Add the backup list command to the cli (#254)
* Add the backup list command to the cli Adds `corso backup list <service>` to the cli commands. Currently does nothing, while we're waiting on downstream implementation. e2e hookup will arrive later.
This commit is contained in:
parent
abc8b44718
commit
ce52cc5f41
@ -12,9 +12,11 @@ var backupApplications = []func(parent *cobra.Command) *cobra.Command{
|
|||||||
func AddCommands(parent *cobra.Command) {
|
func AddCommands(parent *cobra.Command) {
|
||||||
parent.AddCommand(backupCmd)
|
parent.AddCommand(backupCmd)
|
||||||
backupCmd.AddCommand(createCmd)
|
backupCmd.AddCommand(createCmd)
|
||||||
|
backupCmd.AddCommand(listCmd)
|
||||||
|
|
||||||
for _, addBackupTo := range backupApplications {
|
for _, addBackupTo := range backupApplications {
|
||||||
addBackupTo(createCmd)
|
addBackupTo(createCmd)
|
||||||
|
addBackupTo(listCmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,3 +51,19 @@ var createCmd = &cobra.Command{
|
|||||||
func handleCreateCmd(cmd *cobra.Command, args []string) {
|
func handleCreateCmd(cmd *cobra.Command, args []string) {
|
||||||
cmd.Help()
|
cmd.Help()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The backup list subcommand.
|
||||||
|
// `corso backup list <service> [<flag>...]`
|
||||||
|
var listCommand = "list"
|
||||||
|
var listCmd = &cobra.Command{
|
||||||
|
Use: listCommand,
|
||||||
|
Short: "List the history of restore points for a service",
|
||||||
|
Run: handleListCmd,
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler for calls to `corso backup list`.
|
||||||
|
// Produces the same output as `corso backup list --help`.
|
||||||
|
func handleListCmd(cmd *cobra.Command, args []string) {
|
||||||
|
cmd.Help()
|
||||||
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
"github.com/alcionai/corso/cli/config"
|
"github.com/alcionai/corso/cli/config"
|
||||||
"github.com/alcionai/corso/cli/utils"
|
"github.com/alcionai/corso/cli/utils"
|
||||||
@ -19,20 +20,25 @@ var (
|
|||||||
|
|
||||||
// called by backup.go to map parent subcommands to provider-specific handling.
|
// called by backup.go to map parent subcommands to provider-specific handling.
|
||||||
func addExchangeApp(parent *cobra.Command) *cobra.Command {
|
func addExchangeApp(parent *cobra.Command) *cobra.Command {
|
||||||
var c *cobra.Command
|
var (
|
||||||
|
c *cobra.Command
|
||||||
|
fs *pflag.FlagSet
|
||||||
|
)
|
||||||
switch parent.Use {
|
switch parent.Use {
|
||||||
case createCommand:
|
case createCommand:
|
||||||
c = exchangeCreateCmd
|
c, fs = utils.AddCommand(parent, exchangeCreateCmd)
|
||||||
}
|
|
||||||
parent.AddCommand(c)
|
|
||||||
fs := c.Flags()
|
|
||||||
fs.StringVar(&user, "user", "", "ID of the user whose Exchange data is to be backed up.")
|
fs.StringVar(&user, "user", "", "ID of the user whose Exchange data is to be backed up.")
|
||||||
|
case listCommand:
|
||||||
|
c, _ = utils.AddCommand(parent, exchangeListCmd)
|
||||||
|
}
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const exchangeServiceCommand = "exchange"
|
||||||
|
|
||||||
// `corso backup create exchange [<flag>...]`
|
// `corso backup create exchange [<flag>...]`
|
||||||
var exchangeCreateCmd = &cobra.Command{
|
var exchangeCreateCmd = &cobra.Command{
|
||||||
Use: "exchange",
|
Use: exchangeServiceCommand,
|
||||||
Short: "Backup M365 Exchange service data",
|
Short: "Backup M365 Exchange service data",
|
||||||
RunE: createExchangeCmd,
|
RunE: createExchangeCmd,
|
||||||
Args: cobra.NoArgs,
|
Args: cobra.NoArgs,
|
||||||
@ -81,3 +87,34 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
fmt.Printf("Backed up restore point %s in %s for Exchange user %s.\n", result.SnapshotID, s.Provider, user)
|
fmt.Printf("Backed up restore point %s in %s for Exchange user %s.\n", result.SnapshotID, s.Provider, user)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `corso backup list exchange [<flag>...]`
|
||||||
|
var exchangeListCmd = &cobra.Command{
|
||||||
|
Use: exchangeServiceCommand,
|
||||||
|
Short: "List the history of M365 Exchange service backups",
|
||||||
|
RunE: listExchangeCmd,
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
}
|
||||||
|
|
||||||
|
// lists the history of backup operations
|
||||||
|
func listExchangeCmd(cmd *cobra.Command, args []string) error {
|
||||||
|
ctx := cmd.Context()
|
||||||
|
|
||||||
|
_, acct, err := config.GetStorageAndAccount(true, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m365, err := acct.M365Config()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Failed to parse m365 account config")
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Ctx(ctx).Debugw(
|
||||||
|
"Called - "+cmd.CommandPath(),
|
||||||
|
"tenantID", m365.TenantID)
|
||||||
|
|
||||||
|
// todo (keepers issue #251): e2e hookup
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
"github.com/alcionai/corso/cli/config"
|
"github.com/alcionai/corso/cli/config"
|
||||||
"github.com/alcionai/corso/cli/utils"
|
"github.com/alcionai/corso/cli/utils"
|
||||||
@ -24,15 +25,16 @@ var (
|
|||||||
|
|
||||||
// called by repo.go to map parent subcommands to provider-specific handling.
|
// called by repo.go to map parent subcommands to provider-specific handling.
|
||||||
func addS3Commands(parent *cobra.Command) *cobra.Command {
|
func addS3Commands(parent *cobra.Command) *cobra.Command {
|
||||||
var c *cobra.Command
|
var (
|
||||||
|
c *cobra.Command
|
||||||
|
fs *pflag.FlagSet
|
||||||
|
)
|
||||||
switch parent.Use {
|
switch parent.Use {
|
||||||
case initCommand:
|
case initCommand:
|
||||||
c = s3InitCmd
|
c, fs = utils.AddCommand(parent, s3InitCmd)
|
||||||
case connectCommand:
|
case connectCommand:
|
||||||
c = s3ConnectCmd
|
c, fs = utils.AddCommand(parent, s3ConnectCmd)
|
||||||
}
|
}
|
||||||
parent.AddCommand(c)
|
|
||||||
fs := c.Flags()
|
|
||||||
fs.StringVar(&accessKey, "access-key", "", "Access key ID (replaces the AWS_ACCESS_KEY_ID env variable).")
|
fs.StringVar(&accessKey, "access-key", "", "Access key ID (replaces the AWS_ACCESS_KEY_ID env variable).")
|
||||||
fs.StringVar(&bucket, "bucket", "", "Name of the S3 bucket (required).")
|
fs.StringVar(&bucket, "bucket", "", "Name of the S3 bucket (required).")
|
||||||
c.MarkFlagRequired("bucket")
|
c.MarkFlagRequired("bucket")
|
||||||
@ -41,9 +43,11 @@ func addS3Commands(parent *cobra.Command) *cobra.Command {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const s3ProviderCommand = "s3"
|
||||||
|
|
||||||
// `corso repo init s3 [<flag>...]`
|
// `corso repo init s3 [<flag>...]`
|
||||||
var s3InitCmd = &cobra.Command{
|
var s3InitCmd = &cobra.Command{
|
||||||
Use: "s3",
|
Use: s3ProviderCommand,
|
||||||
Short: "Initialize a S3 repository",
|
Short: "Initialize a S3 repository",
|
||||||
Long: `Bootstraps a new S3 repository and connects it to your m356 account.`,
|
Long: `Bootstraps a new S3 repository and connects it to your m356 account.`,
|
||||||
RunE: initS3Cmd,
|
RunE: initS3Cmd,
|
||||||
@ -103,7 +107,7 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
// `corso repo connect s3 [<flag>...]`
|
// `corso repo connect s3 [<flag>...]`
|
||||||
var s3ConnectCmd = &cobra.Command{
|
var s3ConnectCmd = &cobra.Command{
|
||||||
Use: "s3",
|
Use: s3ProviderCommand,
|
||||||
Short: "Connect to a S3 repository",
|
Short: "Connect to a S3 repository",
|
||||||
Long: `Ensures a connection to an existing S3 repository.`,
|
Long: `Ensures a connection to an existing S3 repository.`,
|
||||||
RunE: connectS3Cmd,
|
RunE: connectS3Cmd,
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/alcionai/corso/pkg/repository"
|
"github.com/alcionai/corso/pkg/repository"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RequireProps validates the existence of the properties
|
// RequireProps validates the existence of the properties
|
||||||
@ -39,3 +40,10 @@ func HasNoFlagsAndShownHelp(cmd *cobra.Command) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddCommand adds the subCommand to the parent, and returns
|
||||||
|
// both the subCommand and its pflags.
|
||||||
|
func AddCommand(parent, c *cobra.Command) (*cobra.Command, *pflag.FlagSet) {
|
||||||
|
parent.AddCommand(c)
|
||||||
|
return c, c.Flags()
|
||||||
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ require (
|
|||||||
github.com/microsoftgraph/msgraph-sdk-go-core v0.26.1
|
github.com/microsoftgraph/msgraph-sdk-go-core v0.26.1
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/spf13/cobra v1.4.0
|
github.com/spf13/cobra v1.4.0
|
||||||
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/spf13/viper v1.12.0
|
github.com/spf13/viper v1.12.0
|
||||||
github.com/stretchr/testify v1.7.2
|
github.com/stretchr/testify v1.7.2
|
||||||
go.uber.org/zap v1.21.0
|
go.uber.org/zap v1.21.0
|
||||||
@ -77,7 +78,6 @@ require (
|
|||||||
github.com/prometheus/procfs v0.7.3 // indirect
|
github.com/prometheus/procfs v0.7.3 // indirect
|
||||||
github.com/rs/xid v1.4.0 // indirect
|
github.com/rs/xid v1.4.0 // indirect
|
||||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
|
||||||
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
|
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
|
||||||
github.com/zeebo/blake3 v0.2.3 // indirect
|
github.com/zeebo/blake3 v0.2.3 // indirect
|
||||||
go.opentelemetry.io/otel v1.7.0 // indirect
|
go.opentelemetry.io/otel v1.7.0 // indirect
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user