Skip to content

Commit 09d7ddb

Browse files
Merge pull request #1571 from openshift-cherrypick-robot/cherry-pick-1522-to-release-4.12
[release-4.12] OCPBUGS-22736: pkg/operator/configobserver: check that the serving certificate refer…
2 parents 579f433 + b4f966c commit 09d7ddb

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

pkg/operator/configobservation/apiserver/observe_apiserver.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ type resourceSyncFunc func(destination, source resourcesynccontroller.ResourceLo
5252
// resources to sync.
5353
// It returns the observed config, sync rules and possibly an error. Nil sync rules mean to ignore all resources
5454
// in case of error. Otherwise, resources are deleted by default and the returned sync rules are taken as overrides of that.
55-
type observeAPIServerConfigFunc func(apiServer *configv1.APIServer, recorder events.Recorder, previouslyObservedConfig map[string]interface{}) (map[string]interface{}, syncActionRules, []error)
55+
type observeAPIServerConfigFunc func(apiServer *configv1.APIServer, recorder events.Recorder, previouslyObservedConfig map[string]interface{}, listers *configobservation.Listers) (map[string]interface{}, syncActionRules, []error)
5656

5757
// ObserveUserClientCABundle returns an ObserveConfigFunc that observes a user managed certificate bundle containing
5858
// signers that will be recognized for incoming client certificates in addition to the operator managed signers.
@@ -74,7 +74,7 @@ var ObserveNamedCertificates configobserver.ObserveConfigFunc = (&apiServerObser
7474

7575
// observeUserClientCABundle observes a user managed ConfigMap containing a certificate bundle for the signers that will
7676
// be recognized for incoming client certificates in addition to the operator managed signers.
77-
func observeUserClientCABundle(apiServer *configv1.APIServer, recorder events.Recorder, previouslyObservedConfig map[string]interface{}) (map[string]interface{}, syncActionRules, []error) {
77+
func observeUserClientCABundle(apiServer *configv1.APIServer, recorder events.Recorder, previouslyObservedConfig map[string]interface{}, listers *configobservation.Listers) (map[string]interface{}, syncActionRules, []error) {
7878
configMapName := apiServer.Spec.ClientCA.Name
7979
if len(configMapName) == 0 {
8080
return nil, nil, nil // previously observed resource (if any) should be deleted
@@ -88,7 +88,7 @@ func observeUserClientCABundle(apiServer *configv1.APIServer, recorder events.Re
8888

8989
// observeNamedCertificates observes user managed Secrets containing TLS cert info for serving secure traffic to
9090
// specific hostnames.
91-
func observeNamedCertificates(apiServer *configv1.APIServer, recorder events.Recorder, previouslyObservedConfig map[string]interface{}) (map[string]interface{}, syncActionRules, []error) {
91+
func observeNamedCertificates(apiServer *configv1.APIServer, recorder events.Recorder, previouslyObservedConfig map[string]interface{}, listers *configobservation.Listers) (map[string]interface{}, syncActionRules, []error) {
9292
var errs []error
9393
observedConfig := map[string]interface{}{}
9494

@@ -142,6 +142,11 @@ func observeNamedCertificates(apiServer *configv1.APIServer, recorder events.Rec
142142
recorder.Warningf("ObserveNamedCertificatesFailed", err.Error())
143143
return previouslyObservedConfig, nil, append(errs, err)
144144
}
145+
146+
// check that secret exists and readable by operator
147+
if _, err := listers.ConfigSecretLister().Secrets(operatorclient.GlobalUserSpecifiedConfigNamespace).Get(namedCertificate.ServingCertificate.Name); err != nil {
148+
return previouslyObservedConfig, nil, append(errs, err)
149+
}
145150
// pick one of the available target resource names
146151
targetSecretName := fmt.Sprintf(namedUserServingCertResourceNameFormat, index)
147152

@@ -209,7 +214,7 @@ func (o *apiServerObserver) observe(genericListers configobserver.Listers, recor
209214
return previouslyObservedConfig, append(errs, err)
210215
}
211216

212-
observedConfig, observedResources, errs := o.observerFunc(apiServer, recorder, previouslyObservedConfig)
217+
observedConfig, observedResources, errs := o.observerFunc(apiServer, recorder, previouslyObservedConfig, &listers)
213218

214219
// if we get error during observation, skip the merging and return previous config and errors.
215220
if len(errs) > 0 {

pkg/operator/configobservation/apiserver/observe_apiserver_test.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1010
"k8s.io/apimachinery/pkg/runtime"
1111
"k8s.io/apimachinery/pkg/util/diff"
12+
corelistersv1 "k8s.io/client-go/listers/core/v1"
1213
"k8s.io/client-go/tools/cache"
1314

1415
configv1 "github.com/openshift/api/config/v1"
@@ -101,6 +102,7 @@ func TestObserveNamedCertificates(t *testing.T) {
101102
testCases := []struct {
102103
name string
103104
config *configv1.APIServer
105+
missingSecret string
104106
existing map[string]interface{}
105107
expected map[string]interface{}
106108
expectErrs bool
@@ -446,6 +448,19 @@ func TestObserveNamedCertificates(t *testing.T) {
446448
expected: existingConfig,
447449
expectErrs: true,
448450
},
451+
{
452+
name: "NoSuchSecret",
453+
config: newAPIServerConfig(
454+
withCertificate(
455+
withNames("*.foo.org"),
456+
withSecret("foo"),
457+
),
458+
),
459+
missingSecret: "foo",
460+
existing: existingConfig,
461+
expected: existingConfig,
462+
expectErrs: true,
463+
},
449464
}
450465
for _, tc := range testCases {
451466
t.Run(tc.name, func(t *testing.T) {
@@ -459,6 +474,9 @@ func TestObserveNamedCertificates(t *testing.T) {
459474
var objs []runtime.Object
460475
if tc.config != nil {
461476
for _, nc := range tc.config.Spec.ServingCerts.NamedCertificates {
477+
if nc.ServingCertificate.Name == tc.missingSecret {
478+
continue
479+
}
462480
objs = append(objs, &corev1.Secret{
463481
ObjectMeta: metav1.ObjectMeta{
464482
Name: nc.ServingCertificate.Name,
@@ -471,11 +489,17 @@ func TestObserveNamedCertificates(t *testing.T) {
471489
})
472490
}
473491
}
492+
for _, obj := range objs {
493+
if err := indexer.Add(obj); err != nil {
494+
t.Fatal(err)
495+
}
496+
}
474497

475498
synced := map[string]string{}
476499
listers := configobservation.Listers{
477-
APIServerLister_: configlistersv1.NewAPIServerLister(indexer),
478-
ResourceSync: &mockResourceSyncer{t: t, synced: synced},
500+
APIServerLister_: configlistersv1.NewAPIServerLister(indexer),
501+
ResourceSync: &mockResourceSyncer{t: t, synced: synced},
502+
ConfigSecretLister_: corelistersv1.NewSecretLister(indexer),
479503
}
480504
result, errs := ObserveNamedCertificates(listers, events.NewInMemoryRecorder(t.Name()), tc.existing)
481505
if tc.expectErrs && len(errs) == 0 {

test/e2e/user_certs_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,17 @@ func TestNamedCertificates(t *testing.T) {
5656

5757
// create secrets for named serving certificates
5858
for _, info := range testCertInfoById {
59-
defer func(info *testCertInfo) {
60-
err := deleteSecret(kubeClient, "openshift-config", info.secretName)
61-
require.NoError(t, err)
62-
}(info)
6359
_, err := createTLSSecret(kubeClient, "openshift-config", info.secretName, info.crypto.PrivateKey, info.crypto.Certificate)
6460
require.NoError(t, err)
6561
}
6662

63+
defer func() {
64+
for _, info := range testCertInfoById {
65+
err := deleteSecret(kubeClient, "openshift-config", info.secretName)
66+
require.NoError(t, err)
67+
}
68+
}()
69+
6770
// configure named certificates
6871
defer func() {
6972
_, err := updateAPIServerClusterConfigSpec(configClient, func(apiserver *configv1.APIServer) {

0 commit comments

Comments
 (0)