github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/api/environmentmanager/environmentmanager.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package environmentmanager
     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.environmentmanager")
    16  
    17  // Client provides methods that the Juju client command uses to interact
    18  // with environments stored in the Juju Server.
    19  type Client struct {
    20  	base.ClientFacade
    21  	facade base.FacadeCaller
    22  }
    23  
    24  // NewClient creates a new `Client` based on an existing authenticated API
    25  // connection.
    26  func NewClient(st base.APICallCloser) *Client {
    27  	frontend, backend := base.NewClientFacade(st, "EnvironmentManager")
    28  	logger.Debugf("%#v", frontend)
    29  	return &Client{ClientFacade: frontend, facade: backend}
    30  }
    31  
    32  // ConfigSkeleton returns config values to be used as a starting point for the
    33  // API caller to construct a valid environment specific config.  The provider
    34  // and region params are there for future use, and current behaviour expects
    35  // both of these to be empty.
    36  func (c *Client) ConfigSkeleton(provider, region string) (params.EnvironConfig, error) {
    37  	var result params.EnvironConfigResult
    38  	args := params.EnvironmentSkeletonConfigArgs{
    39  		Provider: provider,
    40  		Region:   region,
    41  	}
    42  	err := c.facade.FacadeCall("ConfigSkeleton", args, &result)
    43  	if err != nil {
    44  		return nil, errors.Trace(err)
    45  	}
    46  	return result.Config, nil
    47  }
    48  
    49  // CreateEnvironment creates a new environment using the account and
    50  // environment config specified in the args.
    51  func (c *Client) CreateEnvironment(owner string, account, config map[string]interface{}) (params.Environment, error) {
    52  	var result params.Environment
    53  	if !names.IsValidUser(owner) {
    54  		return result, errors.Errorf("invalid owner name %q", owner)
    55  	}
    56  	createArgs := params.EnvironmentCreateArgs{
    57  		OwnerTag: names.NewUserTag(owner).String(),
    58  		Account:  account,
    59  		Config:   config,
    60  	}
    61  	err := c.facade.FacadeCall("CreateEnvironment", createArgs, &result)
    62  	if err != nil {
    63  		return result, errors.Trace(err)
    64  	}
    65  	logger.Infof("created environment %s (%s)", result.Name, result.UUID)
    66  	return result, nil
    67  }
    68  
    69  // ListEnvironments returns the environments that the specified user
    70  // has access to in the current server.  Only that state server owner
    71  // can list environments for any user (at this stage).  Other users
    72  // can only ask about their own environments.
    73  func (c *Client) ListEnvironments(user string) ([]base.UserEnvironment, error) {
    74  	var environments params.UserEnvironmentList
    75  	if !names.IsValidUser(user) {
    76  		return nil, errors.Errorf("invalid user name %q", user)
    77  	}
    78  	entity := params.Entity{names.NewUserTag(user).String()}
    79  	err := c.facade.FacadeCall("ListEnvironments", entity, &environments)
    80  	if err != nil {
    81  		return nil, errors.Trace(err)
    82  	}
    83  	result := make([]base.UserEnvironment, len(environments.UserEnvironments))
    84  	for i, env := range environments.UserEnvironments {
    85  		owner, err := names.ParseUserTag(env.OwnerTag)
    86  		if err != nil {
    87  			return nil, errors.Annotatef(err, "OwnerTag %q at position %d", env.OwnerTag, i)
    88  		}
    89  		result[i] = base.UserEnvironment{
    90  			Name:           env.Name,
    91  			UUID:           env.UUID,
    92  			Owner:          owner.Username(),
    93  			LastConnection: env.LastConnection,
    94  		}
    95  	}
    96  	return result, nil
    97  }