package main import ( "context" "fmt" "os" platform "github.com/influxdata/influxdb" "github.com/influxdata/influxdb/cmd/influx/internal" "github.com/influxdata/influxdb/http" "github.com/spf13/cobra" ) // Organization Command var organizationCmd = &cobra.Command{ Use: "org", Aliases: []string{"organization"}, Short: "Organization management commands", Run: organizationF, } func organizationF(cmd *cobra.Command, args []string) { cmd.Usage() } // Create Command type OrganizationCreateFlags struct { name string } var organizationCreateFlags OrganizationCreateFlags func init() { organizationCreateCmd := &cobra.Command{ Use: "create", Short: "Create organization", RunE: wrapCheckSetup(organizationCreateF), } organizationCreateCmd.Flags().StringVarP(&organizationCreateFlags.name, "name", "n", "", "The name of organization that will be created") organizationCreateCmd.MarkFlagRequired("name") organizationCmd.AddCommand(organizationCreateCmd) } func newOrganizationService(f Flags) (platform.OrganizationService, error) { if flags.local { return newLocalKVService() } return &http.OrganizationService{ Addr: flags.host, Token: flags.token, InsecureSkipVerify: flags.skipVerify, }, nil } func organizationCreateF(cmd *cobra.Command, args []string) error { orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } o := &platform.Organization{ Name: organizationCreateFlags.name, } if err := orgSvc.CreateOrganization(context.Background(), o); err != nil { return fmt.Errorf("failed to create organization: %v", err) } w := internal.NewTabWriter(os.Stdout) w.WriteHeaders( "ID", "Name", ) w.Write(map[string]interface{}{ "ID": o.ID.String(), "Name": o.Name, }) w.Flush() return nil } // Find Command type OrganizationFindFlags struct { name string id string } var organizationFindFlags OrganizationFindFlags func init() { organizationFindCmd := &cobra.Command{ Use: "find", Short: "Find organizations", RunE: wrapCheckSetup(organizationFindF), } organizationFindCmd.Flags().StringVarP(&organizationFindFlags.name, "name", "n", "", "The organization name") organizationFindCmd.Flags().StringVarP(&organizationFindFlags.id, "id", "i", "", "The organization ID") organizationCmd.AddCommand(organizationFindCmd) } func organizationFindF(cmd *cobra.Command, args []string) error { orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } filter := platform.OrganizationFilter{} if organizationFindFlags.name != "" { filter.Name = &organizationFindFlags.name } if organizationFindFlags.id != "" { id, err := platform.IDFromString(organizationFindFlags.id) if err != nil { return fmt.Errorf("failed to decode org id %s: %v", organizationFindFlags.id, err) } filter.ID = id } orgs, _, err := orgSvc.FindOrganizations(context.Background(), filter) if err != nil { return fmt.Errorf("failed find orgs: %v", err) } w := internal.NewTabWriter(os.Stdout) w.WriteHeaders( "ID", "Name", ) for _, o := range orgs { w.Write(map[string]interface{}{ "ID": o.ID.String(), "Name": o.Name, }) } w.Flush() return nil } // Update Command type OrganizationUpdateFlags struct { id string name string } var organizationUpdateFlags OrganizationUpdateFlags func init() { organizationUpdateCmd := &cobra.Command{ Use: "update", Short: "Update organization", RunE: wrapCheckSetup(organizationUpdateF), } organizationUpdateCmd.Flags().StringVarP(&organizationUpdateFlags.id, "id", "i", "", "The organization ID (required)") organizationUpdateCmd.Flags().StringVarP(&organizationUpdateFlags.name, "name", "n", "", "The organization name") organizationUpdateCmd.MarkFlagRequired("id") organizationCmd.AddCommand(organizationUpdateCmd) } func organizationUpdateF(cmd *cobra.Command, args []string) error { orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } var id platform.ID if err := id.DecodeFromString(organizationUpdateFlags.id); err != nil { return fmt.Errorf("failed to decode org id %s: %v", organizationUpdateFlags.id, err) } update := platform.OrganizationUpdate{} if organizationUpdateFlags.name != "" { update.Name = &organizationUpdateFlags.name } o, err := orgSvc.UpdateOrganization(context.Background(), id, update) if err != nil { return fmt.Errorf("failed to update org: %v", err) } w := internal.NewTabWriter(os.Stdout) w.WriteHeaders( "ID", "Name", ) w.Write(map[string]interface{}{ "ID": o.ID.String(), "Name": o.Name, }) w.Flush() return nil } // OrganizationDeleteFlags contains the flag of the org delete command type OrganizationDeleteFlags struct { id string } var organizationDeleteFlags OrganizationDeleteFlags func organizationDeleteF(cmd *cobra.Command, args []string) error { orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } var id platform.ID if err := id.DecodeFromString(organizationDeleteFlags.id); err != nil { return fmt.Errorf("failed to decode org id %s: %v", organizationDeleteFlags.id, err) } ctx := context.TODO() o, err := orgSvc.FindOrganizationByID(ctx, id) if err != nil { return fmt.Errorf("failed to find org with id %q: %v", id, err) } if err = orgSvc.DeleteOrganization(ctx, id); err != nil { return fmt.Errorf("failed to delete org with id %q: %v", id, err) } w := internal.NewTabWriter(os.Stdout) w.WriteHeaders( "ID", "Name", "Deleted", ) w.Write(map[string]interface{}{ "ID": o.ID.String(), "Name": o.Name, "Deleted": true, }) w.Flush() return nil } func init() { organizationDeleteCmd := &cobra.Command{ Use: "delete", Short: "Delete organization", RunE: wrapCheckSetup(organizationDeleteF), } organizationDeleteCmd.Flags().StringVarP(&organizationDeleteFlags.id, "id", "i", "", "The organization ID (required)") organizationDeleteCmd.MarkFlagRequired("id") organizationCmd.AddCommand(organizationDeleteCmd) } // Member management var organizationMembersCmd = &cobra.Command{ Use: "members", Short: "Organization membership commands", Run: organizationF, } func init() { organizationCmd.AddCommand(organizationMembersCmd) } // List Members type OrganizationMembersListFlags struct { name string id string } var organizationMembersListFlags OrganizationMembersListFlags func organizationMembersListF(cmd *cobra.Command, args []string) error { orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } if organizationMembersListFlags.id == "" && organizationMembersListFlags.name == "" { return fmt.Errorf("must specify exactly one of id and name") } filter := platform.OrganizationFilter{} if organizationMembersListFlags.name != "" { filter.Name = &organizationMembersListFlags.name } if organizationMembersListFlags.id != "" { var fID platform.ID err := fID.DecodeFromString(organizationMembersListFlags.id) if err != nil { return fmt.Errorf("failed to decode org id %s: %v", organizationMembersListFlags.id, err) } filter.ID = &fID } organization, err := orgSvc.FindOrganization(context.Background(), filter) if err != nil { return fmt.Errorf("failed to find org: %v", err) } return membersListF(context.Background(), platform.UserResourceMappingFilter{ ResourceType: platform.OrgsResourceType, ResourceID: organization.ID, UserType: platform.Member, }) } func init() { organizationMembersListCmd := &cobra.Command{ Use: "list", Short: "List organization members", RunE: wrapCheckSetup(organizationMembersListF), } organizationMembersListCmd.Flags().StringVarP(&organizationMembersListFlags.id, "id", "i", "", "The organization ID") organizationMembersListCmd.Flags().StringVarP(&organizationMembersListFlags.name, "name", "n", "", "The organization name") organizationMembersCmd.AddCommand(organizationMembersListCmd) } // OrganizationMembersAddFlags includes flags to add a member type OrganizationMembersAddFlags struct { name string id string memberID string } var organizationMembersAddFlags OrganizationMembersAddFlags func organizationMembersAddF(cmd *cobra.Command, args []string) error { if organizationMembersAddFlags.id == "" && organizationMembersAddFlags.name == "" { return fmt.Errorf("must specify exactly one of id and name") } if organizationMembersAddFlags.id != "" && organizationMembersAddFlags.name != "" { return fmt.Errorf("must specify exactly one of id and name") } orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } filter := platform.OrganizationFilter{} if organizationMembersAddFlags.name != "" { filter.Name = &organizationMembersListFlags.name } if organizationMembersAddFlags.id != "" { var fID platform.ID err := fID.DecodeFromString(organizationMembersAddFlags.id) if err != nil { return fmt.Errorf("failed to decode org id %s: %v", organizationMembersAddFlags.id, err) } filter.ID = &fID } ctx := context.Background() organization, err := orgSvc.FindOrganization(ctx, filter) if err != nil { return fmt.Errorf("failed to find org: %v", err) } var memberID platform.ID err = memberID.DecodeFromString(organizationMembersAddFlags.memberID) if err != nil { return fmt.Errorf("failed to decode member id %s: %v", organizationMembersAddFlags.memberID, err) } return membersAddF(ctx, platform.UserResourceMapping{ ResourceID: organization.ID, ResourceType: platform.OrgsResourceType, MappingType: platform.UserMappingType, UserID: memberID, UserType: platform.Member, }) } func init() { organizationMembersAddCmd := &cobra.Command{ Use: "add", Short: "Add organization member", RunE: wrapCheckSetup(organizationMembersAddF), } organizationMembersAddCmd.Flags().StringVarP(&organizationMembersAddFlags.id, "id", "i", "", "The organization ID") organizationMembersAddCmd.Flags().StringVarP(&organizationMembersAddFlags.name, "name", "n", "", "The organization name") organizationMembersAddCmd.Flags().StringVarP(&organizationMembersAddFlags.memberID, "member", "o", "", "The member ID") organizationMembersAddCmd.MarkFlagRequired("member") organizationMembersCmd.AddCommand(organizationMembersAddCmd) } // OrganizationMembersRemoveFlags includes flags to remove a Member type OrganizationMembersRemoveFlags struct { name string id string memberID string } var organizationMembersRemoveFlags OrganizationMembersRemoveFlags func organizationMembersRemoveF(cmd *cobra.Command, args []string) error { if organizationMembersRemoveFlags.id == "" && organizationMembersRemoveFlags.name == "" { return fmt.Errorf("must specify exactly one of id and name") } if organizationMembersRemoveFlags.id != "" && organizationMembersRemoveFlags.name != "" { return fmt.Errorf("must specify exactly one of id and name") } orgSvc, err := newOrganizationService(flags) if err != nil { return fmt.Errorf("failed to initialize org service client: %v", err) } filter := platform.OrganizationFilter{} if organizationMembersRemoveFlags.name != "" { filter.Name = &organizationMembersRemoveFlags.name } if organizationMembersRemoveFlags.id != "" { var fID platform.ID err := fID.DecodeFromString(organizationMembersRemoveFlags.id) if err != nil { return fmt.Errorf("failed to decode org id %s: %v", organizationMembersRemoveFlags.id, err) } filter.ID = &fID } ctx := context.Background() organization, err := orgSvc.FindOrganization(ctx, filter) if err != nil { return fmt.Errorf("failed to find organization: %v", err) } var memberID platform.ID err = memberID.DecodeFromString(organizationMembersRemoveFlags.memberID) if err != nil { return fmt.Errorf("failed to decode member id %s: %v", organizationMembersRemoveFlags.memberID, err) } return membersRemoveF(ctx, organization.ID, memberID) } func init() { organizationMembersRemoveCmd := &cobra.Command{ Use: "remove", Short: "Remove organization member", RunE: wrapCheckSetup(organizationMembersRemoveF), } organizationMembersRemoveCmd.Flags().StringVarP(&organizationMembersRemoveFlags.id, "id", "i", "", "The organization ID") organizationMembersRemoveCmd.Flags().StringVarP(&organizationMembersRemoveFlags.name, "name", "n", "", "The organization name") organizationMembersRemoveCmd.Flags().StringVarP(&organizationMembersRemoveFlags.memberID, "member", "o", "", "The member ID") organizationMembersRemoveCmd.MarkFlagRequired("member") organizationMembersCmd.AddCommand(organizationMembersRemoveCmd) }