github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/provider/ec2/provider_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package ec2_test
     5  
     6  import (
     7  	"github.com/juju/testing"
     8  	jc "github.com/juju/testing/checkers"
     9  	"gopkg.in/amz.v3/aws"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/cloud"
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/provider/ec2"
    15  	coretesting "github.com/juju/juju/testing"
    16  )
    17  
    18  type ProviderSuite struct {
    19  	testing.IsolationSuite
    20  	spec     environs.CloudSpec
    21  	provider environs.EnvironProvider
    22  }
    23  
    24  var _ = gc.Suite(&ProviderSuite{})
    25  
    26  func (s *ProviderSuite) SetUpTest(c *gc.C) {
    27  	s.IsolationSuite.SetUpTest(c)
    28  
    29  	credential := cloud.NewCredential(
    30  		cloud.AccessKeyAuthType,
    31  		map[string]string{
    32  			"access-key": "foo",
    33  			"secret-key": "bar",
    34  		},
    35  	)
    36  	s.spec = environs.CloudSpec{
    37  		Type:       "ec2",
    38  		Name:       "aws",
    39  		Region:     "us-east-1",
    40  		Credential: &credential,
    41  	}
    42  
    43  	provider, err := environs.Provider("ec2")
    44  	c.Assert(err, jc.ErrorIsNil)
    45  	s.provider = provider
    46  }
    47  
    48  func (s *ProviderSuite) TestOpen(c *gc.C) {
    49  	env, err := s.provider.Open(environs.OpenParams{
    50  		Cloud:  s.spec,
    51  		Config: coretesting.ModelConfig(c),
    52  	})
    53  	c.Assert(err, jc.ErrorIsNil)
    54  	c.Assert(env, gc.NotNil)
    55  }
    56  
    57  func (s *ProviderSuite) TestOpenUnknownRegion(c *gc.C) {
    58  	// This test shows that we do *not* check the region names against
    59  	// anything in the client. That means that when new regions are
    60  	// added to AWS, we'll be able to support them.
    61  	s.spec.Region = "foobar"
    62  	_, err := s.provider.Open(environs.OpenParams{
    63  		Cloud:  s.spec,
    64  		Config: coretesting.ModelConfig(c),
    65  	})
    66  	c.Assert(err, jc.ErrorIsNil)
    67  }
    68  
    69  func (s *ProviderSuite) TestOpenKnownRegionInvalidEndpoint(c *gc.C) {
    70  	s.PatchValue(&aws.Regions, map[string]aws.Region{
    71  		"us-east-1": {
    72  			EC2Endpoint: "https://testing.invalid",
    73  		},
    74  	})
    75  	s.spec.Endpoint = "https://us-east-1.aws.amazon.com/v1.2/"
    76  
    77  	env, err := s.provider.Open(environs.OpenParams{
    78  		Cloud:  s.spec,
    79  		Config: coretesting.ModelConfig(c),
    80  	})
    81  	c.Assert(err, jc.ErrorIsNil)
    82  
    83  	ec2Client := ec2.EnvironEC2(env)
    84  	c.Assert(ec2Client.Region.EC2Endpoint, gc.Equals, "https://testing.invalid")
    85  }
    86  
    87  func (s *ProviderSuite) TestOpenKnownRegionValidEndpoint(c *gc.C) {
    88  	// If the endpoint in the cloudspec is not known to be invalid,
    89  	// we ignore whatever is in aws.Regions. This way, if the AWS
    90  	// endpoints do ever change, we can update public-clouds.yaml
    91  	// and have it picked up.
    92  	s.PatchValue(&aws.Regions, map[string]aws.Region{
    93  		"us-east-1": {
    94  			EC2Endpoint: "https://testing.invalid",
    95  		},
    96  	})
    97  	s.spec.Endpoint = "https://ec2.us-east-1.amazonaws.com"
    98  
    99  	env, err := s.provider.Open(environs.OpenParams{
   100  		Cloud:  s.spec,
   101  		Config: coretesting.ModelConfig(c),
   102  	})
   103  	c.Assert(err, jc.ErrorIsNil)
   104  
   105  	ec2Client := ec2.EnvironEC2(env)
   106  	c.Assert(ec2Client.Region.EC2Endpoint, gc.Equals, "https://ec2.us-east-1.amazonaws.com")
   107  }
   108  
   109  func (s *ProviderSuite) TestOpenMissingCredential(c *gc.C) {
   110  	s.spec.Credential = nil
   111  	s.testOpenError(c, s.spec, `validating cloud spec: missing credential not valid`)
   112  }
   113  
   114  func (s *ProviderSuite) TestOpenUnsupportedCredential(c *gc.C) {
   115  	credential := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{})
   116  	s.spec.Credential = &credential
   117  	s.testOpenError(c, s.spec, `validating cloud spec: "userpass" auth-type not supported`)
   118  }
   119  
   120  func (s *ProviderSuite) testOpenError(c *gc.C, spec environs.CloudSpec, expect string) {
   121  	_, err := s.provider.Open(environs.OpenParams{
   122  		Cloud:  spec,
   123  		Config: coretesting.ModelConfig(c),
   124  	})
   125  	c.Assert(err, gc.ErrorMatches, expect)
   126  }