Skip to content

Commit ec90969

Browse files
author
Tyler Slaton
committed
fix(openshift): update openshiftRelease to be protected by a mutex
1 parent 3a9b0b9 commit ec90969

File tree

3 files changed

+33
-32
lines changed

3 files changed

+33
-32
lines changed

pkg/controller/operators/openshift/clusteroperator_controller_test.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package openshift
33
import (
44
"fmt"
55
"os"
6-
"sync"
76

87
semver "github.com/blang/semver/v4"
98
. "github.com/onsi/ginkgo/v2"
@@ -60,7 +59,7 @@ var _ = Describe("ClusterOperator controller", func() {
6059
})
6160

6261
AfterEach(func() {
63-
openshiftReleaseOnce = sync.Once{}
62+
resetCurrentReleaseTo(clusterVersion)
6463
})
6564

6665
It("should ensure the ClusterOperator always exists", func() {
@@ -124,7 +123,7 @@ var _ = Describe("ClusterOperator controller", func() {
124123
By("setting upgradeable=false when there's an error determining compatibility")
125124

126125
By("changing the openshift environment variable to be invalid and restarting the ClusterOperator")
127-
resetOpenshiftReleaseOnceTo("")
126+
resetCurrentReleaseTo("")
128127
Eventually(func() error {
129128
return k8sClient.Delete(ctx, co)
130129
}).Should(Succeed())
@@ -141,7 +140,7 @@ var _ = Describe("ClusterOperator controller", func() {
141140
}))
142141

143142
By("setting an appropriate variable for the cluster version and restarting the ClusterOperator")
144-
resetOpenshiftReleaseOnceTo(clusterVersion)
143+
resetCurrentReleaseTo(clusterVersion)
145144
Eventually(func() error {
146145
return k8sClient.Delete(ctx, co)
147146
}).Should(Succeed())
@@ -304,15 +303,13 @@ var _ = Describe("ClusterOperator controller", func() {
304303
})
305304
})
306305

307-
// resetOpenshiftReleaseOnce creates a new sync.Once for the openshift release and then sets the openshift
306+
// resetCurrentRelease thread safely updates the currentRelease.version and then sets the openshift release
308307
// env var to the desired version. WARNING: This function should only be used for testing purposes as it
309308
// goes around the desired logic of only setting the version of the cluster for this operator once.
310-
var resetMutex sync.Mutex
309+
func resetCurrentReleaseTo(version string) {
310+
currentRelease.mu.Lock()
311+
defer currentRelease.mu.Unlock()
311312

312-
func resetOpenshiftReleaseOnceTo(version string) {
313-
resetMutex.Lock()
314-
defer resetMutex.Unlock()
315-
316-
openshiftReleaseOnce = *new(sync.Once)
313+
currentRelease.version = nil
317314
os.Setenv(releaseEnvVar, version)
318315
}

pkg/controller/operators/openshift/helpers.go

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -170,39 +170,43 @@ func incompatibleOperators(ctx context.Context, cli client.Client) (skews, error
170170
return incompatible, nil
171171
}
172172

173+
type openshiftRelease struct {
174+
version *semver.Version
175+
mu sync.Mutex
176+
}
177+
173178
var (
174-
openshiftReleaseOnce = sync.Once{}
175-
openshiftRelease *semver.Version
179+
currentRelease = &openshiftRelease{}
176180
)
177181

178182
const (
179183
releaseEnvVar = "OPENSHIFT_RELEASE" // OpenShift's env variable for defining the current release
180184
)
181185

182186
func getCurrentRelease(ctx context.Context) (*semver.Version, error) {
183-
var doError error
184-
openshiftReleaseOnce.Do(func() {
185-
// Get the raw version from the OPENSHIFT_RELEASE environment variable
186-
raw, ok := os.LookupEnv(releaseEnvVar)
187-
if !ok || raw == "" {
188-
doError = fmt.Errorf("desired release version missing from OPENSHIFT_RELEASE env variable")
189-
return
190-
}
187+
currentRelease.mu.Lock()
188+
defer currentRelease.mu.Unlock()
191189

192-
release, err := semver.ParseTolerant(raw)
193-
if err != nil {
194-
doError = fmt.Errorf("cluster version has invalid desired release version: %w", err)
195-
return
196-
}
190+
if currentRelease.version != nil {
191+
// We've already got the version
192+
return currentRelease.version, nil
193+
}
197194

198-
openshiftRelease = &release
199-
})
195+
// Get the raw version from the OPENSHIFT_RELEASE environment variable
196+
raw, ok := os.LookupEnv(releaseEnvVar)
197+
if !ok || raw == "" {
198+
// No env var set, try again later
199+
return nil, fmt.Errorf("desired release version missing from OPENSHIFT_RELEASE env variable")
200+
}
200201

201-
if doError != nil {
202-
return nil, doError
202+
release, err := semver.ParseTolerant(raw)
203+
if err != nil {
204+
return nil, fmt.Errorf("cluster version has invalid desired release version: %w", err)
203205
}
204206

205-
return openshiftRelease, nil
207+
currentRelease.version = &release
208+
209+
return currentRelease.version, nil
206210
}
207211

208212
func nextY(v semver.Version) (semver.Version, error) {

pkg/controller/operators/openshift/helpers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ func TestIncompatibleOperators(t *testing.T) {
440440
t.Run(tt.description, func(t *testing.T) {
441441
objs := []client.Object{}
442442

443-
resetOpenshiftReleaseOnceTo(tt.version)
443+
resetCurrentReleaseTo(tt.version)
444444

445445
for _, s := range tt.in {
446446
csv := &operatorsv1alpha1.ClusterServiceVersion{}

0 commit comments

Comments
 (0)