diff --git a/pkg/cmd/version/testdata/TestGetVersions-deployment_only_with_pipeline_installed.golden b/pkg/cmd/version/testdata/TestGetVersions-deployment_only_with_pipeline_installed.golden new file mode 100644 index 0000000000..7291f23fb7 --- /dev/null +++ b/pkg/cmd/version/testdata/TestGetVersions-deployment_only_with_pipeline_installed.golden @@ -0,0 +1,2 @@ +Client version: dev +Pipeline version: v0.10.0 diff --git a/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline,_triggers_and_dashboard_installed.golden b/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline,_triggers_and_dashboard_installed.golden new file mode 100644 index 0000000000..bcecbf3ef2 --- /dev/null +++ b/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline,_triggers_and_dashboard_installed.golden @@ -0,0 +1,4 @@ +Client version: dev +Pipeline version: v0.10.0 +Triggers version: v0.5.0 +Dashboard version: v0.7.0 diff --git a/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline_and_dashboard_installed.golden b/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline_and_dashboard_installed.golden new file mode 100644 index 0000000000..0b70794616 --- /dev/null +++ b/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline_and_dashboard_installed.golden @@ -0,0 +1,3 @@ +Client version: dev +Pipeline version: v0.10.0 +Dashboard version: v0.7.0 diff --git a/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline_and_triggers_installed.golden b/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline_and_triggers_installed.golden new file mode 100644 index 0000000000..be27df77fb --- /dev/null +++ b/pkg/cmd/version/testdata/TestGetVersions-deployment_with_pipeline_and_triggers_installed.golden @@ -0,0 +1,3 @@ +Client version: dev +Pipeline version: v0.10.0 +Triggers version: v0.5.0 diff --git a/pkg/cmd/version/testdata/TestGetVersions-empty_deployment_items.golden b/pkg/cmd/version/testdata/TestGetVersions-empty_deployment_items.golden new file mode 100644 index 0000000000..4f5540d7c3 --- /dev/null +++ b/pkg/cmd/version/testdata/TestGetVersions-empty_deployment_items.golden @@ -0,0 +1,2 @@ +Client version: dev +Pipeline version: unknown, pipeline controller may be installed in another namespace please use tkn version -n {namespace} diff --git a/pkg/cmd/version/testdata/TestVersionGood.golden b/pkg/cmd/version/testdata/TestVersionGood.golden index 589514fc09..8d46e5ddd6 100644 --- a/pkg/cmd/version/testdata/TestVersionGood.golden +++ b/pkg/cmd/version/testdata/TestVersionGood.golden @@ -1,4 +1,2 @@ Client version: v1.2.3 Pipeline version: unknown, pipeline controller may be installed in another namespace please use tkn version -n {namespace} -Triggers version: unknown, triggers controller may be installed in another namespace please use tkn version -n {namespace} -Dashboard version: unknown, dashboard controller may be installed in another namespace please use tkn version -n {namespace} diff --git a/pkg/cmd/version/version.go b/pkg/cmd/version/version.go index ecf02a0c8f..ecfd67474d 100644 --- a/pkg/cmd/version/version.go +++ b/pkg/cmd/version/version.go @@ -67,17 +67,13 @@ func Command(p cli.Params) *cobra.Command { fmt.Fprintf(cmd.OutOrStdout(), "Pipeline version: %s\n", pipelineVersion) triggersVersion, _ := version.GetTriggerVersion(cs, namespace) - if triggersVersion == "" { - triggersVersion = "unknown, " + - "triggers controller may be installed in another namespace please use tkn version -n {namespace}" + if triggersVersion != "" { + fmt.Fprintf(cmd.OutOrStdout(), "Triggers version: %s\n", triggersVersion) } - fmt.Fprintf(cmd.OutOrStdout(), "Triggers version: %s\n", triggersVersion) dashboardVersion, _ := version.GetDashboardVersion(cs, namespace) - if dashboardVersion == "" { - dashboardVersion = "unknown, " + - "dashboard controller may be installed in another namespace please use tkn version -n {namespace}" + if dashboardVersion != "" { + fmt.Fprintf(cmd.OutOrStdout(), "Dashboard version: %s\n", dashboardVersion) } - fmt.Fprintf(cmd.OutOrStdout(), "Dashboard version: %s\n", dashboardVersion) } if !check || clientVersion == devVersion { diff --git a/pkg/cmd/version/version_test.go b/pkg/cmd/version/version_test.go index 914545435e..fb586d5747 100644 --- a/pkg/cmd/version/version_test.go +++ b/pkg/cmd/version/version_test.go @@ -22,6 +22,7 @@ import ( "net" "net/http" "net/http/httptest" + "strings" "testing" "time" @@ -29,6 +30,9 @@ import ( pipelinetest "github.com/tektoncd/pipeline/test/v1alpha1" "gotest.tools/v3/assert" "gotest.tools/v3/golden" + v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestVersionGood(t *testing.T) { @@ -150,3 +154,104 @@ func testingHTTPClient(handler http.Handler) (*http.Client, func()) { return cli, s.Close } + +func TestGetVersions(t *testing.T) { + pipelineDeploymentLabels := map[string]string{ + "app.kubernetes.io/part-of": "tekton-pipelines", + "app.kubernetes.io/component": "controller", + "app.kubernetes.io/name": "controller", + } + triggersDeploymentLabels := map[string]string{ + "app.kubernetes.io/part-of": "tekton-triggers", + "app.kubernetes.io/component": "controller", + "app.kubernetes.io/name": "controller", + } + dashboardDeploymentLabels := map[string]string{ + "app.kubernetes.io/part-of": "tekton-dashboard", + "app.kubernetes.io/component": "dashboard", + "app.kubernetes.io/name": "dashboard", + } + pipelineDeployment := getDeploymentData("pipeline-dep", "", pipelineDeploymentLabels, map[string]string{"app.kubernetes.io/version": "v0.10.0"}, nil) + triggersDeployment := getDeploymentData("triggers-dep", "", triggersDeploymentLabels, map[string]string{"app.kubernetes.io/version": "v0.5.0"}, nil) + dashboardDeployment := getDeploymentData("dashboard-dep", "", dashboardDeploymentLabels, map[string]string{"app.kubernetes.io/version": "v0.7.0"}, nil) + + testParams := []struct { + name string + namespace string + userProvidedNamespace string + deployment []*v1.Deployment + goldenFile bool + }{{ + name: "empty deployment items", + namespace: "tekton-pipelines", + deployment: []*v1.Deployment{}, + goldenFile: true, + }, { + name: "deployment only with pipeline installed", + namespace: "test", + userProvidedNamespace: "test", + deployment: []*v1.Deployment{pipelineDeployment}, + goldenFile: true, + }, { + name: "deployment with pipeline and triggers installed", + namespace: "test", + userProvidedNamespace: "test", + deployment: []*v1.Deployment{pipelineDeployment, triggersDeployment}, + goldenFile: true, + }, { + name: "deployment with pipeline and dashboard installed", + namespace: "test", + userProvidedNamespace: "test", + deployment: []*v1.Deployment{pipelineDeployment, dashboardDeployment}, + goldenFile: true, + }, { + name: "deployment with pipeline, triggers and dashboard installed", + namespace: "test", + userProvidedNamespace: "test", + deployment: []*v1.Deployment{pipelineDeployment, triggersDeployment, dashboardDeployment}, + goldenFile: true, + }} + for _, tp := range testParams { + t.Run(tp.name, func(t *testing.T) { + seedData, _ := test.SeedTestData(t, pipelinetest.Data{}) + cs := pipelinetest.Clients{Kube: seedData.Kube} + p := &test.Params{Kube: cs.Kube} + version := Command(p) + cls, err := p.Clients() + if err != nil { + t.Errorf("failed to get client: %v", err) + } + // To add multiple deployments in a particular namespace + for _, v := range tp.deployment { + if _, err := cls.Kube.AppsV1().Deployments(tp.namespace).Create(v); err != nil { + t.Errorf("failed to create deployment: %v", err) + } + } + got, _ := test.ExecuteCommand(version, "version", "-n", "test") + golden.Assert(t, got, strings.ReplaceAll(fmt.Sprintf("%s.golden", t.Name()), "/", "-")) + }) + } +} + +func getDeploymentData(name, image string, deploymentLabels, podTemplateLabels, annotations map[string]string) *v1.Deployment { + return &v1.Deployment{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Labels: deploymentLabels, + }, + Spec: v1.DeploymentSpec{ + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: podTemplateLabels, + Annotations: annotations, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{{ + Image: image, + }}, + }, + }, + }, + } +}