diff --git a/pkg/cvo/availableupdates.go b/pkg/cvo/availableupdates.go index d897e1bfd5..8c24a79a24 100644 --- a/pkg/cvo/availableupdates.go +++ b/pkg/cvo/availableupdates.go @@ -5,7 +5,6 @@ import ( "fmt" "net/http" "net/url" - "runtime" "sort" "strings" "time" @@ -23,6 +22,7 @@ import ( "github.com/openshift/cluster-version-operator/pkg/clusterconditions" ) +const noArchitecture string = "NoArchitecture" const noChannel string = "NoChannel" // syncAvailableUpdates attempts to retrieve the latest updates and update the status of the ClusterVersion @@ -35,8 +35,9 @@ func (optr *Operator) syncAvailableUpdates(ctx context.Context, config *configv1 usedDefaultUpstream = true upstream = optr.defaultUpstreamServer } - arch := runtime.GOARCH + channel := config.Spec.Channel + arch := optr.getArchitecture() // updates are only checked at most once per minimumUpdateCheckInterval or if the generation changes u := optr.getAvailableUpdates() @@ -46,6 +47,9 @@ func (optr *Operator) syncAvailableUpdates(ctx context.Context, config *configv1 klog.V(2).Infof("Retrieving available updates again, because more than %s has elapsed since %s", optr.minimumUpdateCheckInterval, u.LastAttempt) } else if channel != u.Channel { klog.V(2).Infof("Retrieving available updates again, because the channel has changed from %q to %q", u.Channel, channel) + } else if arch != u.Architecture { + klog.V(2).Infof("Retrieving available updates again, because the architecture has changed from %q to %q", + u.Architecture, arch) } else if upstream == u.Upstream || (upstream == optr.defaultUpstreamServer && u.Upstream == "") { klog.V(2).Infof("Available updates were recently retrieved, with less than %s elapsed since %s, will try later.", optr.minimumUpdateCheckInterval, u.LastAttempt) return nil @@ -67,6 +71,7 @@ func (optr *Operator) syncAvailableUpdates(ctx context.Context, config *configv1 au := &availableUpdates{ Upstream: upstream, Channel: config.Spec.Channel, + Architecture: arch, Current: current, Updates: updates, ConditionalUpdates: conditionalUpdates, @@ -82,8 +87,9 @@ func (optr *Operator) syncAvailableUpdates(ctx context.Context, config *configv1 } type availableUpdates struct { - Upstream string - Channel string + Upstream string + Channel string + Architecture string // LastAttempt records the time of the most recent attempt at update // retrieval, regardless of whether it was successful. @@ -115,6 +121,7 @@ func (u *availableUpdates) NeedsUpdate(original *configv1.ClusterVersion) *confi if u == nil { return nil } + // Architecture could change but does not reside in ClusterVersion if u.Upstream != string(original.Spec.Upstream) || u.Channel != original.Spec.Channel { return nil } @@ -160,6 +167,7 @@ func (optr *Operator) setAvailableUpdates(u *availableUpdates) { if u != nil && (optr.availableUpdates == nil || optr.availableUpdates.Upstream != u.Upstream || optr.availableUpdates.Channel != u.Channel || + optr.availableUpdates.Architecture != u.Architecture || success) { u.LastSyncOrConfigChange = u.LastAttempt } else if optr.availableUpdates != nil { @@ -176,6 +184,20 @@ func (optr *Operator) getAvailableUpdates() *availableUpdates { return optr.availableUpdates } +// getArchitecture returns the currently determined cluster architecture. +func (optr *Operator) getArchitecture() string { + optr.statusLock.Lock() + defer optr.statusLock.Unlock() + return optr.architecture +} + +// SetArchitecture sets the cluster architecture. +func (optr *Operator) SetArchitecture(architecture string) { + optr.statusLock.Lock() + defer optr.statusLock.Unlock() + optr.architecture = architecture +} + func calculateAvailableUpdatesStatus(ctx context.Context, clusterID string, transport *http.Transport, upstream, arch, channel, version string) (configv1.Release, []configv1.Release, []configv1.ConditionalUpdate, configv1.ClusterOperatorStatusCondition) { var cvoCurrent configv1.Release if len(upstream) == 0 { @@ -203,7 +225,7 @@ func calculateAvailableUpdatesStatus(ctx context.Context, clusterID string, tran if len(arch) == 0 { return cvoCurrent, nil, nil, configv1.ClusterOperatorStatusCondition{ - Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse, Reason: "NoArchitecture", + Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse, Reason: noArchitecture, Message: "The set of architectures has not been configured.", } } diff --git a/pkg/cvo/cvo.go b/pkg/cvo/cvo.go index 349aca033f..9d758acc2d 100644 --- a/pkg/cvo/cvo.go +++ b/pkg/cvo/cvo.go @@ -93,6 +93,10 @@ type Operator struct { // minimumUpdateCheckInterval is the minimum duration to check for updates from // the upstream. minimumUpdateCheckInterval time.Duration + // architecture identifies the current architecture being used to retrieve available updates + // from OSUS. It's possible values and how it's set are defined by the OSUS Cincinnati API's + // "arch" property. + architecture string // payloadDir is intended for testing. If unset it will default to '/' payloadDir string // defaultUpstreamServer is intended for testing. @@ -249,6 +253,7 @@ func (optr *Operator) InitializeFromPayload(ctx context.Context, restConfig *res optr.release = update.Release optr.releaseCreated = update.ImageRef.CreationTimestamp.Time + optr.SetArchitecture(update.Architecture) httpClientConstructor := sigstore.NewCachedHTTPClientConstructor(optr.HTTPClient, nil) configClient, err := coreclientsetv1.NewForConfig(restConfig) @@ -584,6 +589,8 @@ func (optr *Operator) sync(ctx context.Context, key string) error { // inform the config sync loop about our desired state status := optr.configSync.Update(ctx, config.Generation, desired, config, state, optr.name) + optr.SetArchitecture(status.Architecture) + // write cluster version status return optr.syncStatus(ctx, original, config, status, errs) } diff --git a/pkg/cvo/cvo_scenarios_test.go b/pkg/cvo/cvo_scenarios_test.go index 118402dd24..8bde9f9c2c 100644 --- a/pkg/cvo/cvo_scenarios_test.go +++ b/pkg/cvo/cvo_scenarios_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "reflect" + "runtime" "strconv" "testing" "time" @@ -14,7 +15,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" + apiruntime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/wait" dynamicfake "k8s.io/client-go/dynamic/fake" @@ -30,13 +31,19 @@ import ( "github.com/openshift/library-go/pkg/manifest" ) -func setupCVOTest(payloadDir string) (*Operator, map[string]runtime.Object, *fake.Clientset, *dynamicfake.FakeDynamicClient, func()) { +var architecture string + +func init() { + architecture = runtime.GOARCH +} + +func setupCVOTest(payloadDir string) (*Operator, map[string]apiruntime.Object, *fake.Clientset, *dynamicfake.FakeDynamicClient, func()) { client := &fake.Clientset{} - client.AddReactor("*", "*", func(action clientgotesting.Action) (handled bool, ret runtime.Object, err error) { + client.AddReactor("*", "*", func(action clientgotesting.Action) (handled bool, ret apiruntime.Object, err error) { return false, nil, fmt.Errorf("unexpected client action: %#v", action) }) - cvs := make(map[string]runtime.Object) - client.AddReactor("*", "clusterversions", func(action clientgotesting.Action) (handled bool, ret runtime.Object, err error) { + cvs := make(map[string]apiruntime.Object) + client.AddReactor("*", "clusterversions", func(action clientgotesting.Action) (handled bool, ret apiruntime.Object, err error) { switch a := action.(type) { case clientgotesting.GetActionImpl: obj, ok := cvs[a.GetName()] @@ -71,7 +78,7 @@ func setupCVOTest(payloadDir string) (*Operator, map[string]runtime.Object, *fak } return false, nil, fmt.Errorf("unexpected client action: %#v", action) }) - client.AddReactor("get", "featuregates", func(action clientgotesting.Action) (handled bool, ret runtime.Object, err error) { + client.AddReactor("get", "featuregates", func(action clientgotesting.Action) (handled bool, ret apiruntime.Object, err error) { switch a := action.(type) { case clientgotesting.GetAction: return true, nil, errors.NewNotFound(schema.GroupResource{Resource: "clusterversions"}, a.GetName()) @@ -105,7 +112,7 @@ func setupCVOTest(payloadDir string) (*Operator, map[string]runtime.Object, *fak clusterProfile: payload.DefaultClusterProfile, } - dynamicScheme := runtime.NewScheme() + dynamicScheme := apiruntime.NewScheme() dynamicScheme.AddKnownTypeWithName(schema.GroupVersionKind{Group: "test.cvo.io", Version: "v1", Kind: "TestB"}, &unstructured.Unstructured{}) dynamicClient := dynamicfake.NewSimpleDynamicClient(dynamicScheme) @@ -220,7 +227,7 @@ func TestCVO_StartupAndSync(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -241,7 +248,7 @@ func TestCVO_StartupAndSync(t *testing.T) { LastProgress: time.Unix(1, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -250,7 +257,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Generation: 1, Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -260,7 +267,7 @@ func TestCVO_StartupAndSync(t *testing.T) { LastProgress: time.Unix(2, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -276,7 +283,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Done: 1, Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -286,7 +293,7 @@ func TestCVO_StartupAndSync(t *testing.T) { LastProgress: time.Unix(3, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -302,7 +309,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Done: 2, Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -312,7 +319,7 @@ func TestCVO_StartupAndSync(t *testing.T) { LastProgress: time.Unix(4, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(5, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -329,7 +336,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Completed: 1, Done: 3, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -339,7 +346,7 @@ func TestCVO_StartupAndSync(t *testing.T) { LastProgress: time.Unix(5, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(6, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -400,7 +407,7 @@ func TestCVO_StartupAndSync(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -412,7 +419,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Generation: 1, Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -427,7 +434,7 @@ func TestCVO_StartupAndSync(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -437,7 +444,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Reconciling: true, Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -453,7 +460,7 @@ func TestCVO_StartupAndSync(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -463,7 +470,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -479,7 +486,7 @@ func TestCVO_StartupAndSync(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -490,7 +497,7 @@ func TestCVO_StartupAndSync(t *testing.T) { Completed: 2, Done: 3, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -506,7 +513,7 @@ func TestCVO_StartupAndSync(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -637,7 +644,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -661,7 +668,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Generation: 1, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -669,7 +676,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { SyncWorkerStatus{ Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -686,7 +693,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -695,7 +702,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Done: 1, Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -712,7 +719,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -721,7 +728,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Initial: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -738,7 +745,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(5, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -798,7 +805,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -809,7 +816,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { SyncWorkerStatus{ Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -825,7 +832,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -834,7 +841,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Reconciling: true, Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -851,7 +858,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -860,7 +867,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -877,7 +884,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -887,7 +894,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Completed: 2, Done: 3, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -904,7 +911,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1025,7 +1032,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -1049,7 +1056,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { LastProgress: time.Unix(1, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1057,7 +1064,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { SyncWorkerStatus{ Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1068,7 +1075,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Generation: 1, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1083,7 +1090,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Done: 1, Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1094,7 +1101,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Generation: 1, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1109,7 +1116,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Done: 2, Total: 3, Initial: true, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1126,7 +1133,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(5, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1185,7 +1192,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -1196,7 +1203,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { SyncWorkerStatus{ Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1212,7 +1219,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1221,7 +1228,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Reconciling: true, Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1238,7 +1245,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1247,7 +1254,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1264,7 +1271,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1274,7 +1281,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Completed: 2, Done: 3, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -1291,7 +1298,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -1491,7 +1498,7 @@ func TestCVO_UpgradeUnverifiedPayload(t *testing.T) { verifyAllStatus(t, worker.StatusCh(), SyncWorkerStatus{ Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -1506,7 +1513,7 @@ func TestCVO_UpgradeUnverifiedPayload(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -1556,7 +1563,7 @@ func TestCVO_UpgradeUnverifiedPayload(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.1-abc"}, @@ -1922,7 +1929,7 @@ func TestCVO_UpgradeFailedPayloadLoadWithCapsChanges(t *testing.T) { verifyAllStatus(t, worker.StatusCh(), SyncWorkerStatus{ Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -1937,7 +1944,7 @@ func TestCVO_UpgradeFailedPayloadLoadWithCapsChanges(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2144,7 +2151,7 @@ func TestCVO_InitImplicitlyEnabledCaps(t *testing.T) { Actual: configv1.Release{Version: "1.0.1-abc", Image: "image/image:1", URL: configv1.URL("https://example.com/v1.0.1-abc")}, Generation: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, CapabilitiesStatus: CapabilityStatus{ Status: configv1.ClusterVersionCapabilitiesStatus{ EnabledCapabilities: []configv1.ClusterVersionCapability{configv1.ClusterVersionCapabilityBaremetal, configv1.ClusterVersionCapabilityMarketplace, configv1.ClusterVersionCapabilityOpenShiftSamples}, @@ -2154,7 +2161,7 @@ func TestCVO_InitImplicitlyEnabledCaps(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1"}, }, @@ -2196,7 +2203,7 @@ func TestCVO_InitImplicitlyEnabledCaps(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: configv1.ConditionTrue, Reason: "CapabilitiesImplicitlyEnabled", Message: "The following capabilities could not be disabled: marketplace, openshift-samples"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, {Type: "Available", Status: "False"}, {Type: "Failing", Status: "False"}, {Type: "Progressing", Status: "True", Message: "Working towards 1.0.1-abc"}, @@ -2393,7 +2400,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { verifyAllStatus(t, worker.StatusCh(), SyncWorkerStatus{ Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2408,7 +2415,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2463,7 +2470,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -2474,7 +2481,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { SyncWorkerStatus{ Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2489,7 +2496,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2498,7 +2505,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { Reconciling: true, Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2514,7 +2521,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2523,7 +2530,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2539,7 +2546,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2549,7 +2556,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { Completed: 2, Done: 3, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2565,7 +2572,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2723,7 +2730,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { verifyAllStatus(t, worker.StatusCh(), SyncWorkerStatus{ Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2738,7 +2745,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2746,7 +2753,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { SyncWorkerStatus{ Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2762,7 +2769,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2770,7 +2777,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { SyncWorkerStatus{ Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.1-abc", Image: "image/image:1", @@ -2786,7 +2793,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.1-abc", Image: "image/image:1", Force: true}, }, @@ -2841,7 +2848,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -2950,7 +2957,7 @@ func TestCVO_UpgradeVerifiedPayload(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -3053,7 +3060,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { LastProgress: time.Unix(1, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3061,7 +3068,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { SyncWorkerStatus{ Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3077,7 +3084,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3086,7 +3093,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { Reconciling: true, Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3102,7 +3109,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3111,7 +3118,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3127,7 +3134,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(5, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3154,7 +3161,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { Completed: 1, Done: 3, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3170,7 +3177,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3178,7 +3185,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { SyncWorkerStatus{ Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3194,7 +3201,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3203,7 +3210,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { Reconciling: true, Done: 1, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3219,7 +3226,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(3, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3228,7 +3235,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3244,7 +3251,7 @@ func TestCVO_RestartAndReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(4, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3355,7 +3362,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { LastProgress: time.Unix(1, 0), loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(2, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3388,7 +3395,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { SyncWorkerStatus{ Reconciling: true, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3403,7 +3410,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3423,7 +3430,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Actual: configv1.Release{ Version: "1.0.0-abc", Image: "image/image:1", @@ -3439,7 +3446,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3468,7 +3475,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { Reconciling: true, Done: 2, Total: 3, - VersionHash: "DL-FFQ2Uem8=", + VersionHash: "DL-FFQ2Uem8=", Architecture: architecture, Failure: &payload.UpdateError{ Nested: fmt.Errorf("unable to proceed"), Reason: "UpdatePayloadFailed", @@ -3490,7 +3497,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: time.Unix(1, 0), Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3538,7 +3545,7 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "UpdatePayloadFailed", Message: "Error while reconciling 1.0.0-abc: the update could not be applied"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, }, }, }) @@ -3652,6 +3659,7 @@ func TestCVO_ParallelError(t *testing.T) { Done: status.Done, Total: 3, VersionHash: "Gyh2W6qcDO4=", + Architecture: architecture, Actual: configv1.Release{Version: "1.0.0-abc", Image: "image/image:1"}, LastProgress: status.LastProgress, Generation: 1, @@ -3663,7 +3671,7 @@ func TestCVO_ParallelError(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: status.loadPayloadStatus.LastTransitionTime, Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3687,6 +3695,7 @@ func TestCVO_ParallelError(t *testing.T) { Done: 1, Total: 3, VersionHash: "Gyh2W6qcDO4=", + Architecture: architecture, Actual: configv1.Release{Version: "1.0.0-abc", Image: "image/image:1"}, LastProgress: status.LastProgress, Generation: 1, @@ -3698,7 +3707,7 @@ func TestCVO_ParallelError(t *testing.T) { }, loadPayloadStatus: LoadPayloadStatus{ Step: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\"", + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\"", LastTransitionTime: status.loadPayloadStatus.LastTransitionTime, Update: configv1.Update{Version: "1.0.0-abc", Image: "image/image:1"}, }, @@ -3744,7 +3753,7 @@ func TestCVO_ParallelError(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", - Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\""}, + Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "ClusterOperatorsNotAvailable", Message: "Working towards 1.0.0-abc: 1 of 3 done (33% complete), waiting on operator-1, operator-2"}, diff --git a/pkg/cvo/cvo_test.go b/pkg/cvo/cvo_test.go index a562a70483..1e955f75cc 100644 --- a/pkg/cvo/cvo_test.go +++ b/pkg/cvo/cvo_test.go @@ -2361,7 +2361,7 @@ func TestOperator_availableUpdatesSync(t *testing.T) { }, }, { - name: "report an error condition when channel isn't set", + name: "report an error condition when architecture isn't set", handler: func(w http.ResponseWriter, req *http.Request) { http.Error(w, "bad things", http.StatusInternalServerError) }, @@ -2393,6 +2393,49 @@ func TestOperator_availableUpdatesSync(t *testing.T) { wantUpdates: &availableUpdates{ Upstream: "", Channel: "", + Condition: configv1.ClusterOperatorStatusCondition{ + Type: configv1.RetrievedUpdates, + Status: configv1.ConditionFalse, + Reason: noArchitecture, + Message: "The set of architectures has not been configured.", + }, + }, + }, + { + name: "report an error condition when channel isn't set", + handler: func(w http.ResponseWriter, req *http.Request) { + http.Error(w, "bad things", http.StatusInternalServerError) + }, + optr: &Operator{ + defaultUpstreamServer: "http://localhost:8080/graph", + architecture: "amd64", + release: configv1.Release{ + Version: "v4.0.0", + Image: "image/image:v4.0.1", + }, + namespace: "test", + name: "default", + client: fake.NewSimpleClientset( + &configv1.ClusterVersion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "default", + }, + Spec: configv1.ClusterVersionSpec{ + ClusterID: configv1.ClusterID(id), + Channel: "", + }, + Status: configv1.ClusterVersionStatus{ + History: []configv1.UpdateHistory{ + {Image: "image/image:v4.0.1"}, + }, + }, + }, + ), + }, + wantUpdates: &availableUpdates{ + Upstream: "", + Channel: "", + Architecture: "amd64", Condition: configv1.ClusterOperatorStatusCondition{ Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse, @@ -2408,6 +2451,7 @@ func TestOperator_availableUpdatesSync(t *testing.T) { }, optr: &Operator{ defaultUpstreamServer: "http://localhost:8080/graph", + architecture: "amd64", release: configv1.Release{ Image: "image/image:v4.0.1", }, @@ -2431,8 +2475,9 @@ func TestOperator_availableUpdatesSync(t *testing.T) { ), }, wantUpdates: &availableUpdates{ - Upstream: "", - Channel: "fast", + Upstream: "", + Channel: "fast", + Architecture: "amd64", Condition: configv1.ClusterOperatorStatusCondition{ Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse, @@ -2448,6 +2493,7 @@ func TestOperator_availableUpdatesSync(t *testing.T) { }, optr: &Operator{ defaultUpstreamServer: "http://localhost:8080/graph", + architecture: "amd64", release: configv1.Release{ Version: "4.0.1", Image: "image/image:v4.0.1", @@ -2478,8 +2524,9 @@ func TestOperator_availableUpdatesSync(t *testing.T) { ), }, wantUpdates: &availableUpdates{ - Upstream: "", - Channel: "fast", + Upstream: "", + Channel: "fast", + Architecture: "amd64", Condition: configv1.ClusterOperatorStatusCondition{ Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse, @@ -2509,6 +2556,7 @@ func TestOperator_availableUpdatesSync(t *testing.T) { }, optr: &Operator{ defaultUpstreamServer: "http://localhost:8080/graph", + architecture: "amd64", release: configv1.Release{ Version: "4.0.1", Image: "image/image:v4.0.1", @@ -2540,8 +2588,9 @@ func TestOperator_availableUpdatesSync(t *testing.T) { ), }, wantUpdates: &availableUpdates{ - Upstream: "", - Channel: "fast", + Upstream: "", + Channel: "fast", + Architecture: "amd64", Current: configv1.Release{ Version: "4.0.1", Image: "image/image:v4.0.1", @@ -2574,6 +2623,7 @@ func TestOperator_availableUpdatesSync(t *testing.T) { }, optr: &Operator{ defaultUpstreamServer: "http://localhost:8080/graph", + architecture: "amd64", release: configv1.Release{ Version: "4.0.1", Image: "image/image:v4.0.1", @@ -2605,9 +2655,10 @@ func TestOperator_availableUpdatesSync(t *testing.T) { ), }, wantUpdates: &availableUpdates{ - Upstream: "", - Channel: "fast", - Current: configv1.Release{Version: "4.0.1", Image: "image/image:v4.0.1"}, + Upstream: "", + Channel: "fast", + Architecture: "amd64", + Current: configv1.Release{Version: "4.0.1", Image: "image/image:v4.0.1"}, Updates: []configv1.Release{ {Version: "4.0.2", Image: "image/image:v4.0.2"}, {Version: "4.0.2-prerelease", Image: "some.other.registry/image/image:v4.0.2"}, diff --git a/pkg/cvo/sync_worker.go b/pkg/cvo/sync_worker.go index 895ff36156..3428ff7fbb 100644 --- a/pkg/cvo/sync_worker.go +++ b/pkg/cvo/sync_worker.go @@ -109,10 +109,11 @@ type SyncWorkerStatus struct { Done int Total int - Completed int - Reconciling bool - Initial bool - VersionHash string + Completed int + Reconciling bool + Initial bool + VersionHash string + Architecture string LastProgress time.Time @@ -370,7 +371,8 @@ func (w *SyncWorker) syncPayload(ctx context.Context, work *SyncWork, work.Capabilities) } w.payload = payloadUpdate - msg = fmt.Sprintf("Payload loaded version=%q image=%q", desired.Version, desired.Image) + msg = fmt.Sprintf("Payload loaded version=%q image=%q architecture=%q", desired.Version, desired.Image, + payloadUpdate.Architecture) w.eventRecorder.Eventf(cvoObjectRef, corev1.EventTypeNormal, "PayloadLoaded", msg) reporter.ReportPayload(LoadPayloadStatus{ Failure: nil, @@ -380,7 +382,8 @@ func (w *SyncWorker) syncPayload(ctx context.Context, work *SyncWork, Update: desired, LastTransitionTime: time.Now(), }) - klog.V(2).Infof("Payload loaded from %s with hash %s", desired.Image, payloadUpdate.ManifestHash) + klog.V(2).Infof("Payload loaded from %s with hash %s, architecture %s", desired.Image, payloadUpdate.ManifestHash, + payloadUpdate.Architecture) } return implicitlyEnabledCaps, nil } @@ -508,6 +511,9 @@ func (w *SyncWorker) Update(ctx context.Context, generation int64, desired confi w.status.CapabilitiesStatus.ImplicitlyEnabledCaps = w.work.Capabilities.ImplicitlyEnabledCapabilities w.status.CapabilitiesStatus.Status = capability.GetCapabilitiesStatus(w.work.Capabilities) + // Update syncWorker status with architecture of newly loaded payload. + w.status.Architecture = w.payload.Architecture + // notify the sync loop that we changed config if w.cancelFn != nil { klog.V(2).Info("Cancel the sync worker's current loop") @@ -858,12 +864,13 @@ func (w *SyncWorker) apply(ctx context.Context, work *SyncWork, maxWorkers int, total := len(payloadUpdate.Manifests) cr := &consistentReporter{ status: SyncWorkerStatus{ - Generation: work.Generation, - Initial: work.State.Initializing(), - Reconciling: work.State.Reconciling(), - VersionHash: payloadUpdate.ManifestHash, - Actual: payloadUpdate.Release, - Verified: payloadUpdate.VerifiedImage, + Generation: work.Generation, + Initial: work.State.Initializing(), + Reconciling: work.State.Reconciling(), + VersionHash: payloadUpdate.ManifestHash, + Architecture: w.status.Architecture, + Actual: payloadUpdate.Release, + Verified: payloadUpdate.VerifiedImage, }, completed: work.Completed, version: payloadUpdate.Release.Version, diff --git a/pkg/payload/payload.go b/pkg/payload/payload.go index 967ef28988..a83bdfb651 100644 --- a/pkg/payload/payload.go +++ b/pkg/payload/payload.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "sort" "strings" "time" @@ -67,6 +68,9 @@ const ( // provide better visibility during install and upgrade of // error conditions. PrecreatingPayload + + // heterogeneousArchitectureID identifies a payload architecture as heterogeneous. + heterogeneousArchitectureID = "multi" ) // Initializing is true if the state is InitializingPayload. @@ -109,6 +113,8 @@ type Update struct { ImageRef *imagev1.ImageStream + Architecture string + // manifestHash is a hash of the manifests included in this payload ManifestHash string Manifests []manifest.Manifest @@ -307,7 +313,7 @@ func loadUpdatePayloadMetadata(dir, releaseImage, clusterProfile string) (*Updat releaseDir = filepath.Join(dir, ReleaseManifestDir) ) - release, err := loadReleaseFromMetadata(releaseDir) + release, arch, err := loadReleaseFromMetadata(releaseDir) if err != nil { return nil, nil, err } @@ -325,8 +331,9 @@ func loadUpdatePayloadMetadata(dir, releaseImage, clusterProfile string) (*Updat tasks := getPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile) return &Update{ - Release: release, - ImageRef: imageRef, + Release: release, + ImageRef: imageRef, + Architecture: arch, }, tasks, nil } @@ -350,33 +357,51 @@ func getPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string) [] }} } -func loadReleaseFromMetadata(releaseDir string) (configv1.Release, error) { +func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error) { var release configv1.Release path := filepath.Join(releaseDir, cincinnatiJSONFile) data, err := ioutil.ReadFile(path) if err != nil { - return release, err + return release, "", err } var metadata metadata if err := json.Unmarshal(data, &metadata); err != nil { - return release, fmt.Errorf("unmarshal Cincinnati metadata: %w", err) + return release, "", fmt.Errorf("unmarshal Cincinnati metadata: %w", err) } if metadata.Kind != "cincinnati-metadata-v0" { - return release, fmt.Errorf("unrecognized Cincinnati metadata kind %q", metadata.Kind) + return release, "", fmt.Errorf("unrecognized Cincinnati metadata kind %q", metadata.Kind) } if metadata.Version == "" { - return release, errors.New("missing required Cincinnati metadata version") + return release, "", errors.New("missing required Cincinnati metadata version") } if _, err := semver.Parse(metadata.Version); err != nil { - return release, fmt.Errorf("Cincinnati metadata version %q is not a valid semantic version: %v", metadata.Version, err) + return release, "", fmt.Errorf("Cincinnati metadata version %q is not a valid semantic version: %v", metadata.Version, err) } release.Version = metadata.Version + var arch string + if archInterface, ok := metadata.Metadata["release.openshift.io/architecture"]; ok { + if archString, ok := archInterface.(string); ok { + if archString == heterogeneousArchitectureID { + arch = archString + } else { + return release, "", fmt.Errorf("Architecture from %s (%s) contains invalid value: %q. Valid value is %q.", + cincinnatiJSONFile, release.Version, archString, heterogeneousArchitectureID) + } + klog.V(2).Infof("Architecture from %s (%s) is heterogeneous: %q", cincinnatiJSONFile, release.Version, arch) + } else { + return release, "", fmt.Errorf("Architecture from %s (%s) is not a string: %v", + cincinnatiJSONFile, release.Version, archInterface) + } + } else { + arch = runtime.GOARCH + klog.V(2).Infof("Architecture from %s (%s) retrieved from runtime: %q", cincinnatiJSONFile, release.Version, arch) + } if urlInterface, ok := metadata.Metadata["url"]; ok { if urlString, ok := urlInterface.(string); ok { release.URL = configv1.URL(urlString) @@ -393,7 +418,7 @@ func loadReleaseFromMetadata(releaseDir string) (configv1.Release, error) { } } - return release, nil + return release, arch, nil } func loadImageReferences(releaseDir string) (*imagev1.ImageStream, error) { diff --git a/pkg/payload/payload_test.go b/pkg/payload/payload_test.go index 87230118f4..0aa1d7e10a 100644 --- a/pkg/payload/payload_test.go +++ b/pkg/payload/payload_test.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" "reflect" + "runtime" "testing" "github.com/google/go-cmp/cmp" @@ -23,10 +24,13 @@ import ( "github.com/openshift/library-go/pkg/manifest" ) +var architecture string + func init() { klog.InitFlags(flag.CommandLine) _ = flag.CommandLine.Lookup("v").Value.Set("2") _ = flag.CommandLine.Lookup("alsologtostderr").Value.Set("true") + architecture = runtime.GOARCH } func TestLoadUpdate(t *testing.T) { @@ -62,6 +66,7 @@ func TestLoadUpdate(t *testing.T) { Name: "1.0.0-abc", }, }, + Architecture: architecture, ManifestHash: "DL-FFQ2Uem8=", Manifests: []manifest.Manifest{ { diff --git a/pkg/start/start_integration_test.go b/pkg/start/start_integration_test.go index 3d8dd770d7..49dcb8231c 100644 --- a/pkg/start/start_integration_test.go +++ b/pkg/start/start_integration_test.go @@ -511,6 +511,9 @@ metadata: worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", includeTechPreview, record.NewFakeRecorder(100), payload.DefaultClusterProfile) controllers.CVO.SetSyncWorkerForTesting(worker) + arch := runtime.GOARCH + controllers.CVO.SetArchitecture(arch) + lock, err := createResourceLock(cb, options.Namespace, options.Name) if err != nil { t.Fatal(err) @@ -535,7 +538,7 @@ metadata: t.Logf("latest version:\n%s", printCV(lastCV)) t.Fatal("no request received at upstream URL") } - expectedQuery := fmt.Sprintf("arch=%s&channel=test-channel&id=%s&version=0.0.1", runtime.GOARCH, id.String()) + expectedQuery := fmt.Sprintf("arch=%s&channel=test-channel&id=%s&version=0.0.1", arch, id.String()) expectedQueryValues, err := url.ParseQuery(expectedQuery) if err != nil { t.Fatalf("could not parse expected query: %v", err)