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  }