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  }