Skip to content

Commit

Permalink
Reenable helm-upgrade integration test (linkerd#10047)
Browse files Browse the repository at this point in the history
Supersedes linkerd#9856, now that the `linkerd check` logic in the integrations tests got cleaned up via linkerd#9989.

The helm-upgrade test had been commented-out when we jumped to the new 2.12 helm charts. It can be used again to test upgrades from 2.12.x.

- Some of the logic in `test/integration/install/install_test.go` still hadn't considered the need to upgrade both the `linkerd-crds` and `linkerd-control-plane` charts, so that got fixed.
- Removed references to the now-deprecated `linkerd2` chart.
- Improved the `helm_cleanup()` function by uninstalling the charts in reverse order (extensions first, core last). We delete the namespaces afterwards because helm sometimes doesn't remove them, and so we shouldn't fail if we attempt to delete one that is already gone. Also removed unneeded `kubectl wait`s because `kubect delete ns` should be blocking.
  • Loading branch information
alpeb authored Jan 10, 2023
1 parent 13e497c commit 72589f0
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 54 deletions.
3 changes: 1 addition & 2 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,7 @@ jobs:
- default-policy-deny
- external
- rsa-ca
# Skipping Helm upgrade test given chart in 2.11 is backwards-incompatible
#- helm-upgrade
- helm-upgrade
- uninstall
- upgrade-edge
- upgrade-stable
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,7 @@ jobs:
- default-policy-deny
- external
- rsa-ca
# Skipping Helm upgrade test given chart in 2.11 is backwards-incompatible
#- helm-upgrade
- helm-upgrade
- uninstall
- upgrade-edge
- upgrade-stable
Expand Down
15 changes: 6 additions & 9 deletions bin/_test-helpers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -413,16 +413,13 @@ setup_helm() {
helm_cleanup() {
(
set -e
"$helm_path" --kube-context="$context" --namespace linkerd delete "$helm_release_name-crds" || true
"$helm_path" --kube-context="$context" --namespace linkerd-multicluster delete "$helm_multicluster_release_name" || true
kubectl delete ns/linkerd-multicluster || true
"$helm_path" --kube-context="$context" --namespace linkerd-viz delete "$helm_release_name-l5d-viz" || true
kubectl delete ns/linkerd-viz || true
"$helm_path" --kube-context="$context" --namespace linkerd delete "$helm_release_name-control-plane" || true
"$helm_path" --kube-context="$context" --namespace linkerd delete "$helm_release_name-crds" || true
kubectl delete ns/linkerd
"$helm_path" --kube-context="$context" --namespace linkerd-multicluster delete "$helm_multicluster_release_name" || true
kubectl delete ns/linkerd-multicluster
# We wait for the namespace to be gone so the following call to `cleanup` doesn't fail when it attempts to delete
# the same namespace that is already being deleted here (error thrown by the NamespaceLifecycle controller).
# We don't have that problem with global resources, so no need to wait for them to be gone.
kubectl wait --for=delete ns/linkerd --timeout=120s || true
kubectl wait --for=delete ns/linkerd-multicluster --timeout=120s || true
)
exit_on_err 'error cleaning up Helm'
}
Expand All @@ -439,7 +436,7 @@ run_helm-upgrade_test() {
setup_helm
helm_viz_chart="$( cd "$bindir"/.. && pwd )"/viz/charts/linkerd-viz
run_test "$test_directory/install/install_test.go" --helm-path="$helm_path" --helm-charts="$helm_charts" \
--viz-helm-chart="$helm_viz_chart" --helm-stable-chart='linkerd/linkerd2' --viz-helm-stable-chart="linkerd/linkerd-viz" --helm-release="$helm_release_name" --upgrade-helm-from-version="$stable_version"
--viz-helm-chart="$helm_viz_chart" --viz-helm-stable-chart="linkerd/linkerd-viz" --helm-release="$helm_release_name" --upgrade-helm-from-version="$stable_version"
helm_cleanup
}

Expand Down
2 changes: 1 addition & 1 deletion test/cli/cli_install_static_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func TestMain(m *testing.M) {
exit(1, "-linkerd flag is required")
}

TestHelper = testutil.NewGenericTestHelper(*linkerd, "", "l5d", "linkerd-viz", "", "", "", "", "", "", "", "", false, false, false, false, false, false, *http.DefaultClient, testutil.KubernetesHelper{})
TestHelper = testutil.NewGenericTestHelper(*linkerd, "", "l5d", "linkerd-viz", "", "", "", "", "", "", "", false, false, false, false, false, false, *http.DefaultClient, testutil.KubernetesHelper{})
os.Exit(m.Run())
}

Expand Down
54 changes: 26 additions & 28 deletions test/integration/install/install_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -313,8 +313,9 @@ func TestInstallOrUpgradeCli(t *testing.T) {

}

// These need to be updated (if there are changes) once a new stable is released
func helmOverridesStable(root *tls.CA) ([]string, []string) {
// helmInstallFlags returns the flags required for the `helm install` command,
// both for the linkerd-control-plane and the linkerd-viz charts
func helmInstallFlags(root *tls.CA) ([]string, []string) {
coreArgs := []string{
"--set", "controllerLogLevel=debug",
"--set", "linkerdVersion=" + TestHelper.UpgradeHelmFromVersion(),
Expand All @@ -326,13 +327,16 @@ func helmOverridesStable(root *tls.CA) ([]string, []string) {
"--set", "identity.issuer.crtExpiry=" + root.Cred.Crt.Certificate.NotAfter.Format(time.RFC3339),
}
vizArgs := []string{
"--namespace", TestHelper.GetVizNamespace(),
"--create-namespace",
"--set", "linkerdVersion=" + TestHelper.UpgradeHelmFromVersion(),
}
return coreArgs, vizArgs
}

// These need to correspond to the flags in the current edge
func helmOverridesEdge(root *tls.CA) ([]string, []string) {
// helmUpgradeFlags returns the flags required for the `helm upgrade` command,
// both for the linkerd-control-plane and the linkerd-viz charts
func helmUpgradeFlags(root *tls.CA) ([]string, []string) {
skippedInboundPortsEscaped := strings.Replace(skippedInboundPorts, ",", "\\,", 1)
coreArgs := []string{
"--set", "controllerLogLevel=debug",
Expand All @@ -345,7 +349,6 @@ func helmOverridesEdge(root *tls.CA) ([]string, []string) {
}
vizArgs := []string{
"--namespace", TestHelper.GetVizNamespace(),
"--create-namespace",
"--set", "linkerdVersion=" + TestHelper.GetVersion(),
}

Expand Down Expand Up @@ -381,37 +384,23 @@ func TestInstallHelm(t *testing.T) {
"failed to generate root certificate for identity: %s", err)
}

var crdsChartToInstall string
var controlPlaneChartToInstall string
var vizChartToInstall string
var args []string
var vizArgs []string

if TestHelper.UpgradeHelmFromVersion() != "" {
crdsChartToInstall = TestHelper.GetHelmStableChart()
vizChartToInstall = TestHelper.GetLinkerdVizHelmStableChart()
args, vizArgs = helmOverridesStable(helmTLSCerts)
} else {
crdsChartToInstall = TestHelper.GetHelmCharts() + "/linkerd-crds"
controlPlaneChartToInstall = TestHelper.GetHelmCharts() + "/linkerd-control-plane"
vizChartToInstall = TestHelper.GetLinkerdVizHelmChart()
args, vizArgs = helmOverridesEdge(helmTLSCerts)
}
args, vizArgs := helmInstallFlags(helmTLSCerts)

releaseName := TestHelper.GetHelmReleaseName() + "-crds"
if stdout, stderr, err := TestHelper.HelmInstall(crdsChartToInstall, releaseName, args...); err != nil {
if stdout, stderr, err := TestHelper.HelmInstall("linkerd/linkerd-crds", releaseName, args...); err != nil {
testutil.AnnotatedFatalf(t, "'helm install' command failed",
"'helm install' command failed\n%s\n%s", stdout, stderr)
}

releaseName = TestHelper.GetHelmReleaseName() + "-control-plane"
if stdout, stderr, err := TestHelper.HelmInstall(controlPlaneChartToInstall, releaseName, args...); err != nil {
if stdout, stderr, err := TestHelper.HelmInstall("linkerd/linkerd-control-plane", releaseName, args...); err != nil {
testutil.AnnotatedFatalf(t, "'helm install' command failed",
"'helm install' command failed\n%s\n%s", stdout, stderr)
}
TestHelper.WaitRollout(t, testutil.LinkerdDeployReplicasEdge)

if stdout, stderr, err := TestHelper.HelmCmdPlain("install", vizChartToInstall, "l5d-viz", vizArgs...); err != nil {
releaseName = TestHelper.GetHelmReleaseName() + "-l5d-viz"
if stdout, stderr, err := TestHelper.HelmCmdPlain("install", "linkerd/linkerd-viz", releaseName, vizArgs...); err != nil {
testutil.AnnotatedFatalf(t, "'helm install' command failed",
"'helm install' command failed\n%s\n%s", stdout, stderr)
}
Expand Down Expand Up @@ -477,16 +466,25 @@ func TestUpgradeHelm(t *testing.T) {
"--timeout", "60m",
"--wait",
}
extraArgs, vizArgs := helmOverridesEdge(helmTLSCerts)
extraArgs, vizArgs := helmUpgradeFlags(helmTLSCerts)
args = append(args, extraArgs...)
if stdout, stderr, err := TestHelper.HelmUpgrade(TestHelper.GetHelmCharts()+"/linkerd-crds", args...); err != nil {
releaseName := TestHelper.GetHelmReleaseName() + "-crds"
if stdout, stderr, err := TestHelper.HelmUpgrade(TestHelper.GetHelmCharts()+"/linkerd-crds", releaseName, args...); err != nil {
testutil.AnnotatedFatalf(t, "'helm upgrade' command failed",
"'helm upgrade' command failed\n%s\n%s", stdout, stderr)
}
TestHelper.WaitRollout(t, testutil.LinkerdDeployReplicasEdge)

releaseName = TestHelper.GetHelmReleaseName() + "-control-plane"
if stdout, stderr, err := TestHelper.HelmUpgrade(TestHelper.GetHelmCharts()+"/linkerd-control-plane", releaseName, args...); err != nil {
TestHelper.WaitRollout(t, testutil.LinkerdDeployReplicasEdge)
testutil.AnnotatedFatalf(t, "'helm upgrade' command failed",
"'helm upgrade' command failed\n%s\n%s", stdout, stderr)
}
TestHelper.WaitRollout(t, testutil.LinkerdVizDeployReplicas)

vizChart := TestHelper.GetLinkerdVizHelmChart()
if stdout, stderr, err := TestHelper.HelmCmdPlain("upgrade", vizChart, "l5d-viz", vizArgs...); err != nil {
releaseName = TestHelper.GetHelmReleaseName() + "-l5d-viz"
if stdout, stderr, err := TestHelper.HelmCmdPlain("upgrade", vizChart, releaseName, vizArgs...); err != nil {
testutil.AnnotatedFatalf(t, "'helm upgrade' command failed",
"'helm upgrade' command failed\n%s\n%s", stdout, stderr)
}
Expand Down
14 changes: 2 additions & 12 deletions testutil/test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ type helm struct {
multiclusterChart string
vizChart string
vizStableChart string
stableChart string
releaseName string
multiclusterReleaseName string
upgradeFromVersion string
Expand Down Expand Up @@ -130,7 +129,6 @@ func NewGenericTestHelper(
clusterDomain,
helmPath,
helmCharts,
helmStableChart,
helmReleaseName,
helmMulticlusterReleaseName,
helmMulticlusterChart string,
Expand All @@ -154,7 +152,6 @@ func NewGenericTestHelper(
charts: helmCharts,
multiclusterChart: helmMulticlusterChart,
multiclusterReleaseName: helmMulticlusterReleaseName,
stableChart: helmStableChart,
releaseName: helmReleaseName,
upgradeFromVersion: upgradeFromVersion,
},
Expand Down Expand Up @@ -191,7 +188,6 @@ func NewTestHelper() *TestHelper {
multiclusterHelmChart := flag.String("multicluster-helm-chart", "charts/linkerd-multicluster", "path to linkerd2's multicluster Helm chart")
vizHelmChart := flag.String("viz-helm-chart", "charts/linkerd-viz", "path to linkerd2's viz extension Helm chart")
vizHelmStableChart := flag.String("viz-helm-stable-chart", "charts/linkerd-viz", "path to linkerd2's viz extension stable Helm chart")
helmStableChart := flag.String("helm-stable-chart", "linkerd/linkerd2", "path to linkerd2's stable Helm chart")
helmReleaseName := flag.String("helm-release", "", "install linkerd via Helm using this release name")
multiclusterHelmReleaseName := flag.String("multicluster-helm-release", "", "install linkerd multicluster via Helm using this release name")
upgradeFromVersion := flag.String("upgrade-from-version", "", "when specified, the upgrade test uses it as the base version of the upgrade")
Expand Down Expand Up @@ -240,7 +236,6 @@ func NewTestHelper() *TestHelper {
multiclusterChart: *multiclusterHelmChart,
vizChart: *vizHelmChart,
vizStableChart: *vizHelmStableChart,
stableChart: *helmStableChart,
releaseName: *helmReleaseName,
multiclusterReleaseName: *multiclusterHelmReleaseName,
upgradeFromVersion: *upgradeHelmFromVersion,
Expand Down Expand Up @@ -344,11 +339,6 @@ func (h *TestHelper) GetLinkerdVizHelmStableChart() string {
return h.helm.vizStableChart
}

// GetHelmStableChart returns the path to the Linkerd Helm stable chart
func (h *TestHelper) GetHelmStableChart() string {
return h.helm.stableChart
}

// UpgradeHelmFromVersion returns the version from which Linkerd should be upgraded with Helm
func (h *TestHelper) UpgradeHelmFromVersion() string {
return h.helm.upgradeFromVersion
Expand Down Expand Up @@ -520,10 +510,10 @@ func (h *TestHelper) KubectlStream(arg ...string) (*Stream, error) {
}

// HelmUpgrade runs the helm upgrade subcommand, with the provided arguments
func (h *TestHelper) HelmUpgrade(chart string, arg ...string) (string, string, error) {
func (h *TestHelper) HelmUpgrade(chart, releaseName string, arg ...string) (string, string, error) {
withParams := append([]string{
"upgrade",
h.helm.releaseName,
releaseName,
"--kube-context", h.k8sContext,
"--namespace", h.namespace,
"--timeout", "60m",
Expand Down

0 comments on commit 72589f0

Please sign in to comment.