@@ -70,3 +70,64 @@ func CombineCABundleConfigMaps(destinationConfigMap ResourceLocation, lister cor
70
70
}
71
71
return cm , nil
72
72
}
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