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  }