diff --git a/pkg/project/project.go b/pkg/project/project.go index 296a263dd..a7f4fd6bb 100644 --- a/pkg/project/project.go +++ b/pkg/project/project.go @@ -153,6 +153,11 @@ func (p *Project) Initialize(overwrite bool, blueprintURL ...string) error { if err := p.Workstation.Prepare(); err != nil { return fmt.Errorf("failed to prepare workstation: %w", err) } + if p.Workstation.ContainerRuntime != nil { + if err := p.Workstation.ContainerRuntime.WriteConfig(); err != nil { + return fmt.Errorf("failed to write container runtime config: %w", err) + } + } } if err := p.Runtime.ConfigHandler.GenerateContextID(); err != nil { diff --git a/pkg/project/project_test.go b/pkg/project/project_test.go index fe05c4d1d..66f5d54bc 100644 --- a/pkg/project/project_test.go +++ b/pkg/project/project_test.go @@ -17,6 +17,7 @@ import ( "github.com/windsorcli/cli/pkg/workstation" "github.com/windsorcli/cli/pkg/workstation/network" "github.com/windsorcli/cli/pkg/workstation/services" + "github.com/windsorcli/cli/pkg/workstation/virt" ) // ============================================================================= @@ -741,6 +742,97 @@ func TestProject_Initialize(t *testing.T) { } }) + t.Run("CallsContainerRuntimeWriteConfig", func(t *testing.T) { + mocks := setupProjectMocks(t) + mockConfig := mocks.ConfigHandler.(*config.MockConfigHandler) + mockConfig.IsDevModeFunc = func(contextName string) bool { + return true + } + mockConfig.GetBoolFunc = func(key string, defaultValue ...bool) bool { + if key == "docker.enabled" { + return true + } + return false + } + + proj, err := NewProject("test-context", &Project{Runtime: mocks.Runtime}) + if err != nil { + t.Fatalf("Failed to create project: %v", err) + } + + if err := proj.Configure(nil); err != nil { + t.Fatalf("Failed to configure project: %v", err) + } + + if proj.Workstation == nil { + t.Fatal("Expected workstation to be created") + } + + writeConfigCalled := false + mockContainerRuntime := virt.NewMockVirt() + mockContainerRuntime.WriteConfigFunc = func() error { + writeConfigCalled = true + return nil + } + proj.Workstation.ContainerRuntime = mockContainerRuntime + proj.Workstation.NetworkManager = nil + + err = proj.Initialize(false) + + if err != nil { + t.Errorf("Expected no error, got: %v", err) + } + + if !writeConfigCalled { + t.Error("Expected ContainerRuntime.WriteConfig to be called") + } + }) + + t.Run("ErrorOnContainerRuntimeWriteConfigFailure", func(t *testing.T) { + mocks := setupProjectMocks(t) + mockConfig := mocks.ConfigHandler.(*config.MockConfigHandler) + mockConfig.IsDevModeFunc = func(contextName string) bool { + return true + } + mockConfig.GetBoolFunc = func(key string, defaultValue ...bool) bool { + if key == "docker.enabled" { + return true + } + return false + } + + proj, err := NewProject("test-context", &Project{Runtime: mocks.Runtime}) + if err != nil { + t.Fatalf("Failed to create project: %v", err) + } + + if err := proj.Configure(nil); err != nil { + t.Fatalf("Failed to configure project: %v", err) + } + + if proj.Workstation == nil { + t.Fatal("Expected workstation to be created") + } + + mockContainerRuntime := virt.NewMockVirt() + mockContainerRuntime.WriteConfigFunc = func() error { + return fmt.Errorf("write config failed") + } + proj.Workstation.ContainerRuntime = mockContainerRuntime + proj.Workstation.NetworkManager = nil + + err = proj.Initialize(false) + + if err == nil { + t.Error("Expected error for ContainerRuntime.WriteConfig failure") + return + } + + if !strings.Contains(err.Error(), "failed to write container runtime config") { + t.Errorf("Expected specific error message, got: %v", err) + } + }) + t.Run("SuccessWithOverwriteTrue", func(t *testing.T) { mocks := setupProjectMocks(t) proj, err := NewProject("test-context", &Project{Runtime: mocks.Runtime}) diff --git a/pkg/workstation/virt/docker_virt.go b/pkg/workstation/virt/docker_virt.go index c59d9f037..ab7c54326 100644 --- a/pkg/workstation/virt/docker_virt.go +++ b/pkg/workstation/virt/docker_virt.go @@ -70,12 +70,6 @@ func (v *DockerVirt) Up() error { return fmt.Errorf("failed to determine compose command: %w", err) } - if v.configHandler.GetString("vm.driver") == "colima" { - if err := v.WriteConfig(); err != nil { - return fmt.Errorf("error regenerating docker compose config: %w", err) - } - } - projectRoot := v.runtime.ProjectRoot composeFilePath := filepath.Join(projectRoot, ".windsor", "docker-compose.yaml")