github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  	err := utils.SetHome(dir)
    63  	c.Assert(err, jc.ErrorIsNil)
    64  	s.AddCleanup(func(*gc.C) {
    65  		err := utils.SetHome(home)
    66  		c.Assert(err, jc.ErrorIsNil)
    67  	})
    68  	s.PatchEnvironment("USER", "fred")
    69  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "key-id")
    70  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret-access-key")
    71  
    72  	credentials, err := s.provider.DetectCredentials()
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	expected := cloud.NewCredential(
    75  		cloud.AccessKeyAuthType, map[string]string{
    76  			"access-key": "key-id",
    77  			"secret-key": "secret-access-key",
    78  		},
    79  	)
    80  	expected.Label = `aws credential "fred"`
    81  	c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected)
    82  }
    83  
    84  func (s *credentialsSuite) assertDetectCredentialsKnownLocation(c *gc.C, dir string) {
    85  	location := filepath.Join(dir, ".aws")
    86  	err := os.MkdirAll(location, 0700)
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	path := filepath.Join(location, "credentials")
    89  	credData := `
    90  [fred]
    91  aws_access_key_id=aws-key-id
    92  aws_secret_access_key=aws-secret-access-key
    93  `[1:]
    94  	err = ioutil.WriteFile(path, []byte(credData), 0600)
    95  	c.Assert(err, jc.ErrorIsNil)
    96  
    97  	path = filepath.Join(location, "config")
    98  	regionData := `
    99  [default]
   100  region=region
   101  `[1:]
   102  	err = ioutil.WriteFile(path, []byte(regionData), 0600)
   103  	c.Assert(err, jc.ErrorIsNil)
   104  
   105  	// Ensure any env vars are ignored.
   106  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "key-id")
   107  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret-access-key")
   108  
   109  	credentials, err := s.provider.DetectCredentials()
   110  	c.Assert(err, jc.ErrorIsNil)
   111  	c.Assert(credentials.DefaultRegion, gc.Equals, "region")
   112  	expected := cloud.NewCredential(
   113  		cloud.AccessKeyAuthType, map[string]string{
   114  			"access-key": "aws-key-id",
   115  			"secret-key": "aws-secret-access-key",
   116  		},
   117  	)
   118  	expected.Label = `aws credential "fred"`
   119  	c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected)
   120  }
   121  
   122  func (s *credentialsSuite) TestDetectCredentialsKnownLocationUnix(c *gc.C) {
   123  	if runtime.GOOS == "windows" {
   124  		c.Skip("skipping on Windows")
   125  	}
   126  	home := utils.Home()
   127  	dir := c.MkDir()
   128  	err := utils.SetHome(dir)
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	s.AddCleanup(func(*gc.C) {
   131  		err := utils.SetHome(home)
   132  		c.Assert(err, jc.ErrorIsNil)
   133  	})
   134  	s.assertDetectCredentialsKnownLocation(c, dir)
   135  }
   136  
   137  func (s *credentialsSuite) TestDetectCredentialsKnownLocationWindows(c *gc.C) {
   138  	if runtime.GOOS != "windows" {
   139  		c.Skip("skipping on non-Windows platform")
   140  	}
   141  	dir := c.MkDir()
   142  	s.PatchEnvironment("USERPROFILE", dir)
   143  	s.assertDetectCredentialsKnownLocation(c, dir)
   144  }