Skip to content

Commit 4760434

Browse files
Merge pull request #1936 from vrutkovs/combine-cas-optimistic-update
OCPBUGS-55217: CombineCABundleConfigMaps: use optimistic create/update
2 parents 4b0a8a2 + 855d77f commit 4760434

File tree

5 files changed

+365
-7
lines changed

5 files changed

+365
-7
lines changed

pkg/crypto/crypto.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ func MakeSelfSignedCAConfig(name string, lifetime time.Duration) (*TLSCertificat
629629
func MakeSelfSignedCAConfigForSubject(subject pkix.Name, lifetime time.Duration) (*TLSCertificateConfig, error) {
630630
if lifetime <= 0 {
631631
lifetime = DefaultCACertificateLifetimeDuration
632-
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %d years!\n", subject.CommonName, lifetime)
632+
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %s!\n", subject.CommonName, lifetime.String())
633633
}
634634

635635
if lifetime > DefaultCACertificateLifetimeDuration {
@@ -1018,7 +1018,7 @@ func newSigningCertificateTemplateForDuration(subject pkix.Name, caLifetime time
10181018
func newServerCertificateTemplate(subject pkix.Name, hosts []string, lifetime time.Duration, currentTime func() time.Time, authorityKeyId, subjectKeyId []byte) *x509.Certificate {
10191019
if lifetime <= 0 {
10201020
lifetime = DefaultCertificateLifetimeDuration
1021-
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %d years!\n", subject.CommonName, lifetime)
1021+
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %s!\n", subject.CommonName, lifetime.String())
10221022
}
10231023

10241024
if lifetime > DefaultCertificateLifetimeDuration {
@@ -1105,7 +1105,7 @@ func CertsFromPEM(pemCerts []byte) ([]*x509.Certificate, error) {
11051105
func NewClientCertificateTemplate(subject pkix.Name, lifetime time.Duration, currentTime func() time.Time) *x509.Certificate {
11061106
if lifetime <= 0 {
11071107
lifetime = DefaultCertificateLifetimeDuration
1108-
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %d years!\n", subject.CommonName, lifetime)
1108+
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %s!\n", subject.CommonName, lifetime.String())
11091109
}
11101110

11111111
if lifetime > DefaultCertificateLifetimeDuration {

pkg/crypto/crypto_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func TestCrypto(t *testing.T) {
142142
func newSigningCertificateTemplate(subject pkix.Name, lifetime time.Duration, currentTime func() time.Time) *x509.Certificate {
143143
if lifetime <= 0 {
144144
lifetime = DefaultCACertificateLifetimeDuration
145-
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %d years!\n", subject.CommonName, lifetime)
145+
fmt.Fprintf(os.Stderr, "Validity period of the certificate for %q is unset, resetting to %s!\n", subject.CommonName, lifetime.String())
146146
}
147147

148148
if lifetime > DefaultCACertificateLifetimeDuration {

pkg/operator/certrotation/annotations.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,19 @@ func (a AdditionalAnnotations) EnsureTLSMetadataUpdate(meta *metav1.ObjectMeta)
4242
}
4343
if len(a.JiraComponent) > 0 && meta.Annotations[annotations.OpenShiftComponent] != a.JiraComponent {
4444
diff := cmp.Diff(meta.Annotations[annotations.OpenShiftComponent], a.JiraComponent)
45-
klog.V(2).Infof("Updating %q annotation for %s/%s, diff: %s", annotations.OpenShiftComponent, meta.Name, meta.Namespace, diff)
45+
klog.V(2).Infof("Updating %q annotation for %s/%s, diff: %s", annotations.OpenShiftComponent, meta.Namespace, meta.Name, diff)
4646
meta.Annotations[annotations.OpenShiftComponent] = a.JiraComponent
4747
modified = true
4848
}
4949
if len(a.Description) > 0 && meta.Annotations[annotations.OpenShiftDescription] != a.Description {
5050
diff := cmp.Diff(meta.Annotations[annotations.OpenShiftDescription], a.Description)
51-
klog.V(2).Infof("Updating %q annotation for %s/%s, diff: %s", annotations.OpenShiftDescription, meta.Name, meta.Namespace, diff)
51+
klog.V(2).Infof("Updating %q annotation for %s/%s, diff: %s", annotations.OpenShiftDescription, meta.Namespace, meta.Name, diff)
5252
meta.Annotations[annotations.OpenShiftDescription] = a.Description
5353
modified = true
5454
}
5555
if len(a.AutoRegenerateAfterOfflineExpiry) > 0 && meta.Annotations[AutoRegenerateAfterOfflineExpiryAnnotation] != a.AutoRegenerateAfterOfflineExpiry {
5656
diff := cmp.Diff(meta.Annotations[AutoRegenerateAfterOfflineExpiryAnnotation], a.AutoRegenerateAfterOfflineExpiry)
57-
klog.V(2).Infof("Updating %q annotation for %s/%s, diff: %s", AutoRegenerateAfterOfflineExpiryAnnotation, meta.Name, meta.Namespace, diff)
57+
klog.V(2).Infof("Updating %q annotation for %s/%s, diff: %s", AutoRegenerateAfterOfflineExpiryAnnotation, meta.Namespace, meta.Name, diff)
5858
meta.Annotations[AutoRegenerateAfterOfflineExpiryAnnotation] = a.AutoRegenerateAfterOfflineExpiry
5959
modified = true
6060
}

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)