diff --git a/cmd/uncloud/caddy/deploy.go b/cmd/uncloud/caddy/deploy.go new file mode 100644 index 00000000..2daf7ce9 --- /dev/null +++ b/cmd/uncloud/caddy/deploy.go @@ -0,0 +1,51 @@ +package caddy + +import ( + "context" + "fmt" + "github.com/spf13/cobra" + "uncloud/internal/cli" +) + +type deployOptions struct { + image string + cluster string +} + +func NewDeployCommand() *cobra.Command { + opts := deployOptions{} + + cmd := &cobra.Command{ + Use: "deploy", + Short: "Deploy or upgrade Caddy reverse proxy across all machines in the cluster.", + Long: "Deploy or upgrade Caddy reverse proxy across all machines in the cluster.\n" + + "It performs a rolling update if Caddy is already running.", + RunE: func(cmd *cobra.Command, args []string) error { + uncli := cmd.Context().Value("cli").(*cli.CLI) + return deploy(cmd.Context(), uncli, opts) + }, + } + + cmd.Flags().StringVar(&opts.image, "image", "", + "Caddy Docker image to deploy. (default caddy:LATEST_VERSION)") + cmd.Flags().StringVarP( + &opts.cluster, "cluster", "c", "", + "Name of the cluster to deploy to. (default is the current cluster)", + ) + + return cmd +} + +func deploy(ctx context.Context, uncli *cli.CLI, opts deployOptions) error { + client, err := uncli.ConnectCluster(ctx, opts.cluster) + if err != nil { + return fmt.Errorf("connect to cluster: %w", err) + } + defer client.Close() + + if err = client.DeployCaddy(ctx, opts.image); err != nil { + return fmt.Errorf("deploy caddy: %w", err) + } + + return nil +} diff --git a/cmd/uncloud/caddy/root.go b/cmd/uncloud/caddy/root.go new file mode 100644 index 00000000..a20fe9e2 --- /dev/null +++ b/cmd/uncloud/caddy/root.go @@ -0,0 +1,16 @@ +package caddy + +import ( + "github.com/spf13/cobra" +) + +func NewRootCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "caddy", + Short: "Manage Caddy reverse proxy service.", + } + cmd.AddCommand( + NewDeployCommand(), + ) + return cmd +} diff --git a/cmd/uncloud/main.go b/cmd/uncloud/main.go index 95f16a9c..0caf2356 100644 --- a/cmd/uncloud/main.go +++ b/cmd/uncloud/main.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "os" "strings" + "uncloud/cmd/uncloud/caddy" "uncloud/cmd/uncloud/machine" "uncloud/cmd/uncloud/service" "uncloud/internal/cli" @@ -41,6 +42,7 @@ func main() { _ = cmd.MarkPersistentFlagFilename("uncloud-config", "toml") cmd.AddCommand( + caddy.NewRootCommand(), machine.NewRootCommand(), service.NewRootCommand(), service.NewInspectCommand(), diff --git a/internal/cli/client/caddy.go b/internal/cli/client/caddy.go new file mode 100644 index 00000000..27643ad3 --- /dev/null +++ b/internal/cli/client/caddy.go @@ -0,0 +1,10 @@ +package client + +import ( + "context" + "errors" +) + +func (cli *Client) DeployCaddy(ctx context.Context, image string) error { + return errors.New("not implemented") +}