github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/common/cloudspec/cloudspec_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cloudspec_test 5 6 import ( 7 "errors" 8 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 "github.com/juju/utils" 12 gc "gopkg.in/check.v1" 13 names "gopkg.in/juju/names.v2" 14 15 "github.com/juju/juju/apiserver/common" 16 "github.com/juju/juju/apiserver/common/cloudspec" 17 "github.com/juju/juju/apiserver/params" 18 "github.com/juju/juju/cloud" 19 "github.com/juju/juju/environs" 20 coretesting "github.com/juju/juju/testing" 21 ) 22 23 type CloudSpecSuite struct { 24 testing.IsolationSuite 25 testing.Stub 26 result environs.CloudSpec 27 authFunc common.AuthFunc 28 api cloudspec.CloudSpecAPI 29 } 30 31 var _ = gc.Suite(&CloudSpecSuite{}) 32 33 func (s *CloudSpecSuite) SetUpTest(c *gc.C) { 34 s.IsolationSuite.SetUpTest(c) 35 s.Stub.ResetCalls() 36 37 s.authFunc = func(tag names.Tag) bool { 38 s.AddCall("Auth", tag) 39 return tag == coretesting.ModelTag 40 } 41 s.api = cloudspec.NewCloudSpec(func(tag names.ModelTag) (environs.CloudSpec, error) { 42 s.AddCall("CloudSpec", tag) 43 return s.result, s.NextErr() 44 }, func() (common.AuthFunc, error) { 45 s.AddCall("GetAuthFunc") 46 return s.authFunc, s.NextErr() 47 }) 48 49 credential := cloud.NewCredential( 50 "auth-type", 51 map[string]string{"k": "v"}, 52 ) 53 s.result = environs.CloudSpec{ 54 "type", 55 "name", 56 "region", 57 "endpoint", 58 "identity-endpoint", 59 "storage-endpoint", 60 &credential, 61 } 62 } 63 64 func (s *CloudSpecSuite) TestCloudSpec(c *gc.C) { 65 otherModelTag := names.NewModelTag(utils.MustNewUUID().String()) 66 machineTag := names.NewMachineTag("42") 67 result, err := s.api.CloudSpec(params.Entities{Entities: []params.Entity{ 68 {coretesting.ModelTag.String()}, 69 {otherModelTag.String()}, 70 {machineTag.String()}, 71 }}) 72 c.Assert(err, jc.ErrorIsNil) 73 c.Assert(result.Results, jc.DeepEquals, []params.CloudSpecResult{{ 74 Result: ¶ms.CloudSpec{ 75 "type", 76 "name", 77 "region", 78 "endpoint", 79 "identity-endpoint", 80 "storage-endpoint", 81 ¶ms.CloudCredential{ 82 AuthType: "auth-type", 83 Attributes: map[string]string{"k": "v"}, 84 }, 85 }, 86 }, { 87 Error: ¶ms.Error{ 88 Code: params.CodeUnauthorized, 89 Message: "permission denied", 90 }, 91 }, { 92 Error: ¶ms.Error{ 93 Message: `"machine-42" is not a valid model tag`, 94 }, 95 }}) 96 s.CheckCalls(c, []testing.StubCall{ 97 {"GetAuthFunc", nil}, 98 {"Auth", []interface{}{coretesting.ModelTag}}, 99 {"CloudSpec", []interface{}{coretesting.ModelTag}}, 100 {"Auth", []interface{}{otherModelTag}}, 101 }) 102 } 103 104 func (s *CloudSpecSuite) TestCloudSpecNilCredential(c *gc.C) { 105 s.result.Credential = nil 106 result, err := s.api.CloudSpec(params.Entities{ 107 Entities: []params.Entity{{coretesting.ModelTag.String()}}, 108 }) 109 c.Assert(err, jc.ErrorIsNil) 110 c.Assert(result.Results, jc.DeepEquals, []params.CloudSpecResult{{ 111 Result: ¶ms.CloudSpec{ 112 "type", 113 "name", 114 "region", 115 "endpoint", 116 "identity-endpoint", 117 "storage-endpoint", 118 nil, 119 }, 120 }}) 121 } 122 123 func (s *CloudSpecSuite) TestCloudSpecGetAuthFuncError(c *gc.C) { 124 expect := errors.New("bewm") 125 s.SetErrors(expect) 126 result, err := s.api.CloudSpec(params.Entities{ 127 Entities: []params.Entity{{coretesting.ModelTag.String()}}, 128 }) 129 c.Assert(err, gc.Equals, expect) 130 c.Assert(result, jc.DeepEquals, params.CloudSpecResults{}) 131 } 132 133 func (s *CloudSpecSuite) TestCloudSpecCloudSpecError(c *gc.C) { 134 s.SetErrors(nil, errors.New("bewm")) 135 result, err := s.api.CloudSpec(params.Entities{ 136 Entities: []params.Entity{{coretesting.ModelTag.String()}}, 137 }) 138 c.Assert(err, jc.ErrorIsNil) 139 c.Assert(result, jc.DeepEquals, params.CloudSpecResults{Results: []params.CloudSpecResult{{ 140 Error: ¶ms.Error{Message: "bewm"}, 141 }}}) 142 }