func main()

in cmd/client-keystone-auth/main.go [139:238]


func main() {
	// Glog requires this otherwise it complains.
	flag.CommandLine.Parse(nil)
	// This is a temporary hack to enable proper logging until upstream dependencies
	// are migrated to fully utilize klog instead of glog.
	klogFlags := flag.NewFlagSet("klog", flag.ExitOnError)
	klog.InitFlags(klogFlags)

	// Sync the glog and klog flags.
	flag.CommandLine.VisitAll(func(f1 *flag.Flag) {
		f2 := klogFlags.Lookup(f1.Name)
		if f2 != nil {
			value := f1.Value.String()
			f2.Value.Set(value)
		}
	})

	var url string
	var domain string
	var user string
	var project string
	var password string
	var clientCertPath string
	var clientKeyPath string
	var clientCAPath string
	var options keystone.Options
	var err error
	var applicationCredentialID string
	var applicationCredentialName string
	var applicationCredentialSecret string

	pflag.StringVar(&url, "keystone-url", os.Getenv("OS_AUTH_URL"), "URL for the OpenStack Keystone API")
	pflag.StringVar(&domain, "domain-name", os.Getenv("OS_DOMAIN_NAME"), "Keystone domain name")
	pflag.StringVar(&user, "user-name", os.Getenv("OS_USERNAME"), "User name")
	pflag.StringVar(&project, "project-name", os.Getenv("OS_PROJECT_NAME"), "Keystone project name")
	pflag.StringVar(&password, "password", os.Getenv("OS_PASSWORD"), "Password")
	pflag.StringVar(&clientCertPath, "cert", os.Getenv("OS_CERT"), "Client certificate bundle file")
	pflag.StringVar(&clientKeyPath, "key", os.Getenv("OS_KEY"), "Client certificate key file")
	pflag.StringVar(&clientCAPath, "cacert", os.Getenv("OS_CACERT"), "Certificate authority file")
	pflag.StringVar(&applicationCredentialID, "application-credential-id", os.Getenv("OS_APPLICATION_CREDENTIAL_ID"), "Application Credential ID")
	pflag.StringVar(&applicationCredentialName, "application-credential-name", os.Getenv("OS_APPLICATION_CREDENTIAL_NAME"), "Application Credential Name")
	pflag.StringVar(&applicationCredentialSecret, "application-credential-secret", os.Getenv("OS_APPLICATION_CREDENTIAL_SECRET"), "Application Credential Secret")

	logs.AddFlags(pflag.CommandLine)
	logs.InitLogs()
	defer logs.FlushLogs()

	pflag.CommandLine.AddGoFlagSet(klogFlags)
	kflag.InitFlags()

	// Generate Gophercloud Auth Options based on input data from stdin
	// if IsTerminal returns "true", or from env variables otherwise.
	if !terminal.IsTerminal(int(os.Stdin.Fd())) {
		// If all requiered arguments are set use them
		if argumentsAreSet(url, user, project, password, domain, applicationCredentialID, applicationCredentialName, applicationCredentialSecret) {
			options.AuthOptions = gophercloud.AuthOptions{
				IdentityEndpoint:            url,
				Username:                    user,
				TenantName:                  project,
				Password:                    password,
				DomainName:                  domain,
				ApplicationCredentialID:     applicationCredentialID,
				ApplicationCredentialName:   applicationCredentialName,
				ApplicationCredentialSecret: applicationCredentialSecret,
			}
		} else {
			// Use environment variables if arguments are missing
			authOpts, err := clientconfig.AuthOptions(nil)
			if err != nil {
				fmt.Fprintf(os.Stderr, "Failed to read openstack env vars: %s\n", err)
				os.Exit(1)
			}
			options.AuthOptions = *authOpts
		}
	} else {
		options.AuthOptions, err = prompt(url, domain, user, project, password, applicationCredentialID, applicationCredentialName, applicationCredentialSecret)
		if err != nil {
			fmt.Fprintf(os.Stderr, "Failed to read data from console: %s\n", err)
			os.Exit(1)
		}
	}

	options.ClientCertPath = clientCertPath
	options.ClientKeyPath = clientKeyPath
	options.ClientCAPath = clientCAPath

	token, err := keystone.GetToken(options)
	if err != nil {
		if _, ok := err.(gophercloud.ErrDefault401); ok {
			fmt.Println(errRespTemplate)
			os.Stderr.WriteString("Invalid user credentials were provided\n")
			os.Exit(0)
		}
		fmt.Fprintf(os.Stderr, "An error occurred: %v\n", err)
		os.Exit(1)
	}

	out := fmt.Sprintf(respTemplate, token.ID, token.ExpiresAt.Format(time.RFC3339Nano))
	fmt.Println(out)
}