1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package servicemappingloader
16
17 import (
18 "fmt"
19 "io"
20 "path"
21 "sort"
22 "strings"
23
24 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/apis/core/v1alpha1"
25 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/deepcopy"
26 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/k8s"
27 "github.com/GoogleCloudPlatform/k8s-config-connector/scripts/resource-autogen/allowlist"
28 generatedembed "github.com/GoogleCloudPlatform/k8s-config-connector/scripts/resource-autogen/servicemapping/embed/generated"
29
30 "github.com/ghodss/yaml"
31 )
32
33 var emptyIAMConfig v1alpha1.IAMConfig
34
35 func GetServiceMappingMap() (map[string]v1alpha1.ServiceMapping, error) {
36 generatedSMMap, err := GetGeneratedSMMap()
37 if err != nil {
38 return nil, fmt.Errorf("error getting all the generated ServiceMapping map: %w", err)
39 }
40 return getAllowlistedSMMap(generatedSMMap)
41 }
42
43 func GetGeneratedSMMap() (map[string]v1alpha1.ServiceMapping, error) {
44 baseDirName := "/"
45 generatedSMDir, err := generatedembed.Assets.Open(baseDirName)
46 if err != nil {
47 return nil, fmt.Errorf("error reading generated files in ServiceMapping directory: %v", err)
48 }
49 defer generatedSMDir.Close()
50 generatedFiles, err := generatedSMDir.Readdir(0)
51 if err != nil {
52 return nil, fmt.Errorf("error reading generated files in ServiceMapping directory: %v", err)
53 }
54
55 serviceMappings := make(map[string]v1alpha1.ServiceMapping)
56 for _, file := range generatedFiles {
57 smPath := path.Join(baseDirName, file.Name())
58 sm, err := fileToServiceMapping(smPath)
59 if err != nil {
60 return nil, err
61 }
62 serviceMappings[sm.Name] = *sm
63 }
64 return serviceMappings, nil
65 }
66
67 func getAllowlistedSMMap(generatedSMMap map[string]v1alpha1.ServiceMapping) (map[string]v1alpha1.ServiceMapping, error) {
68 autoGenAllowlist, err := allowlist.LoadAutoGenAllowList(generatedSMMap)
69 if err != nil {
70 return nil, err
71 }
72
73 allowlistedSMMap := make(map[string]v1alpha1.ServiceMapping)
74 for _, sm := range generatedSMMap {
75 if !autoGenAllowlist.HasService(strings.ToLower(sm.Spec.Name)) {
76 continue
77 }
78
79 allowlistedSM := deepcopy.DeepCopy(sm).(v1alpha1.ServiceMapping)
80 rcList := []v1alpha1.ResourceConfig{}
81 for _, rc := range sm.Spec.Resources {
82 autoGenType, ok := autoGenAllowlist.GetTFTypeInService(strings.ToLower(sm.Spec.Name), rc.Name)
83 if !ok {
84 continue
85 }
86
87 rc.Version = &autoGenType.Version
88 allowlistedRC := deepcopy.DeepCopy(rc).(v1alpha1.ResourceConfig)
89
90 if autoGenType.Version == k8s.KCCAPIVersionV1Alpha1 {
91 allowlistedRC.IAMConfig = emptyIAMConfig
92 }
93
94
95 var resourceReferences []v1alpha1.ReferenceConfig
96 for _, rr := range allowlistedRC.ResourceReferences {
97 autoGenType, ok := autoGenAllowlist.GetKRMKind(rr.GVK.Kind)
98 if ok && autoGenType.Version == k8s.KCCAPIVersionV1Alpha1 {
99 continue
100 }
101 resourceReferences = append(resourceReferences, rr)
102 }
103 allowlistedRC.ResourceReferences = resourceReferences
104 rcList = append(rcList, allowlistedRC)
105 }
106 sort.Slice(rcList, func(i, j int) bool {
107 return rcList[i].Name < rcList[j].Name
108 })
109 allowlistedSM.Spec.Resources = rcList
110 allowlistedSMMap[sm.Name] = allowlistedSM
111 }
112 return allowlistedSMMap, nil
113 }
114
115 func fileToServiceMapping(filePath string) (*v1alpha1.ServiceMapping, error) {
116 file, err := generatedembed.Assets.Open(filePath)
117
118 if err != nil {
119 return nil, fmt.Errorf("error opening file '%v': %v", filePath, err)
120 }
121 defer file.Close()
122
123 sm, err := readerToServiceMapping(file)
124 if err != nil {
125 return nil, fmt.Errorf("error reading file '%v' to service mapping: %v", filePath, err)
126 }
127 return sm, nil
128 }
129
130 func readerToServiceMapping(r io.Reader) (*v1alpha1.ServiceMapping, error) {
131 bytes, err := io.ReadAll(r)
132 if err != nil {
133 return nil, fmt.Errorf("error reading file: %v", err)
134 }
135 var sm v1alpha1.ServiceMapping
136 if err := yaml.Unmarshal(bytes, &sm); err != nil {
137 return nil, fmt.Errorf("error unmarshaling byte to service mapping: %v", err)
138 }
139 return &sm, nil
140 }
141
View as plain text