github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/cloud/clouds_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cloud_test 5 6 import ( 7 "io/ioutil" 8 "path/filepath" 9 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/cloud" 14 "github.com/juju/juju/juju/osenv" 15 "github.com/juju/juju/testing" 16 ) 17 18 type cloudSuite struct { 19 testing.BaseSuite 20 } 21 22 var _ = gc.Suite(&cloudSuite{}) 23 24 var publicCloudNames = []string{ 25 "aws", "aws-china", "aws-gov", "google", "azure", "azure-china", "rackspace", "joyent", "cloudsigma", 26 } 27 28 func parsePublicClouds(c *gc.C) map[string]cloud.Cloud { 29 clouds, err := cloud.ParseCloudMetadata([]byte(cloud.FallbackPublicCloudInfo)) 30 c.Assert(err, jc.ErrorIsNil) 31 c.Assert(clouds, gc.HasLen, len(publicCloudNames)) 32 return clouds 33 } 34 35 func (s *cloudSuite) TestParseClouds(c *gc.C) { 36 clouds := parsePublicClouds(c) 37 var cloudNames []string 38 for name, _ := range clouds { 39 cloudNames = append(cloudNames, name) 40 } 41 c.Assert(cloudNames, jc.SameContents, publicCloudNames) 42 } 43 44 func (s *cloudSuite) TestParseCloudsEndpointDenormalisation(c *gc.C) { 45 clouds := parsePublicClouds(c) 46 rackspace := clouds["rackspace"] 47 c.Assert(rackspace.Type, gc.Equals, "rackspace") 48 c.Assert(rackspace.Endpoint, gc.Equals, "https://identity.api.rackspacecloud.com/v2.0") 49 var regionNames []string 50 for _, region := range rackspace.Regions { 51 regionNames = append(regionNames, region.Name) 52 if region.Name == "lon" { 53 c.Assert(region.Endpoint, gc.Equals, "https://lon.identity.api.rackspacecloud.com/v2.0") 54 } else { 55 c.Assert(region.Endpoint, gc.Equals, "https://identity.api.rackspacecloud.com/v2.0") 56 } 57 } 58 c.Assert(regionNames, jc.SameContents, []string{"dfw", "ord", "iad", "lon", "syd", "hkg"}) 59 } 60 61 func (s *cloudSuite) TestParseCloudsAuthTypes(c *gc.C) { 62 clouds := parsePublicClouds(c) 63 rackspace := clouds["rackspace"] 64 c.Assert(rackspace.AuthTypes, jc.SameContents, []cloud.AuthType{"access-key", "userpass"}) 65 } 66 67 func (s *cloudSuite) TestPublicCloudsMetadataFallback(c *gc.C) { 68 clouds, fallbackUsed, err := cloud.PublicCloudMetadata("badfile.yaml") 69 c.Assert(err, jc.ErrorIsNil) 70 c.Assert(fallbackUsed, jc.IsTrue) 71 var cloudNames []string 72 for name, _ := range clouds { 73 cloudNames = append(cloudNames, name) 74 } 75 c.Assert(cloudNames, jc.SameContents, publicCloudNames) 76 } 77 78 func (s *cloudSuite) TestPublicCloudsMetadata(c *gc.C) { 79 metadata := ` 80 clouds: 81 aws-me: 82 type: aws 83 auth-types: [ userpass ] 84 `[1:] 85 dir := c.MkDir() 86 cloudyamlfile := filepath.Join(dir, "public-clouds.yaml") 87 err := ioutil.WriteFile(cloudyamlfile, []byte(metadata), 0644) 88 c.Assert(err, jc.ErrorIsNil) 89 clouds, fallbackUsed, err := cloud.PublicCloudMetadata(cloudyamlfile) 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(fallbackUsed, jc.IsFalse) 92 c.Assert(clouds, jc.DeepEquals, map[string]cloud.Cloud{ 93 "aws-me": cloud.Cloud{ 94 Type: "aws", 95 AuthTypes: []cloud.AuthType{"userpass"}, 96 }, 97 }) 98 } 99 100 func (s *cloudSuite) TestGeneratedPublicCloudInfo(c *gc.C) { 101 cloudData, err := ioutil.ReadFile("fallback-public-cloud.yaml") 102 c.Assert(err, jc.ErrorIsNil) 103 clouds, err := cloud.ParseCloudMetadata(cloudData) 104 c.Assert(err, jc.ErrorIsNil) 105 106 generatedClouds := parsePublicClouds(c) 107 c.Assert(clouds, jc.DeepEquals, generatedClouds) 108 } 109 110 func (s *cloudSuite) TestWritePublicCloudsMetadata(c *gc.C) { 111 origHome := osenv.SetJujuXDGDataHome(c.MkDir()) 112 s.AddCleanup(func(*gc.C) { osenv.SetJujuXDGDataHome(origHome) }) 113 114 clouds := map[string]cloud.Cloud{ 115 "aws-me": cloud.Cloud{ 116 Type: "aws", 117 AuthTypes: []cloud.AuthType{"userpass"}, 118 }, 119 } 120 err := cloud.WritePublicCloudMetadata(clouds) 121 c.Assert(err, jc.ErrorIsNil) 122 publicClouds, fallbackUsed, err := cloud.PublicCloudMetadata(cloud.JujuPublicCloudsPath()) 123 c.Assert(err, jc.ErrorIsNil) 124 c.Assert(fallbackUsed, jc.IsFalse) 125 c.Assert(publicClouds, jc.DeepEquals, clouds) 126 } 127 128 func (s *cloudSuite) assertCompareClouds(c *gc.C, meta2 string, expected bool) { 129 meta1 := ` 130 clouds: 131 aws-me: 132 type: aws 133 auth-types: [ userpass ] 134 `[1:] 135 if meta2 == "" { 136 meta2 = meta1 137 } 138 c1, err := cloud.ParseCloudMetadata([]byte(meta1)) 139 c.Assert(err, jc.ErrorIsNil) 140 c2, err := cloud.ParseCloudMetadata([]byte(meta2)) 141 c.Assert(err, jc.ErrorIsNil) 142 result, err := cloud.IsSameCloudMetadata(c1, c2) 143 c.Assert(err, jc.ErrorIsNil) 144 c.Assert(result, gc.Equals, expected) 145 } 146 147 func (s *cloudSuite) TestIsSameCloudsMetadataSameData(c *gc.C) { 148 s.assertCompareClouds(c, "", true) 149 } 150 151 func (s *cloudSuite) TestIsSameCloudsMetadataExistingCloudChanged(c *gc.C) { 152 metadata := ` 153 clouds: 154 aws-me: 155 type: aws 156 auth-types: [ userpass ] 157 endpoint: http://endpoint 158 `[1:] 159 s.assertCompareClouds(c, metadata, false) 160 } 161 162 func (s *cloudSuite) TestIsSameCloudsMetadataNewCloudAdded(c *gc.C) { 163 metadata := ` 164 clouds: 165 aws-me: 166 type: aws 167 auth-types: [ userpass ] 168 gce-me: 169 type: gce 170 auth-types: [ userpass ] 171 `[1:] 172 s.assertCompareClouds(c, metadata, false) 173 }