Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/cmd/cli/command/cd.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func cdCommand(cmd *cobra.Command, args []string, command client.CdCommand, fabr
}

if len(args) == 0 {
projectName, err := client.LoadProjectNameWithFallback(ctx, session.Loader, session.Provider)
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}
Expand Down
31 changes: 18 additions & 13 deletions src/cmd/cli/command/compose.go
Original file line number Diff line number Diff line change
Expand Up @@ -326,9 +326,11 @@ func handleComposeUpErr(ctx context.Context, debugger *debug.Debugger, project *
printDefangHint("To start a new project, do:", "new")
}

if connect.CodeOf(originalErr) == connect.CodeResourceExhausted && strings.Contains(originalErr.Error(), "maximum number of projects") {
playgroundProvider, isPlayground := provider.(*client.PlaygroundProvider)

if isPlayground && connect.CodeOf(originalErr) == connect.CodeResourceExhausted && strings.Contains(originalErr.Error(), "maximum number of projects") {
term.Error("Error:", client.PrettyError(originalErr))
err := handleTooManyProjectsError(ctx, provider, originalErr)
err := handleTooManyProjectsError(ctx, playgroundProvider, originalErr)
if err != nil {
return originalErr
}
Expand All @@ -345,7 +347,7 @@ func handleComposeUpErr(ctx context.Context, debugger *debug.Debugger, project *
}, originalErr)
}

