2018-05-16 18:59:35 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"time"
|
|
|
|
|
2019-01-08 00:37:16 +00:00
|
|
|
platform "github.com/influxdata/influxdb"
|
|
|
|
"github.com/influxdata/influxdb/cmd/influx/internal"
|
|
|
|
"github.com/influxdata/influxdb/http"
|
2018-05-16 18:59:35 +00:00
|
|
|
"github.com/spf13/cobra"
|
2019-12-17 19:55:35 +00:00
|
|
|
"github.com/spf13/viper"
|
2018-05-16 18:59:35 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Bucket Command
|
|
|
|
var bucketCmd = &cobra.Command{
|
2019-12-31 19:45:42 +00:00
|
|
|
Use: "bucket",
|
|
|
|
Short: "Bucket management commands",
|
|
|
|
TraverseChildren: true,
|
|
|
|
Run: seeHelp,
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2018-09-25 16:19:40 +00:00
|
|
|
// BucketCreateFlags define the Create Command
|
2018-05-16 18:59:35 +00:00
|
|
|
type BucketCreateFlags struct {
|
2019-12-17 19:55:35 +00:00
|
|
|
name string
|
|
|
|
organization
|
2018-05-16 18:59:35 +00:00
|
|
|
retention time.Duration
|
|
|
|
}
|
|
|
|
|
|
|
|
var bucketCreateFlags BucketCreateFlags
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
bucketCreateCmd := &cobra.Command{
|
|
|
|
Use: "create",
|
|
|
|
Short: "Create bucket",
|
2019-01-22 18:19:26 +00:00
|
|
|
RunE: wrapCheckSetup(bucketCreateF),
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-01-14 18:54:53 +00:00
|
|
|
bucketCreateCmd.Flags().StringVarP(&bucketCreateFlags.name, "name", "n", "", "Name of bucket that will be created")
|
|
|
|
bucketCreateCmd.Flags().DurationVarP(&bucketCreateFlags.retention, "retention", "r", 0, "Duration in nanoseconds data will live in bucket")
|
2018-05-16 18:59:35 +00:00
|
|
|
bucketCreateCmd.MarkFlagRequired("name")
|
2019-12-17 19:55:35 +00:00
|
|
|
bucketCreateFlags.organization.register(bucketCreateCmd)
|
2018-05-16 18:59:35 +00:00
|
|
|
|
|
|
|
bucketCmd.AddCommand(bucketCreateCmd)
|
|
|
|
}
|
|
|
|
|
2018-10-25 19:28:33 +00:00
|
|
|
func newBucketService(f Flags) (platform.BucketService, error) {
|
2019-10-25 21:39:38 +00:00
|
|
|
if f.local {
|
2019-03-28 08:42:38 +00:00
|
|
|
return newLocalKVService()
|
2018-10-25 19:28:33 +00:00
|
|
|
}
|
2019-12-07 18:54:03 +00:00
|
|
|
|
|
|
|
client, err := newHTTPClient()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2018-10-25 19:28:33 +00:00
|
|
|
return &http.BucketService{
|
2019-12-07 18:54:03 +00:00
|
|
|
Client: client,
|
2018-10-25 19:28:33 +00:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2019-01-22 18:19:26 +00:00
|
|
|
func bucketCreateF(cmd *cobra.Command, args []string) error {
|
2019-12-17 19:55:35 +00:00
|
|
|
if err := bucketCreateFlags.organization.validOrgFlags(); err != nil {
|
|
|
|
return err
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2018-10-25 19:28:33 +00:00
|
|
|
s, err := newBucketService(flags)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to initialize bucket service client: %v", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
b := &platform.Bucket{
|
|
|
|
Name: bucketCreateFlags.name,
|
|
|
|
RetentionPeriod: bucketCreateFlags.retention,
|
|
|
|
}
|
|
|
|
|
2019-12-12 17:33:15 +00:00
|
|
|
orgSvc, err := newOrganizationService()
|
|
|
|
if err != nil {
|
2020-01-03 09:22:54 +00:00
|
|
|
return err
|
2019-12-12 17:33:15 +00:00
|
|
|
}
|
|
|
|
|
2019-12-17 19:55:35 +00:00
|
|
|
b.OrgID, err = bucketCreateFlags.organization.getID(orgSvc)
|
2019-12-12 17:33:15 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if err := s.CreateBucket(context.Background(), b); err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to create bucket: %v", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
w := internal.NewTabWriter(os.Stdout)
|
|
|
|
w.WriteHeaders(
|
|
|
|
"ID",
|
|
|
|
"Name",
|
|
|
|
"Retention",
|
|
|
|
"OrganizationID",
|
|
|
|
)
|
|
|
|
w.Write(map[string]interface{}{
|
2019-11-18 17:45:03 +00:00
|
|
|
"ID": b.ID.String(),
|
|
|
|
"Name": b.Name,
|
|
|
|
"Retention": b.RetentionPeriod,
|
|
|
|
"OrganizationID": b.OrgID.String(),
|
2018-05-16 18:59:35 +00:00
|
|
|
})
|
|
|
|
w.Flush()
|
2019-01-22 18:19:26 +00:00
|
|
|
|
|
|
|
return nil
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2018-09-25 16:19:40 +00:00
|
|
|
// BucketFindFlags define the Find Command
|
2018-05-16 18:59:35 +00:00
|
|
|
type BucketFindFlags struct {
|
2019-11-21 00:36:58 +00:00
|
|
|
name string
|
|
|
|
id string
|
|
|
|
headers bool
|
2019-12-17 19:55:35 +00:00
|
|
|
organization
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var bucketFindFlags BucketFindFlags
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
bucketFindCmd := &cobra.Command{
|
|
|
|
Use: "find",
|
|
|
|
Short: "Find buckets",
|
2019-01-22 18:19:26 +00:00
|
|
|
RunE: wrapCheckSetup(bucketFindF),
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-01-14 18:54:53 +00:00
|
|
|
bucketFindCmd.Flags().StringVarP(&bucketFindFlags.name, "name", "n", "", "The bucket name")
|
2019-12-17 19:55:35 +00:00
|
|
|
viper.BindEnv("BUCKET_NAME")
|
|
|
|
if h := viper.GetString("BUCKET_NAME"); h != "" {
|
|
|
|
bucketFindFlags.name = h
|
|
|
|
}
|
2019-01-14 18:54:53 +00:00
|
|
|
bucketFindCmd.Flags().StringVarP(&bucketFindFlags.id, "id", "i", "", "The bucket ID")
|
2019-11-21 00:36:58 +00:00
|
|
|
bucketFindCmd.Flags().BoolVar(&bucketFindFlags.headers, "headers", true, "To print the table headers; defaults true")
|
2019-12-17 19:55:35 +00:00
|
|
|
bucketFindFlags.organization.register(bucketFindCmd)
|
2018-05-16 18:59:35 +00:00
|
|
|
|
|
|
|
bucketCmd.AddCommand(bucketFindCmd)
|
|
|
|
}
|
|
|
|
|
2019-01-22 18:19:26 +00:00
|
|
|
func bucketFindF(cmd *cobra.Command, args []string) error {
|
2018-10-25 19:28:33 +00:00
|
|
|
s, err := newBucketService(flags)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to initialize bucket service client: %v", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
filter := platform.BucketFilter{}
|
|
|
|
if bucketFindFlags.name != "" {
|
|
|
|
filter.Name = &bucketFindFlags.name
|
|
|
|
}
|
|
|
|
|
|
|
|
if bucketFindFlags.id != "" {
|
2018-07-20 10:24:07 +00:00
|
|
|
id, err := platform.IDFromString(bucketFindFlags.id)
|
2018-05-16 18:59:35 +00:00
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to decode bucket id %q: %v", bucketFindFlags.id, err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
2018-07-20 10:24:07 +00:00
|
|
|
filter.ID = id
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-12-17 19:55:35 +00:00
|
|
|
if err := bucketFindFlags.organization.validOrgFlags(); err != nil {
|
|
|
|
return err
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-12-17 19:55:35 +00:00
|
|
|
if bucketFindFlags.organization.id != "" {
|
|
|
|
orgID, err := platform.IDFromString(bucketFindFlags.organization.id)
|
2018-05-16 18:59:35 +00:00
|
|
|
if err != nil {
|
2019-12-17 19:55:35 +00:00
|
|
|
return fmt.Errorf("failed to decode org id %q: %v", bucketFindFlags.organization.id, err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
2018-07-20 10:24:07 +00:00
|
|
|
filter.OrganizationID = orgID
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-12-17 19:55:35 +00:00
|
|
|
if bucketFindFlags.organization.name != "" {
|
|
|
|
filter.Org = &bucketFindFlags.organization.name
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
buckets, _, err := s.FindBuckets(context.Background(), filter)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to retrieve buckets: %s", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
w := internal.NewTabWriter(os.Stdout)
|
2019-11-21 00:36:58 +00:00
|
|
|
w.HideHeaders(!bucketFindFlags.headers)
|
2018-05-16 18:59:35 +00:00
|
|
|
w.WriteHeaders(
|
|
|
|
"ID",
|
|
|
|
"Name",
|
|
|
|
"Retention",
|
|
|
|
"OrganizationID",
|
|
|
|
)
|
|
|
|
for _, b := range buckets {
|
|
|
|
w.Write(map[string]interface{}{
|
2019-11-18 17:45:03 +00:00
|
|
|
"ID": b.ID.String(),
|
|
|
|
"Name": b.Name,
|
|
|
|
"Retention": b.RetentionPeriod,
|
|
|
|
"OrganizationID": b.OrgID.String(),
|
2018-05-16 18:59:35 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
w.Flush()
|
2019-01-22 18:19:26 +00:00
|
|
|
|
|
|
|
return nil
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2018-09-25 16:19:40 +00:00
|
|
|
// BucketUpdateFlags define the Update Command
|
2018-05-16 18:59:35 +00:00
|
|
|
type BucketUpdateFlags struct {
|
|
|
|
id string
|
|
|
|
name string
|
|
|
|
retention time.Duration
|
|
|
|
}
|
|
|
|
|
|
|
|
var bucketUpdateFlags BucketUpdateFlags
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
bucketUpdateCmd := &cobra.Command{
|
|
|
|
Use: "update",
|
|
|
|
Short: "Update bucket",
|
2019-01-22 18:19:26 +00:00
|
|
|
RunE: wrapCheckSetup(bucketUpdateF),
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-01-14 18:54:53 +00:00
|
|
|
bucketUpdateCmd.Flags().StringVarP(&bucketUpdateFlags.id, "id", "i", "", "The bucket ID (required)")
|
|
|
|
bucketUpdateCmd.Flags().StringVarP(&bucketUpdateFlags.name, "name", "n", "", "New bucket name")
|
2019-12-17 19:55:35 +00:00
|
|
|
viper.BindEnv("BUCKET_NAME")
|
|
|
|
if h := viper.GetString("BUCKET_NAME"); h != "" {
|
|
|
|
bucketFindFlags.name = h
|
|
|
|
}
|
|
|
|
|
2019-01-14 18:54:53 +00:00
|
|
|
bucketUpdateCmd.Flags().DurationVarP(&bucketUpdateFlags.retention, "retention", "r", 0, "New duration data will live in bucket")
|
2018-05-16 18:59:35 +00:00
|
|
|
bucketUpdateCmd.MarkFlagRequired("id")
|
|
|
|
|
|
|
|
bucketCmd.AddCommand(bucketUpdateCmd)
|
|
|
|
}
|
|
|
|
|
2019-01-22 18:19:26 +00:00
|
|
|
func bucketUpdateF(cmd *cobra.Command, args []string) error {
|
2018-10-25 19:28:33 +00:00
|
|
|
s, err := newBucketService(flags)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to initialize bucket service client: %v", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var id platform.ID
|
|
|
|
if err := id.DecodeFromString(bucketUpdateFlags.id); err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to decode bucket id %q: %v", bucketUpdateFlags.id, err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
update := platform.BucketUpdate{}
|
|
|
|
if bucketUpdateFlags.name != "" {
|
|
|
|
update.Name = &bucketUpdateFlags.name
|
|
|
|
}
|
|
|
|
if bucketUpdateFlags.retention != 0 {
|
|
|
|
update.RetentionPeriod = &bucketUpdateFlags.retention
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := s.UpdateBucket(context.Background(), id, update)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to update bucket: %v", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
w := internal.NewTabWriter(os.Stdout)
|
|
|
|
w.WriteHeaders(
|
|
|
|
"ID",
|
|
|
|
"Name",
|
|
|
|
"Retention",
|
|
|
|
"OrganizationID",
|
|
|
|
)
|
|
|
|
w.Write(map[string]interface{}{
|
2019-11-18 17:45:03 +00:00
|
|
|
"ID": b.ID.String(),
|
|
|
|
"Name": b.Name,
|
|
|
|
"Retention": b.RetentionPeriod,
|
|
|
|
"OrganizationID": b.OrgID.String(),
|
2018-05-16 18:59:35 +00:00
|
|
|
})
|
|
|
|
w.Flush()
|
2019-01-22 18:19:26 +00:00
|
|
|
|
|
|
|
return nil
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2018-09-25 16:19:40 +00:00
|
|
|
// BucketDeleteFlags define the Delete command
|
2018-05-16 18:59:35 +00:00
|
|
|
type BucketDeleteFlags struct {
|
|
|
|
id string
|
|
|
|
}
|
|
|
|
|
|
|
|
var bucketDeleteFlags BucketDeleteFlags
|
|
|
|
|
2019-01-22 18:19:26 +00:00
|
|
|
func bucketDeleteF(cmd *cobra.Command, args []string) error {
|
2018-10-25 19:28:33 +00:00
|
|
|
s, err := newBucketService(flags)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to initialize bucket service client: %v", err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var id platform.ID
|
2018-10-25 19:28:33 +00:00
|
|
|
if err := id.DecodeFromString(bucketDeleteFlags.id); err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to decode bucket id %q: %v", bucketDeleteFlags.id, err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-01-23 00:51:48 +00:00
|
|
|
ctx := context.Background()
|
2018-05-16 18:59:35 +00:00
|
|
|
b, err := s.FindBucketByID(ctx, id)
|
|
|
|
if err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to find bucket with id %q: %v", id, err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if err = s.DeleteBucket(ctx, id); err != nil {
|
2019-01-23 00:51:48 +00:00
|
|
|
return fmt.Errorf("failed to delete bucket with id %q: %v", id, err)
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
w := internal.NewTabWriter(os.Stdout)
|
|
|
|
w.WriteHeaders(
|
|
|
|
"ID",
|
|
|
|
"Name",
|
|
|
|
"Retention",
|
|
|
|
"OrganizationID",
|
|
|
|
"Deleted",
|
|
|
|
)
|
|
|
|
w.Write(map[string]interface{}{
|
2019-11-18 17:45:03 +00:00
|
|
|
"ID": b.ID.String(),
|
|
|
|
"Name": b.Name,
|
|
|
|
"Retention": b.RetentionPeriod,
|
|
|
|
"OrganizationID": b.OrgID.String(),
|
|
|
|
"Deleted": true,
|
2018-05-16 18:59:35 +00:00
|
|
|
})
|
|
|
|
w.Flush()
|
2019-01-22 18:19:26 +00:00
|
|
|
|
|
|
|
return nil
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
bucketDeleteCmd := &cobra.Command{
|
|
|
|
Use: "delete",
|
|
|
|
Short: "Delete bucket",
|
2019-01-22 18:19:26 +00:00
|
|
|
RunE: wrapCheckSetup(bucketDeleteF),
|
2018-05-16 18:59:35 +00:00
|
|
|
}
|
|
|
|
|
2019-01-14 18:54:53 +00:00
|
|
|
bucketDeleteCmd.Flags().StringVarP(&bucketDeleteFlags.id, "id", "i", "", "The bucket ID (required)")
|
2018-05-16 18:59:35 +00:00
|
|
|
bucketDeleteCmd.MarkFlagRequired("id")
|
|
|
|
|
|
|
|
bucketCmd.AddCommand(bucketDeleteCmd)
|
|
|
|
}
|