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 }