github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/ec2/credentials_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  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"runtime"
    11  
    12  	"github.com/juju/errors"
    13  	"github.com/juju/testing"
    14  	jc "github.com/juju/testing/checkers"
    15  	"github.com/juju/utils"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/cloud"
    19  	"github.com/juju/juju/environs"
    20  	envtesting "github.com/juju/juju/environs/testing"
    21  )
    22  
    23  type credentialsSuite struct {
    24  	testing.IsolationSuite
    25  	provider environs.EnvironProvider
    26  }
    27  
    28  var _ = gc.Suite(&credentialsSuite{})
    29  
    30  func (s *credentialsSuite) SetUpTest(c *gc.C) {
    31  	s.IsolationSuite.SetUpTest(c)
    32  
    33  	var err error
    34  	s.provider, err = environs.Provider("ec2")
    35  	c.Assert(err, jc.ErrorIsNil)
    36  }
    37  
    38  func (s *credentialsSuite) TestCredentialSchemas(c *gc.C) {
    39  	envtesting.AssertProviderAuthTypes(c, s.provider, "access-key")
    40  }
    41  
    42  func (s *credentialsSuite) TestAccessKeyCredentialsValid(c *gc.C) {
    43  	envtesting.AssertProviderCredentialsValid(c, s.provider, "access-key", map[string]string{
    44  		"access-key": "key",
    45  		"secret-key": "secret",
    46  	})
    47  }
    48  
    49  func (s *credentialsSuite) TestAccessKeyHiddenAttributes(c *gc.C) {
    50  	envtesting.AssertProviderCredentialsAttributesHidden(c, s.provider, "access-key", "secret-key")
    51  }
    52  
    53  func (s *credentialsSuite) TestDetectCredentialsNotFound(c *gc.C) {
    54  	// No environment variables set, so no credentials should be found.
    55  	_, err := s.provider.DetectCredentials()
    56  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    57  }
    58  
    59  func (s *credentialsSuite) TestDetectCredentialsEnvironmentVariables(c *gc.C) {
    60  	home := utils.Home()
    61  	dir := c.MkDir()
    62  	utils.SetHome(dir)
    63  	s.AddCleanup(func(*gc.C) {
    64  		utils.SetHome(home)
    65  	})
    66  	s.PatchEnvironment("USER", "fred")
    67  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "key-id")
    68  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret-access-key")
    69  
    70  	credentials, err := s.provider.DetectCredentials()
    71  	c.Assert(err, jc.ErrorIsNil)
    72  	expected := cloud.NewCredential(
    73  		cloud.AccessKeyAuthType, map[string]string{
    74  			"access-key": "key-id",
    75  			"secret-key": "secret-access-key",
    76  		},
    77  	)
    78  	expected.Label = `aws credential "fred"`
    79  	c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected)
    80  }
    81  
    82  func (s *credentialsSuite) assertDetectCredentialsKnownLocation(c *gc.C, dir string) {
    83  	location := filepath.Join(dir, ".aws")
    84  	err := os.MkdirAll(location, 0700)
    85  	c.Assert(err, jc.ErrorIsNil)
    86  	path := filepath.Join(location, "credentials")
    87  	credData := `
    88  [fred]
    89  aws_access_key_id=aws-key-id
    90  aws_secret_access_key=aws-secret-access-key
    91  `[1:]
    92  	err = ioutil.WriteFile(path, []byte(credData), 0600)
    93  	c.Assert(err, jc.ErrorIsNil)
    94  
    95  	path = filepath.Join(location, "config")
    96  	regionData := `
    97  [default]
    98  region=region
    99  `[1:]
   100  	err = ioutil.WriteFile(path, []byte(regionData), 0600)
   101  	c.Assert(err, jc.ErrorIsNil)
   102  
   103  	// Ensure any env vars are ignored.
   104  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "key-id")
   105  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret-access-key")
   106  
   107  	credentials, err := s.provider.DetectCredentials()
   108  	c.Assert(err, jc.ErrorIsNil)
   109  	c.Assert(credentials.DefaultRegion, gc.Equals, "region")
   110  	expected := cloud.NewCredential(
   111  		cloud.AccessKeyAuthType, map[string]string{
   112  			"access-key": "aws-key-id",
   113  			"secret-key": "aws-secret-access-key",
   114  		},
   115  	)
   116  	expected.Label = `aws credential "fred"`
   117  	c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected)
   118  }
   119  
   120  func (s *credentialsSuite) TestDetectCredentialsKnownLocationUnix(c *gc.C) {
   121  	if runtime.GOOS == "windows" {
   122  		c.Skip("skipping on Windows")
   123  	}
   124  	home := utils.Home()
   125  	dir := c.MkDir()
   126  	utils.SetHome(dir)
   127  	s.AddCleanup(func(*gc.C) {
   128  		utils.SetHome(home)
   129  	})
   130  	s.assertDetectCredentialsKnownLocation(c, dir)
   131  }
   132  
   133  func (s *credentialsSuite) TestDetectCredentialsKnownLocationWindows(c *gc.C) {
   134  	if runtime.GOOS != "windows" {
   135  		c.Skip("skipping on non-Windows platform")
   136  	}
   137  	dir := c.MkDir()
   138  	s.PatchEnvironment("USERPROFILE", dir)
   139  	s.assertDetectCredentialsKnownLocation(c, dir)
   140  }