|
4 | 4 | "context"
|
5 | 5 | "errors"
|
6 | 6 | "fmt"
|
| 7 | + "os" |
7 | 8 | "strings"
|
| 9 | + "sync" |
8 | 10 |
|
9 | 11 | semver "github.com/blang/semver/v4"
|
10 | 12 | configv1 "github.com/openshift/api/config/v1"
|
@@ -119,17 +121,17 @@ func transientErrors(err error) error {
|
119 | 121 | }
|
120 | 122 |
|
121 | 123 | func incompatibleOperators(ctx context.Context, cli client.Client) (skews, error) {
|
122 |
| - desired, err := desiredRelease(ctx, cli) |
| 124 | + current, err := currentRelease(ctx) |
123 | 125 | if err != nil {
|
124 | 126 | return nil, err
|
125 | 127 | }
|
126 | 128 |
|
127 |
| - if desired == nil { |
| 129 | + if current == nil { |
128 | 130 | // Note: This shouldn't happen
|
129 | 131 | return nil, fmt.Errorf("failed to determine current OpenShift Y-stream release")
|
130 | 132 | }
|
131 | 133 |
|
132 |
| - next, err := nextY(*desired) |
| 134 | + next, err := nextY(*current) |
133 | 135 | if err != nil {
|
134 | 136 | return nil, err
|
135 | 137 | }
|
@@ -168,24 +170,39 @@ func incompatibleOperators(ctx context.Context, cli client.Client) (skews, error
|
168 | 170 | return incompatible, nil
|
169 | 171 | }
|
170 | 172 |
|
171 |
| -func desiredRelease(ctx context.Context, cli client.Client) (*semver.Version, error) { |
172 |
| - cv := configv1.ClusterVersion{} |
173 |
| - if err := cli.Get(ctx, client.ObjectKey{Name: "version"}, &cv); err != nil { // "version" is the name of OpenShift's ClusterVersion singleton |
174 |
| - return nil, &transientError{fmt.Errorf("failed to get ClusterVersion: %w", err)} |
| 173 | +var ( |
| 174 | + openshiftRelease *semver.Version |
| 175 | + releaseMutex sync.Mutex |
| 176 | +) |
| 177 | + |
| 178 | +const ( |
| 179 | + releaseEnvVar = "OPENSHIFT_RELEASE" |
| 180 | +) |
| 181 | + |
| 182 | +func currentRelease(ctx context.Context) (*semver.Version, error) { |
| 183 | + releaseMutex.Lock() |
| 184 | + defer releaseMutex.Unlock() |
| 185 | + |
| 186 | + if openshiftRelease != nil { |
| 187 | + // We've already got the version |
| 188 | + return openshiftRelease, nil |
175 | 189 | }
|
176 | 190 |
|
177 |
| - v := cv.Status.Desired.Version |
178 |
| - if v == "" { |
179 |
| - // The release version hasn't been set yet |
180 |
| - return nil, fmt.Errorf("desired release version missing from ClusterVersion") |
| 191 | + // Get the raw version from the OPENSHIFT_RELEASE environment variable |
| 192 | + raw, ok := os.LookupEnv(releaseEnvVar) |
| 193 | + if !ok { |
| 194 | + // No env var set, try again later |
| 195 | + return nil, fmt.Errorf(releaseEnvVar) |
181 | 196 | }
|
182 | 197 |
|
183 |
| - desired, err := semver.ParseTolerant(v) |
| 198 | + release, err := semver.ParseTolerant(raw) |
184 | 199 | if err != nil {
|
185 | 200 | return nil, fmt.Errorf("cluster version has invalid desired release version: %w", err)
|
186 | 201 | }
|
187 | 202 |
|
188 |
| - return &desired, nil |
| 203 | + openshiftRelease = &release |
| 204 | + |
| 205 | + return openshiftRelease, nil |
189 | 206 | }
|
190 | 207 |
|
191 | 208 | func nextY(v semver.Version) (semver.Version, error) {
|
|
0 commit comments