func handleTooManyProjectsError(ctx context.Context, provider client.Provider, originalErr error) error {
func handleTooManyProjectsError(ctx context.Context, provider *client.PlaygroundProvider, originalErr error) error {
projectName, err := provider.RemoteProjectName(ctx)
if err != nil {
term.Warn("failed to get remote project name:", err)
Expand Down Expand Up @@ -438,18 +440,19 @@ func makeComposeDownCmd() *cobra.Command {
return err
}

projectName, err := client.LoadProjectNameWithFallback(cmd.Context(), session.Loader, session.Provider)
ctx := cmd.Context()
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}

err = canIUseProvider(cmd.Context(), session.Provider, projectName, 0)
err = canIUseProvider(ctx, session.Provider, projectName, 0)
if err != nil {
return err
}

since := time.Now()
deployment, err := cli.ComposeDown(cmd.Context(), projectName, global.Client, session.Provider)
deployment, err := cli.ComposeDown(ctx, projectName, global.Client, session.Provider)
if err != nil {
if connect.CodeOf(err) == connect.CodeNotFound {
// Show a warning (not an error) if the service was not found
Expand All @@ -461,7 +464,7 @@ func makeComposeDownCmd() *cobra.Command {

term.Info("Deleted services, deployment ID", deployment)

listConfigs, err := session.Provider.ListConfig(cmd.Context(), &defangv1.ListConfigsRequest{Project: projectName})
listConfigs, err := session.Provider.ListConfig(ctx, &defangv1.ListConfigsRequest{Project: projectName})
if err == nil {
if len(listConfigs.Names) > 0 {
term.Warn("Stored project configs are not deleted.")
Expand All @@ -476,7 +479,7 @@ func makeComposeDownCmd() *cobra.Command {
}

tailOptions := newTailOptionsForDown(session.Stack.Name, deployment, since)
tailCtx := cmd.Context() // FIXME: stop Tail when the deployment task is done
tailCtx := ctx // FIXME: stop Tail when the deployment task is done
err = cli.TailAndWaitForCD(tailCtx, session.Provider, projectName, tailOptions)
if err != nil && !errors.Is(err, io.EOF) {
if connect.CodeOf(err) == connect.CodePermissionDenied {
Expand Down Expand Up @@ -600,16 +603,17 @@ func makeComposePsCmd() *cobra.Command {
return err
}

projectName, err := client.LoadProjectNameWithFallback(cmd.Context(), session.Loader, session.Provider)
ctx := cmd.Context()
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}

if long {
return cli.PrintLongServices(cmd.Context(), projectName, session.Provider)
return cli.PrintLongServices(ctx, projectName, session.Provider)
}

if err := cli.PrintServices(cmd.Context(), projectName, session.Provider); err != nil {
if err := cli.PrintServices(ctx, projectName, session.Provider); err != nil {
if errNoServices := new(cli.ErrNoServices); !errors.As(err, errNoServices) {
return err
}
Expand Down Expand Up @@ -732,14 +736,15 @@ func handleLogsCmd(cmd *cobra.Command, args []string) error {
return err
}

projectName, err := client.LoadProjectNameWithFallback(cmd.Context(), session.Loader, session.Provider)
ctx := cmd.Context()
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}

// Handle 'latest' deployment flag
if deployment == "latest" {
resp, err := global.Client.ListDeployments(cmd.Context(), &defangv1.ListDeploymentsRequest{
resp, err := global.Client.ListDeployments(ctx, &defangv1.ListDeploymentsRequest{
Project: projectName,
Stack: session.Stack.Name,
Type: defangv1.DeploymentType_DEPLOYMENT_TYPE_ACTIVE,
Expand Down
9 changes: 5 additions & 4 deletions src/cmd/cli/command/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ var configSetCmd = &cobra.Command{
return fmt.Errorf("failed to get account info from provider %q: %w", session.Stack.Provider, err)
}

projectName, err := client.LoadProjectNameWithFallback(cmd.Context(), session.Loader, session.Provider)
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}
Expand Down Expand Up @@ -199,12 +199,13 @@ var configDeleteCmd = &cobra.Command{
return err
}

projectName, err := client.LoadProjectNameWithFallback(cmd.Context(), session.Loader, session.Provider)
ctx := cmd.Context()
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}

if err := cli.ConfigDelete(cmd.Context(), projectName, session.Provider, names...); err != nil {
if err := cli.ConfigDelete(ctx, projectName, session.Provider, names...); err != nil {
// Show a warning (not an error) if the config was not found
if connect.CodeOf(err) == connect.CodeNotFound {
term.Warn(client.PrettyError(err))
Expand All @@ -231,7 +232,7 @@ var configListCmd = &cobra.Command{
if err != nil {
return err
}
projectName, err := client.LoadProjectNameWithFallback(ctx, session.Loader, session.Provider)
projectName, _, err := session.Loader.LoadProjectName(ctx)
if err != nil {
return err
}
Expand Down
5 changes: 3 additions & 2 deletions src/pkg/agent/tools/default_tool_cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,9 @@ func (DefaultToolCLI) ComposeDown(ctx context.Context, projectName string, fabri
return cli.ComposeDown(ctx, projectName, fabric, provider)
}

func (DefaultToolCLI) LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error) {
return client.LoadProjectNameWithFallback(ctx, loader, provider)
func (DefaultToolCLI) LoadProjectName(ctx context.Context, loader client.Loader) (string, error) {
projectName, _, err := loader.LoadProjectName(ctx)
return projectName, err
}

func (DefaultToolCLI) ConfigDelete(ctx context.Context, projectName string, provider client.Provider, name string) error {
Expand Down
4 changes: 2 additions & 2 deletions src/pkg/agent/tools/destroy.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ func HandleDestroyTool(ctx context.Context, loader client.Loader, params Destroy
if err != nil {
return "", fmt.Errorf("failed to setup provider: %w", err)
}
term.Debug("Function invoked: cli.LoadProjectNameWithFallback")
projectName, err := cli.LoadProjectNameWithFallback(ctx, loader, provider)
term.Debug("Function invoked: cli.LoadProjectName")
projectName, err := cli.LoadProjectName(ctx, loader)
if err != nil {
return "", fmt.Errorf("failed to load project name: %w", err)
}
Expand Down
6 changes: 3 additions & 3 deletions src/pkg/agent/tools/destroy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ func (m *MockDestroyCLI) ComposeDown(ctx context.Context, projectName string, gr
return m.ComposeDownResult, nil
}

func (m *MockDestroyCLI) LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error) {
m.CallLog = append(m.CallLog, "LoadProjectNameWithFallback")
func (m *MockDestroyCLI) LoadProjectName(ctx context.Context, loader client.Loader) (string, error) {
m.CallLog = append(m.CallLog, "LoadProjectName")
if m.LoadProjectNameWithFallbackError != nil {
return "", m.LoadProjectNameWithFallbackError
}
Expand Down Expand Up @@ -187,7 +187,7 @@ func TestHandleDestroyTool(t *testing.T) {
expectedCalls := []string{
"Connect(test-cluster)",
"NewProvider(aws)",
"LoadProjectNameWithFallback",
"LoadProjectName",
"CanIUseProvider(test-project)",
"ComposeDown(test-project)",
}
Expand Down
2 changes: 1 addition & 1 deletion src/pkg/agent/tools/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type CLIInterface interface {
InteractiveLoginMCP(ctx context.Context, cluster string, mcpClient string) error
ListConfig(ctx context.Context, provider client.Provider, projectName string) (*defangv1.Secrets, error)
LoadProject(ctx context.Context, loader client.Loader) (*compose.Project, error)
LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error)
LoadProjectName(ctx context.Context, loader client.Loader) (string, error)
NewProvider(ctx context.Context, providerId client.ProviderID, client client.FabricClient, stack string) client.Provider
PrintEstimate(mode modes.Mode, estimate *defangv1.EstimateResponse) string
RunEstimate(ctx context.Context, project *compose.Project, fabric *client.GrpcClient, provider client.Provider, providerId client.ProviderID, region string, mode modes.Mode) (*defangv1.EstimateResponse, error)
Expand Down
4 changes: 2 additions & 2 deletions src/pkg/agent/tools/listConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ func HandleListConfigTool(ctx context.Context, loader client.Loader, params List
return "", fmt.Errorf("failed to setup provider: %w", err)
}

term.Debug("Function invoked: cli.LoadProjectNameWithFallback")
projectName, err := cli.LoadProjectNameWithFallback(ctx, loader, provider)
term.Debug("Function invoked: cli.LoadProjectName")
projectName, err := cli.LoadProjectName(ctx, loader)
if err != nil {
return "", fmt.Errorf("failed to load project name: %w", err)
}
Expand Down
6 changes: 3 additions & 3 deletions src/pkg/agent/tools/listConfig_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ func (m *MockListConfigCLI) NewProvider(ctx context.Context, providerId client.P
return nil // Mock provider
}

func (m *MockListConfigCLI) LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error) {
m.CallLog = append(m.CallLog, "LoadProjectNameWithFallback")
func (m *MockListConfigCLI) LoadProjectName(ctx context.Context, loader client.Loader) (string, error) {
m.CallLog = append(m.CallLog, "LoadProjectName")
if m.LoadProjectNameError != nil {
return "", m.LoadProjectNameError
}
Expand Down Expand Up @@ -174,7 +174,7 @@ func TestHandleListConfigTool(t *testing.T) {
expectedCalls := []string{
"Connect(test-cluster)",
"NewProvider(aws)",
"LoadProjectNameWithFallback",
"LoadProjectName",
"ListConfig(test-project)",
}
assert.Equal(t, expectedCalls, mockCLI.CallLog)
Expand Down
4 changes: 2 additions & 2 deletions src/pkg/agent/tools/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ func HandleLogsTool(ctx context.Context, loader client.Loader, params LogsParams
return "", fmt.Errorf("failed to setup provider: %w", err)
}

term.Debug("Function invoked: cli.LoadProjectNameWithFallback")
projectName, err := cli.LoadProjectNameWithFallback(ctx, loader, provider)
term.Debug("Function invoked: cli.LoadProjectName")
projectName, err := cli.LoadProjectName(ctx, loader)
if err != nil {
return "", fmt.Errorf("failed to load project name: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions src/pkg/agent/tools/removeConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ func HandleRemoveConfigTool(ctx context.Context, loader client.Loader, params Re
if err != nil {
return "", fmt.Errorf("failed to setup provider: %w", err)
}
term.Debug("Function invoked: cli.LoadProjectNameWithFallback")
projectName, err := cli.LoadProjectNameWithFallback(ctx, loader, provider)
term.Debug("Function invoked: cli.LoadProjectName")
projectName, err := cli.LoadProjectName(ctx, loader)
if err != nil {
return "", fmt.Errorf("failed to load project name: %w", err)
}
Expand Down
6 changes: 3 additions & 3 deletions src/pkg/agent/tools/removeConfig_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ func (m *MockRemoveConfigCLI) NewProvider(ctx context.Context, providerId client
return nil // Mock provider
}

func (m *MockRemoveConfigCLI) LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error) {
m.CallLog = append(m.CallLog, "LoadProjectNameWithFallback")
func (m *MockRemoveConfigCLI) LoadProjectName(ctx context.Context, loader client.Loader) (string, error) {
m.CallLog = append(m.CallLog, "LoadProjectName")
if m.LoadProjectNameError != nil {
return "", m.LoadProjectNameError
}
Expand Down Expand Up @@ -188,7 +188,7 @@ func TestHandleRemoveConfigTool(t *testing.T) {
expectedCalls := []string{
"Connect(test-cluster)",
"NewProvider(aws)",
"LoadProjectNameWithFallback",
"LoadProjectName",
"ConfigDelete(test-project, DATABASE_URL)",
}
assert.Equal(t, expectedCalls, mockCLI.CallLog)
Expand Down
4 changes: 2 additions & 2 deletions src/pkg/agent/tools/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ func HandleServicesTool(ctx context.Context, loader client.Loader, params Servic
if err != nil {
return "", fmt.Errorf("failed to setup provider: %w", err)
}
term.Debug("Function invoked: cli.LoadProjectNameWithFallback")
projectName, err := cli.LoadProjectNameWithFallback(ctx, loader, provider)
term.Debug("Function invoked: cli.LoadProjectName")
projectName, err := cli.LoadProjectName(ctx, loader)
term.Debugf("Project name loaded: %s", projectName)
if err != nil {
if strings.Contains(err.Error(), "no projects found") {
Expand Down
2 changes: 1 addition & 1 deletion src/pkg/agent/tools/services_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func (m *MockCLI) NewProvider(ctx context.Context, providerId client.ProviderID,
return m.MockProvider
}

func (m *MockCLI) LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error) {
func (m *MockCLI) LoadProjectName(ctx context.Context, loader client.Loader) (string, error) {
if m.LoadProjectNameWithFallbackError != nil {
return "", m.LoadProjectNameWithFallbackError
}
Expand Down
4 changes: 2 additions & 2 deletions src/pkg/agent/tools/setConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ func HandleSetConfig(ctx context.Context, loader client.Loader, params SetConfig
}

if params.ProjectName == "" {
term.Debug("Function invoked: cli.LoadProjectNameWithFallback")
projectName, err := cliInterface.LoadProjectNameWithFallback(ctx, loader, provider)
term.Debug("Function invoked: cli.LoadProjectName")
projectName, err := cliInterface.LoadProjectName(ctx, loader)
if err != nil {
return "", fmt.Errorf("failed to load project name: %w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion src/pkg/agent/tools/setConfig_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (p *MockProvider) AccountInfo(context.Context) (*client.AccountInfo, error)
return &client.AccountInfo{}, nil
}

func (m *MockSetConfigCLI) LoadProjectNameWithFallback(ctx context.Context, loader client.Loader, provider client.Provider) (string, error) {
func (m *MockSetConfigCLI) LoadProjectName(ctx context.Context, loader client.Loader) (string, error) {
m.LoadProjectNameCalled = true
if m.LoadProjectNameError != nil {
return "", m.LoadProjectNameError
Expand Down
24 changes: 0 additions & 24 deletions src/pkg/cli/client/byoc/baseclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package byoc

import (
"context"
"errors"
"fmt"
"iter"
"strings"
Expand All @@ -13,7 +12,6 @@ import (
"github.com/DefangLabs/defang/src/pkg/cli/compose"
"github.com/DefangLabs/defang/src/pkg/dns"
"github.com/DefangLabs/defang/src/pkg/stacks"
"github.com/DefangLabs/defang/src/pkg/term"
"github.com/DefangLabs/defang/src/pkg/types"
defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1"
composeTypes "github.com/compose-spec/compose-go/v2/types"
Expand Down Expand Up @@ -95,28 +93,6 @@ func (b *ByocBaseClient) ServicePrivateDNS(serviceName string) string {
return getServiceLabel(serviceName)
}

func (b *ByocBaseClient) RemoteProjectName(ctx context.Context) (string, error) {
// Get the list of projects from remote
stacks, err := b.projectBackend.CdList(ctx, false)
if err != nil {
return "", fmt.Errorf("no cloud projects found: %w", err)
}
var projectNames []string
for stack := range stacks {
projectNames = append(projectNames, stack.Project)
}

if len(projectNames) == 0 {
return "", errors.New("no cloud projects found")
}

if len(projectNames) > 1 {
return "", ErrMultipleProjects{ProjectNames: projectNames}
}
term.Debug("Using default project:", projectNames[0])
return projectNames[0], nil
}

type ErrNoPermission string

func (e ErrNoPermission) Error() string {
Expand Down
27 changes: 0 additions & 27 deletions src/pkg/cli/client/projectName.go

This file was deleted.

Loading
Loading