6 "github.com/gophercloud/gophercloud"
9 var nilOptions = gophercloud.AuthOptions{}
12 AuthOptionsFromEnv fills out an identity.AuthOptions structure with the
13 settings found on the various OpenStack OS_* environment variables.
15 The following variables provide sources of truth: OS_AUTH_URL, OS_USERNAME,
16 OS_PASSWORD and OS_PROJECT_ID.
18 Of these, OS_USERNAME, OS_PASSWORD, and OS_AUTH_URL must have settings,
19 or an error will result. OS_PROJECT_ID, is optional.
21 OS_TENANT_ID and OS_TENANT_NAME are deprecated forms of OS_PROJECT_ID and
22 OS_PROJECT_NAME and the latter are expected against a v3 auth api.
24 If OS_PROJECT_ID and OS_PROJECT_NAME are set, they will still be referred
25 as "tenant" in Gophercloud.
27 If OS_PROJECT_NAME is set, it requires OS_PROJECT_ID to be set as well to
28 handle projects not on the default domain.
30 To use this function, first set the OS_* environment variables (for example,
31 by sourcing an `openrc` file), then:
33 opts, err := openstack.AuthOptionsFromEnv()
34 provider, err := openstack.AuthenticatedClient(opts)
36 func AuthOptionsFromEnv() (gophercloud.AuthOptions, error) {
37 authURL := os.Getenv("OS_AUTH_URL")
38 username := os.Getenv("OS_USERNAME")
39 userID := os.Getenv("OS_USERID")
40 password := os.Getenv("OS_PASSWORD")
41 tenantID := os.Getenv("OS_TENANT_ID")
42 tenantName := os.Getenv("OS_TENANT_NAME")
43 domainID := os.Getenv("OS_DOMAIN_ID")
44 domainName := os.Getenv("OS_DOMAIN_NAME")
45 applicationCredentialID := os.Getenv("OS_APPLICATION_CREDENTIAL_ID")
46 applicationCredentialName := os.Getenv("OS_APPLICATION_CREDENTIAL_NAME")
47 applicationCredentialSecret := os.Getenv("OS_APPLICATION_CREDENTIAL_SECRET")
49 // If OS_PROJECT_ID is set, overwrite tenantID with the value.
50 if v := os.Getenv("OS_PROJECT_ID"); v != "" {
54 // If OS_PROJECT_NAME is set, overwrite tenantName with the value.
55 if v := os.Getenv("OS_PROJECT_NAME"); v != "" {
60 err := gophercloud.ErrMissingEnvironmentVariable{
61 EnvironmentVariable: "OS_AUTH_URL",
63 return nilOptions, err
66 if userID == "" && username == "" {
67 // Empty username and userID could be ignored, when applicationCredentialID and applicationCredentialSecret are set
68 if applicationCredentialID == "" && applicationCredentialSecret == "" {
69 err := gophercloud.ErrMissingAnyoneOfEnvironmentVariables{
70 EnvironmentVariables: []string{"OS_USERID", "OS_USERNAME"},
72 return nilOptions, err
76 if password == "" && applicationCredentialID == "" && applicationCredentialName == "" {
77 err := gophercloud.ErrMissingEnvironmentVariable{
78 EnvironmentVariable: "OS_PASSWORD",
80 return nilOptions, err
83 if (applicationCredentialID != "" || applicationCredentialName != "") && applicationCredentialSecret == "" {
84 err := gophercloud.ErrMissingEnvironmentVariable{
85 EnvironmentVariable: "OS_APPLICATION_CREDENTIAL_SECRET",
87 return nilOptions, err
90 if domainID == "" && domainName == "" && tenantID == "" && tenantName != "" {
91 err := gophercloud.ErrMissingEnvironmentVariable{
92 EnvironmentVariable: "OS_PROJECT_ID",
94 return nilOptions, err
97 if applicationCredentialID == "" && applicationCredentialName != "" && applicationCredentialSecret != "" {
98 if userID == "" && username == "" {
99 return nilOptions, gophercloud.ErrMissingAnyoneOfEnvironmentVariables{
100 EnvironmentVariables: []string{"OS_USERID", "OS_USERNAME"},
103 if username != "" && domainID == "" && domainName == "" {
104 return nilOptions, gophercloud.ErrMissingAnyoneOfEnvironmentVariables{
105 EnvironmentVariables: []string{"OS_DOMAIN_ID", "OS_DOMAIN_NAME"},
110 ao := gophercloud.AuthOptions{
111 IdentityEndpoint: authURL,
116 TenantName: tenantName,
118 DomainName: domainName,
119 ApplicationCredentialID: applicationCredentialID,
120 ApplicationCredentialName: applicationCredentialName,
121 ApplicationCredentialSecret: applicationCredentialSecret,