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  }