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  }