diff --git a/cmd/commands.go b/cmd/commands.go index 1f0df3e75..a2fc09552 100644 --- a/cmd/commands.go +++ b/cmd/commands.go @@ -247,6 +247,9 @@ var ( &databaseEnableFeature, &databaseDisableFeature, + // Maintenance + &databaseMaintenanceList, + // Backups &backupsListCommand, &backupsCreateCommand, diff --git a/cmd/maintenance.go b/cmd/maintenance.go new file mode 100644 index 000000000..af250a650 --- /dev/null +++ b/cmd/maintenance.go @@ -0,0 +1,41 @@ +package cmd + +import ( + "github.com/urfave/cli/v2" + + "github.com/Scalingo/cli/db/maintenance" + "github.com/Scalingo/cli/detect" + "github.com/Scalingo/cli/utils" + scalingo "github.com/Scalingo/go-scalingo/v6" +) + +var databaseMaintenanceList = cli.Command{ + Name: "database-maintenance-list", + Category: "Addons", + Usage: "List database maintenance", + Flags: []cli.Flag{ + &appFlag, + &addonFlag, + &cli.IntFlag{Name: "page", Usage: "Page to display", Value: 1}, + &cli.IntFlag{Name: "per-page", Usage: "Number of deployments to display", Value: 20}, + }, + Description: CommandDescription{ + Description: "List database maintenance", + Examples: []string{}, + }.Render(), + + Action: func(c *cli.Context) error { + currentApp := detect.CurrentApp(c) + utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeDBs) + addonName := addonNameFromFlags(c, true) + + err := maintenance.List(c.Context, currentApp, addonName, scalingo.PaginationOpts{ + Page: c.Int("page"), + PerPage: c.Int("per-page"), + }) + if err != nil { + errorQuit(err) + } + return nil + }, +} diff --git a/db/maintenance/list.go b/db/maintenance/list.go new file mode 100644 index 000000000..f211557e5 --- /dev/null +++ b/db/maintenance/list.go @@ -0,0 +1,53 @@ +package maintenance + +import ( + "context" + "fmt" + "os" + + "github.com/olekukonko/tablewriter" + "gopkg.in/errgo.v1" + + "github.com/Scalingo/cli/config" + "github.com/Scalingo/cli/io" + "github.com/Scalingo/cli/utils" + "github.com/Scalingo/go-scalingo/v6" +) + +func List(ctx context.Context, app string, addonName string, paginationOpts scalingo.PaginationOpts) error { + c, err := config.ScalingoClient(ctx) + if err != nil { + return errgo.Notef(err, "fail to get Scalingo client") + } + + response, err := c.DatabaseListMaintenance(ctx, app, addonName, paginationOpts) + if err != nil { + return errgo.Notef(err, "fail to list the database maintenance") + } + + t := tablewriter.NewWriter(os.Stdout) + t.SetHeader([]string{"ID", "Type", "Started At", "Ended At", "Status"}) + + for _, maintenance := range response.Maintenance { + startedAt := "Not started" + if maintenance.StartedAt != nil { + startedAt = maintenance.StartedAt.Format(utils.TimeFormat) + } + + endedAt := "" + if maintenance.EndedAt != nil { + endedAt = maintenance.EndedAt.Format(utils.TimeFormat) + } + + t.Append([]string{ + maintenance.ID, + string(maintenance.Type), + startedAt, + endedAt, + string(maintenance.Status), + }) + } + t.Render() + fmt.Fprintln(os.Stderr, io.Gray(fmt.Sprintf("Page: %d, Last Page: %d", response.Meta.CurrentPage, response.Meta.TotalPages))) + return nil +}