func (c OpenstackCredentials) detectCredential() (*cloud.Credential, string, string, error) { creds := identity.CredentialsFromEnv() if creds.TenantName == "" { return nil, "", "", errors.NewNotFound(nil, "OS_TENANT_NAME environment variable not set") } if creds.User == "" { return nil, "", "", errors.NewNotFound(nil, "neither OS_USERNAME nor OS_ACCESS_KEY environment variable not set") } if creds.Secrets == "" { return nil, "", "", errors.NewNotFound(nil, "neither OS_PASSWORD nor OS_SECRET_KEY environment variable not set") } user, err := utils.LocalUsername() if err != nil { return nil, "", "", errors.Trace(err) } // If OS_USERNAME or NOVA_USERNAME is set, assume userpass. var credential cloud.Credential if os.Getenv("OS_USERNAME") != "" || os.Getenv("NOVA_USERNAME") != "" { user = creds.User credential = cloud.NewCredential( cloud.UserPassAuthType, map[string]string{ credAttrUserName: creds.User, credAttrPassword: creds.Secrets, credAttrTenantName: creds.TenantName, credAttrDomainName: creds.DomainName, }, ) } else { credential = cloud.NewCredential( cloud.AccessKeyAuthType, map[string]string{ credAttrAccessKey: creds.User, credAttrSecretKey: creds.Secrets, credAttrTenantName: creds.TenantName, }, ) } region := creds.Region if region == "" { region = "<unspecified>" } credential.Label = fmt.Sprintf("openstack region %q project %q user %q", region, creds.TenantName, user) return &credential, user, creds.Region, nil }