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 }