From 66e0b8c07846e35518f44bc70de11b87ae686136 Mon Sep 17 00:00:00 2001 From: Lionello Lunesu Date: Mon, 10 Feb 2025 14:44:36 -0800 Subject: [PATCH] wip --- src/cmd/cli/command/cd.go | 52 +++++++++++++++++++++++++++ src/cmd/cli/command/commands.go | 2 ++ src/pkg/cli/client/byoc/baseclient.go | 34 ++++++++++++------ 3 files changed, 77 insertions(+), 11 deletions(-) diff --git a/src/cmd/cli/command/cd.go b/src/cmd/cli/command/cd.go index 2081e114..718bfa8a 100644 --- a/src/cmd/cli/command/cd.go +++ b/src/cmd/cli/command/cd.go @@ -120,6 +120,32 @@ var cdCancelCmd = &cobra.Command{ }, } +var cdExportCmd = &cobra.Command{ + Use: "export", + Annotations: authNeededAnnotation, // need subscription + Args: cobra.NoArgs, // TODO: set MaximumNArgs(1), + Short: "Export the service stack state", + RunE: func(cmd *cobra.Command, args []string) error { + loader := configureLoader(cmd) + provider, err := getProvider(cmd.Context(), loader) + if err != nil { + return err + } + + projectName, err := cliClient.LoadProjectNameWithFallback(cmd.Context(), loader, provider) + if err != nil { + return err + } + + err = canIUseProvider(cmd.Context(), provider, projectName) + if err != nil { + return err + } + + return cli.BootstrapCommand(cmd.Context(), projectName, client, provider, "export") + }, +} + var cdTearDownCmd = &cobra.Command{ Use: "teardown", Args: cobra.NoArgs, @@ -198,3 +224,29 @@ var cdPreviewCmd = &cobra.Command{ return cli.Tail(cmd.Context(), provider, project.Name, tailOptions) }, } + +var cdUpgradeCmd = &cobra.Command{ + Use: "upgrade", + Annotations: authNeededAnnotation, // need subscription + Args: cobra.NoArgs, + Short: "Upgrade the provider", + RunE: func(cmd *cobra.Command, args []string) error { + loader := configureLoader(cmd) + provider, err := getProvider(cmd.Context(), loader) + if err != nil { + return err + } + + projectName, err := cliClient.LoadProjectNameWithFallback(cmd.Context(), loader, provider) + if err != nil { + return err + } + + err = canIUseProvider(cmd.Context(), provider, projectName) + if err != nil { + return err + } + + return cli.BootstrapCommand(cmd.Context(), projectName, client, provider, "upgrade") + }, +} diff --git a/src/cmd/cli/command/commands.go b/src/cmd/cli/command/commands.go index d3093022..e986c962 100644 --- a/src/cmd/cli/command/commands.go +++ b/src/cmd/cli/command/commands.go @@ -173,6 +173,7 @@ func SetupCommands(ctx context.Context, version string) { RootCmd.AddCommand(cdCmd) cdCmd.AddCommand(cdDestroyCmd) cdCmd.AddCommand(cdDownCmd) + cdCmd.AddCommand(cdExportCmd) cdCmd.AddCommand(cdRefreshCmd) cdTearDownCmd.Flags().Bool("force", false, "force the teardown of the CD stack") cdCmd.AddCommand(cdTearDownCmd) @@ -180,6 +181,7 @@ func SetupCommands(ctx context.Context, version string) { cdCmd.AddCommand(cdListCmd) cdCmd.AddCommand(cdCancelCmd) cdCmd.AddCommand(cdPreviewCmd) + cdCmd.AddCommand(cdUpgradeCmd) // Eula command tosCmd.Flags().Bool("agree-tos", false, "agree to the Defang terms of service") diff --git a/src/pkg/cli/client/byoc/baseclient.go b/src/pkg/cli/client/byoc/baseclient.go index d38c6770..6a42254d 100644 --- a/src/pkg/cli/client/byoc/baseclient.go +++ b/src/pkg/cli/client/byoc/baseclient.go @@ -84,19 +84,31 @@ func DebugPulumi(ctx context.Context, env []string, cmd ...string) error { localCmd := append([]string{"npm", "run", "dev"}, cmd...) term.Debug(strings.Join(append(env, localCmd...), " ")) - dir := os.Getenv("DEFANG_PULUMI_DIR") - if dir == "" { + if dir := os.Getenv("DEFANG_PULUMI_DIR"); dir != "" { + // Run the Pulumi command locally + env = append([]string{ + "PATH=" + os.Getenv("PATH"), + "USER=" + pkg.GetCurrentUser(), // needed for Pulumi + }, env...) + if err := runLocalCommand(ctx, dir, env, localCmd...); err != nil { + return err + } + } else if os.Getenv("DEFANG_DOCKER") == "1" { + // Run the Pulumi command locally in a Docker container + dockerCmd := []string{"docker", "run", "--rm", "--entrypoint=node"} + for _, e := range env { + dockerCmd = append(dockerCmd, "-e", e) + } + dockerCmd = append(dockerCmd, "docker.io/defangio/cd-sandbox:public-do-beta", "lib/index.js") + dockerCmd = append(dockerCmd, cmd...) + term.Debug(strings.Join(dockerCmd, " ")) + + if err := runLocalCommand(ctx, "", env, dockerCmd...); err != nil { + return err + } + } else { return nil // show the shell command, but use regular Pulumi command in cloud task } - - // Run the Pulumi command locally - env = append([]string{ - "PATH=" + os.Getenv("PATH"), - "USER=" + pkg.GetCurrentUser(), // needed for Pulumi - }, env...) - if err := runLocalCommand(ctx, dir, env, localCmd...); err != nil { - return err - } // We always return an error to stop the CLI from "tailing" the cloud logs return errors.New("local pulumi command succeeded; stopping") }