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  }