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