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)
}