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 }