blob: c35f79f3e7abf883c3760fcebb828efd0aa07533 [file] [log] [blame]
//go:build integ
// +build integ
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package revisions
import (
"fmt"
"path/filepath"
"strings"
"testing"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/test/env"
"github.com/apache/dubbo-go-pixiu/pkg/test/framework"
"github.com/apache/dubbo-go-pixiu/pkg/test/framework/components/echo"
"github.com/apache/dubbo-go-pixiu/pkg/test/framework/components/echo/deployment"
"github.com/apache/dubbo-go-pixiu/pkg/test/framework/components/istioctl"
"github.com/apache/dubbo-go-pixiu/pkg/test/framework/components/namespace"
kubetest "github.com/apache/dubbo-go-pixiu/pkg/test/kube"
)
func TestRevisionTags(t *testing.T) {
framework.NewTest(t).
Features("installation.istioctl.revision_tags").
RequiresSingleCluster().
RequiresLocalControlPlane().
Run(func(t framework.TestContext) {
tcs := []struct {
name string
tag string
revision string
nsLabel string
error string
}{
{
"prod tag pointed to stable",
"prod",
"stable",
"istio.io/rev=prod",
"",
},
{
"prod tag pointed to canary",
"prod",
"canary",
"istio.io/rev=prod",
"",
},
{
"tag pointed to non existent revision",
"prod",
"fake-revision",
"istio.io/rev=prod",
"cannot modify tag",
},
{
"default tag-injects for istio injection enabled",
"default",
"stable",
"istio-injection=enabled",
"",
},
}
istioCtl := istioctl.NewOrFail(t, t, istioctl.Config{Cluster: t.Clusters().Default()})
baseArgs := []string{"tag"}
for _, tc := range tcs {
t.NewSubTest(tc.name).Run(func(t framework.TestContext) {
tagSetArgs := append(baseArgs, "set", tc.tag, "--revision", tc.revision, "--skip-confirmation", "--overwrite")
tagSetArgs = append(tagSetArgs, "--manifests", filepath.Join(env.IstioSrc, "manifests"))
tagRemoveArgs := append(baseArgs, "remove", tc.tag, "-y")
_, cmdErr, _ := istioCtl.Invoke(tagSetArgs)
t.Cleanup(func() {
_, _, _ = istioCtl.Invoke(tagRemoveArgs)
})
if tc.error == "" && cmdErr != "" {
t.Fatalf("did not expect error, got %q", cmdErr)
}
if tc.error != "" {
if !strings.Contains(cmdErr, tc.error) {
t.Fatalf("expected error to contain %q, got %q", tc.error, cmdErr)
}
// found correct error, don't proceed
return
}
// Expect the specified revision to inject for the namespace with the
// given injection label
revTagNs := namespace.NewOrFail(t, t, namespace.Config{
Prefix: "revision-tag",
})
nsLabelParts := strings.Split(tc.nsLabel, "=")
if len(nsLabelParts) != 2 {
t.Fatalf("invalid namespace label %s", tc.nsLabel)
}
if err := revTagNs.SetLabel(nsLabelParts[0], nsLabelParts[1]); err != nil {
t.Fatalf("couldn't set label %q on namespace %s: %w",
tc.nsLabel, revTagNs.Name(), err)
}
deployment.New(t).WithConfig(echo.Config{
Service: "revision-tag",
Namespace: revTagNs,
}).BuildOrFail(t)
fetch := kubetest.NewSinglePodFetch(t.Clusters().Default(),
revTagNs.Name(),
fmt.Sprintf("app=%s", "revision-tag"))
pods, err := fetch()
if err != nil {
t.Fatalf("error fetching pods: %v", err)
}
verifyRevision(t, istioCtl, pods[0].Name, revTagNs.Name(), tc.revision)
})
}
})
}
func verifyRevision(t framework.TestContext, i istioctl.Instance, podName, podNamespace, revision string) {
t.Helper()
pcArgs := []string{"pc", "bootstrap", podName, "-n", podNamespace}
bootstrapConfig, _ := i.InvokeOrFail(t, pcArgs)
expected := fmt.Sprintf("\"discoveryAddress\": \"istiod-%s.dubbo-system.svc:15012\"", revision)
if !strings.Contains(bootstrapConfig, expected) {
t.Errorf("expected revision %q in bootstrap config, did not find", revision)
}
}