github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/cli/backup/organizations.go (about) 1 package backup 2 3 import ( 4 "context" 5 "github.com/bep/simplecobra" 6 "github.com/esnet/gdg/cli/support" 7 "github.com/esnet/gdg/internal/config" 8 "github.com/esnet/gdg/internal/service" 9 "github.com/gosimple/slug" 10 "github.com/jedib0t/go-pretty/v6/table" 11 "github.com/spf13/cobra" 12 "log/slog" 13 "sort" 14 ) 15 16 func parseOrganizationGlobalFlags(command *cobra.Command) []string { 17 orgName, _ := command.Flags().GetString("org-name") 18 return []string{orgName} 19 } 20 21 func newOrganizationsCommand() simplecobra.Commander { 22 description := "Manage Grafana Organizations." 23 return &support.SimpleCommand{ 24 NameP: "organizations", 25 Short: description, 26 Long: description, 27 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 28 cmd.Aliases = []string{"org", "orgs"} 29 cmd.PersistentFlags().StringP("org-name", "o", "", "when set to true, bypass confirmation prompts") 30 }, 31 32 InitCFunc: func(cd *simplecobra.Commandeer, r *support.RootCommand) error { 33 return nil 34 }, 35 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 36 return cd.CobraCommand.Help() 37 }, 38 CommandsList: []simplecobra.Commander{ 39 newOrganizationsListCmd(), 40 newOrganizationsDownloadCmd(), 41 newOrganizationsUploadCmd(), 42 }, 43 } 44 45 } 46 47 func newOrganizationsListCmd() simplecobra.Commander { 48 description := "List Grafana Organizations." 49 return &support.SimpleCommand{ 50 NameP: "list", 51 Short: description, 52 Long: description, 53 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 54 cmd.Aliases = []string{"l"} 55 cmd.PersistentFlags().BoolP("with-preferences", "", false, "when set to true, Attempts to retrieve Orgs Preferences (Warning, this is slow due to Grafana current API design)") 56 }, 57 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 58 filter := service.NewOrganizationFilter(parseOrganizationGlobalFlags(cd.CobraCommand)...) 59 includePreferences, _ := cd.CobraCommand.Flags().GetBool("with-preferences") 60 61 headerRow := table.Row{"id", "organization Name", "org slug ID"} 62 if includePreferences { 63 headerRow = append(headerRow, table.Row{"HomeDashboardUID", "Theme", "WeekStart"}...) 64 } 65 rootCmd.TableObj.AppendHeader(headerRow) 66 listOrganizations := rootCmd.GrafanaSvc().ListOrganizations(filter, includePreferences) 67 slog.Info("Listing organizations for context", 68 slog.Any("count", len(listOrganizations)), 69 slog.Any("context", config.Config().GetGDGConfig().GetContext())) 70 sort.Slice(listOrganizations, func(a, b int) bool { 71 return listOrganizations[a].Organization.ID < listOrganizations[b].Organization.ID 72 }) 73 if len(listOrganizations) == 0 { 74 slog.Info("No organizations found") 75 } else { 76 for _, org := range listOrganizations { 77 data := table.Row{org.Organization.ID, 78 org.Organization.Name, 79 slug.Make(org.Organization.Name)} 80 if includePreferences { 81 data = append(data, table.Row{org.Preferences.HomeDashboardUID, 82 org.Preferences.Theme, 83 org.Preferences.WeekStart}...) 84 } 85 rootCmd.TableObj.AppendRow(data) 86 87 } 88 rootCmd.Render(cd.CobraCommand, listOrganizations) 89 } 90 return nil 91 }, 92 } 93 94 } 95 func newOrganizationsDownloadCmd() simplecobra.Commander { 96 description := "download Organizations" 97 return &support.SimpleCommand{ 98 NameP: "download", 99 Short: description, 100 Long: description, 101 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 102 cmd.Aliases = []string{"d"} 103 }, 104 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 105 slog.Info("Downloading organizations for context", "context", config.Config().GetGDGConfig().GetContext()) 106 rootCmd.TableObj.AppendHeader(table.Row{"file"}) 107 filter := service.NewOrganizationFilter(parseOrganizationGlobalFlags(cd.CobraCommand)...) 108 listOrganizations := rootCmd.GrafanaSvc().DownloadOrganizations(filter) 109 if len(listOrganizations) == 0 { 110 slog.Info("No organizations found") 111 } else { 112 for _, org := range listOrganizations { 113 rootCmd.TableObj.AppendRow(table.Row{org}) 114 } 115 rootCmd.Render(cd.CobraCommand, listOrganizations) 116 } 117 return nil 118 }, 119 } 120 121 } 122 func newOrganizationsUploadCmd() simplecobra.Commander { 123 description := "upload Organizations to grafana" 124 return &support.SimpleCommand{ 125 NameP: "upload", 126 Short: description, 127 Long: description, 128 WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) { 129 cmd.Aliases = []string{"u"} 130 }, 131 RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error { 132 slog.Info("Uploading Folders for context: ", "context", config.Config().GetGDGConfig().GetContext()) 133 rootCmd.TableObj.AppendHeader(table.Row{"file"}) 134 filter := service.NewOrganizationFilter(parseOrganizationGlobalFlags(cd.CobraCommand)...) 135 organizations := rootCmd.GrafanaSvc().UploadOrganizations(filter) 136 if len(organizations) == 0 { 137 slog.Info("No Organizations were uploaded") 138 } else { 139 for _, folder := range organizations { 140 rootCmd.TableObj.AppendRow(table.Row{folder}) 141 } 142 rootCmd.Render(cd.CobraCommand, organizations) 143 } 144 return nil 145 }, 146 } 147 148 }