github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/environs/config" 11 "github.com/juju/juju/network" 12 providercommon "github.com/juju/juju/provider/common" 13 "github.com/juju/juju/state" 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{st: st} 85 } 86 87 // stateShim forwards and adapts state.State methods to Backing 88 // method. 89 type stateShim struct { 90 NetworkBacking 91 st *state.State 92 } 93 94 func (s *stateShim) ModelConfig() (*config.Config, error) { 95 return s.st.ModelConfig() 96 } 97 98 func (s *stateShim) AddSpace(name string, providerId network.Id, subnetIds []string, public bool) error { 99 _, err := s.st.AddSpace(name, providerId, subnetIds, public) 100 return err 101 } 102 103 func (s *stateShim) AllSpaces() ([]BackingSpace, error) { 104 // TODO(dimitern): Make this ListSpaces() instead. 105 results, err := s.st.AllSpaces() 106 if err != nil { 107 return nil, errors.Trace(err) 108 } 109 spaces := make([]BackingSpace, len(results)) 110 for i, result := range results { 111 spaces[i] = &spaceShim{space: result} 112 } 113 return spaces, nil 114 } 115 116 func (s *stateShim) AddSubnet(info BackingSubnetInfo) (BackingSubnet, error) { 117 // TODO(dimitern): Add multiple AZs per subnet in state. 118 var firstZone string 119 if len(info.AvailabilityZones) > 0 { 120 firstZone = info.AvailabilityZones[0] 121 } 122 _, err := s.st.AddSubnet(state.SubnetInfo{ 123 CIDR: info.CIDR, 124 VLANTag: info.VLANTag, 125 ProviderId: info.ProviderId, 126 AvailabilityZone: firstZone, 127 SpaceName: info.SpaceName, 128 }) 129 return nil, err // Drop the first result, as it's unused. 130 } 131 132 func (s *stateShim) AllSubnets() ([]BackingSubnet, error) { 133 results, err := s.st.AllSubnets() 134 if err != nil { 135 return nil, errors.Trace(err) 136 } 137 subnets := make([]BackingSubnet, len(results)) 138 for i, result := range results { 139 subnets[i] = &subnetShim{subnet: result} 140 } 141 return subnets, nil 142 } 143 144 type availZoneShim struct{} 145 146 func (availZoneShim) Name() string { return "not-set" } 147 func (availZoneShim) Available() bool { return true } 148 149 func (s *stateShim) AvailabilityZones() ([]providercommon.AvailabilityZone, error) { 150 // TODO(dimitern): Fix this to get them from state when available! 151 return nil, nil 152 } 153 154 func (s *stateShim) SetAvailabilityZones(zones []providercommon.AvailabilityZone) error { 155 return nil 156 }