github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "gopkg.in/juju/names.v2" 9 10 "github.com/juju/juju/api/base" 11 "github.com/juju/juju/apiserver/params" 12 ) 13 14 const spacesFacade = "Spaces" 15 16 // API provides access to the InstancePoller API facade. 17 type API struct { 18 base.ClientFacade 19 facade base.FacadeCaller 20 } 21 22 // NewAPI creates a new client-side Spaces facade. 23 func NewAPI(caller base.APICallCloser) *API { 24 if caller == nil { 25 panic("caller is nil") 26 } 27 clientFacade, facadeCaller := base.NewClientFacade(caller, spacesFacade) 28 return &API{ 29 ClientFacade: clientFacade, 30 facade: facadeCaller, 31 } 32 } 33 34 func makeCreateSpaceParams(name string, subnetIds []string, public bool) params.CreateSpaceParams { 35 spaceTag := names.NewSpaceTag(name).String() 36 subnetTags := make([]string, len(subnetIds)) 37 38 for i, s := range subnetIds { 39 subnetTags[i] = names.NewSubnetTag(s).String() 40 } 41 42 return params.CreateSpaceParams{ 43 SpaceTag: spaceTag, 44 SubnetTags: subnetTags, 45 Public: public, 46 } 47 } 48 49 // CreateSpace creates a new Juju network space, associating the 50 // specified subnets with it (optional; can be empty). 51 func (api *API) CreateSpace(name string, subnetIds []string, public bool) error { 52 var response params.ErrorResults 53 createSpacesParams := params.CreateSpacesParams{ 54 Spaces: []params.CreateSpaceParams{makeCreateSpaceParams(name, subnetIds, public)}, 55 } 56 err := api.facade.FacadeCall("CreateSpaces", createSpacesParams, &response) 57 if err != nil { 58 if params.IsCodeNotSupported(err) { 59 return errors.NewNotSupported(nil, err.Error()) 60 } 61 return errors.Trace(err) 62 } 63 return response.OneError() 64 } 65 66 // ListSpaces lists all available spaces and their associated subnets. 67 func (api *API) ListSpaces() ([]params.Space, error) { 68 var response params.ListSpacesResults 69 err := api.facade.FacadeCall("ListSpaces", nil, &response) 70 if params.IsCodeNotSupported(err) { 71 return response.Results, errors.NewNotSupported(nil, err.Error()) 72 } 73 return response.Results, err 74 } 75 76 // ReloadSpaces reloads spaces from substrate 77 func (api *API) ReloadSpaces() error { 78 if api.facade.BestAPIVersion() < 3 { 79 return errors.NewNotSupported(nil, "Controller does not support reloading spaces") 80 } 81 err := api.facade.FacadeCall("ReloadSpaces", nil, nil) 82 if params.IsCodeNotSupported(err) { 83 return errors.NewNotSupported(nil, err.Error()) 84 } 85 return err 86 }