Skip to content

Commit 7870f71

Browse files
Merge pull request #160 from enj/enj/i/rv_track
Bug 1733336: Correct race between config sync loop and resource syncer
2 parents c3442b1 + bd5c055 commit 7870f71

File tree

8 files changed

+660
-81
lines changed

8 files changed

+660
-81
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ verify-commits:
8484
# make test-unit
8585
# make test-unit WHAT=pkg/build TESTFLAGS=-v
8686
test-unit:
87-
GOTEST_FLAGS="$(TESTFLAGS)" hack/test-go.sh $(WHAT) $(TESTS)
87+
GOTEST_FLAGS="$(TESTFLAGS)" GODEBUG=tls13 KUBERNETES_SERVICE_PORT_HTTPS=443 hack/test-go.sh $(WHAT) $(TESTS)
8888
.PHONY: test-unit
8989

9090
test-sec:

pkg/operator2/branding.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55

66
"gopkg.in/yaml.v2"
77

8-
corev1 "k8s.io/api/core/v1"
98
"k8s.io/apimachinery/pkg/api/errors"
109
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1110

@@ -68,10 +67,6 @@ func (c *authOperator) handleBrandingTemplates(configTemplates configv1.OAuthTem
6867
return &templates, nil
6968
}
7069

71-
func (c *authOperator) handleOCPBrandingSecret() (*corev1.Secret, error) {
72-
return c.secrets.Secrets(targetNamespace).Get(ocpBrandingSecretName, metav1.GetOptions{})
73-
}
74-
7570
func (c *authOperator) getConsoleBranding() (string, error) {
7671
cm, err := c.configMaps.ConfigMaps(targetNamespace).Get(consoleConfigMapLocalName, metav1.GetOptions{})
7772
if errors.IsNotFound(err) {

pkg/operator2/configsync.go

Lines changed: 35 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,55 +12,57 @@ import (
1212
"github.com/openshift/library-go/pkg/operator/resourcesynccontroller"
1313
)
1414

15-
func (c *authOperator) handleConfigSync(data *configSyncData) ([]string, error) {
16-
// TODO we probably need listers
17-
configMapClient := c.configMaps.ConfigMaps(targetNamespace)
18-
secretClient := c.secrets.Secrets(targetNamespace)
15+
func (c *authOperator) handleConfigSync(data *configSyncData) error {
16+
// TODO this has too much boilerplate
1917

20-
configMaps, err := configMapClient.List(metav1.ListOptions{})
21-
if err != nil {
22-
return nil, fmt.Errorf("error listing configMaps: %v", err)
18+
inUseConfigMapNames := sets.NewString()
19+
inUseSecretNames := sets.NewString()
20+
21+
for _, dest := range sets.StringKeySet(data.idpConfigMaps).List() {
22+
syncOrDie(c.resourceSyncer.SyncConfigMap, dest, data.idpConfigMaps[dest].src)
23+
inUseConfigMapNames.Insert(dest)
24+
}
25+
for _, dest := range sets.StringKeySet(data.idpSecrets).List() {
26+
syncOrDie(c.resourceSyncer.SyncSecret, dest, data.idpSecrets[dest].src)
27+
inUseSecretNames.Insert(dest)
28+
}
29+
for _, dest := range sets.StringKeySet(data.tplSecrets).List() {
30+
syncOrDie(c.resourceSyncer.SyncSecret, dest, data.tplSecrets[dest].src)
31+
inUseSecretNames.Insert(dest)
2332
}
2433

25-
secrets, err := secretClient.List(metav1.ListOptions{})
34+
// TODO we probably need listers
35+
36+
configMaps, err := c.configMaps.ConfigMaps(targetNamespace).List(metav1.ListOptions{})
2637
if err != nil {
27-
return nil, fmt.Errorf("error listing secrets: %v", err)
38+
return err
2839
}
29-
40+
configMapNames := sets.NewString()
3041
prefixConfigMapNames := sets.NewString()
31-
prefixSecretNames := sets.NewString()
32-
resourceVersionsAll := map[string]string{}
33-
34-
// TODO this has too much boilerplate
35-
3642
for _, cm := range configMaps.Items {
43+
configMapNames.Insert(cm.Name)
3744
if strings.HasPrefix(cm.Name, userConfigPrefix) {
3845
prefixConfigMapNames.Insert(cm.Name)
39-
resourceVersionsAll[cm.Name] = cm.GetResourceVersion()
4046
}
4147
}
48+
if !configMapNames.IsSuperset(inUseConfigMapNames) {
49+
return fmt.Errorf("config maps %s in %s not synced", inUseConfigMapNames.Difference(configMapNames).List(), targetNamespace)
50+
}
4251

52+
secrets, err := c.secrets.Secrets(targetNamespace).List(metav1.ListOptions{})
53+
if err != nil {
54+
return err
55+
}
56+
secretNames := sets.NewString()
57+
prefixSecretNames := sets.NewString()
4358
for _, secret := range secrets.Items {
59+
secretNames.Insert(secret.Name)
4460
if strings.HasPrefix(secret.Name, userConfigPrefix) {
4561
prefixSecretNames.Insert(secret.Name)
46-
resourceVersionsAll[secret.Name] = secret.GetResourceVersion()
4762
}
4863
}
49-
50-
inUseConfigMapNames := sets.NewString()
51-
inUseSecretNames := sets.NewString()
52-
53-
for dest, src := range data.idpConfigMaps {
54-
syncOrDie(c.resourceSyncer.SyncConfigMap, dest, src.src)
55-
inUseConfigMapNames.Insert(dest)
56-
}
57-
for dest, src := range data.idpSecrets {
58-
syncOrDie(c.resourceSyncer.SyncSecret, dest, src.src)
59-
inUseSecretNames.Insert(dest)
60-
}
61-
for dest, src := range data.tplSecrets {
62-
syncOrDie(c.resourceSyncer.SyncSecret, dest, src.src)
63-
inUseSecretNames.Insert(dest)
64+
if !secretNames.IsSuperset(inUseSecretNames) {
65+
return fmt.Errorf("secrets %s in %s not synced", inUseSecretNames.Difference(secretNames).List(), targetNamespace)
6466
}
6567

6668
notInUseConfigMapNames := prefixConfigMapNames.Difference(inUseConfigMapNames)
@@ -76,18 +78,7 @@ func (c *authOperator) handleConfigSync(data *configSyncData) ([]string, error)
7678
syncOrDie(c.resourceSyncer.SyncSecret, dest, "")
7779
}
7880

79-
// only get the resource versions of the elements in use
80-
var resourceVersionsInUse []string
81-
82-
for name := range inUseConfigMapNames {
83-
resourceVersionsInUse = append(resourceVersionsInUse, resourceVersionsAll[name])
84-
}
85-
86-
for name := range inUseSecretNames {
87-
resourceVersionsInUse = append(resourceVersionsInUse, resourceVersionsAll[name])
88-
}
89-
90-
return resourceVersionsInUse, nil
81+
return nil
9182
}
9283

9384
type configSyncData struct {

0 commit comments

Comments
 (0)