github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/common/networkingcommon/shims.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package networkingcommon 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/apiserver/params" 10 "github.com/juju/juju/network" 11 providercommon "github.com/juju/juju/provider/common" 12 "github.com/juju/juju/state" 13 "github.com/juju/juju/state/stateenvirons" 14 ) 15 16 // NOTE: All of the following code is only tested with a feature test. 17 18 // subnetShim forwards and adapts state.Subnets methods to BackingSubnet. 19 type subnetShim struct { 20 BackingSubnet 21 subnet *state.Subnet 22 } 23 24 func (s *subnetShim) CIDR() string { 25 return s.subnet.CIDR() 26 } 27 28 func (s *subnetShim) VLANTag() int { 29 return s.subnet.VLANTag() 30 } 31 32 func (s *subnetShim) ProviderId() network.Id { 33 return s.subnet.ProviderId() 34 } 35 36 func (s *subnetShim) AvailabilityZones() []string { 37 // TODO(dimitern): Add multiple zones to state.Subnet. 38 return []string{s.subnet.AvailabilityZone()} 39 } 40 41 func (s *subnetShim) Life() params.Life { 42 return params.Life(s.subnet.Life().String()) 43 } 44 45 func (s *subnetShim) Status() string { 46 // TODO(dimitern): This should happen in a cleaner way. 47 if s.Life() != params.Alive { 48 return "terminating" 49 } 50 return "in-use" 51 } 52 53 func (s *subnetShim) SpaceName() string { 54 return s.subnet.SpaceName() 55 } 56 57 // spaceShim forwards and adapts state.Space methods to BackingSpace. 58 type spaceShim struct { 59 BackingSpace 60 space *state.Space 61 } 62 63 func (s *spaceShim) Name() string { 64 return s.space.Name() 65 } 66 67 func (s *spaceShim) ProviderId() network.Id { 68 return s.space.ProviderId() 69 } 70 71 func (s *spaceShim) Subnets() ([]BackingSubnet, error) { 72 results, err := s.space.Subnets() 73 if err != nil { 74 return nil, errors.Trace(err) 75 } 76 subnets := make([]BackingSubnet, len(results)) 77 for i, result := range results { 78 subnets[i] = &subnetShim{subnet: result} 79 } 80 return subnets, nil 81 } 82 83 func NewStateShim(st *state.State) *stateShim { 84 return &stateShim{stateenvirons.EnvironConfigGetter{st}, st} 85 } 86 87 // stateShim forwards and adapts state.State methods to Backing 88 // method. 89 type stateShim struct { 90 stateenvirons.EnvironConfigGetter 91 st *state.State 92 } 93 94 func (s *stateShim) AddSpace(name string, providerId network.Id, subnetIds []string, public bool) error { 95 _, err := s.st.AddSpace(name, providerId, subnetIds, public) 96 return err 97 } 98 99 func (s *stateShim) AllSpaces() ([]BackingSpace, error) { 100 // TODO(dimitern): Make this ListSpaces() instead. 101 results, err := s.st.AllSpaces() 102 if err != nil { 103 return nil, errors.Trace(err) 104 } 105 spaces := make([]BackingSpace, len(results)) 106 for i, result := range results { 107 spaces[i] = &spaceShim{space: result} 108 } 109 return spaces, nil 110 } 111 112 func (s *stateShim) AddSubnet(info BackingSubnetInfo) (BackingSubnet, error) { 113 // TODO(dimitern): Add multiple AZs per subnet in state. 114 var firstZone string 115 if len(info.AvailabilityZones) > 0 { 116 firstZone = info.AvailabilityZones[0] 117 } 118 _, err := s.st.AddSubnet(state.SubnetInfo{ 119 CIDR: info.CIDR, 120 VLANTag: info.VLANTag, 121 ProviderId: info.ProviderId, 122 AvailabilityZone: firstZone, 123 SpaceName: info.SpaceName, 124 }) 125 return nil, err // Drop the first result, as it's unused. 126 } 127 128 func (s *stateShim) AllSubnets() ([]BackingSubnet, error) { 129 results, err := s.st.AllSubnets() 130 if err != nil { 131 return nil, errors.Trace(err) 132 } 133 subnets := make([]BackingSubnet, len(results)) 134 for i, result := range results { 135 subnets[i] = &subnetShim{subnet: result} 136 } 137 return subnets, nil 138 } 139 140 func (s *stateShim) AvailabilityZones() ([]providercommon.AvailabilityZone, error) { 141 // TODO(dimitern): Fix this to get them from state when available! 142 return nil, nil 143 } 144 145 func (s *stateShim) SetAvailabilityZones(zones []providercommon.AvailabilityZone) error { 146 return nil 147 }