Skip to content

Commit

Permalink
Use namespace in remote-state (#205)
Browse files Browse the repository at this point in the history
* Use `namespace` in context

* Use `namespace` in context
  • Loading branch information
aknysh committed Sep 22, 2022
1 parent 0a2516d commit 9f3993c
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 13 deletions.
9 changes: 7 additions & 2 deletions internal/exec/aws_eks_update_kubeconfig.go
Expand Up @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion internal/exec/terraform_generate_varfiles.go
Expand Up @@ -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))
Expand Down
13 changes: 10 additions & 3 deletions pkg/component/component_processor.go
Expand Up @@ -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)
Expand All @@ -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
Expand Down
7 changes: 4 additions & 3 deletions pkg/component/component_processor_test.go
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions pkg/config/schema.go
Expand Up @@ -160,6 +160,7 @@ type AwsEksUpdateKubeconfigContext struct {
DryRun bool
Verbose bool
Alias string
Namespace string
Tenant string
Environment string
Stage string
Expand Down
24 changes: 20 additions & 4 deletions pkg/config/utils.go
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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")
Expand All @@ -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)
}
Expand Down

0 comments on commit 9f3993c

Please sign in to comment.