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 }