Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package okteto for openSUSE:Factory checked in at 2022-12-17 20:36:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/okteto (Old) and /work/SRC/openSUSE:Factory/.okteto.new.1835 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "okteto" Sat Dec 17 20:36:50 2022 rev:35 rq:1043457 version:2.10.2 Changes: -------- --- /work/SRC/openSUSE:Factory/okteto/okteto.changes 2022-12-02 13:13:19.049911339 +0100 +++ /work/SRC/openSUSE:Factory/.okteto.new.1835/okteto.changes 2022-12-17 20:37:08.532801760 +0100 @@ -1,0 +2,7 @@ +Fri Dec 16 12:37:48 UTC 2022 - ka...@b1-systems.de + +- Update to version 2.10.2: + * Fix sanitize name (#3263) (#3295) + * Fix infer name for "okteto logs" (#3264) (#3274) + +------------------------------------------------------------------- Old: ---- okteto-2.10.1.tar.gz New: ---- okteto-2.10.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ okteto.spec ++++++ --- /var/tmp/diff_new_pack.lIIpin/_old 2022-12-17 20:37:09.184805342 +0100 +++ /var/tmp/diff_new_pack.lIIpin/_new 2022-12-17 20:37:09.188805364 +0100 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: okteto -Version: 2.10.1 +Version: 2.10.2 Release: 0 Summary: Develop your applications directly in your Kubernetes Cluster License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.lIIpin/_old 2022-12-17 20:37:09.216805518 +0100 +++ /var/tmp/diff_new_pack.lIIpin/_new 2022-12-17 20:37:09.220805540 +0100 @@ -3,10 +3,10 @@ <param name="url">https://github.com/okteto/okteto</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">2.10.1</param> + <param name="revision">2.10.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> - <param name="match-tag">2.10.1</param> + <param name="match-tag">2.10.2</param> </service> <service name="set_version" mode="disabled"> <param name="basename">okteto</param> @@ -16,7 +16,7 @@ <param name="compression">gz</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">okteto-2.10.1.tar.gz</param> + <param name="archive">okteto-2.10.2.tar.gz</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.lIIpin/_old 2022-12-17 20:37:09.236805628 +0100 +++ /var/tmp/diff_new_pack.lIIpin/_new 2022-12-17 20:37:09.236805628 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/okteto/okteto</param> - <param name="changesrevision">c9b1cc3a7c128d0905811a03697b396444e9ebb6</param></service></servicedata> + <param name="changesrevision">1fad522d06e5be2426145d57e2d8391f4b22da9c</param></service></servicedata> (No newline at EOF) ++++++ okteto-2.10.1.tar.gz -> okteto-2.10.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/cmd/deploy/command_configuration.go new/okteto-2.10.2/cmd/deploy/command_configuration.go --- old/okteto-2.10.1/cmd/deploy/command_configuration.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/cmd/deploy/command_configuration.go 2022-12-14 12:39:03.000000000 +0100 @@ -57,6 +57,8 @@ deployOptions.Manifest.Name = deployOptions.Name } if deployOptions.Manifest.Deploy != nil && deployOptions.Manifest.Deploy.ComposeSection != nil && deployOptions.Manifest.Deploy.ComposeSection.Stack != nil { + // when deploy options has name, stack name is overridden + // this name might not be sanitized deployOptions.Manifest.Deploy.ComposeSection.Stack.Name = deployOptions.Name } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/cmd/deploy/deploy.go new/okteto-2.10.2/cmd/deploy/deploy.go --- old/okteto-2.10.1/cmd/deploy/deploy.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/cmd/deploy/deploy.go 2022-12-14 12:39:03.000000000 +0100 @@ -395,6 +395,8 @@ fmt.Sprintf("%s=true", oktetoLog.OktetoDisableSpinnerEnvVar), // Set OKTETO_NAMESPACE=namespace-name env variable, so all the commandsruns on the same namespace fmt.Sprintf("%s=%s", model.OktetoNamespaceEnvVar, okteto.Context().Namespace), + // Set OKTETO_AUTODISCOVERY_RELEASE_NAME=sanitized name, so the release name in case of autodiscovery of helm is valid + fmt.Sprintf("%s=%s", constants.OktetoAutodiscoveryReleaseName, format.ResourceK8sMetaString(deployOptions.Name)), ) oktetoLog.EnableMasking() err = dc.deploy(ctx, deployOptions) @@ -565,7 +567,7 @@ translateOptions := &ingresses.TranslateOptions{ Namespace: opts.Manifest.Namespace, - Name: opts.Manifest.Name, + Name: format.ResourceK8sMetaString(opts.Manifest.Name), } for name, endpoint := range opts.Manifest.Deploy.Endpoints { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/cmd/deploy/kubeconfig.go new/okteto-2.10.2/cmd/deploy/kubeconfig.go --- old/okteto-2.10.1/cmd/deploy/kubeconfig.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/cmd/deploy/kubeconfig.go 2022-12-14 12:39:03.000000000 +0100 @@ -19,6 +19,7 @@ "time" "github.com/okteto/okteto/pkg/config" + "github.com/okteto/okteto/pkg/format" oktetoLog "github.com/okteto/okteto/pkg/log" "github.com/okteto/okteto/pkg/okteto" "k8s.io/client-go/rest" @@ -89,6 +90,6 @@ // GetTempKubeConfigFile returns where the temp kubeConfigFile for deploy should be stored func GetTempKubeConfigFile(name string) string { - tempKubeConfigTemplate := fmt.Sprintf("kubeconfig-deploy-%s-%d", name, time.Now().UnixMilli()) + tempKubeConfigTemplate := fmt.Sprintf("kubeconfig-deploy-%s-%d", format.ResourceK8sMetaString(name), time.Now().UnixMilli()) return filepath.Join(config.GetOktetoHome(), tempKubeConfigTemplate) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/cmd/logs/logs.go new/okteto-2.10.2/cmd/logs/logs.go --- old/okteto-2.10.1/cmd/logs/logs.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/cmd/logs/logs.go 2022-12-14 12:39:03.000000000 +0100 @@ -61,6 +61,13 @@ if err != nil { return err } + wd, err := os.Getwd() + if err != nil { + return err + } + if manifest.Name == "" { + manifest.Name = utils.InferName(wd) + } if len(args) > 0 { options.Include = args[0] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/cmd/pipeline/deploy.go new/okteto-2.10.2/cmd/pipeline/deploy.go --- old/okteto-2.10.1/cmd/pipeline/deploy.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/cmd/pipeline/deploy.go 2022-12-14 12:39:03.000000000 +0100 @@ -114,6 +114,8 @@ } if opts.Name == "" { + // in case of inferring the name from the repositoryURL + // opts.Name is not sanitized opts.Name = getPipelineName(opts.Repository) } @@ -223,6 +225,7 @@ return resp, nil } +// getPipelineName returns the repository name without sanitizing func getPipelineName(repository string) string { return model.TranslateURLToName(repository) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/cmd/utils/manifest.go new/okteto-2.10.2/cmd/utils/manifest.go --- old/okteto-2.10.1/cmd/utils/manifest.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/cmd/utils/manifest.go 2022-12-14 12:39:03.000000000 +0100 @@ -22,12 +22,12 @@ // InferName infers the application name from the folder received as parameter func InferName(cwd string) string { - repo, err := model.GetRepositoryURL(cwd) + repoURL, err := model.GetRepositoryURL(cwd) if err != nil { oktetoLog.Info("inferring name from folder") return filepath.Base(cwd) } oktetoLog.Info("inferring name from git repository URL") - return model.TranslateURLToName(repo) + return model.TranslateURLToName(repoURL) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/integration/commands/deploy.go new/okteto-2.10.2/integration/commands/deploy.go --- old/okteto-2.10.1/integration/commands/deploy.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/integration/commands/deploy.go 2022-12-14 12:39:03.000000000 +0100 @@ -35,6 +35,7 @@ Namespace string OktetoHome string Token string + Name string } // DestroyOptions defines the options that can be added to a deploy command @@ -130,6 +131,9 @@ if deployOptions.LogOutput != "" { cmd.Args = append(cmd.Args, "--log-output", deployOptions.LogOutput) } + if deployOptions.Name != "" { + cmd.Args = append(cmd.Args, "--name", deployOptions.Name) + } cmd.Env = os.Environ() if v := os.Getenv(model.OktetoURLEnvVar); v != "" { cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", model.OktetoURLEnvVar, v)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/integration/deploy/helm_test.go new/okteto-2.10.2/integration/deploy/helm_test.go --- old/okteto-2.10.1/integration/deploy/helm_test.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/integration/deploy/helm_test.go 2022-12-14 12:39:03.000000000 +0100 @@ -135,6 +135,52 @@ require.True(t, k8sErrors.IsNotFound(err)) } +// TestDeployFromHelmNameOK tests the following scenario: +// - Deploying a pipeline manifest with custom name not sanaitized +// - Deploying a pipeline manifest locally from a helm chart +// - The endpoints generated are accessible +func TestDeployFromHelmNameOK(t *testing.T) { + t.Parallel() + oktetoPath, err := integration.GetOktetoPath() + require.NoError(t, err) + + dir := t.TempDir() + require.NoError(t, createHelmChart(dir)) + + testNamespace := integration.GetTestNamespace("TestDeployFromHelmNameOK", user) + namespaceOpts := &commands.NamespaceOptions{ + Namespace: testNamespace, + OktetoHome: dir, + Token: token, + } + require.NoError(t, commands.RunOktetoCreateNamespace(oktetoPath, namespaceOpts)) + defer commands.RunOktetoDeleteNamespace(oktetoPath, namespaceOpts) + require.NoError(t, commands.RunOktetoKubeconfig(oktetoPath, dir)) + c, _, err := okteto.NewK8sClientProvider().Provide(kubeconfig.Get([]string{filepath.Join(dir, ".kube", "config")})) + require.NoError(t, err) + + deployOptions := &commands.DeployOptions{ + Workdir: dir, + Namespace: testNamespace, + OktetoHome: dir, + Token: token, + Name: "my custom name", + } + require.NoError(t, commands.RunOktetoDeploy(oktetoPath, deployOptions)) + autowakeURL := fmt.Sprintf("https://e2etest-%s.%s", testNamespace, appsSubdomain) + require.NotEmpty(t, integration.GetContentFromURL(autowakeURL, timeout)) + + destroyOptions := &commands.DestroyOptions{ + Workdir: dir, + Namespace: testNamespace, + OktetoHome: dir, + Name: "my custom name", + } + require.NoError(t, commands.RunOktetoDestroy(oktetoPath, destroyOptions)) + _, err = integration.GetService(context.Background(), testNamespace, "e2etest", c) + require.True(t, k8sErrors.IsNotFound(err)) +} + func createHelmChart(dir string) error { if err := os.Mkdir(filepath.Join(dir, "chart"), 0700); err != nil { return err diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/integration/okteto/deploy_test.go new/okteto-2.10.2/integration/okteto/deploy_test.go --- old/okteto-2.10.1/integration/okteto/deploy_test.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/integration/okteto/deploy_test.go 2022-12-14 12:39:03.000000000 +0100 @@ -145,6 +145,41 @@ } } +func TestDeployWithNonSanitizedOK(t *testing.T) { + integration.SkipIfNotOktetoCluster(t) + t.Parallel() + oktetoPath, err := integration.GetOktetoPath() + require.NoError(t, err) + + dir := t.TempDir() + require.NoError(t, createComposeScenario(dir)) + + testNamespace := integration.GetTestNamespace("TestDeployWithNonSanitizedOK", user) + namespaceOpts := &commands.NamespaceOptions{ + Namespace: testNamespace, + OktetoHome: dir, + Token: token, + } + require.NoError(t, commands.RunOktetoCreateNamespace(oktetoPath, namespaceOpts)) + require.NoError(t, commands.RunOktetoKubeconfig(oktetoPath, dir)) + defer commands.RunOktetoDeleteNamespace(oktetoPath, namespaceOpts) + + deployOptions := &commands.DeployOptions{ + Workdir: dir, + Namespace: testNamespace, + OktetoHome: dir, + Token: token, + Name: "test/my deployment", + } + require.NoError(t, commands.RunOktetoDeploy(oktetoPath, deployOptions)) + + c, _, err := okteto.NewK8sClientProvider().Provide(kubeconfig.Get([]string{filepath.Join(dir, ".kube", "config")})) + require.NoError(t, err) + _, err = integration.GetConfigmap(context.Background(), testNamespace, fmt.Sprintf("okteto-git-%s", "test-my-deployment"), c) + require.NoError(t, err) + +} + func TestCmdFailOutput(t *testing.T) { integration.SkipIfNotOktetoCluster(t) t.Parallel() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/cmd/stack/deploy.go new/okteto-2.10.2/pkg/cmd/stack/deploy.go --- old/okteto-2.10.1/pkg/cmd/stack/deploy.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/cmd/stack/deploy.go 2022-12-14 12:39:03.000000000 +0100 @@ -187,14 +187,14 @@ // add specific stack labels if _, ok := endpoint.Labels[model.StackNameLabel]; !ok { - endpoint.Labels[model.StackNameLabel] = s.Name + endpoint.Labels[model.StackNameLabel] = format.ResourceK8sMetaString(s.Name) } if _, ok := endpoint.Labels[model.StackEndpointNameLabel]; !ok { endpoint.Labels[model.StackEndpointNameLabel] = endpointName } translateOptions := &ingresses.TranslateOptions{ - Name: s.Name, + Name: format.ResourceK8sMetaString(s.Name), Namespace: s.Namespace, } ingress := ingresses.Translate(endpointName, endpoint, translateOptions) @@ -381,14 +381,14 @@ } // add specific stack labels if _, ok := endpoint.Labels[model.StackNameLabel]; !ok { - endpoint.Labels[model.StackNameLabel] = s.Name + endpoint.Labels[model.StackNameLabel] = format.ResourceK8sMetaString(s.Name) } if _, ok := endpoint.Labels[model.StackEndpointNameLabel]; !ok { endpoint.Labels[model.StackEndpointNameLabel] = ingressName } translateOptions := &ingresses.TranslateOptions{ - Name: s.Name, + Name: format.ResourceK8sMetaString(s.Name), Namespace: s.Namespace, } ingress := ingresses.Translate(ingressName, endpoint, translateOptions) @@ -431,7 +431,7 @@ func getErrorDueToRestartLimit(ctx context.Context, stack *model.Stack, svcName string, client kubernetes.Interface) error { svc := stack.Services[svcName] for dependingSvc := range svc.DependsOn { - svcLabels := map[string]string{model.StackNameLabel: stack.Name, model.StackServiceNameLabel: dependingSvc} + svcLabels := map[string]string{model.StackNameLabel: format.ResourceK8sMetaString(stack.Name), model.StackServiceNameLabel: dependingSvc} p, err := pods.GetBySelector(ctx, stack.Namespace, svcLabels, client) if err != nil { oktetoLog.Infof("could not get pod of svc '%s': %s", dependingSvc, err) @@ -487,7 +487,7 @@ } func getPodName(ctx context.Context, stack *model.Stack, svcName string, client kubernetes.Interface) string { - svcLabels := map[string]string{model.StackNameLabel: stack.Name, model.StackServiceNameLabel: svcName} + svcLabels := map[string]string{model.StackNameLabel: format.ResourceK8sMetaString(stack.Name), model.StackServiceNameLabel: svcName} p, err := pods.GetBySelector(ctx, stack.Namespace, svcLabels, client) if err != nil { @@ -606,7 +606,7 @@ // when the stack is under an .okteto folder, this was the name for the dev environment // for those users which will have a dev environment deployed with old version // when re-deploying we switch the name for the environment and we have to move the resources to the new name - if old.Labels[model.StackNameLabel] != s.Name && old.Labels[model.StackNameLabel] != "okteto" { + if old.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(s.Name) && old.Labels[model.StackNameLabel] != "okteto" { return false, fmt.Errorf("skipping deploy of deployment '%s' due to name collision with deployment in compose '%s'", svcName, old.Labels[model.StackNameLabel]) } if v, ok := old.Labels[model.DeployedByLabel]; ok { @@ -653,7 +653,7 @@ if old.Labels[model.StackNameLabel] == "" { return false, fmt.Errorf("skipping deploy of statefulset '%s' due to name collision with pre-existing statefulset", svcName) } - if old.Labels[model.StackNameLabel] != s.Name && old.Labels[model.StackNameLabel] != "okteto" { + if old.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(s.Name) && old.Labels[model.StackNameLabel] != "okteto" { return false, fmt.Errorf("skipping deploy of statefulset '%s' due to name collision with statefulset in compose '%s'", svcName, old.Labels[model.StackNameLabel]) } if v, ok := old.Labels[model.DeployedByLabel]; ok { @@ -688,7 +688,7 @@ if old.Labels[model.StackNameLabel] == "" { return false, fmt.Errorf("skipping deploy of job '%s' due to name collision with pre-existing job", svcName) } - if old.Labels[model.StackNameLabel] != s.Name && old.Labels[model.StackNameLabel] != "okteto" { + if old.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(s.Name) && old.Labels[model.StackNameLabel] != "okteto" { return false, fmt.Errorf("skipping deploy of job '%s' due to name collision with job in stack '%s'", svcName, old.Labels[model.StackNameLabel]) } } @@ -722,7 +722,7 @@ oktetoLog.Warning("skipping creation of volume '%s' due to name collision with pre-existing volume", pvc.Name) return nil } - if old.Labels[model.StackNameLabel] != s.Name && old.Labels[model.StackNameLabel] != "okteto" { + if old.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(s.Name) && old.Labels[model.StackNameLabel] != "okteto" { oktetoLog.Warning("skipping creation of volume '%s' due to name collision with volume in stack '%s'", pvc.Name, old.Labels[model.StackNameLabel]) return nil } @@ -758,7 +758,7 @@ ticker := time.NewTicker(100 * time.Millisecond) timeout := time.Now().Add(600 * time.Second) - selector := map[string]string{model.StackNameLabel: s.Name} + selector := map[string]string{model.StackNameLabel: format.ResourceK8sMetaString(s.Name)} for time.Now().Before(timeout) { <-ticker.C pendingPods := numPods diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/cmd/stack/deploy_test.go new/okteto-2.10.2/pkg/cmd/stack/deploy_test.go --- old/okteto-2.10.1/pkg/cmd/stack/deploy_test.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/cmd/stack/deploy_test.go 2022-12-14 12:39:03.000000000 +0100 @@ -233,7 +233,7 @@ if err != nil { t.Fatal(err) } - if d.Labels[model.StackNameLabel] != tt.stack.Name { + if d.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(tt.stack.Name) { t.Fatal() } if d.Labels[model.DeployedByLabel] != format.ResourceK8sMetaString(tt.stack.Name) { @@ -245,7 +245,7 @@ if err != nil { t.Fatal(err) } - if sfs.Labels[model.StackNameLabel] != tt.stack.Name { + if sfs.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(tt.stack.Name) { t.Fatal() } if sfs.Labels[model.DeployedByLabel] != format.ResourceK8sMetaString(tt.stack.Name) { @@ -258,7 +258,7 @@ if err != nil { t.Fatal(err) } - if job.Labels[model.StackNameLabel] != tt.stack.Name { + if job.Labels[model.StackNameLabel] != format.ResourceK8sMetaString(tt.stack.Name) { t.Fatal() } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/cmd/stack/destroy.go new/okteto-2.10.2/pkg/cmd/stack/destroy.go --- old/okteto-2.10.1/pkg/cmd/stack/destroy.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/cmd/stack/destroy.go 2022-12-14 12:39:03.000000000 +0100 @@ -22,6 +22,7 @@ "time" oktetoErrors "github.com/okteto/okteto/pkg/errors" + "github.com/okteto/okteto/pkg/format" "github.com/okteto/okteto/pkg/k8s/configmaps" "github.com/okteto/okteto/pkg/k8s/deployments" "github.com/okteto/okteto/pkg/k8s/ingresses" @@ -251,7 +252,7 @@ ticker := time.NewTicker(100 * time.Millisecond) timeout := time.Now().Add(300 * time.Second) - selector := map[string]string{model.StackNameLabel: s.Name} + selector := map[string]string{model.StackNameLabel: format.ResourceK8sMetaString(s.Name)} for time.Now().Before(timeout) { <-ticker.C podList, err := pods.ListBySelector(ctx, s.Namespace, selector, c) @@ -271,7 +272,7 @@ return err } for _, v := range vList { - if v.Labels[model.StackNameLabel] == s.Name { + if v.Labels[model.StackNameLabel] == format.ResourceK8sMetaString(s.Name) { if err := volumes.Destroy(ctx, v.Name, v.Namespace, c, timeout); err != nil { return fmt.Errorf("error destroying volume '%s': %s", v.Name, err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/cmd/stack/endpoints.go new/okteto-2.10.2/pkg/cmd/stack/endpoints.go --- old/okteto-2.10.1/pkg/cmd/stack/endpoints.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/cmd/stack/endpoints.go 2022-12-14 12:39:03.000000000 +0100 @@ -35,7 +35,7 @@ return err } - endpointList, err := iClient.GetEndpointsBySelector(ctx, stack.Namespace, fmt.Sprintf("%s=%s", model.StackNameLabel, stack.Name)) + endpointList, err := iClient.GetEndpointsBySelector(ctx, stack.Namespace, stack.GetLabelSelector()) if err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/cmd/stack/translate.go new/okteto-2.10.2/pkg/cmd/stack/translate.go --- old/okteto-2.10.1/pkg/cmd/stack/translate.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/cmd/stack/translate.go 2022-12-14 12:39:03.000000000 +0100 @@ -24,6 +24,7 @@ buildv2 "github.com/okteto/okteto/cmd/build/v2" "github.com/okteto/okteto/cmd/utils" + "github.com/okteto/okteto/pkg/format" "github.com/okteto/okteto/pkg/model" "github.com/okteto/okteto/pkg/types" appsv1 "k8s.io/api/apps/v1" @@ -447,7 +448,7 @@ func translateVolumeLabels(volumeName string, s *model.Stack) map[string]string { volume := s.Volumes[volumeName] labels := map[string]string{ - model.StackNameLabel: s.Name, + model.StackNameLabel: format.ResourceK8sMetaString(s.Name), model.StackVolumeNameLabel: volumeName, } for k := range volume.Labels { @@ -489,7 +490,7 @@ func translateLabels(svcName string, s *model.Stack) map[string]string { svc := s.Services[svcName] labels := map[string]string{ - model.StackNameLabel: s.Name, + model.StackNameLabel: format.ResourceK8sMetaString(s.Name), model.StackServiceNameLabel: svcName, } for k := range svc.Labels { @@ -506,7 +507,7 @@ func translateLabelSelector(svcName string, s *model.Stack) map[string]string { labels := map[string]string{ - model.StackNameLabel: s.Name, + model.StackNameLabel: format.ResourceK8sMetaString(s.Name), model.StackServiceNameLabel: svcName, } return labels diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/cmd/stack/translate_test.go new/okteto-2.10.2/pkg/cmd/stack/translate_test.go --- old/okteto-2.10.1/pkg/cmd/stack/translate_test.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/cmd/stack/translate_test.go 2022-12-14 12:39:03.000000000 +0100 @@ -33,7 +33,7 @@ func Test_translateConfigMap(t *testing.T) { s := &model.Stack{ Manifest: []byte("manifest"), - Name: "stackName", + Name: "stack Name", Services: map[string]*model.Service{ "svcName": { Image: "image", @@ -41,13 +41,13 @@ }, } result := translateConfigMap(s) - if result.Name != "okteto-stackName" { + if result.Name != "okteto-stack-name" { t.Errorf("Wrong configmap name: '%s'", result.Name) } if result.Labels[model.StackLabel] != "true" { t.Errorf("Wrong labels: '%s'", result.Labels) } - if result.Data[NameField] != "stackName" { + if result.Data[NameField] != "stack Name" { t.Errorf("Wrong data.name: '%s'", result.Data[NameField]) } if result.Data[YamlField] != base64.StdEncoding.EncodeToString(s.Manifest) { @@ -94,7 +94,7 @@ labels := map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", } if !reflect.DeepEqual(result.Labels, labels) { @@ -111,7 +111,7 @@ t.Errorf("Wrong deployment spec.replicas: '%d'", *result.Spec.Replicas) } selector := map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", } if !reflect.DeepEqual(result.Spec.Selector.MatchLabels, selector) { @@ -211,7 +211,7 @@ labels := map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", } assert.Equal(t, labels, result.Labels) @@ -227,7 +227,7 @@ t.Errorf("Wrong statefulset spec.replicas: '%d'", *result.Spec.Replicas) } selector := map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", } if !reflect.DeepEqual(result.Spec.Selector.MatchLabels, selector) { @@ -405,7 +405,7 @@ labels := map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", } if !reflect.DeepEqual(result.Labels, labels) { @@ -539,7 +539,7 @@ labels := map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", } if !reflect.DeepEqual(result.Labels, labels) { @@ -702,7 +702,7 @@ Labels: map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Annotations: map[string]string{ @@ -713,7 +713,7 @@ Spec: apiv1.ServiceSpec{ Type: apiv1.ServiceTypeClusterIP, Selector: map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Ports: []apiv1.ServicePort{ @@ -776,7 +776,7 @@ Labels: map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Annotations: map[string]string{ @@ -788,7 +788,7 @@ Spec: apiv1.ServiceSpec{ Type: apiv1.ServiceTypeClusterIP, Selector: map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Ports: []apiv1.ServicePort{ @@ -849,7 +849,7 @@ Labels: map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Annotations: map[string]string{ @@ -861,7 +861,7 @@ Spec: apiv1.ServiceSpec{ Type: apiv1.ServiceTypeClusterIP, Selector: map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Ports: []apiv1.ServicePort{ @@ -922,7 +922,7 @@ Labels: map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Annotations: map[string]string{ @@ -934,7 +934,7 @@ Spec: apiv1.ServiceSpec{ Type: apiv1.ServiceTypeClusterIP, Selector: map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Ports: []apiv1.ServicePort{ @@ -990,7 +990,7 @@ Labels: map[string]string{ "label1": "value1", "label2": "value2", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Annotations: map[string]string{ @@ -1001,7 +1001,7 @@ Spec: apiv1.ServiceSpec{ Type: apiv1.ServiceTypeClusterIP, Selector: map[string]string{ - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackServiceNameLabel: "svcName", }, Ports: []apiv1.ServicePort{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/constants/constants.go new/okteto-2.10.2/pkg/constants/constants.go --- old/okteto-2.10.1/pkg/constants/constants.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/constants/constants.go 2022-12-14 12:39:03.000000000 +0100 @@ -40,4 +40,7 @@ // OktetoFolderEnvVar defines the path of okteto folder OktetoFolderEnvVar = "OKTETO_FOLDER" + + // OktetoAutodiscoveryReleaseName defines the name used for helm release when autodiscovery + OktetoAutodiscoveryReleaseName = "OKTETO_AUTODISCOVERY_RELEASE_NAME" ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/k8s/ingresses/translate_test.go new/okteto-2.10.2/pkg/k8s/ingresses/translate_test.go --- old/okteto-2.10.1/pkg/k8s/ingresses/translate_test.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/k8s/ingresses/translate_test.go 2022-12-14 12:39:03.000000000 +0100 @@ -29,7 +29,7 @@ "endpoint1": { Labels: model.Labels{ "label1": "value1", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackEndpointNameLabel: "endpoint1", }, Annotations: model.Annotations{"annotation1": "value1"}, @@ -53,7 +53,7 @@ }, expectedIngressLabels: map[string]string{ model.DeployedByLabel: "stackname", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackEndpointNameLabel: "endpoint1", "label1": "value1", }, @@ -156,7 +156,7 @@ "endpoint1": { Labels: model.Labels{ "label1": "value1", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackEndpointNameLabel: "endpoint1", }, Annotations: model.Annotations{"annotation1": "value1"}, @@ -180,7 +180,7 @@ }, expectedIngressLabels: map[string]string{ model.DeployedByLabel: "stackname", - model.StackNameLabel: "stackName", + model.StackNameLabel: "stackname", model.StackEndpointNameLabel: "endpoint1", "label1": "value1", }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/k8s/pods/pod.go new/okteto-2.10.2/pkg/k8s/pods/pod.go --- old/okteto-2.10.1/pkg/k8s/pods/pod.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/k8s/pods/pod.go 2022-12-14 12:39:03.000000000 +0100 @@ -24,6 +24,7 @@ "time" oktetoErrors "github.com/okteto/okteto/pkg/errors" + "github.com/okteto/okteto/pkg/format" "github.com/okteto/okteto/pkg/k8s/events" "github.com/okteto/okteto/pkg/k8s/exec" oktetoLog "github.com/okteto/okteto/pkg/log" @@ -408,7 +409,7 @@ } func GetHealthcheckFailure(ctx context.Context, namespace, svcName, stackName string, c kubernetes.Interface) string { - selector := fmt.Sprintf("%s=%s,%s=%s", model.StackNameLabel, stackName, model.StackServiceNameLabel, svcName) + selector := fmt.Sprintf("%s=%s,%s=%s", model.StackNameLabel, format.ResourceK8sMetaString(stackName), model.StackServiceNameLabel, svcName) pods, err := c.CoreV1().Pods(namespace).List( ctx, metav1.ListOptions{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/model/manifest.go new/okteto-2.10.2/pkg/model/manifest.go --- old/okteto-2.10.1/pkg/model/manifest.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/model/manifest.go 2022-12-14 12:39:03.000000000 +0100 @@ -486,7 +486,7 @@ } oktetoLog.AddToBuffer(oktetoLog.InfoLevel, "Found helm chart on %s", chartPath) tags := inferHelmTags(chartPath) - command := fmt.Sprintf("helm upgrade --install ${%s} %s %s", constants.OktetoNameEnvVar, chartPath, tags) + command := fmt.Sprintf("helm upgrade --install ${%s} %s %s", constants.OktetoAutodiscoveryReleaseName, chartPath, tags) chartManifest := &Manifest{ Type: ChartType, Deploy: &DeployInfo{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/model/stack.go new/okteto-2.10.2/pkg/model/stack.go --- old/okteto-2.10.1/pkg/model/stack.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/model/stack.go 2022-12-14 12:39:03.000000000 +0100 @@ -28,6 +28,7 @@ "github.com/okteto/okteto/pkg/discovery" oktetoErrors "github.com/okteto/okteto/pkg/errors" "github.com/okteto/okteto/pkg/filesystem" + "github.com/okteto/okteto/pkg/format" oktetoLog "github.com/okteto/okteto/pkg/log" "github.com/okteto/okteto/pkg/model/forward" yaml "gopkg.in/yaml.v2" @@ -275,6 +276,7 @@ if actualStackName == "" { nameEnvVar := os.Getenv(constants.OktetoNameEnvVar) if nameEnvVar != "" { + // this name could be not sanitized when running at pipeline installer return nameEnvVar, nil } name, err := GetValidNameFromGitRepo(filepath.Dir(stackPath)) @@ -407,7 +409,8 @@ } func (s *Stack) Validate() error { - if err := validateStackName(s.Name); err != nil { + // in case name is coming from option "name" at deploy this could not be sanitized + if err := validateStackName(format.ResourceK8sMetaString(s.Name)); err != nil { return fmt.Errorf("Invalid compose name: %s", err) } if len(s.Services) == 0 { @@ -453,6 +456,8 @@ return validateDependsOn(s) } +// validateStackName checks if the name is compliant +// name param is sanitized func validateStackName(name string) error { if name == "" { return fmt.Errorf("name cannot be empty") @@ -491,12 +496,14 @@ // GetLabelSelector returns the label selector for the stack name func (s *Stack) GetLabelSelector() string { - return fmt.Sprintf("%s=%s", StackNameLabel, s.Name) + // we need to sanitize the stack name in case this is overridden by the deploy options name + return fmt.Sprintf("%s=%s", StackNameLabel, format.ResourceK8sMetaString(s.Name)) } // GetStackConfigMapName returns the label selector for the stack name func GetStackConfigMapName(stackName string) string { - return fmt.Sprintf("okteto-%s", stackName) + // we need to sanitize the stack name in case this is overridden by the deploy options name + return fmt.Sprintf("okteto-%s", format.ResourceK8sMetaString(stackName)) } func IsPortInService(port int32, ports []Port) bool { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/model/utils.go new/okteto-2.10.2/pkg/model/utils.go --- old/okteto-2.10.1/pkg/model/utils.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/model/utils.go 2022-12-14 12:39:03.000000000 +0100 @@ -25,7 +25,8 @@ type graph map[string][]string -// GetValidNameFromFolder returns a valid kubernetes name for a folder +// GetValidNameFromFolder returns name for a folder +// this name is not sanitized func GetValidNameFromFolder(folder string) (string, error) { dir, err := filepath.Abs(folder) if err != nil { @@ -36,15 +37,11 @@ } name := filepath.Base(dir) - name = strings.ToLower(name) - name = ValidKubeNameRegex.ReplaceAllString(name, "-") - name = strings.TrimPrefix(name, "-") - name = strings.TrimSuffix(name, "-") oktetoLog.Infof("autogenerated name: %s", name) return name, nil } -// GetValidNameFromGitRepo returns a valid kubernetes name for a folder +// GetValidNameFromGitRepo returns a name from a repository url func GetValidNameFromGitRepo(folder string) (string, error) { repo, err := GetRepositoryURL(folder) if err != nil { @@ -54,22 +51,26 @@ return name, nil } -func TranslateURLToName(repo string) string { - repoName := findRepoName(repo) +// TranslateURLToName returns the repo name from the repository url +// removes .git in case it has this as suffix +// repoName is not sanitized +func TranslateURLToName(repoURL string) string { + repoName := findRepoName(repoURL) if strings.HasSuffix(repoName, ".git") { repoName = repoName[:strings.LastIndex(repoName, ".git")] } - name := ValidKubeNameRegex.ReplaceAllString(repoName, "-") - return name + return repoName } -func findRepoName(repo string) string { - possibleName := strings.ToLower(repo[strings.LastIndex(repo, "/")+1:]) + +// findRepoName returns string after last "/" from repoURL +func findRepoName(repoURL string) string { + possibleName := repoURL[strings.LastIndex(repoURL, "/")+1:] if possibleName == "" { - possibleName = repo - nthTrim := strings.Count(repo, "/") + possibleName = repoURL + nthTrim := strings.Count(repoURL, "/") for i := 0; i < nthTrim-1; i++ { - possibleName = strings.ToLower(possibleName[strings.Index(possibleName, "/")+1:]) + possibleName = possibleName[strings.Index(possibleName, "/")+1:] } possibleName = possibleName[:len(possibleName)-1] } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/okteto-2.10.1/pkg/model/utils_test.go new/okteto-2.10.2/pkg/model/utils_test.go --- old/okteto-2.10.1/pkg/model/utils_test.go 2022-12-01 20:09:06.000000000 +0100 +++ new/okteto-2.10.2/pkg/model/utils_test.go 2022-12-14 12:39:03.000000000 +0100 @@ -26,10 +26,10 @@ expected string }{ {name: "all lower case", folder: "lowercase", expected: "lowercase"}, - {name: "with some lower case", folder: "lowerCase", expected: "lowercase"}, - {name: "upper case", folder: "UpperCase", expected: "uppercase"}, - {name: "valid symbols", folder: "getting-started.test", expected: "getting-started-test"}, - {name: "invalid symbols", folder: "getting_$#started", expected: "getting-started"}, + {name: "with some lower case", folder: "lowerCase", expected: "lowerCase"}, + {name: "upper case", folder: "UpperCase", expected: "UpperCase"}, + {name: "valid symbols", folder: "getting-started.test", expected: "getting-started.test"}, + {name: "invalid symbols", folder: "getting_$#started", expected: "getting_$#started"}, {name: "current folder", folder: ".", expected: "model"}, {name: "parent folder", folder: "..", expected: "pkg"}, {name: "okteto folder", folder: ".okteto", expected: "model"}, @@ -58,8 +58,8 @@ {name: "https with slash at the end", gitRepo: "https://github.com/okteto/stacks-getting-started/", expected: "stacks-getting-started"}, {name: "ssh url", gitRepo: "g...@github.com:okteto/stacks-getting-started.git", expected: "stacks-getting-started"}, {name: "ssh url with slash at the end", gitRepo: "g...@github.com:okteto/stacks-getting-started.git/", expected: "stacks-getting-started"}, - {name: "https with dots", gitRepo: "https://github.com/okteto/stacks.getting.started", expected: "stacks-getting-started"}, - {name: "URL with uppers", gitRepo: "https://github.com/okteto/StacksGettingStarted", expected: "stacksgettingstarted"}, + {name: "https with dots", gitRepo: "https://github.com/okteto/stacks.getting.started", expected: "stacks.getting.started"}, + {name: "URL with uppers", gitRepo: "https://github.com/okteto/StacksGettingStarted", expected: "StacksGettingStarted"}, } for _, tt := range tests { ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/okteto/vendor.tar.gz /work/SRC/openSUSE:Factory/.okteto.new.1835/vendor.tar.gz differ: char 5, line 1