func FetchEnvVar()

in pkg/seata/fetchers.go [13:70]


func FetchEnvVar(ctx context.Context, c client.Client, cr *seatav1alpha1.SeataServer, envVar v1.EnvVar) (string, error) {
	if envVar.ValueFrom == nil {
		return envVar.Value, nil
	}

	// Inspired by kubelet#makeEnvironmentVariables, determine the final values of variables.
	// See https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet_pods.go#L694-L806
	var result string
	switch {
	case envVar.ValueFrom.ConfigMapKeyRef != nil:
		cm := envVar.ValueFrom.ConfigMapKeyRef
		name := cm.Name
		key := cm.Key
		optional := cm.Optional != nil && *cm.Optional

		configMap := &v1.ConfigMap{}
		err := c.Get(ctx, types.NamespacedName{Name: name, Namespace: cr.Namespace}, configMap)
		if err != nil {
			if errors.IsNotFound(err) && optional {
				// ignore error when marked optional
				return result, nil
			}
			return result, err
		}
		runtimeVal, ok := configMap.Data[key]
		if !ok {
			if optional {
				return result, nil
			}
			return result, fmt.Errorf("couldn't find key %v in ConfigMap %v/%v", key, cr.Namespace, name)
		}
		result = runtimeVal
	case envVar.ValueFrom.SecretKeyRef != nil:
		s := envVar.ValueFrom.SecretKeyRef
		name := s.Name
		key := s.Key
		optional := s.Optional != nil && *s.Optional
		secret := &v1.Secret{}
		err := c.Get(ctx, types.NamespacedName{Name: name, Namespace: cr.Namespace}, secret)
		if err != nil {
			if errors.IsNotFound(err) && optional {
				// ignore error when marked optional
				return result, nil
			}
			return result, err
		}
		runtimeValBytes, ok := secret.Data[key]
		if !ok {
			if optional {
				return result, nil
			}
			return result, fmt.Errorf("couldn't find key %v in Secret %v/%v", key, cr.Namespace, name)
		}
		runtimeVal := string(runtimeValBytes)
		result = runtimeVal
	}
	return result, nil
}