github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/common/cloudspec/cloudspec.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cloudspec 5 6 import ( 7 "github.com/juju/errors" 8 names "gopkg.in/juju/names.v2" 9 10 "github.com/juju/juju/api/base" 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/cloud" 13 "github.com/juju/juju/environs" 14 ) 15 16 // CloudSpecAPI provides common client-side API functions 17 // to call into apiserver/common/cloudspec.CloudSpec. 18 type CloudSpecAPI struct { 19 facade base.FacadeCaller 20 } 21 22 // NewCloudSpecAPI creates a CloudSpecAPI using the provided 23 // FacadeCaller. 24 func NewCloudSpecAPI(facade base.FacadeCaller) *CloudSpecAPI { 25 return &CloudSpecAPI{facade} 26 } 27 28 // CloudSpec returns the cloud specification for the model 29 // with the given tag. 30 func (api *CloudSpecAPI) CloudSpec(tag names.ModelTag) (environs.CloudSpec, error) { 31 var results params.CloudSpecResults 32 args := params.Entities{Entities: []params.Entity{{tag.String()}}} 33 err := api.facade.FacadeCall("CloudSpec", args, &results) 34 if err != nil { 35 return environs.CloudSpec{}, err 36 } 37 if n := len(results.Results); n != 1 { 38 return environs.CloudSpec{}, errors.Errorf("expected 1 result, got %d", n) 39 } 40 result := results.Results[0] 41 if result.Error != nil { 42 return environs.CloudSpec{}, errors.Annotate(result.Error, "API request failed") 43 } 44 return api.MakeCloudSpec(result.Result) 45 } 46 47 // MakeCloudSpec creates an environs.CloudSpec from a params.CloudSpec 48 // that has been returned from the apiserver. 49 func (api *CloudSpecAPI) MakeCloudSpec(pSpec *params.CloudSpec) (environs.CloudSpec, error) { 50 if pSpec == nil { 51 return environs.CloudSpec{}, errors.NotValidf("nil value") 52 } 53 var credential *cloud.Credential 54 if pSpec.Credential != nil { 55 credentialValue := cloud.NewCredential( 56 cloud.AuthType(pSpec.Credential.AuthType), 57 pSpec.Credential.Attributes, 58 ) 59 credential = &credentialValue 60 } 61 spec := environs.CloudSpec{ 62 Type: pSpec.Type, 63 Name: pSpec.Name, 64 Region: pSpec.Region, 65 Endpoint: pSpec.Endpoint, 66 IdentityEndpoint: pSpec.IdentityEndpoint, 67 StorageEndpoint: pSpec.StorageEndpoint, 68 Credential: credential, 69 } 70 if err := spec.Validate(); err != nil { 71 return environs.CloudSpec{}, errors.Annotate(err, "validating CloudSpec") 72 } 73 return spec, nil 74 }