github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/openstack/credentials_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package openstack_test 5 6 import ( 7 "io/ioutil" 8 "path/filepath" 9 "runtime" 10 11 "github.com/juju/errors" 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/utils" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/cloud" 18 "github.com/juju/juju/environs" 19 envtesting "github.com/juju/juju/environs/testing" 20 ) 21 22 type credentialsSuite struct { 23 testing.IsolationSuite 24 provider environs.EnvironProvider 25 } 26 27 var _ = gc.Suite(&credentialsSuite{}) 28 29 func (s *credentialsSuite) SetUpTest(c *gc.C) { 30 s.IsolationSuite.SetUpTest(c) 31 32 var err error 33 s.provider, err = environs.Provider("openstack") 34 c.Assert(err, jc.ErrorIsNil) 35 } 36 37 func (s *credentialsSuite) TestCredentialSchemas(c *gc.C) { 38 envtesting.AssertProviderAuthTypes(c, s.provider, "access-key", "userpass") 39 } 40 41 func (s *credentialsSuite) TestAccessKeyCredentialsValid(c *gc.C) { 42 envtesting.AssertProviderCredentialsValid(c, s.provider, "access-key", map[string]string{ 43 "access-key": "key", 44 "secret-key": "secret", 45 "tenant-name": "gary", 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) TestUserPassCredentialsValid(c *gc.C) { 54 envtesting.AssertProviderCredentialsValid(c, s.provider, "userpass", map[string]string{ 55 "username": "bob", 56 "password": "dobbs", 57 "tenant-name": "gary", 58 }) 59 } 60 61 func (s *credentialsSuite) TestUserPassHiddenAttributes(c *gc.C) { 62 envtesting.AssertProviderCredentialsAttributesHidden(c, s.provider, "userpass", "password") 63 } 64 65 func (s *credentialsSuite) TestDetectCredentialsNotFound(c *gc.C) { 66 // No environment variables set, so no credentials should be found. 67 _, err := s.provider.DetectCredentials() 68 c.Assert(err, jc.Satisfies, errors.IsNotFound) 69 } 70 71 func (s *credentialsSuite) TestDetectCredentialsAccessKeyEnvironmentVariables(c *gc.C) { 72 s.PatchEnvironment("USER", "fred") 73 s.PatchEnvironment("OS_AUTH_VERSION", "2") 74 s.PatchEnvironment("OS_TENANT_NAME", "gary") 75 s.PatchEnvironment("OS_TENANT_ID", "abcd123") 76 s.PatchEnvironment("OS_ACCESS_KEY", "key-id") 77 s.PatchEnvironment("OS_SECRET_KEY", "secret-access-key") 78 s.PatchEnvironment("OS_REGION_NAME", "east") 79 80 credentials, err := s.provider.DetectCredentials() 81 c.Assert(err, jc.ErrorIsNil) 82 c.Assert(credentials.DefaultRegion, gc.Equals, "east") 83 expected := cloud.NewCredential( 84 cloud.AccessKeyAuthType, map[string]string{ 85 "version": "2", 86 "access-key": "key-id", 87 "secret-key": "secret-access-key", 88 "tenant-name": "gary", 89 "tenant-id": "abcd123", 90 }, 91 ) 92 expected.Label = `openstack region "east" project "gary" user "fred"` 93 c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected) 94 } 95 96 func (s *credentialsSuite) TestDetectCredentialsUserPassEnvironmentVariables(c *gc.C) { 97 s.PatchEnvironment("OS_IDENTITY_API_VERSION", "3") 98 s.PatchEnvironment("USER", "fred") 99 s.PatchEnvironment("OS_PROJECT_NAME", "gary") 100 s.PatchEnvironment("OS_PROJECT_ID", "xyz") 101 s.PatchEnvironment("OS_USERNAME", "bob") 102 s.PatchEnvironment("OS_PASSWORD", "dobbs") 103 s.PatchEnvironment("OS_REGION_NAME", "west") 104 s.PatchEnvironment("OS_USER_DOMAIN_NAME", "user-domain") 105 106 credentials, err := s.provider.DetectCredentials() 107 c.Assert(err, jc.ErrorIsNil) 108 c.Assert(credentials.DefaultRegion, gc.Equals, "west") 109 expected := cloud.NewCredential( 110 cloud.UserPassAuthType, map[string]string{ 111 "version": "3", 112 "username": "bob", 113 "password": "dobbs", 114 "tenant-name": "gary", 115 "tenant-id": "xyz", 116 "domain-name": "", 117 "project-domain-name": "", 118 "user-domain-name": "user-domain", 119 }, 120 ) 121 expected.Label = `openstack region "west" project "gary" user "bob"` 122 c.Assert(credentials.AuthCredentials["bob"], jc.DeepEquals, expected) 123 } 124 125 func (s *credentialsSuite) TestDetectCredentialsUserPassDefaultDomain(c *gc.C) { 126 s.PatchEnvironment("OS_AUTH_VERSION", "3") 127 s.PatchEnvironment("USER", "fred") 128 s.PatchEnvironment("OS_PROJECT_NAME", "gary") 129 s.PatchEnvironment("OS_USERNAME", "bob") 130 s.PatchEnvironment("OS_PASSWORD", "dobbs") 131 s.PatchEnvironment("OS_REGION_NAME", "west") 132 s.PatchEnvironment("OS_DEFAULT_DOMAIN_NAME", "default-domain") 133 134 credentials, err := s.provider.DetectCredentials() 135 c.Assert(err, jc.ErrorIsNil) 136 c.Assert(credentials.DefaultRegion, gc.Equals, "west") 137 expected := cloud.NewCredential( 138 cloud.UserPassAuthType, map[string]string{ 139 "version": "3", 140 "username": "bob", 141 "password": "dobbs", 142 "tenant-name": "gary", 143 "tenant-id": "", 144 "domain-name": "", 145 "project-domain-name": "default-domain", 146 "user-domain-name": "default-domain", 147 }, 148 ) 149 expected.Label = `openstack region "west" project "gary" user "bob"` 150 c.Assert(credentials.AuthCredentials["bob"], jc.DeepEquals, expected) 151 } 152 153 func (s *credentialsSuite) TestDetectCredentialsNovarc(c *gc.C) { 154 if runtime.GOOS != "linux" { 155 c.Skip("not running linux") 156 } 157 home := utils.Home() 158 dir := c.MkDir() 159 err := utils.SetHome(dir) 160 c.Assert(err, jc.ErrorIsNil) 161 s.AddCleanup(func(*gc.C) { 162 err := utils.SetHome(home) 163 c.Assert(err, jc.ErrorIsNil) 164 }) 165 166 content := ` 167 # Some secrets 168 export OS_AUTH_VERSION=3 169 export OS_TENANT_NAME=gary 170 export OS_TENANT_ID=xyz 171 EXPORT OS_USERNAME=bob 172 export OS_PASSWORD = dobbs 173 OS_REGION_NAME=region 174 OS_PROJECT_DOMAIN_NAME=project-domain 175 `[1:] 176 novarc := filepath.Join(dir, ".novarc") 177 err = ioutil.WriteFile(novarc, []byte(content), 0600) 178 179 credentials, err := s.provider.DetectCredentials() 180 c.Assert(err, jc.ErrorIsNil) 181 c.Assert(credentials.DefaultRegion, gc.Equals, "region") 182 expected := cloud.NewCredential( 183 cloud.UserPassAuthType, map[string]string{ 184 "version": "3", 185 "username": "bob", 186 "password": "dobbs", 187 "tenant-name": "gary", 188 "tenant-id": "xyz", 189 "domain-name": "", 190 "project-domain-name": "project-domain", 191 "user-domain-name": "", 192 }, 193 ) 194 expected.Label = `openstack region "region" project "gary" user "bob"` 195 c.Assert(credentials.AuthCredentials["bob"], jc.DeepEquals, expected) 196 }