From 275d62ee402e1b2b5447aa92ca5a5e8f016e9168 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 27 Mar 2024 13:15:39 -0400 Subject: [PATCH] OCPBUGS-31438: Correctly detect catalog image ID for extractContent catalog pods (#3194) Signed-off-by: Joe Lanford --- pkg/controller/registry/reconciler/grpc.go | 31 ++++++++++++------- .../registry/reconciler/grpc_test.go | 23 +++++++++++--- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/pkg/controller/registry/reconciler/grpc.go b/pkg/controller/registry/reconciler/grpc.go index 354cf1e8c7..8864e1acf8 100644 --- a/pkg/controller/registry/reconciler/grpc.go +++ b/pkg/controller/registry/reconciler/grpc.go @@ -8,12 +8,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" - controllerclient "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/controller-runtime/client" - hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash" - "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" - "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" "github.com/pkg/errors" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -21,6 +15,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/intstr" + + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" + controllerclient "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/controller-runtime/client" + hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash" + "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" + "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" + "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" ) const ( @@ -525,12 +526,20 @@ func imageChanged(logger *logrus.Entry, updatePod *corev1.Pod, servingPods []*co // imageID returns the ImageID of the primary catalog source container or an empty string if the image ID isn't available yet. // Note: the pod must be running and the container in a ready status to return a valid ImageID. func imageID(pod *corev1.Pod) string { - if len(pod.Status.ContainerStatuses) < 1 { - logrus.WithField("CatalogSource", pod.GetName()).Warn("pod status unknown") - return "" + if len(pod.Status.InitContainerStatuses) == 2 && len(pod.Status.ContainerStatuses) == 1 { + // spec.grpcPodConfig.extractContent mode was used for this pod + return pod.Status.InitContainerStatuses[1].ImageID } - - return pod.Status.ContainerStatuses[0].ImageID + if len(pod.Status.InitContainerStatuses) == 0 && len(pod.Status.ContainerStatuses) == 1 { + // spec.grpcPodConfig.extractContent mode was NOT used for this pod (i.e. we're just running the catalog image directly) + return pod.Status.ContainerStatuses[0].ImageID + } + if len(pod.Status.InitContainerStatuses) == 0 && len(pod.Status.ContainerStatuses) == 0 { + logrus.WithField("CatalogSource", pod.GetName()).Warn("pod status unknown; pod has not yet populated initContainer and container status") + } else { + logrus.WithField("CatalogSource", pod.GetName()).Warn("pod status unknown; pod contains unexpected initContainer and container configuration") + } + return "" } func (c *GrpcRegistryReconciler) removePods(pods []*corev1.Pod, namespace string) error { diff --git a/pkg/controller/registry/reconciler/grpc_test.go b/pkg/controller/registry/reconciler/grpc_test.go index 33309afddd..fd505fcf6a 100644 --- a/pkg/controller/registry/reconciler/grpc_test.go +++ b/pkg/controller/registry/reconciler/grpc_test.go @@ -7,7 +7,7 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" + "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" @@ -17,7 +17,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clientfake" ) @@ -640,17 +640,30 @@ func TestGetPodImageID(t *testing.T) { result string }{ { - description: "pod has status: return status", + description: "default pod has status: return status", pod: &corev1.Pod{Status: corev1.PodStatus{ContainerStatuses: []corev1.ContainerStatus{{ImageID: "xyz123"}}}}, result: "xyz123", }, { - description: "pod has two containers: return first", + description: "extractConfig pod has status: return status", + pod: &corev1.Pod{Status: corev1.PodStatus{ + InitContainerStatuses: []corev1.ContainerStatus{ + {ImageID: "xyz123"}, + {ImageID: "abc456"}, + }, + ContainerStatuses: []corev1.ContainerStatus{ + {ImageID: "xyz123"}, + }, + }}, + result: "abc456", + }, + { + description: "pod has unexpected container config", pod: &corev1.Pod{Status: corev1.PodStatus{ContainerStatuses: []corev1.ContainerStatus{ {ImageID: "xyz123"}, {ImageID: "abc456"}, }}}, - result: "xyz123", + result: "", }, { description: "pod has no status",