github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/api/spaces/spaces.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package spaces 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 ) 14 15 var logger = loggo.GetLogger("juju.api.spaces") 16 17 const spacesFacade = "Spaces" 18 19 // API provides access to the InstancePoller API facade. 20 type API struct { 21 base.ClientFacade 22 facade base.FacadeCaller 23 } 24 25 // NewAPI creates a new client-side Spaces facade. 26 func NewAPI(caller base.APICallCloser) *API { 27 if caller == nil { 28 panic("caller is nil") 29 } 30 clientFacade, facadeCaller := base.NewClientFacade(caller, spacesFacade) 31 return &API{ 32 ClientFacade: clientFacade, 33 facade: facadeCaller, 34 } 35 } 36 37 func makeCreateSpaceParams(name string, subnetIds []string, public bool) params.CreateSpaceParams { 38 spaceTag := names.NewSpaceTag(name).String() 39 subnetTags := make([]string, len(subnetIds)) 40 41 for i, s := range subnetIds { 42 subnetTags[i] = names.NewSubnetTag(s).String() 43 } 44 45 return params.CreateSpaceParams{ 46 SpaceTag: spaceTag, 47 SubnetTags: subnetTags, 48 Public: public, 49 } 50 } 51 52 // CreateSpace creates a new Juju network space, associating the 53 // specified subnets with it (optional; can be empty). 54 func (api *API) CreateSpace(name string, subnetIds []string, public bool) error { 55 var response params.ErrorResults 56 createSpacesParams := params.CreateSpacesParams{ 57 Spaces: []params.CreateSpaceParams{makeCreateSpaceParams(name, subnetIds, public)}, 58 } 59 err := api.facade.FacadeCall("CreateSpaces", createSpacesParams, &response) 60 if err != nil { 61 if params.IsCodeNotSupported(err) { 62 return errors.NewNotSupported(nil, err.Error()) 63 } 64 return errors.Trace(err) 65 } 66 return response.OneError() 67 } 68 69 // ListSpaces lists all available spaces and their associated subnets. 70 func (api *API) ListSpaces() ([]params.Space, error) { 71 var response params.ListSpacesResults 72 err := api.facade.FacadeCall("ListSpaces", nil, &response) 73 if params.IsCodeNotSupported(err) { 74 return response.Results, errors.NewNotSupported(nil, err.Error()) 75 } 76 return response.Results, err 77 }