-
-
Notifications
You must be signed in to change notification settings - Fork 96
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Filter out empty results from describe stacks #764
base: main
Are you sure you want to change the base?
Changes from all commits
5367378
c003b25
958d921
ad8a683
80bfa6e
f76f914
7629b93
1a0d381
21c59b8
37f64bb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -55,6 +55,11 @@ func ExecuteDescribeStacksCmd(cmd *cobra.Command, args []string) error { | |
return err | ||
} | ||
|
||
includeEmptyStacks, err := cmd.Flags().GetBool("include-empty-stacks") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
componentsCsv, err := flags.GetString("components") | ||
if err != nil { | ||
return err | ||
|
@@ -97,6 +102,7 @@ func ExecuteDescribeStacksCmd(cmd *cobra.Command, args []string) error { | |
sections, | ||
false, | ||
processTemplates, | ||
includeEmptyStacks, | ||
) | ||
if err != nil { | ||
return err | ||
|
@@ -119,6 +125,7 @@ func ExecuteDescribeStacks( | |
sections []string, | ||
ignoreMissingFiles bool, | ||
processTemplates bool, | ||
includeEmptyStacks bool, | ||
) (map[string]any, error) { | ||
|
||
stacksMap, _, err := FindStacksMap(cliConfig, ignoreMissingFiles) | ||
|
@@ -127,6 +134,7 @@ func ExecuteDescribeStacks( | |
} | ||
|
||
finalStacksMap := make(map[string]any) | ||
processedStacks := make(map[string]bool) | ||
var varsSection map[string]any | ||
var metadataSection map[string]any | ||
var settingsSection map[string]any | ||
|
@@ -136,12 +144,48 @@ func ExecuteDescribeStacks( | |
var backendSection map[string]any | ||
var backendTypeSection string | ||
var stackName string | ||
context := schema.Context{} | ||
|
||
for stackFileName, stackSection := range stacksMap { | ||
var context schema.Context | ||
|
||
// Delete the stack-wide imports | ||
delete(stackSection.(map[string]any), "imports") | ||
|
||
// Check if components section exists and has explicit components | ||
hasExplicitComponents := false | ||
if componentsSection, ok := stackSection.(map[string]any)["components"]; ok { | ||
if componentsSection != nil { | ||
if terraformSection, ok := componentsSection.(map[string]any)["terraform"].(map[string]any); ok { | ||
hasExplicitComponents = len(terraformSection) > 0 | ||
} | ||
if helmfileSection, ok := componentsSection.(map[string]any)["helmfile"].(map[string]any); ok { | ||
hasExplicitComponents = hasExplicitComponents || len(helmfileSection) > 0 | ||
} | ||
} | ||
} | ||
|
||
// Also check for imports | ||
hasImports := false | ||
if importsSection, ok := stackSection.(map[string]any)["import"].([]any); ok { | ||
hasImports = len(importsSection) > 0 | ||
} | ||
|
||
// Skip stacks without components or imports when includeEmptyStacks is false | ||
if !includeEmptyStacks && !hasExplicitComponents && !hasImports { | ||
continue | ||
} | ||
|
||
stackName = stackFileName | ||
if processedStacks[stackName] { | ||
continue | ||
} | ||
processedStacks[stackName] = true | ||
|
||
if !u.MapKeyExists(finalStacksMap, stackName) { | ||
finalStacksMap[stackName] = make(map[string]any) | ||
finalStacksMap[stackName].(map[string]any)["components"] = make(map[string]any) | ||
} | ||
|
||
if componentsSection, ok := stackSection.(map[string]any)["components"].(map[string]any); ok { | ||
|
||
if len(componentTypes) == 0 || u.SliceContainsString(componentTypes, "terraform") { | ||
|
@@ -242,9 +286,13 @@ func ExecuteDescribeStacks( | |
|
||
if stackName == "" { | ||
stackName = stackFileName | ||
} else if strings.HasPrefix(stackFileName, "deploy/") { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Cerebrovinny why do we need a special treatment for the |
||
// If we have a deploy/ prefixed version, use that as the canonical name | ||
stackName = stackFileName | ||
} | ||
|
||
if !u.MapKeyExists(finalStacksMap, stackName) { | ||
// Only create the stack entry if it doesn't exist or if we're using the canonical name | ||
if !u.MapKeyExists(finalStacksMap, stackName) || strings.HasPrefix(stackName, "deploy/") { | ||
Cerebrovinny marked this conversation as resolved.
Show resolved
Hide resolved
|
||
finalStacksMap[stackName] = make(map[string]any) | ||
} | ||
|
||
|
@@ -430,9 +478,13 @@ func ExecuteDescribeStacks( | |
|
||
if stackName == "" { | ||
stackName = stackFileName | ||
} else if strings.HasPrefix(stackFileName, "deploy/") { | ||
// If we have a deploy/ prefixed version, use that as the canonical name | ||
stackName = stackFileName | ||
} | ||
|
||
if !u.MapKeyExists(finalStacksMap, stackName) { | ||
// Only create the stack entry if it doesn't exist or if we're using the canonical name | ||
if !u.MapKeyExists(finalStacksMap, stackName) || strings.HasPrefix(stackName, "deploy/") { | ||
finalStacksMap[stackName] = make(map[string]any) | ||
} | ||
|
||
|
@@ -511,11 +563,66 @@ func ExecuteDescribeStacks( | |
} | ||
} | ||
} | ||
} | ||
|
||
// Filter out empty stacks (stacks without any components) | ||
if st, ok := finalStacksMap[stackName].(map[string]any); ok { | ||
if len(st) == 0 { | ||
// Filter out empty stacks after processing all stack files | ||
if !includeEmptyStacks { | ||
for stackName := range finalStacksMap { | ||
if stackName == "" { | ||
delete(finalStacksMap, stackName) | ||
continue | ||
} | ||
|
||
stackEntry, ok := finalStacksMap[stackName].(map[string]any) | ||
if !ok { | ||
return nil, fmt.Errorf("invalid stack entry type for stack %s", stackName) | ||
} | ||
componentsSection, hasComponents := stackEntry["components"].(map[string]any) | ||
|
||
if !hasComponents { | ||
delete(finalStacksMap, stackName) | ||
continue | ||
} | ||
|
||
// Check if any component type (terraform/helmfile) has components | ||
hasNonEmptyComponents := false | ||
for _, components := range componentsSection { | ||
if compTypeMap, ok := components.(map[string]any); ok { | ||
for _, comp := range compTypeMap { | ||
if compContent, ok := comp.(map[string]any); ok { | ||
// Check for any meaningful content | ||
relevantSections := []string{"vars", "metadata", "settings", "env", "workspace"} | ||
for _, section := range relevantSections { | ||
if _, hasSection := compContent[section]; hasSection { | ||
hasNonEmptyComponents = true | ||
break | ||
} | ||
} | ||
} | ||
} | ||
} | ||
if hasNonEmptyComponents { | ||
break | ||
} | ||
} | ||
|
||
if !hasNonEmptyComponents { | ||
delete(finalStacksMap, stackName) | ||
continue | ||
} | ||
|
||
// Check for duplicate stacks (deploy/ prefix) | ||
if strings.HasPrefix(stackName, "deploy/") { | ||
baseStackName := strings.TrimPrefix(stackName, "deploy/") | ||
delete(finalStacksMap, baseStackName) | ||
} | ||
} | ||
} else { | ||
// When including empty stacks, we still need to handle deploy/ prefix duplicates | ||
for stackName := range finalStacksMap { | ||
if strings.HasPrefix(stackName, "deploy/") { | ||
baseStackName := strings.TrimPrefix(stackName, "deploy/") | ||
delete(finalStacksMap, baseStackName) | ||
} | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -13,7 +13,8 @@ func ExecuteDescribeStacks( | |||||
componentTypes []string, | ||||||
sections []string, | ||||||
ignoreMissingFiles bool, | ||||||
includeEmptyStacks bool, | ||||||
) (map[string]any, error) { | ||||||
|
||||||
return e.ExecuteDescribeStacks(cliConfig, filterByStack, components, componentTypes, sections, ignoreMissingFiles, true) | ||||||
return e.ExecuteDescribeStacks(cliConfig, filterByStack, components, componentTypes, sections, ignoreMissingFiles, false, includeEmptyStacks) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this |
||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.