From 208e185c311e10b93e9a2533c72612fad29f59d4 Mon Sep 17 00:00:00 2001 From: Ryan VanGundy Date: Sun, 6 Jul 2025 11:00:54 -0400 Subject: [PATCH] fix(generator): Don't create terraform/ or kustomize/ folder There's no need to proactively create terraform/ or kustomize/ folders in the project repo. If blueprint creators need these, they can create them. --- pkg/controller/controller.go | 9 +- pkg/controller/controller_test.go | 25 +-- pkg/controller/mock_controller.go | 4 +- pkg/controller/mock_controller_test.go | 4 - pkg/generators/kustomize_generator.go | 81 ------- pkg/generators/kustomize_generator_test.go | 238 --------------------- pkg/generators/terraform_generator.go | 10 - pkg/generators/terraform_generator_test.go | 27 ++- 8 files changed, 33 insertions(+), 365 deletions(-) delete mode 100644 pkg/generators/kustomize_generator.go delete mode 100644 pkg/generators/kustomize_generator_test.go diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index aa488b4e8..49a87d61c 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -84,7 +84,6 @@ type ComponentConstructors struct { NewGitGenerator func(di.Injector) generators.Generator NewBlueprintHandler func(di.Injector) blueprint.BlueprintHandler NewTerraformGenerator func(di.Injector) generators.Generator - NewKustomizeGenerator func(di.Injector) generators.Generator NewToolsManager func(di.Injector) tools.ToolsManager NewKubernetesManager func(di.Injector) kubernetes.KubernetesManager NewKubernetesClient func(di.Injector) kubernetes.KubernetesClient @@ -196,9 +195,7 @@ func NewDefaultConstructors() ComponentConstructors { NewTerraformGenerator: func(injector di.Injector) generators.Generator { return generators.NewTerraformGenerator(injector) }, - NewKustomizeGenerator: func(injector di.Injector) generators.Generator { - return generators.NewKustomizeGenerator(injector) - }, + NewToolsManager: func(injector di.Injector) tools.ToolsManager { return tools.NewToolsManager(injector) }, @@ -956,10 +953,6 @@ func (c *BaseController) createGeneratorsComponents(req Requirements) error { c.injector.Register("terraformGenerator", terraformGenerator) } - if !existingGeneratorNames["kustomizeGenerator"] { - kustomizeGenerator := c.constructors.NewKustomizeGenerator(c.injector) - c.injector.Register("kustomizeGenerator", kustomizeGenerator) - } } return nil diff --git a/pkg/controller/controller_test.go b/pkg/controller/controller_test.go index bd8fb854b..f3c3d7552 100644 --- a/pkg/controller/controller_test.go +++ b/pkg/controller/controller_test.go @@ -166,13 +166,7 @@ func TestNewController(t *testing.T) { } return nil }, - "NewKustomizeGenerator": func() error { - generator := controller.constructors.NewKustomizeGenerator(mocks.Injector) - if generator == nil { - return fmt.Errorf("NewKustomizeGenerator returned nil") - } - return nil - }, + "NewToolsManager": func() error { manager := controller.constructors.NewToolsManager(mocks.Injector) if manager == nil { @@ -2572,19 +2566,15 @@ func TestBaseController_createGeneratorsComponents(t *testing.T) { } }) - t.Run("CreatesTerraformAndKustomizeGeneratorsWhenBlueprintRequired", func(t *testing.T) { - // Given a controller with mocked terraform and kustomize generators + t.Run("CreatesTerraformGeneratorWhenBlueprintRequired", func(t *testing.T) { + // Given a controller with mocked terraform generator controller, mocks := setup(t) - // Mock generators + // Mock generator mockTerraformGenerator := generators.NewMockGenerator() - mockKustomizeGenerator := generators.NewMockGenerator() controller.constructors.NewTerraformGenerator = func(di.Injector) generators.Generator { return mockTerraformGenerator } - controller.constructors.NewKustomizeGenerator = func(di.Injector) generators.Generator { - return mockKustomizeGenerator - } // When creating generator components with generators and blueprint enabled err := controller.createGeneratorsComponents(Requirements{ @@ -2592,18 +2582,15 @@ func TestBaseController_createGeneratorsComponents(t *testing.T) { Blueprint: true, }) - // Then no error should be returned and both generators should be registered + // Then no error should be returned and terraform generator should be registered if err != nil { t.Errorf("Expected no error, got %v", err) } - // Verify generators were created + // Verify generator was created if resolved := mocks.Injector.Resolve("terraformGenerator"); resolved != mockTerraformGenerator { t.Error("Expected terraform generator to be registered") } - if resolved := mocks.Injector.Resolve("kustomizeGenerator"); resolved != mockKustomizeGenerator { - t.Error("Expected kustomize generator to be registered") - } }) t.Run("DoesNotCreateDuplicateGenerators", func(t *testing.T) { diff --git a/pkg/controller/mock_controller.go b/pkg/controller/mock_controller.go index 22a5f10bf..91cd4dde5 100644 --- a/pkg/controller/mock_controller.go +++ b/pkg/controller/mock_controller.go @@ -100,9 +100,7 @@ func NewMockConstructors() ComponentConstructors { NewTerraformGenerator: func(injector di.Injector) generators.Generator { return generators.NewMockGenerator() }, - NewKustomizeGenerator: func(injector di.Injector) generators.Generator { - return generators.NewMockGenerator() - }, + NewToolsManager: func(injector di.Injector) tools.ToolsManager { return tools.NewMockToolsManager() }, diff --git a/pkg/controller/mock_controller_test.go b/pkg/controller/mock_controller_test.go index 6770c269c..fc20468ab 100644 --- a/pkg/controller/mock_controller_test.go +++ b/pkg/controller/mock_controller_test.go @@ -441,10 +441,6 @@ func TestNewMockConstructors(t *testing.T) { if terraformGenerator == nil { t.Error("expected NewTerraformGenerator to return non-nil") } - kustomizeGenerator := constructors.NewKustomizeGenerator(injector) - if kustomizeGenerator == nil { - t.Error("expected NewKustomizeGenerator to return non-nil") - } // Test env printer constructors awsEnvPrinter := constructors.NewAwsEnvPrinter(injector) diff --git a/pkg/generators/kustomize_generator.go b/pkg/generators/kustomize_generator.go deleted file mode 100644 index 9269fa57b..000000000 --- a/pkg/generators/kustomize_generator.go +++ /dev/null @@ -1,81 +0,0 @@ -package generators - -import ( - "fmt" - "path/filepath" - - "github.com/windsorcli/cli/pkg/di" -) - -// The KustomizeGenerator is a specialized component that manages Kustomize configuration. -// It provides functionality to create and initialize Kustomize directories and files. -// The KustomizeGenerator ensures proper Kubernetes resource management for Windsor projects, -// establishing the foundation for declarative configuration management. - -// ============================================================================= -// Types -// ============================================================================= - -// KustomizeGenerator is a generator that writes Kustomize files -type KustomizeGenerator struct { - BaseGenerator -} - -// ============================================================================= -// Constructor -// ============================================================================= - -// NewKustomizeGenerator creates a new KustomizeGenerator -func NewKustomizeGenerator(injector di.Injector) *KustomizeGenerator { - return &KustomizeGenerator{ - BaseGenerator: *NewGenerator(injector), - } -} - -// ============================================================================= -// Public Methods -// ============================================================================= - -// Write method creates a "kustomize" directory in the project root if it does not exist. -// It then generates a "kustomization.yaml" file within this directory, initializing it -// with an empty list of resources. -func (g *KustomizeGenerator) Write(overwrite ...bool) error { - projectRoot, err := g.shell.GetProjectRoot() - if err != nil { - return fmt.Errorf("mock error getting project root") - } - - kustomizeDir := filepath.Join(projectRoot, "kustomize") - if err := g.shims.MkdirAll(kustomizeDir, 0755); err != nil { - return fmt.Errorf("mock error reading kustomization.yaml") - } - - kustomizationPath := filepath.Join(kustomizeDir, "kustomization.yaml") - if _, err := g.shims.Stat(kustomizationPath); err == nil { - return nil - } - - kustomization := map[string]any{ - "apiVersion": "kustomize.config.k8s.io/v1beta1", - "kind": "Kustomization", - "resources": []string{}, - } - - data, err := g.shims.MarshalYAML(kustomization) - if err != nil { - return fmt.Errorf("mock error writing kustomization.yaml") - } - - if err := g.shims.WriteFile(kustomizationPath, data, 0644); err != nil { - return fmt.Errorf("mock error writing kustomization.yaml") - } - - return nil -} - -// ============================================================================= -// Interface Compliance -// ============================================================================= - -// Ensure KustomizeGenerator implements Generator -var _ Generator = (*KustomizeGenerator)(nil) diff --git a/pkg/generators/kustomize_generator_test.go b/pkg/generators/kustomize_generator_test.go deleted file mode 100644 index 3538e4ee9..000000000 --- a/pkg/generators/kustomize_generator_test.go +++ /dev/null @@ -1,238 +0,0 @@ -package generators - -import ( - "fmt" - "io/fs" - "os" - "path/filepath" - "testing" -) - -// ============================================================================= -// Test Constructor -// ============================================================================= - -func TestNewKustomizeGenerator(t *testing.T) { - t.Run("NewKustomizeGenerator", func(t *testing.T) { - // Given a set of mocks - mocks := setupMocks(t) - - // When a new KustomizeGenerator is created - generator := NewKustomizeGenerator(mocks.Injector) - generator.shims = mocks.Shims - if err := generator.Initialize(); err != nil { - t.Fatalf("failed to initialize KustomizeGenerator: %v", err) - } - - // Then the KustomizeGenerator should be created correctly - if generator == nil { - t.Fatalf("expected KustomizeGenerator to be created, got nil") - } - - // And the KustomizeGenerator should have the correct injector - if generator.injector != mocks.Injector { - t.Errorf("expected KustomizeGenerator to have the correct injector") - } - }) -} - -// ============================================================================= -// Test Public Methods -// ============================================================================= - -func TestKustomizeGenerator_Write(t *testing.T) { - setup := func(t *testing.T) (*KustomizeGenerator, *Mocks) { - mocks := setupMocks(t) - generator := NewKustomizeGenerator(mocks.Injector) - generator.shims = mocks.Shims - if err := generator.Initialize(); err != nil { - t.Fatalf("failed to initialize KustomizeGenerator: %v", err) - } - return generator, mocks - } - - t.Run("Success", func(t *testing.T) { - // Given a KustomizeGenerator with mocks - generator, mocks := setup(t) - - // And the project root is set - expectedProjectRoot := "/mock/project/root" - mocks.Shell.GetProjectRootFunc = func() (string, error) { - return expectedProjectRoot, nil - } - - // And the shims are configured for file operations - mocks.Shims.MkdirAll = func(path string, perm fs.FileMode) error { - expectedPath := filepath.Join(expectedProjectRoot, "kustomize") - if path != expectedPath { - t.Errorf("expected path %s, got %s", expectedPath, path) - } - return nil - } - - mocks.Shims.Stat = func(name string) (fs.FileInfo, error) { - expectedPath := filepath.Join(expectedProjectRoot, "kustomize", "kustomization.yaml") - if name == expectedPath { - return nil, os.ErrNotExist - } - return nil, nil - } - - mocks.Shims.WriteFile = func(filename string, data []byte, perm fs.FileMode) error { - expectedPath := filepath.Join(expectedProjectRoot, "kustomize", "kustomization.yaml") - if filename != expectedPath { - t.Errorf("expected filename %s, got %s", expectedPath, filename) - } - expectedContent := "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources: []\n" - if string(data) != expectedContent { - t.Errorf("expected content %s, got %s", expectedContent, string(data)) - } - return nil - } - - // When Write is called - err := generator.Write() - - // Then no error should occur - if err != nil { - t.Errorf("expected no error, got %v", err) - } - }) - - t.Run("ErrorGettingProjectRoot", func(t *testing.T) { - // Given a set of mocks - mocks := setupMocks(t) - - // And GetProjectRoot is mocked to return an error - mocks.Shell.GetProjectRootFunc = func() (string, error) { - return "", fmt.Errorf("mock error getting project root") - } - - // And a new KustomizeGenerator is created - generator := NewKustomizeGenerator(mocks.Injector) - generator.shims = mocks.Shims - if err := generator.Initialize(); err != nil { - t.Fatalf("failed to initialize KustomizeGenerator: %v", err) - } - - // When Write is called - err := generator.Write() - - // Then an error should be returned - if err == nil { - t.Fatalf("expected an error, got nil") - } - - // And the error should match the expected error - expectedError := "mock error getting project root" - if err.Error() != expectedError { - t.Errorf("expected error %s, got %s", expectedError, err.Error()) - } - }) - - t.Run("ErrorReadingKustomization", func(t *testing.T) { - // Given a KustomizeGenerator with mocks - generator, mocks := setup(t) - - // And MkdirAll is mocked to return an error - mocks.Shims.MkdirAll = func(_ string, _ fs.FileMode) error { - return fmt.Errorf("mock error reading kustomization.yaml") - } - - // When Write is called - err := generator.Write() - - // Then an error should be returned - if err == nil { - t.Fatalf("expected an error, got nil") - } - - // And the error should match the expected error - expectedError := "mock error reading kustomization.yaml" - if err.Error() != expectedError { - t.Errorf("expected error %s, got %s", expectedError, err.Error()) - } - }) - - t.Run("KustomizationDoesNotExist", func(t *testing.T) { - // Given a KustomizeGenerator with mocks - generator, mocks := setup(t) - - // And Stat is mocked to simulate kustomization.yaml does not exist - mocks.Shims.Stat = func(_ string) (fs.FileInfo, error) { - return nil, os.ErrNotExist - } - - // And WriteFile is mocked to simulate successful file creation - mocks.Shims.WriteFile = func(_ string, _ []byte, _ fs.FileMode) error { - return nil - } - - // When Write is called - err := generator.Write() - - // Then no error should be returned - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - }) - - t.Run("KustomizationExists", func(t *testing.T) { - // Given a KustomizeGenerator with mocks - generator, mocks := setup(t) - - // And Stat is mocked to simulate kustomization.yaml exists - mocks.Shims.Stat = func(_ string) (fs.FileInfo, error) { - return nil, nil - } - - // And WriteFile should not be called - writeFileCalled := false - mocks.Shims.WriteFile = func(_ string, _ []byte, _ fs.FileMode) error { - writeFileCalled = true - return nil - } - - // When Write is called - err := generator.Write() - - // Then no error should be returned - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - // And WriteFile should not have been called - if writeFileCalled { - t.Error("expected WriteFile not to be called when file exists") - } - }) - - t.Run("ErrorWritingKustomization", func(t *testing.T) { - // Given a KustomizeGenerator with mocks - generator, mocks := setup(t) - - // And Stat is mocked to simulate kustomization.yaml does not exist - mocks.Shims.Stat = func(_ string) (fs.FileInfo, error) { - return nil, os.ErrNotExist - } - - // And WriteFile is mocked to simulate an error during file writing - mocks.Shims.WriteFile = func(_ string, _ []byte, _ fs.FileMode) error { - return fmt.Errorf("mock error writing kustomization.yaml") - } - - // When Write is called - err := generator.Write() - - // Then an error should be returned - if err == nil { - t.Fatalf("expected an error, got nil") - } - - // And the error should match the expected error - expectedError := "mock error writing kustomization.yaml" - if err.Error() != expectedError { - t.Errorf("expected error %s, got %s", expectedError, err.Error()) - } - }) -} diff --git a/pkg/generators/terraform_generator.go b/pkg/generators/terraform_generator.go index 3d56590e2..a8a380bd9 100644 --- a/pkg/generators/terraform_generator.go +++ b/pkg/generators/terraform_generator.go @@ -100,11 +100,6 @@ func (g *TerraformGenerator) Write(overwrite ...bool) error { } } - projectRoot, err := g.shell.GetProjectRoot() - if err != nil { - return fmt.Errorf("failed to get project root: %w", err) - } - contextPath, err := g.configHandler.GetConfigRoot() if err != nil { return fmt.Errorf("failed to get config root: %w", err) @@ -119,11 +114,6 @@ func (g *TerraformGenerator) Write(overwrite ...bool) error { } } - terraformFolderPath := filepath.Join(projectRoot, "terraform") - if err := g.shims.MkdirAll(terraformFolderPath, 0755); err != nil { - return fmt.Errorf("failed to create terraform directory: %w", err) - } - for _, component := range components { if component.Source != "" { if err := g.generateModuleShim(component, ociArtifacts); err != nil { diff --git a/pkg/generators/terraform_generator_test.go b/pkg/generators/terraform_generator_test.go index 2cdee7832..dbe4364e6 100644 --- a/pkg/generators/terraform_generator_test.go +++ b/pkg/generators/terraform_generator_test.go @@ -195,11 +195,34 @@ func TestTerraformGenerator_Write(t *testing.T) { // Given a TerraformGenerator with mocks generator, mocks := setup(t) - // And MkdirAll is mocked to return an error + // And a component with source that will trigger module directory creation + component := blueprintv1alpha1.TerraformComponent{ + Source: "fake-source", + Path: "test-component", + FullPath: "/tmp/terraform/test-component", + } + mocks.BlueprintHandler.GetTerraformComponentsFunc = func() []blueprintv1alpha1.TerraformComponent { + return []blueprintv1alpha1.TerraformComponent{component} + } + + // And MkdirAll is mocked to return an error for module directory creation mocks.Shims.MkdirAll = func(_ string, _ fs.FileMode) error { return fmt.Errorf("mock error creating directory") } + // Mock processTemplates to succeed + mocks.Shell.GetProjectRootFunc = func() (string, error) { + return "/tmp", nil + } + + mocks.Shims.Stat = func(path string) (fs.FileInfo, error) { + return nil, os.ErrNotExist + } + + mocks.ConfigHandler.(*config.MockConfigHandler).GetConfigRootFunc = func() (string, error) { + return "/tmp/context", nil + } + // When Write is called err := generator.Write() @@ -209,7 +232,7 @@ func TestTerraformGenerator_Write(t *testing.T) { } // And the error should match the expected error - expectedError := "failed to create terraform directory: mock error creating directory" + expectedError := "failed to generate module shim: failed to create module directory: mock error creating directory" if err.Error() != expectedError { t.Errorf("expected error %s, got %s", expectedError, err.Error()) }