Skip to content

Upgrade tests pluggable test suite #1638

@cardil

Description

@cardil

Problem

Upgrade tests are located in Serving, Eventing, and also a merger of those in Operator. All those utilize Bash scripts that perform upgrade & downgrade, invoke smoke tests, and orchestrate continues assertion on requests or events in background. This follow up on knative/serving#9137.

Possible solution

I propose to create a pluggable test suite for upgrade tests. That upgrade suite might be located in knative.dev/pkg/test/upgrade package. That test suite should be configurable, so that can be used for upgrade testing in Knative Serving, and Eventing, and Operator. Different configuration can be used by vendors that needs this to be slightly different.

Consider the example of pseudo code below for Serving upgrades:

// +build e2e
// Serving upgrade test

package e2e

import (
  "knative.dev/pkg/test/upgrade"
  serving "knative.dev/serving/test/upgrade"
)

func TestServingUpgrades(t *testing.T) {
  suite := upgrade.NewBuilder(t).
    PreUpgradeTest(serving.PreUpgradeTest).
    PostUpgradeTest(serving.PostUpgradeTest).
    PostDowngradeTest(serving.PostDowngradeTest).
    ProbeTest(serving.ProbeTest).
    BaseInstall(serving.LatestReleaseInstall).
    UpgradeWith(serving.HeadInstall).
    DowngradeWith(serving.LatestReleaseInstall).
    Build()
  suite.Execute()
}

And Eventing upgrades:

// +build e2e
// Eventing upgrade test

package e2e

import (
  "knative.dev/pkg/test/upgrade"
  eventing "knative.dev/eventing/test/upgrade"
)

func TestEventingUpgrades(t *testing.T) {
  suite := upgrade.NewBuilder(t).
    PreUpgradeTest(eventing.PreUpgradeTest).
    PostUpgradeTest(eventing.PostUpgradeTest).
    PostDowngradeTest(eventing.PostDowngradeTest).
    ProbeTest(eventing.ProbeTest).
    BaseInstall(eventing.LatestReleaseInstall).
    UpgradeWith(eventing.HeadInstall).
    DowngradeWith(eventing.LatestReleaseInstall).
    Build()
  suite.Execute()
}

And Knative Operator upgrades test might then look like:

// +build e2e
// Operator upgrade test

package e2e

import (
  "knative.dev/pkg/test/upgrade"
  serving "knative.dev/serving/test/upgrade"
  eventing "knative.dev/eventing/test/upgrade"
)

func TestOperatorUpgrades(t *testing.T) {
  suite := upgrade.NewBuilder(t).
    PreUpgradeTest(serving.PreUpgradeTest).
    PreUpgradeTest(eventing.PreUpgradeTest).
    PostUpgradeTest(serving.PostUpgradeTest).
    PostUpgradeTest(eventing.PostUpgradeTest).
    PostDowngradeTest(serving.PostDowngradeTest).
    PostDowngradeTest(eventing.PostDowngradeTest).
    ProbeTest(serving.ProbeTest).
    ProbeTest(eventing.ProbeTest).
    BaseInstall(serving.LatestReleaseInstall).
    BaseInstall(eventing.LatestReleaseInstall).
    UpgradeWith(serving.HeadInstall).
    UpgradeWith(eventing.HeadInstall).
    DowngradeWith(serving.LatestReleaseInstall).
    DowngradeWith(eventing.LatestReleaseInstall).
    Build()
  suite.Execute()
}

As a final example Openshift Serverless example:

// +build e2e
// Serverless upgrade test

package e2e

import (
  "knative.dev/pkg/test/upgrade"
  serving "knative.dev/serving/test/upgrade"
  eventing "knative.dev/eventing/test/upgrade"
  serverless "github.com/openshift-knative/serverless-operator/test/upgrade"
  "github.com/openshift-knative/serverless-operator/test/upgrade/ocp"
)

func TestServerlessOperatorUpgrades(t *testing.T) {
  suite := upgrade.NewBuilder(t).
    PreUpgradeTest(serving.PreUpgradeTest).
    PreUpgradeTest(eventing.PreUpgradeTest).
    PostUpgradeTest(serving.PostUpgradeTest).
    PostUpgradeTest(eventing.PostUpgradeTest).
    PostDowngradeTest(serving.PostDowngradeTest).
    PostDowngradeTest(eventing.PostDowngradeTest).
    ProbeTest(serving.ProbeTest).
    ProbeTest(eventing.ProbeTest).
    BaseInstall(serverless.LatestReleaseInstall).
    UpgradeWith(ocp.Latest).
    UpgradeWith(serverless.HeadInstall).
    // No downgrade in this test...
    Build()
  suite.Execute()
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions