From 9f3993ce021ab116737964f2459daae7c44e15fb Mon Sep 17 00:00:00 2001 From: Andriy Knysh Date: Thu, 22 Sep 2022 15:23:12 -0400 Subject: [PATCH] Use `namespace` in `remote-state` (#205) * Use `namespace` in context * Use `namespace` in context --- internal/exec/aws_eks_update_kubeconfig.go | 9 ++++++-- internal/exec/terraform_generate_varfiles.go | 2 +- pkg/component/component_processor.go | 13 ++++++++--- pkg/component/component_processor_test.go | 7 +++--- pkg/config/schema.go | 1 + pkg/config/utils.go | 24 ++++++++++++++++---- 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/internal/exec/aws_eks_update_kubeconfig.go b/internal/exec/aws_eks_update_kubeconfig.go index a67c4545c..299e1beb5 100644 --- a/internal/exec/aws_eks_update_kubeconfig.go +++ b/internal/exec/aws_eks_update_kubeconfig.go @@ -132,8 +132,13 @@ func ExecuteAwsEksUpdateKubeconfig(kubeconfigContext c.AwsEksUpdateKubeconfigCon return errors.New("stack name pattern must be provided in 'stacks.name_pattern' CLI config or 'ATMOS_STACKS_NAME_PATTERN' ENV variable") } - stack, err := c.GetStackNameFromContextAndStackNamePattern(kubeconfigContext.Tenant, - kubeconfigContext.Environment, kubeconfigContext.Stage, c.Config.Stacks.NamePattern) + stack, err := c.GetStackNameFromContextAndStackNamePattern( + kubeconfigContext.Namespace, + kubeconfigContext.Tenant, + kubeconfigContext.Environment, + kubeconfigContext.Stage, + c.Config.Stacks.NamePattern, + ) if err != nil { return err } diff --git a/internal/exec/terraform_generate_varfiles.go b/internal/exec/terraform_generate_varfiles.go index 75d67b0cf..5661c1456 100644 --- a/internal/exec/terraform_generate_varfiles.go +++ b/internal/exec/terraform_generate_varfiles.go @@ -168,7 +168,7 @@ func ExecuteTerraformGenerateVarfiles(fileTemplate string, format string, stacks return fmt.Errorf("invalid '--format' argument '%s'. Valid values are 'json' (default), 'yaml' and 'hcl", format) } - u.PrintInfo(fmt.Sprintf("Varfile: %s", fileName)) + u.PrintInfo(fmt.Sprintf("varfile: %s", fileName)) u.PrintMessage(fmt.Sprintf("terraform component: %s", terraformComponent)) u.PrintMessage(fmt.Sprintf("atmos component: %s", componentName)) u.PrintMessage(fmt.Sprintf("atmos stack: %s", contextPrefix)) diff --git a/pkg/component/component_processor.go b/pkg/component/component_processor.go index 6885b9f46..99afd48ad 100644 --- a/pkg/component/component_processor.go +++ b/pkg/component/component_processor.go @@ -27,8 +27,15 @@ func ProcessComponentInStack(component string, stack string) (map[string]any, er return configAndStacksInfo.ComponentSection, nil } -// ProcessComponentFromContext accepts context (tenant, environment, stage) and returns the component configuration in the stack -func ProcessComponentFromContext(component string, tenant string, environment string, stage string) (map[string]any, error) { +// ProcessComponentFromContext accepts context (namespace, tenant, environment, stage) and returns the component configuration in the stack +func ProcessComponentFromContext( + component string, + namespace string, + tenant string, + environment string, + stage string, +) (map[string]any, error) { + err := c.InitConfig() if err != nil { u.PrintErrorToStdError(err) @@ -41,7 +48,7 @@ func ProcessComponentFromContext(component string, tenant string, environment st return nil, er } - stack, err := c.GetStackNameFromContextAndStackNamePattern(tenant, environment, stage, c.Config.Stacks.NamePattern) + stack, err := c.GetStackNameFromContextAndStackNamePattern(namespace, tenant, environment, stage, c.Config.Stacks.NamePattern) if err != nil { u.PrintErrorToStdError(err) return nil, err diff --git a/pkg/component/component_processor_test.go b/pkg/component/component_processor_test.go index ac255462e..e03182432 100644 --- a/pkg/component/component_processor_test.go +++ b/pkg/component/component_processor_test.go @@ -10,6 +10,7 @@ func TestComponentProcessor(t *testing.T) { var err error var component string var stack string + namespace := "" var yamlConfig []byte var tenant1Ue2DevTestTestComponent map[string]any @@ -48,7 +49,7 @@ func TestComponentProcessor(t *testing.T) { tenant := "tenant1" environment := "ue2" stage := "dev" - tenant1Ue2DevTestTestComponent2, err = ProcessComponentFromContext(component, tenant, environment, stage) + tenant1Ue2DevTestTestComponent2, err = ProcessComponentFromContext(component, namespace, tenant, environment, stage) assert.Nil(t, err) tenant1Ue2DevTestTestComponentBackend2 := tenant1Ue2DevTestTestComponent2["backend"].(map[any]any) tenant1Ue2DevTestTestComponentRemoteStateBackend2 := tenant1Ue2DevTestTestComponent2["remote_state_backend"].(map[any]any) @@ -118,7 +119,7 @@ func TestComponentProcessor(t *testing.T) { tenant = "tenant1" environment = "ue2" stage = "dev" - tenant1Ue2DevTestTestComponentOverrideComponent2, err = ProcessComponentFromContext(component, tenant, environment, stage) + tenant1Ue2DevTestTestComponentOverrideComponent2, err = ProcessComponentFromContext(component, namespace, tenant, environment, stage) assert.Nil(t, err) tenant1Ue2DevTestTestComponentOverrideComponent2Backend := tenant1Ue2DevTestTestComponentOverrideComponent2["backend"].(map[any]any) tenant1Ue2DevTestTestComponentOverrideComponent2Workspace := tenant1Ue2DevTestTestComponentOverrideComponent2["workspace"].(string) @@ -136,7 +137,7 @@ func TestComponentProcessor(t *testing.T) { tenant = "tenant1" environment = "ue2" stage = "test-1" - tenant1Ue2Test1TestTestComponentOverrideComponent2, err = ProcessComponentFromContext(component, tenant, environment, stage) + tenant1Ue2Test1TestTestComponentOverrideComponent2, err = ProcessComponentFromContext(component, namespace, tenant, environment, stage) assert.Nil(t, err) tenant1Ue2Test1TestTestComponentOverrideComponent2Backend := tenant1Ue2DevTestTestComponentOverrideComponent2["backend"].(map[any]any) tenant1Ue2Test1TestTestComponentOverrideComponent2Workspace := tenant1Ue2Test1TestTestComponentOverrideComponent2["workspace"].(string) diff --git a/pkg/config/schema.go b/pkg/config/schema.go index 07b448341..fa67b39a5 100644 --- a/pkg/config/schema.go +++ b/pkg/config/schema.go @@ -160,6 +160,7 @@ type AwsEksUpdateKubeconfigContext struct { DryRun bool Verbose bool Alias string + Namespace string Tenant string Environment string Stage string diff --git a/pkg/config/utils.go b/pkg/config/utils.go index 5168084e4..48140ca8f 100644 --- a/pkg/config/utils.go +++ b/pkg/config/utils.go @@ -35,7 +35,7 @@ func FindAllStackConfigsInPathsForStack( // Find all matches in the glob matches, err := u.GetGlobMatches(pathWithExt) if err != nil || len(matches) == 0 { - // Retry (b/c we are using `doublestar` library and it sometimes has issues reading many files in a Docker container) + // Retry (b/c we are using `doublestar` library, and it sometimes has issues reading many files in a Docker container) // TODO: review `doublestar` library matches, err = u.GetGlobMatches(pathWithExt) if err != nil { @@ -113,7 +113,7 @@ func FindAllStackConfigsInPaths( // Find all matches in the glob matches, err := u.GetGlobMatches(pathWithExt) if err != nil || len(matches) == 0 { - // Retry (b/c we are using `doublestar` library and it sometimes has issues reading many files in a Docker container) + // Retry (b/c we are using `doublestar` library, and it sometimes has issues reading many files in a Docker container) // TODO: review `doublestar` library matches, err = u.GetGlobMatches(pathWithExt) if err != nil { @@ -458,7 +458,14 @@ func ReplaceContextTokens(context Context, pattern string) string { } // GetStackNameFromContextAndStackNamePattern calculates stack name from the provided context using the provided stack name pattern -func GetStackNameFromContextAndStackNamePattern(tenant string, environment string, stage string, stackNamePattern string) (string, error) { +func GetStackNameFromContextAndStackNamePattern( + namespace string, + tenant string, + environment string, + stage string, + stackNamePattern string, +) (string, error) { + if len(stackNamePattern) == 0 { return "", fmt.Errorf("stack name pattern must be provided") @@ -468,7 +475,16 @@ func GetStackNameFromContextAndStackNamePattern(tenant string, environment strin stackNamePatternParts := strings.Split(stackNamePattern, "-") for _, part := range stackNamePatternParts { - if part == "{tenant}" { + if part == "{namespace}" { + if len(namespace) == 0 { + return "", fmt.Errorf("stack name pattern '%s' includes '{namespace}', but namespace is not provided", stackNamePattern) + } + if len(stack) == 0 { + stack = namespace + } else { + stack = fmt.Sprintf("%s-%s", stack, namespace) + } + } else if part == "{tenant}" { if len(tenant) == 0 { return "", fmt.Errorf("stack name pattern '%s' includes '{tenant}', but tenant is not provided", stackNamePattern) }