github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/api/subnets/subnets.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package subnets
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/loggo"
     9  	"github.com/juju/names"
    10  
    11  	"github.com/juju/juju/api/base"
    12  	"github.com/juju/juju/apiserver/params"
    13  	"github.com/juju/juju/network"
    14  )
    15  
    16  var logger = loggo.GetLogger("juju.api.subnets")
    17  
    18  const subnetsFacade = "Subnets"
    19  
    20  // API provides access to the Subnets API facade.
    21  type API struct {
    22  	base.ClientFacade
    23  	facade base.FacadeCaller
    24  }
    25  
    26  // NewAPI creates a new client-side Subnets facade.
    27  func NewAPI(caller base.APICallCloser) *API {
    28  	if caller == nil {
    29  		panic("caller is nil")
    30  	}
    31  	clientFacade, facadeCaller := base.NewClientFacade(caller, subnetsFacade)
    32  	return &API{
    33  		ClientFacade: clientFacade,
    34  		facade:       facadeCaller,
    35  	}
    36  }
    37  
    38  // AddSubnet adds an existing subnet to the environment.
    39  func (api *API) AddSubnet(subnet names.SubnetTag, providerId network.Id, space names.SpaceTag, zones []string) error {
    40  	var response params.ErrorResults
    41  	// Prefer ProviderId when set over CIDR.
    42  	subnetTag := subnet.String()
    43  	if providerId != "" {
    44  		subnetTag = ""
    45  	}
    46  
    47  	params := params.AddSubnetsParams{
    48  		Subnets: []params.AddSubnetParams{{
    49  			SubnetTag:        subnetTag,
    50  			SubnetProviderId: string(providerId),
    51  			SpaceTag:         space.String(),
    52  			Zones:            zones,
    53  		}},
    54  	}
    55  	err := api.facade.FacadeCall("AddSubnets", params, &response)
    56  	if err != nil {
    57  		return errors.Trace(err)
    58  	}
    59  	return response.OneError()
    60  }
    61  
    62  // CreateSubnet creates a new subnet with the provider.
    63  func (api *API) CreateSubnet(subnet names.SubnetTag, space names.SpaceTag, zones []string, isPublic bool) error {
    64  	var response params.ErrorResults
    65  	params := params.CreateSubnetsParams{
    66  		Subnets: []params.CreateSubnetParams{{
    67  			SubnetTag: subnet.String(),
    68  			SpaceTag:  space.String(),
    69  			Zones:     zones,
    70  			IsPublic:  isPublic,
    71  		}},
    72  	}
    73  	err := api.facade.FacadeCall("CreateSubnets", params, &response)
    74  	if err != nil {
    75  		return errors.Trace(err)
    76  	}
    77  	return response.OneError()
    78  }
    79  
    80  // ListSubnets fetches all the subnets known by the environment.
    81  func (api *API) ListSubnets(spaceTag *names.SpaceTag, zone string) ([]params.Subnet, error) {
    82  	var response params.ListSubnetsResults
    83  	var space string
    84  	if spaceTag != nil {
    85  		space = spaceTag.String()
    86  	}
    87  	args := params.SubnetsFilters{
    88  		SpaceTag: space,
    89  		Zone:     zone,
    90  	}
    91  	err := api.facade.FacadeCall("ListSubnets", args, &response)
    92  	if err != nil {
    93  		return nil, errors.Trace(err)
    94  	}
    95  	return response.Results, nil
    96  }