Skip to content

Commit cc5f469

Browse files
committed
CombineCABundleConfigMaps: use optimistic create/update
Instead of re-creating configmap from scratch every time this function should attempt to use existing configmap and replace the contents only. This would prevent extra configmap updates when metadata changes
1 parent 3f084d7 commit cc5f469

File tree

1 file changed

+61
-0
lines changed
  • pkg/operator/resourcesynccontroller

1 file changed

+61
-0
lines changed

pkg/operator/resourcesynccontroller/core.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,64 @@ func CombineCABundleConfigMaps(destinationConfigMap ResourceLocation, lister cor
7070
}
7171
return cm, nil
7272
}
73+
74+
func CombineCABundleConfigMapsOptimistically(destinationConfigMap *corev1.ConfigMap, lister corev1listers.ConfigMapLister, additionalAnnotations certrotation.AdditionalAnnotations, inputConfigMaps ...ResourceLocation) (*corev1.ConfigMap, bool, error) {
75+
var cm *corev1.ConfigMap
76+
if destinationConfigMap == nil {
77+
cm = &corev1.ConfigMap{}
78+
} else {
79+
cm = destinationConfigMap.DeepCopy()
80+
}
81+
certificates := []*x509.Certificate{}
82+
for _, input := range inputConfigMaps {
83+
inputConfigMap, err := lister.ConfigMaps(input.Namespace).Get(input.Name)
84+
if apierrors.IsNotFound(err) {
85+
continue
86+
}
87+
if err != nil {
88+
return nil, false, err
89+
}
90+
91+
// configmaps must conform to this
92+
inputContent := inputConfigMap.Data["ca-bundle.crt"]
93+
if len(inputContent) == 0 {
94+
continue
95+
}
96+
inputCerts, err := cert.ParseCertsPEM([]byte(inputContent))
97+
if err != nil {
98+
return nil, false, fmt.Errorf("configmap/%s in %q is malformed: %v", input.Name, input.Namespace, err)
99+
}
100+
certificates = append(certificates, inputCerts...)
101+
}
102+
103+
certificates = crypto.FilterExpiredCerts(certificates...)
104+
finalCertificates := []*x509.Certificate{}
105+
// now check for duplicates. n^2, but super simple
106+
for i := range certificates {
107+
found := false
108+
for j := range finalCertificates {
109+
if reflect.DeepEqual(certificates[i].Raw, finalCertificates[j].Raw) {
110+
found = true
111+
break
112+
}
113+
}
114+
if !found {
115+
finalCertificates = append(finalCertificates, certificates[i])
116+
}
117+
}
118+
119+
caBytes, err := crypto.EncodeCertificates(finalCertificates...)
120+
if err != nil {
121+
return nil, false, err
122+
}
123+
124+
modified := additionalAnnotations.EnsureTLSMetadataUpdate(&cm.ObjectMeta)
125+
newCMData := map[string]string{
126+
"ca-bundle.crt": string(caBytes),
127+
}
128+
if !reflect.DeepEqual(cm.Data, newCMData) {
129+
cm.Data = newCMData
130+
modified = true
131+
}
132+
return cm, modified, nil
133+
}

0 commit comments

Comments
 (0)