in cmd/hub/api/cloudaccount.go [485:570]
func cloudSpecificCredentials(provider, region string, args []string) (string, map[string]string, error) {
switch provider {
case "aws":
var kind string
credentials := make(map[string]string)
if util.Contains(GovCloudRegions, region) && len(args) >= 1 {
if maybeAwsAccessKey(args[0]) && len(args) >= 2 {
credentials["dnsAccessKey"] = args[0]
credentials["dnsSecretKey"] = args[1]
args = args[2:]
} else {
profile := args[0]
creds, err := awsCredentials(profile)
if err != nil {
return "", nil, err
}
if creds.SessionToken != "" {
return "", nil, fmt.Errorf("AWS credentials retrieved has session token set (profile `%s`)", profile)
}
credentials["dnsAccessKey"] = creds.AccessKeyID
credentials["dnsSecretKey"] = creds.SecretAccessKey
args = args[1:]
}
}
if len(args) == 2 {
kind = "awscar"
credentials["accessKey"] = args[0]
credentials["secretKey"] = args[1]
} else if len(args) == 1 && strings.HasPrefix(args[0], "arn:aws") {
kind = "awsarn"
credentials["roleArn"] = args[0]
} else {
profile := ""
if len(args) == 1 {
profile = args[0]
}
creds, err := awsCredentials(profile)
if err != nil {
return "", nil, err
}
kind = "awscar"
credentials["accessKey"] = creds.AccessKeyID
credentials["secretKey"] = creds.SecretAccessKey
credentials["sessionToken"] = creds.SessionToken
}
return kind, credentials, nil
case "azure", "gcp":
credentialsFile := ""
if len(args) == 1 {
credentialsFile = args[0]
}
if credentialsFile == "" {
if provider == "gcp" {
credentialsFile = config.GcpCredentialsFile
if credentialsFile == "" {
credentialsFile = os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
}
} else if provider == "azure" {
credentialsFile = config.AzureCredentialsFile
if credentialsFile == "" {
credentialsFile = os.Getenv("AZURE_AUTH_LOCATION")
}
}
}
if credentialsFile == "" {
return "", nil, errors.New("No credentials file specified")
}
file, err := os.Open(credentialsFile)
if err != nil {
return "", nil, fmt.Errorf("Unable to open credentials file: %v", err)
}
defer file.Close()
data, err := io.ReadAll(file)
if err != nil {
return "", nil, fmt.Errorf("Unable to read credentials file `%s`: %v", credentialsFile, err)
}
var creds map[string]string
err = json.Unmarshal(data, &creds)
if err != nil {
return "", nil, fmt.Errorf("Unable to unmarshall credentials file `%s`: %v", credentialsFile, err)
}
return provider, creds, nil
}
return "", nil, errors.New("Unknown cloud account provider")
}