github.com/rancher/types@v0.0.0-20220328215343-4370ff10ecd5/mapper/env.go (about)

     1  package mapper
     2  
     3  import (
     4  	"sort"
     5  
     6  	"github.com/rancher/norman/types"
     7  	"github.com/rancher/norman/types/convert"
     8  	"k8s.io/api/core/v1"
     9  )
    10  
    11  type EnvironmentMapper struct {
    12  }
    13  
    14  func (e EnvironmentMapper) FromInternal(data map[string]interface{}) {
    15  	var env []v1.EnvVar
    16  	var envFrom []v1.EnvFromSource
    17  
    18  	envMap := map[string]interface{}{}
    19  	var envFromMaps []interface{}
    20  
    21  	if err := convert.ToObj(data["env"], &env); err == nil {
    22  		for _, envVar := range env {
    23  			if envVar.ValueFrom == nil {
    24  				envMap[envVar.Name] = envVar.Value
    25  				continue
    26  			}
    27  
    28  			if envVar.ValueFrom.FieldRef != nil {
    29  				envFromMaps = append(envFromMaps, map[string]interface{}{
    30  					"source":     "field",
    31  					"sourceName": envVar.ValueFrom.FieldRef.FieldPath,
    32  					"targetKey":  envVar.Name,
    33  				})
    34  			}
    35  			if envVar.ValueFrom.ResourceFieldRef != nil {
    36  				envFromMaps = append(envFromMaps, map[string]interface{}{
    37  					"source":     "resource",
    38  					"sourceName": envVar.ValueFrom.ResourceFieldRef.ContainerName,
    39  					"sourceKey":  envVar.ValueFrom.ResourceFieldRef.Resource,
    40  					"divisor":    envVar.ValueFrom.ResourceFieldRef.Divisor,
    41  					"targetKey":  envVar.Name,
    42  				})
    43  			}
    44  			if envVar.ValueFrom.ConfigMapKeyRef != nil {
    45  				envFromMaps = append(envFromMaps, map[string]interface{}{
    46  					"source":     "configMap",
    47  					"sourceName": envVar.ValueFrom.ConfigMapKeyRef.Name,
    48  					"sourceKey":  envVar.ValueFrom.ConfigMapKeyRef.Key,
    49  					"optional":   getValue(envVar.ValueFrom.ConfigMapKeyRef.Optional),
    50  					"targetKey":  envVar.Name,
    51  				})
    52  			}
    53  			if envVar.ValueFrom.SecretKeyRef != nil {
    54  				envFromMaps = append(envFromMaps, map[string]interface{}{
    55  					"source":     "secret",
    56  					"sourceName": envVar.ValueFrom.SecretKeyRef.Name,
    57  					"sourceKey":  envVar.ValueFrom.SecretKeyRef.Key,
    58  					"optional":   getValue(envVar.ValueFrom.SecretKeyRef.Optional),
    59  					"targetKey":  envVar.Name,
    60  				})
    61  			}
    62  		}
    63  	}
    64  
    65  	if err := convert.ToObj(data["envFrom"], &envFrom); err == nil {
    66  		for _, envVar := range envFrom {
    67  			if envVar.SecretRef != nil {
    68  				envFromMaps = append(envFromMaps, map[string]interface{}{
    69  					"source":     "secret",
    70  					"sourceName": envVar.SecretRef.Name,
    71  					"prefix":     envVar.Prefix,
    72  					"optional":   getValue(envVar.SecretRef.Optional),
    73  					"type":       "/v3/project/schemas/environmentFrom",
    74  				})
    75  			}
    76  			if envVar.ConfigMapRef != nil {
    77  				envFromMaps = append(envFromMaps, map[string]interface{}{
    78  					"source":     "configMap",
    79  					"sourceName": envVar.ConfigMapRef.Name,
    80  					"prefix":     envVar.Prefix,
    81  					"optional":   getValue(envVar.ConfigMapRef.Optional),
    82  					"type":       "/v3/project/schemas/environmentFrom",
    83  				})
    84  			}
    85  		}
    86  	}
    87  
    88  	delete(data, "env")
    89  	delete(data, "envFrom")
    90  
    91  	if len(envMap) > 0 {
    92  		data["environment"] = envMap
    93  	}
    94  	if len(envFromMaps) > 0 {
    95  		data["environmentFrom"] = envFromMaps
    96  	}
    97  }
    98  
    99  func (e EnvironmentMapper) ToInternal(data map[string]interface{}) error {
   100  	var envVar []map[string]interface{}
   101  	var envVarFrom []map[string]interface{}
   102  
   103  	var orderedKeys []string
   104  	environment := convert.ToMapInterface(data["environment"])
   105  	for k := range environment {
   106  		orderedKeys = append(orderedKeys, k)
   107  	}
   108  	sort.Strings(orderedKeys)
   109  	for _, key := range orderedKeys {
   110  		envVar = append(envVar, map[string]interface{}{
   111  			"name":  key,
   112  			"value": environment[key],
   113  		})
   114  	}
   115  
   116  	for _, value := range convert.ToMapSlice(data["environmentFrom"]) {
   117  		source := convert.ToString(value["source"])
   118  		if source == "" {
   119  			continue
   120  		}
   121  
   122  		targetKey := convert.ToString(value["targetKey"])
   123  		sourceKey := convert.ToString(value["sourceKey"])
   124  		if targetKey == "" && sourceKey == "" {
   125  			switch source {
   126  			case "secret":
   127  				envVarFrom = append(envVarFrom, map[string]interface{}{
   128  					"prefix": value["prefix"],
   129  					"secretRef": map[string]interface{}{
   130  						"name":     value["sourceName"],
   131  						"optional": value["optional"],
   132  					},
   133  				})
   134  			case "configMap":
   135  				envVarFrom = append(envVarFrom, map[string]interface{}{
   136  					"prefix": value["prefix"],
   137  					"configMapRef": map[string]interface{}{
   138  						"name":     value["sourceName"],
   139  						"optional": value["optional"],
   140  					},
   141  				})
   142  			}
   143  		} else {
   144  			if targetKey == "" {
   145  				targetKey = sourceKey
   146  			}
   147  			switch source {
   148  			case "field":
   149  				envVar = append(envVar, map[string]interface{}{
   150  					"name": targetKey,
   151  					"valueFrom": map[string]interface{}{
   152  						"fieldRef": map[string]interface{}{
   153  							"fieldPath": value["sourceName"],
   154  						},
   155  					},
   156  				})
   157  			case "resource":
   158  				envVar = append(envVar, map[string]interface{}{
   159  					"name": targetKey,
   160  					"valueFrom": map[string]interface{}{
   161  						"resourceFieldRef": map[string]interface{}{
   162  							"containerName": value["sourceName"],
   163  							"resource":      value["sourceKey"],
   164  							"divisor":       value["divisor"],
   165  						},
   166  					},
   167  				})
   168  			case "configMap":
   169  				envVar = append(envVar, map[string]interface{}{
   170  					"name": targetKey,
   171  					"valueFrom": map[string]interface{}{
   172  						"configMapKeyRef": map[string]interface{}{
   173  							"name":     value["sourceName"],
   174  							"key":      value["sourceKey"],
   175  							"optional": value["optional"],
   176  						},
   177  					},
   178  				})
   179  			case "secret":
   180  				envVar = append(envVar, map[string]interface{}{
   181  					"name": targetKey,
   182  					"valueFrom": map[string]interface{}{
   183  						"secretKeyRef": map[string]interface{}{
   184  							"name":     value["sourceName"],
   185  							"key":      value["sourceKey"],
   186  							"optional": value["optional"],
   187  						},
   188  					},
   189  				})
   190  			}
   191  		}
   192  	}
   193  
   194  	delete(data, "environment")
   195  	delete(data, "environmentFrom")
   196  	data["env"] = envVar
   197  	data["envFrom"] = envVarFrom
   198  
   199  	return nil
   200  }
   201  
   202  func (e EnvironmentMapper) ModifySchema(schema *types.Schema, schemas *types.Schemas) error {
   203  	delete(schema.ResourceFields, "env")
   204  	delete(schema.ResourceFields, "envFrom")
   205  	return nil
   206  }
   207  
   208  func getValue(optional *bool) bool {
   209  	if optional != nil {
   210  		return *optional
   211  	}
   212  	return false
   213  }