-
Notifications
You must be signed in to change notification settings - Fork 927
/
login.go
205 lines (176 loc) · 5.84 KB
/
login.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package helpers
import (
"fmt"
"os"
"strconv"
"strings"
"time"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
. "github.com/onsi/gomega/gexec"
)
// SetAPI sets the API endpoint to the value of the CF_INT_API environment variable,
// or "https://api.bosh-lite.com" if not set. If the SKIP_SSL_VALIDATION environment
// variable is set, it will use the '--skip-ssl-validation' flag. It returns the API
// URL and a boolean indicating if SSL validation was skipped.
func SetAPI() (string, bool) {
apiURL := GetAPI()
skipSSLValidation := SkipSSLValidation()
if skipSSLValidation {
Eventually(CF("api", apiURL, "--skip-ssl-validation")).Should(Exit(0))
} else {
Eventually(CF("api", apiURL)).Should(Exit(0))
}
return apiURL, skipSSLValidation
}
// UnsetAPI unsets the currently set API endpoint for the CLI.
func UnsetAPI() {
Eventually(CF("api", "--unset")).Should(Exit(0))
}
func SkipSSLValidation() bool {
if skip, err := strconv.ParseBool(os.Getenv("SKIP_SSL_VALIDATION")); err == nil && !skip {
return false
}
return true
}
// GetAPI gets the value of the CF_INT_API environment variable, if set, and prefixes
// it with "https://" if the value doesn't already start with "http". If the variable
// is not set, returns "https://api.bosh-lite.com".
func GetAPI() string {
apiURL := os.Getenv("CF_INT_API")
if apiURL == "" {
return "https://api.bosh-lite.com"
}
if !strings.HasPrefix(apiURL, "http") {
apiURL = fmt.Sprintf("https://%s", apiURL)
}
return apiURL
}
// LoginAs logs in to the CLI with 'cf auth' and the given username and password,
// retrying up to 3 times on failures.
func LoginAs(username, password string) {
env := map[string]string{
"CF_USERNAME": username,
"CF_PASSWORD": password,
}
var session *Session
for i := 0; i < 3; i++ {
session = CFWithEnv(env, "auth")
Eventually(session).Should(Exit())
if session.ExitCode() == 0 {
return
}
time.Sleep(3 * time.Second)
}
Expect(session.ExitCode()).To(Equal(0))
}
// LoginCF logs in to the CLI using the username and password from the CF_INT_USERNAME
// and CF_INT_PASSWORD environment variables, respectively, defaulting to "admin" for
// each if either is not set.
func LoginCF() string {
if ClientCredentialsTestMode() {
return LoginCFWithClientCredentials()
}
username, password := GetCredentials()
LoginAs(username, password)
return username
}
// LoginCFWithClientCredentials logs in to the CLI using client credentials from the CF_INT_CLIENT_ID and
// CF_INT_CLIENT_SECRET environment variables and returns the client ID. If these environment variables
// are not set, it skips the current test.
func LoginCFWithClientCredentials() string {
username, password := SkipIfClientCredentialsNotSet()
env := map[string]string{
"CF_USERNAME": username,
"CF_PASSWORD": password,
}
Eventually(CFWithEnv(env, "auth", "--client-credentials")).Should(Exit(0))
return username
}
// GetCredentials returns back the credentials for the user or client to authenticate with Cloud Foundry.
func GetCredentials() (string, string) {
if ClientCredentialsTestMode() {
return SkipIfClientCredentialsNotSet()
}
username := os.Getenv("CF_INT_USERNAME")
if username == "" {
username = "admin"
}
password := os.Getenv("CF_INT_PASSWORD")
if password == "" {
password = "admin"
}
return username, password
}
// SkipIfOIDCCredentialsNotSet returns back the username and the password for
// OIDC origin, or skips the test if those values are not set.
func SkipIfOIDCCredentialsNotSet() (string, string) {
oidcUsername := os.Getenv("CF_INT_OIDC_USERNAME")
oidcPassword := os.Getenv("CF_INT_OIDC_PASSWORD")
if oidcUsername == "" || oidcPassword == "" {
Skip("CF_INT_OIDC_USERNAME or CF_INT_OIDC_PASSWORD is not set")
}
return oidcUsername, oidcPassword
}
// LogoutCF logs out of the CLI.
func LogoutCF() {
Eventually(CF("logout")).Should(Exit(0))
}
// TargetOrgAndSpace targets the given org and space with 'cf target'.
func TargetOrgAndSpace(org string, space string) {
Eventually(CF("target", "-o", org, "-s", space)).Should(Exit(0))
}
// TargetOrg targets the given org with 'cf target'.
func TargetOrg(org string) {
Eventually(CF("target", "-o", org)).Should(Exit(0))
}
// ClearTarget logs out and logs back in to the CLI using LogoutCF and LoginCF.
func ClearTarget() {
LogoutCF()
LoginCF()
}
// SetupCF logs in to the CLI with LoginCF, creates the given org and space, and targets that
// org and space.
func SetupCF(org string, space string) {
LoginCF()
CreateOrgAndSpace(org, space)
TargetOrgAndSpace(org, space)
}
// SetupCFWithOrgOnly logs in to the CLI with LoginCF, creates the given org, and targets it.
func SetupCFWithOrgOnly(org string) {
LoginCF()
CreateOrg(org)
TargetOrg(org)
}
// SetupCFWithGeneratedOrgAndSpaceNames logs in to the CLI with LoginCF, creates the org and
// space with generated names, and targets that org and space. Returns the generated org so
// that it can be deleted easily in cleanup step of the test.
func SetupCFWithGeneratedOrgAndSpaceNames() string {
org := NewOrgName()
space := NewSpaceName()
SetupCF(org, space)
return org
}
// SwitchToNoRole logs out of the CLI and logs back in as a newly-created user without a role.
func SwitchToNoRole() string {
username, password := CreateUser()
LogoutCF()
LoginAs(username, password)
return username
}
// SwitchToOrgRole logs out of the CLI and logs back in as a newly-created user with the given
// org role in the given org.
func SwitchToOrgRole(org, role string) string {
username, password := CreateUserInOrgRole(org, role)
LogoutCF()
LoginAs(username, password)
return username
}
// SwitchToSpaceRole logs out of the CLI and logs back in as a newly-created user with the given
// space role in the given space and org.
func SwitchToSpaceRole(org, space, role string) string {
username, password := CreateUserInSpaceRole(org, space, role)
LogoutCF()
LoginAs(username, password)
return username
}