~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/provider/gce/credentials_test.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2016 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package gce_test
 
5
 
 
6
import (
 
7
        "io/ioutil"
 
8
        "os"
 
9
        "path/filepath"
 
10
        "runtime"
 
11
 
 
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
        "github.com/juju/juju/provider/gce/google"
 
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("gce")
 
35
        c.Assert(err, jc.ErrorIsNil)
 
36
}
 
37
 
 
38
func (s *credentialsSuite) TestCredentialSchemas(c *gc.C) {
 
39
        envtesting.AssertProviderAuthTypes(c, s.provider, "oauth2", "jsonfile")
 
40
}
 
41
 
 
42
var sampleCredentialAttributes = map[string]string{
 
43
        "GCE_CLIENT_ID":    "123",
 
44
        "GCE_CLIENT_EMAIL": "test@example.com",
 
45
        "GCE_PROJECT_ID":   "fourfivesix",
 
46
        "GCE_PRIVATE_KEY":  "sewen",
 
47
}
 
48
 
 
49
func (s *credentialsSuite) TestOAuth2CredentialsValid(c *gc.C) {
 
50
        envtesting.AssertProviderCredentialsValid(c, s.provider, "oauth2", map[string]string{
 
51
                "client-id":    "123",
 
52
                "client-email": "test@example.com",
 
53
                "project-id":   "fourfivesix",
 
54
                "private-key":  "sewen",
 
55
        })
 
56
}
 
57
 
 
58
func (s *credentialsSuite) TestOAuth2HiddenAttributes(c *gc.C) {
 
59
        envtesting.AssertProviderCredentialsAttributesHidden(c, s.provider, "oauth2", "private-key")
 
60
}
 
61
 
 
62
func (s *credentialsSuite) TestJSONFileCredentialsValid(c *gc.C) {
 
63
        dir := c.MkDir()
 
64
        filename := filepath.Join(dir, "somefile")
 
65
        err := ioutil.WriteFile(filename, []byte("contents"), 0600)
 
66
        c.Assert(err, jc.ErrorIsNil)
 
67
        envtesting.AssertProviderCredentialsValid(c, s.provider, "jsonfile", map[string]string{
 
68
                // For now at least, the contents of the file are not validated
 
69
                // by the credentials schema. That is left to the provider.
 
70
                // The file does need to be an absolute path though and exist.
 
71
                "file": filename,
 
72
        })
 
73
}
 
74
 
 
75
func createCredsFile(c *gc.C, path string) string {
 
76
        if path == "" {
 
77
                dir := c.MkDir()
 
78
                path = filepath.Join(dir, "creds.json")
 
79
        }
 
80
        creds, err := google.NewCredentials(sampleCredentialAttributes)
 
81
        c.Assert(err, jc.ErrorIsNil)
 
82
        err = ioutil.WriteFile(path, creds.JSONKey, 0644)
 
83
        c.Assert(err, jc.ErrorIsNil)
 
84
        return path
 
85
}
 
86
 
 
87
func (s *credentialsSuite) TestDetectCredentialsFromEnvVar(c *gc.C) {
 
88
        jsonpath := createCredsFile(c, "")
 
89
        s.PatchEnvironment("USER", "fred")
 
90
        s.PatchEnvironment("GOOGLE_APPLICATION_CREDENTIALS", jsonpath)
 
91
        s.PatchEnvironment("CLOUDSDK_COMPUTE_REGION", "region")
 
92
        credentials, err := s.provider.DetectCredentials()
 
93
        c.Assert(err, jc.ErrorIsNil)
 
94
        c.Assert(credentials.DefaultRegion, gc.Equals, "region")
 
95
        expected := cloud.NewCredential(cloud.JSONFileAuthType, map[string]string{"file": jsonpath})
 
96
        expected.Label = `google credential "test@example.com"`
 
97
        c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected)
 
98
}
 
99
 
 
100
func (s *credentialsSuite) assertDetectCredentialsKnownLocation(c *gc.C, jsonpath string) {
 
101
        s.PatchEnvironment("USER", "fred")
 
102
        s.PatchEnvironment("CLOUDSDK_COMPUTE_REGION", "region")
 
103
        credentials, err := s.provider.DetectCredentials()
 
104
        c.Assert(err, jc.ErrorIsNil)
 
105
        c.Assert(credentials.DefaultRegion, gc.Equals, "region")
 
106
        expected := cloud.NewCredential(cloud.JSONFileAuthType, map[string]string{"file": jsonpath})
 
107
        expected.Label = `google credential "test@example.com"`
 
108
        c.Assert(credentials.AuthCredentials["fred"], jc.DeepEquals, expected)
 
109
}
 
110
 
 
111
func (s *credentialsSuite) TestDetectCredentialsKnownLocationUnix(c *gc.C) {
 
112
        if runtime.GOOS == "windows" {
 
113
                c.Skip("skipping on Windows")
 
114
        }
 
115
        home := utils.Home()
 
116
        dir := c.MkDir()
 
117
        err := utils.SetHome(dir)
 
118
        c.Assert(err, jc.ErrorIsNil)
 
119
        s.AddCleanup(func(*gc.C) {
 
120
                err := utils.SetHome(home)
 
121
                c.Assert(err, jc.ErrorIsNil)
 
122
        })
 
123
        path := filepath.Join(dir, ".config", "gcloud")
 
124
        err = os.MkdirAll(path, 0700)
 
125
        c.Assert(err, jc.ErrorIsNil)
 
126
        jsonpath := createCredsFile(c, filepath.Join(path, "application_default_credentials.json"))
 
127
        s.assertDetectCredentialsKnownLocation(c, jsonpath)
 
128
}
 
129
 
 
130
func (s *credentialsSuite) TestDetectCredentialsKnownLocationWindows(c *gc.C) {
 
131
        if runtime.GOOS != "windows" {
 
132
                c.Skip("skipping on non-Windows platform")
 
133
        }
 
134
        dir := c.MkDir()
 
135
        s.PatchEnvironment("APPDATA", dir)
 
136
        path := filepath.Join(dir, "gcloud")
 
137
        err := os.MkdirAll(path, 0700)
 
138
        c.Assert(err, jc.ErrorIsNil)
 
139
        jsonpath := createCredsFile(c, filepath.Join(path, "application_default_credentials.json"))
 
140
        s.assertDetectCredentialsKnownLocation(c, jsonpath)
 
141
}