github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 }