From be693e9df09b567f53b2402cbc2a689094369692 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Sun, 8 Oct 2023 22:42:34 +0200 Subject: [PATCH] fix: trim comments that are not modifers See https://git.coopcloud.tech/coop-cloud/organising/issues/505 --- pkg/config/env.go | 33 +++++++++++++++++++++++++++++---- pkg/config/env_test.go | 33 +++++++++++++++++++++++++++++++++ pkg/upstream/convert/service.go | 2 +- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/pkg/config/env.go b/pkg/config/env.go index af9ac822..923b406a 100644 --- a/pkg/config/env.go +++ b/pkg/config/env.go @@ -36,6 +36,11 @@ var REPOS_BASE_URL = "https://git.coopcloud.tech/coop-cloud" var CATALOGUE_JSON_REPO_NAME = "recipes-catalogue-json" var SSH_URL_TEMPLATE = "ssh://git@git.coopcloud.tech:2222/coop-cloud/%s.git" +// envVarModifiers is a list of env var modifier strings. These are added to +// env vars as comments and modify their processing by Abra, e.g. determining +// how long secrets should be. +var envVarModifiers = []string{"length"} + // GetServers retrieves all servers. func GetServers() ([]string, error) { var servers []string @@ -50,18 +55,38 @@ func GetServers() ([]string, error) { return servers, nil } +// ContainsEnvVarModifier determines if an env var contains a modifier. +func ContainsEnvVarModifier(envVar string) bool { + for _, mod := range envVarModifiers { + if strings.Contains(envVar, fmt.Sprintf("%s=", mod)) { + return true + } + } + return false +} + // ReadEnv loads an app envivornment into a map. func ReadEnv(filePath string) (AppEnv, error) { - var envFile AppEnv + var envVars AppEnv - envFile, err := godotenv.Read(filePath) + envVars, err := godotenv.Read(filePath) if err != nil { return nil, err } - logrus.Debugf("read %s from %s", envFile, filePath) + for idx, envVar := range envVars { + if strings.Contains(envVar, "#") { + if ContainsEnvVarModifier(envVar) { + continue + } + vals := strings.Split(envVar, "#") + envVars[idx] = strings.TrimSpace(vals[0]) + } + } - return envFile, nil + logrus.Debugf("read %s from %s", envVars, filePath) + + return envVars, nil } // ReadServerNames retrieves all server names. diff --git a/pkg/config/env_test.go b/pkg/config/env_test.go index 047d3e07..d3741f32 100644 --- a/pkg/config/env_test.go +++ b/pkg/config/env_test.go @@ -184,3 +184,36 @@ func TestCheckEnvError(t *testing.T) { } } } + +func TestContainsEnvVarModifier(t *testing.T) { + if ok := config.ContainsEnvVarModifier("FOO=bar # bing"); ok { + t.Fatal("FOO contains no env var modifier") + } + + if ok := config.ContainsEnvVarModifier("FOO=bar # length=3"); !ok { + t.Fatal("FOO contains an env var modifier (length)") + } +} + +func TestEnvVarCommentsRemoved(t *testing.T) { + offline := true + r, err := recipe.Get("abra-test-recipe", offline) + if err != nil { + t.Fatal(err) + } + + envSamplePath := path.Join(config.RECIPES_DIR, r.Name, ".env.sample") + envSample, err := config.ReadEnv(envSamplePath) + if err != nil { + t.Fatal(err) + } + + envVar, exists := envSample["WITH_COMMENT"] + if !exists { + t.Fatal("WITH_COMMENT env var should be present in .env.sample") + } + + if strings.Contains(envVar, "should be removed") { + t.Fatalf("comment from '%s' should be removed", envVar) + } +} diff --git a/pkg/upstream/convert/service.go b/pkg/upstream/convert/service.go index 44cfd569..16cd0cfa 100644 --- a/pkg/upstream/convert/service.go +++ b/pkg/upstream/convert/service.go @@ -420,7 +420,7 @@ func convertServiceSecrets( return nil, err } - // NOTE(d1): strip # length=... modifiers + // NOTE(d1): strip all comments if strings.Contains(obj.Name, "#") { vals := strings.Split(obj.Name, "#") obj.Name = strings.TrimSpace(vals[0])