Skip to content

Commit

Permalink
fixup! fixup! fixup! Add upgrade E2E
Browse files Browse the repository at this point in the history
Signed-off-by: Mikalai Radchuk <mradchuk@redhat.com>
  • Loading branch information
m1kola committed Jul 10, 2024
1 parent 06e64eb commit 13dad76
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 48 deletions.
2 changes: 2 additions & 0 deletions hack/pre-upgrade-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ spec:
installNamespace: default
packageName: prometheus
version: 1.0.0
serviceAccount:
name: default
EOF

kubectl wait --for=condition=Unpacked --timeout=60s ClusterCatalog $TEST_CLUSTER_CATALOG_NAME
Expand Down
86 changes: 38 additions & 48 deletions test/upgrade-e2e/upgrade_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,45 @@ import (
ocv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
)

// TODO: Get rid of hardcoded namespace
const olmNamespace = "olmv1-system"

func TestClusterExtensionAfterOLMUpgrade(t *testing.T) {
t.Log("Starting checks after OLM upgrade")
ctx := context.Background()

managerLabelSelector := labels.Set{"control-plane": "controller-manager"}

t.Log("Checking that the controller-manager deployment is updated")
require.EventuallyWithT(t, func(ct *assert.CollectT) {
var managerDeployments appsv1.DeploymentList
assert.NoError(ct, c.List(ctx, &managerDeployments, client.MatchingLabelsSelector{Selector: managerLabelSelector.AsSelector()}))
assert.Len(ct, managerDeployments.Items, 1)
managerDeployment := managerDeployments.Items[0]

assert.True(ct,
managerDeployment.Status.UpdatedReplicas == *managerDeployment.Spec.Replicas &&
managerDeployment.Status.Replicas == *managerDeployment.Spec.Replicas &&
managerDeployment.Status.AvailableReplicas == *managerDeployment.Spec.Replicas &&
managerDeployment.Status.ReadyReplicas == *managerDeployment.Spec.Replicas,
)
}, time.Minute, time.Second)

var managerPod *corev1.Pod
t.Log("Waiting for only one controller-manager pod to remain")
require.EventuallyWithT(t, func(ct *assert.CollectT) {
var managerPods corev1.PodList
assert.NoError(ct, c.List(ctx, &managerPods, client.MatchingLabelsSelector{Selector: managerLabelSelector.AsSelector()}))
assert.Len(ct, managerPods.Items, 1)

managerPod = &managerPods.Items[0]
}, time.Minute, time.Second)

t.Log("Reading logs to make sure that ClusterExtension was reconciled by operator-controller before we update it")
logCtx, cancel := context.WithTimeout(ctx, time.Minute)
defer cancel()
substring := fmt.Sprintf(`"ClusterExtension": {"name":"%s"}`, testClusterExtensionName)
found, err := watchPodLogsForSubstring(logCtx, managerPod, "manager", substring)
require.NoError(t, err)
require.True(t, found)

var clusterCatalog catalogdv1alpha1.ClusterCatalog
var clusterExtension ocv1alpha1.ClusterExtension

Expand Down Expand Up @@ -64,7 +94,7 @@ func TestClusterExtensionAfterOLMUpgrade(t *testing.T) {
t.Log("Updating the cluster extension to change version")
// This is to make sure that after we upgrade OLM itself we can still reconcile old objects
clusterExtension.Spec.Version = "1.0.1"
c.Update(ctx, &clusterExtension)
require.NoError(t, c.Update(ctx, &clusterExtension))

t.Log("Checking that the cluster extension installs successfully")
require.EventuallyWithT(t, func(ct *assert.CollectT) {
Expand All @@ -79,48 +109,12 @@ func TestClusterExtensionAfterOLMUpgrade(t *testing.T) {
assert.Equal(ct, &ocv1alpha1.BundleMetadata{Name: "prometheus-operator.1.0.1", Version: "1.0.1"}, clusterExtension.Status.InstalledBundle)
assert.NotEqual(ct, previousVersion, clusterExtension.Status.InstalledBundle.Version)
}, time.Minute, time.Second)

t.Log("Checking that the controller-manager deployment is updated")
require.EventuallyWithT(t, func(ct *assert.CollectT) {
var managerDeployments appsv1.DeploymentList
assert.NoError(ct, c.List(ctx, &managerDeployments, client.MatchingLabelsSelector{Selector: managerLabelSelector.AsSelector()}))
assert.Len(ct, managerDeployments.Items, 1)
managerDeployment := managerDeployments.Items[0]

assert.True(ct,
managerDeployment.Status.UpdatedReplicas == *managerDeployment.Spec.Replicas &&
managerDeployment.Status.Replicas == *managerDeployment.Spec.Replicas &&
managerDeployment.Status.AvailableReplicas == *managerDeployment.Spec.Replicas &&
managerDeployment.Status.ReadyReplicas == *managerDeployment.Spec.Replicas,
)
}, time.Minute, time.Second)

var managerPod *corev1.Pod
t.Log("Waiting for only one pod controller-manager pod to remain")
require.EventuallyWithT(t, func(ct *assert.CollectT) {
managerPods, err := kclientset.CoreV1().Pods(olmNamespace).List(ctx, metav1.ListOptions{
LabelSelector: metav1.FormatLabelSelector(metav1.SetAsLabelSelector(managerLabelSelector)),
})
assert.NoError(ct, err)
assert.Len(ct, managerPods.Items, 1)

managerPod = &managerPods.Items[0]
}, time.Minute, time.Second)

logCtx, cancel := context.WithTimeout(ctx, time.Minute)
defer cancel()

substring := fmt.Sprintf(`"ClusterExtension": {"name":"%s"}`, testClusterExtensionName)
found, err := watchPodLogsForSubstring(logCtx, managerPod, substring)
require.NoError(t, err)
require.True(t, found)
}

func watchPodLogsForSubstring(ctx context.Context, pod *corev1.Pod, substring string) (bool, error) {
func watchPodLogsForSubstring(ctx context.Context, pod *corev1.Pod, container, substring string) (bool, error) {
podLogOpts := corev1.PodLogOptions{
Follow: true,
// We are only interested in manager logs
Container: "manager",
Follow: true,
Container: container,
}

req := kclientset.CoreV1().Pods(pod.Namespace).GetLogs(pod.Name, &podLogOpts)
Expand All @@ -139,9 +133,5 @@ func watchPodLogsForSubstring(ctx context.Context, pod *corev1.Pod, substring st
}
}

if err := scanner.Err(); err != nil {
return false, err
}

return false, nil
return false, scanner.Err()
}

0 comments on commit 13dad76

Please sign in to comment.