func getParameter()

in cmd/hub/api/parameter.go [96:194]


func getParameter(resource string, parameters []Parameter, name, component string) (bool, string, error) {
	var param *Parameter
	if component != "" {
		for i, p := range parameters {
			if name == p.Name && component == p.Component {
				param = &parameters[i]
			}
		}
	}
	if param == nil {
		for i, p := range parameters {
			if name == p.Name {
				param = &parameters[i]
			}
		}
	}
	if param != nil {
		switch param.Kind {

		case "secret":
			reallySecretRef := ""
			secretKind := ""
			if maybeMap, ok := param.Value.(map[string]interface{}); ok {
				if maybeSecretRef, ok := maybeMap["secret"]; ok {
					if secretRef, ok := maybeSecretRef.(string); ok {
						reallySecretRef = secretRef
						if maybeKind, ok := maybeMap["kind"]; ok {
							if kind, ok := maybeKind.(string); ok {
								secretKind = kind
							}
						}
					}
				}
			} else if secretRef, ok := param.Value.(string); ok {
				reallySecretRef = secretRef
			}
			if reallySecretRef != "" {
				s, err := secret(resource, reallySecretRef)
				if err != nil {
					return false, "", err
				}
				if kind, ok := s["kind"]; ok {
					if secretKind != "" && kind != secretKind {
						util.Warn("Secret `%s` kind `%s` doesn't match kind `%s` stored in Secrets Service",
							name, secretKind, kind)
					}
					switch kind {
					case "text", "password", "certificate", "sshKey", "privateKey",
						"token", "bearerToken", "accessToken", "refreshToken", "loginToken":
						return true, s[kind], nil
					case "license":
						return true, s["licenseKey"], nil
					case "gitAccessToken": // legacy
						return true, s["loginToken"], nil
					case "usernamePassword":
						return true, fmt.Sprintf("%s/%s", s["username"], s["password"]), nil
					case "cloudAccessKeys":
						return true, fmt.Sprintf("%s:%s", s["accessKey"], s["secretKey"]), nil
					case "cloudAccount":
						return true, fmt.Sprintf("%s/%s", s["roleArn"], s["externalId"]), nil
					}
				}
			}
			return false, "", fmt.Errorf("Unable to retrieve secret `%s`: `%+v` is not a known secret reference",
				name, param.Value)

		case "license":
			if id, ok := param.Value.(string); ok && id != "" {
				l, err := license(id)
				if err != nil {
					return false, "", err
				}
				return true, l.LicenseKey, nil
			}
			return false, "", fmt.Errorf("Unable to retrieve license `%s`: `%+v` is not a license reference",
				name, param.Value)

		default:
			if param.Value == nil {
				return false, "", fmt.Errorf("Unable to retrieve parameter `%s`: `value` not set", name)
			}
			if scalar, ok := param.Value.(string); ok {
				return true, scalar, nil
			}
			if scalar, ok := param.Value.(bool); ok {
				return true, strconv.FormatBool(scalar), nil
			}
			if scalar, ok := param.Value.(int64); ok {
				return true, strconv.FormatInt(scalar, 10), nil
			}
			if scalar, ok := param.Value.(float64); ok {
				return true, strconv.FormatFloat(scalar, 'f', -1, 64), nil
			}
			return false, "", fmt.Errorf("Unable to retrieve parameter `%s`: `%+v` is not a plain scalar value",
				name, param.Value)
		}
	}
	return false, "", nil
}