package main import ( "fmt" "runtime" "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/registry" "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/version" "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ Use: "registry-exporter", Version: version.Version, Short: "Registry exporter", Long: "Registry exporter for xk6", Example: `registry-exporter registry.bolt registry-exporter --status created --out out.json registry.bolt`, SilenceErrors: true, SilenceUsage: true, RunE: rootCmdRun, } const ( outFlag = "out" formatFlag = "format" statusFlag = "status" ageFlag = "age" ) const ( defaultOutPath = "dumped-registry.json" jsonFormat = "json" createdStatus = "created" ) func init() { rootCmd.Flags().String(outFlag, defaultOutPath, "Path to output file") rootCmd.Flags().String(formatFlag, jsonFormat, "Output format") rootCmd.Flags().String(statusFlag, createdStatus, "Object status") rootCmd.Flags().Int(ageFlag, 0, "Object age") cobra.AddTemplateFunc("runtimeVersion", runtime.Version) rootCmd.SetVersionTemplate(`FrostFS xk6 Registry Exporter {{printf "Version: %s" .Version }} GoVersion: {{ runtimeVersion }} `) } func rootCmdRun(cmd *cobra.Command, args []string) error { if len(args) != 1 { return fmt.Errorf("expected exacly one non-flag argumet: path to the registry, got: %s", args) } format, err := cmd.Flags().GetString(formatFlag) if err != nil { return fmt.Errorf("get '%s' flag: %w", formatFlag, err) } if format != jsonFormat { return fmt.Errorf("unknown format '%s', only '%s' is supported", format, jsonFormat) } out, err := cmd.Flags().GetString(outFlag) if err != nil { return fmt.Errorf("get '%s' flag: %w", outFlag, err) } status, err := cmd.Flags().GetString(statusFlag) if err != nil { return fmt.Errorf("get '%s' flag: %w", statusFlag, err) } age, err := cmd.Flags().GetInt(ageFlag) if err != nil { return fmt.Errorf("get '%s' flag: %w", ageFlag, err) } objRegistry := registry.NewObjRegistry(cmd.Context(), args[0]) objSelector := registry.NewObjSelector(objRegistry, 0, registry.SelectorAwaiting, ®istry.ObjFilter{ Status: status, Age: age, }) objExporter := registry.NewObjExporter(objSelector) cmd.Println("Writing result file:", out) return objExporter.ExportJSONPreGen(out) }