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  }