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  }