
* fix: separate v1 dbrp list results into physical and virtual * fix: remove virtual column from v1 dbrp list * fix: update v1 dbrp list tests for new format * fix: add new test with virtual result
244 lines
5.5 KiB
Go
244 lines
5.5 KiB
Go
package v1dbrps
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/influxdata/influx-cli/v2/api"
|
|
"github.com/influxdata/influx-cli/v2/clients"
|
|
)
|
|
|
|
type Client struct {
|
|
clients.CLI
|
|
api.DBRPsApi
|
|
api.OrganizationsApi
|
|
}
|
|
|
|
type dbrpPrintOpts struct {
|
|
dbrp *api.DBRP
|
|
dbrps []api.DBRP
|
|
}
|
|
|
|
type ListParams struct {
|
|
clients.OrgParams
|
|
ID string
|
|
BucketID string
|
|
Default bool
|
|
DB string
|
|
RP string
|
|
}
|
|
|
|
func (c Client) List(ctx context.Context, params *ListParams) error {
|
|
if params.OrgID == "" && params.OrgName == "" && c.ActiveConfig.Org == "" {
|
|
return clients.ErrMustSpecifyOrg
|
|
}
|
|
|
|
req := c.GetDBRPs(ctx)
|
|
if params.OrgID != "" {
|
|
req = req.OrgID(params.OrgID)
|
|
}
|
|
if params.OrgName != "" {
|
|
req = req.Org(params.OrgName)
|
|
}
|
|
if params.OrgID == "" && params.OrgName == "" {
|
|
req = req.Org(c.ActiveConfig.Org)
|
|
}
|
|
|
|
if params.ID != "" {
|
|
req = req.Id(params.ID)
|
|
}
|
|
if params.BucketID != "" {
|
|
req = req.BucketID(params.BucketID)
|
|
}
|
|
if params.RP != "" {
|
|
req = req.Rp(params.RP)
|
|
}
|
|
if params.DB != "" {
|
|
req = req.Db(params.DB)
|
|
}
|
|
|
|
// Set this parameter if the --default flag was passed. This will list only
|
|
// default DBRPs. Otherwise, don't set the parameter at all to list DBRPs that
|
|
// are default and not default.
|
|
if params.Default {
|
|
req = req.Default_(params.Default) // Note: codegen sets this property as "Default_" instead of "Default"
|
|
}
|
|
|
|
dbrps, err := req.Execute()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to list dbrps: %w", err)
|
|
}
|
|
var virtDbrps []api.DBRP
|
|
var physDbrps []api.DBRP
|
|
for _, dbrp := range dbrps.GetContent() {
|
|
if dbrp.GetVirtual() {
|
|
virtDbrps = append(virtDbrps, dbrp)
|
|
} else {
|
|
physDbrps = append(physDbrps, dbrp)
|
|
}
|
|
}
|
|
|
|
c.printDBRPs(dbrpPrintOpts{dbrps: physDbrps})
|
|
fmt.Fprintln(c.StdIO, "\nVIRTUAL DBRP MAPPINGS (READ-ONLY)")
|
|
fmt.Fprintln(c.StdIO, "----------------------------------")
|
|
c.printDBRPs(dbrpPrintOpts{dbrps: virtDbrps})
|
|
|
|
return nil
|
|
}
|
|
|
|
type CreateParams struct {
|
|
clients.OrgParams
|
|
BucketID string
|
|
Default bool
|
|
DB string
|
|
RP string
|
|
}
|
|
|
|
func (c Client) Create(ctx context.Context, params *CreateParams) error {
|
|
orgId, err := params.GetOrgID(ctx, c.ActiveConfig, c.OrganizationsApi)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
reqBody := api.DBRPCreate{
|
|
OrgID: &orgId,
|
|
BucketID: params.BucketID,
|
|
Database: params.DB,
|
|
RetentionPolicy: params.RP,
|
|
}
|
|
|
|
dbrp, err := c.PostDBRP(ctx).DBRPCreate(reqBody).Execute()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create dbrp for bucket %q: %w", params.BucketID, err)
|
|
}
|
|
|
|
c.printDBRPs(dbrpPrintOpts{dbrp: &dbrp})
|
|
|
|
return nil
|
|
}
|
|
|
|
type UpdateParams struct {
|
|
clients.OrgParams
|
|
ID string
|
|
Default bool
|
|
RP string
|
|
}
|
|
|
|
func (c Client) Update(ctx context.Context, params *UpdateParams) error {
|
|
if params.OrgID == "" && params.OrgName == "" && c.ActiveConfig.Org == "" {
|
|
return clients.ErrMustSpecifyOrg
|
|
}
|
|
|
|
reqBody := api.DBRPUpdate{}
|
|
if params.RP != "" {
|
|
reqBody.RetentionPolicy = ¶ms.RP
|
|
}
|
|
if params.Default {
|
|
reqBody.Default = ¶ms.Default
|
|
}
|
|
|
|
req := c.PatchDBRPID(ctx, params.ID)
|
|
if params.OrgID != "" {
|
|
req = req.OrgID(params.OrgID)
|
|
}
|
|
if params.OrgName != "" {
|
|
req = req.Org(params.OrgName)
|
|
}
|
|
if params.OrgID == "" && params.OrgName == "" {
|
|
req = req.Org(c.ActiveConfig.Org)
|
|
}
|
|
|
|
dbrp, err := req.DBRPUpdate(reqBody).Execute()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to update DBRP mapping %q: %w", params.ID, err)
|
|
}
|
|
|
|
dbrpContent := dbrp.GetContent()
|
|
c.printDBRPs(dbrpPrintOpts{dbrp: &dbrpContent})
|
|
|
|
return nil
|
|
}
|
|
|
|
type DeleteParams struct {
|
|
clients.OrgParams
|
|
ID string
|
|
}
|
|
|
|
func (c Client) Delete(ctx context.Context, params *DeleteParams) error {
|
|
if params.OrgID == "" && params.OrgName == "" && c.ActiveConfig.Org == "" {
|
|
return clients.ErrMustSpecifyOrg
|
|
}
|
|
|
|
// Get the DBRP to verify that it exists, and to be able to print the results
|
|
// of the delete command, which output the details of the deleted DBRP.
|
|
getReq := c.GetDBRPsID(ctx, params.ID)
|
|
deleteReq := c.DeleteDBRPID(ctx, params.ID)
|
|
|
|
// The org name or ID must be set on requests for OSS because of how the OSS
|
|
// authorization mechanism currently works.
|
|
if params.OrgID != "" {
|
|
getReq = getReq.OrgID(params.OrgID)
|
|
deleteReq = deleteReq.OrgID(params.OrgID)
|
|
}
|
|
if params.OrgName != "" {
|
|
getReq = getReq.Org(params.OrgName)
|
|
deleteReq = deleteReq.Org(params.OrgName)
|
|
}
|
|
if params.OrgID == "" && params.OrgName == "" {
|
|
getReq = getReq.Org(c.ActiveConfig.Org)
|
|
deleteReq = deleteReq.Org(c.ActiveConfig.Org)
|
|
}
|
|
|
|
dbrp, err := getReq.Execute()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to find DBRP mapping %q: %w", params.ID, err)
|
|
}
|
|
|
|
if err := deleteReq.Execute(); err != nil {
|
|
return fmt.Errorf("failed to delete DBRP mapping %q: %w", params.ID, err)
|
|
}
|
|
|
|
dbrpContent := dbrp.GetContent()
|
|
c.printDBRPs(dbrpPrintOpts{dbrp: &dbrpContent})
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c Client) printDBRPs(opts dbrpPrintOpts) error {
|
|
if c.PrintAsJSON {
|
|
var v interface{} = opts.dbrps
|
|
if opts.dbrp != nil {
|
|
v = opts.dbrp
|
|
}
|
|
return c.PrintJSON(v)
|
|
}
|
|
|
|
headers := []string{
|
|
"ID",
|
|
"Database",
|
|
"Bucket ID",
|
|
"Retention Policy",
|
|
"Default",
|
|
"Organization ID",
|
|
}
|
|
|
|
if opts.dbrp != nil {
|
|
opts.dbrps = append(opts.dbrps, *opts.dbrp)
|
|
}
|
|
|
|
var rows []map[string]interface{}
|
|
for _, t := range opts.dbrps {
|
|
row := map[string]interface{}{
|
|
"ID": t.Id,
|
|
"Database": t.Database,
|
|
"Retention Policy": t.RetentionPolicy,
|
|
"Default": t.Default,
|
|
"Organization ID": t.OrgID,
|
|
"Bucket ID": t.BucketID,
|
|
}
|
|
rows = append(rows, row)
|
|
}
|
|
|
|
return c.PrintTable(headers, rows...)
|
|
}
|