1package openstack
2
3import (
4	"os"
5
6	"github.com/gophercloud/gophercloud"
7)
8
9var nilOptions = gophercloud.AuthOptions{}
10
11// AuthOptionsFromEnv fills out an identity.AuthOptions structure with the settings found on the various OpenStack
12// OS_* environment variables.  The following variables provide sources of truth: OS_AUTH_URL, OS_USERNAME,
13// OS_PASSWORD, OS_TENANT_ID, and OS_TENANT_NAME.  Of these, OS_USERNAME, OS_PASSWORD, and OS_AUTH_URL must
14// have settings, or an error will result.  OS_TENANT_ID and OS_TENANT_NAME are optional.
15func AuthOptionsFromEnv() (gophercloud.AuthOptions, error) {
16	authURL := os.Getenv("OS_AUTH_URL")
17	username := os.Getenv("OS_USERNAME")
18	userID := os.Getenv("OS_USERID")
19	password := os.Getenv("OS_PASSWORD")
20	tenantID := os.Getenv("OS_TENANT_ID")
21	tenantName := os.Getenv("OS_TENANT_NAME")
22	domainID := os.Getenv("OS_DOMAIN_ID")
23	domainName := os.Getenv("OS_DOMAIN_NAME")
24
25	if authURL == "" {
26		err := gophercloud.ErrMissingInput{Argument: "authURL"}
27		return nilOptions, err
28	}
29
30	if username == "" && userID == "" {
31		err := gophercloud.ErrMissingInput{Argument: "username"}
32		return nilOptions, err
33	}
34
35	if password == "" {
36		err := gophercloud.ErrMissingInput{Argument: "password"}
37		return nilOptions, err
38	}
39
40	ao := gophercloud.AuthOptions{
41		IdentityEndpoint: authURL,
42		UserID:           userID,
43		Username:         username,
44		Password:         password,
45		TenantID:         tenantID,
46		TenantName:       tenantName,
47		DomainID:         domainID,
48		DomainName:       domainName,
49	}
50
51	return ao, nil
52}
53