github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/internal/commands/config_registry_mirrors.go (about) 1 package commands 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/pkg/errors" 8 "github.com/spf13/cobra" 9 10 "github.com/buildpacks/pack/internal/config" 11 "github.com/buildpacks/pack/internal/style" 12 "github.com/buildpacks/pack/pkg/logging" 13 ) 14 15 var registryMirror string 16 17 func ConfigRegistryMirrors(logger logging.Logger, cfg config.Config, cfgPath string) *cobra.Command { 18 cmd := &cobra.Command{ 19 Use: "registry-mirrors", 20 Short: "List, add and remove OCI registry mirrors", 21 Aliases: []string{"registry-mirror"}, 22 Args: cobra.MaximumNArgs(3), 23 RunE: logError(logger, func(cmd *cobra.Command, args []string) error { 24 listRegistryMirrors(args, logger, cfg) 25 return nil 26 }), 27 } 28 29 listCmd := generateListCmd(cmd.Use, logger, cfg, listRegistryMirrors) 30 listCmd.Long = "List all registry mirrors." 31 listCmd.Use = "list" 32 listCmd.Example = "pack config registry-mirrors list" 33 cmd.AddCommand(listCmd) 34 35 addCmd := generateAdd("mirror for a registry", logger, cfg, cfgPath, addRegistryMirror) 36 addCmd.Use = "add <registry> [-m <mirror...]" 37 addCmd.Long = "Set mirror for a given registry." 38 addCmd.Example = "pack config registry-mirrors add index.docker.io --mirror 10.0.0.1\npack config registry-mirrors add '*' --mirror 10.0.0.1" 39 addCmd.Flags().StringVarP(®istryMirror, "mirror", "m", "", "Registry mirror") 40 cmd.AddCommand(addCmd) 41 42 rmCmd := generateRemove("mirror for a registry", logger, cfg, cfgPath, removeRegistryMirror) 43 rmCmd.Use = "remove <registry>" 44 rmCmd.Long = "Remove mirror for a given registry." 45 rmCmd.Example = "pack config registry-mirrors remove index.docker.io" 46 cmd.AddCommand(rmCmd) 47 48 AddHelpFlag(cmd, "run-image-mirrors") 49 return cmd 50 } 51 52 func addRegistryMirror(args []string, logger logging.Logger, cfg config.Config, cfgPath string) error { 53 registry := args[0] 54 if registryMirror == "" { 55 logger.Infof("A registry mirror was not provided.") 56 return nil 57 } 58 59 if cfg.RegistryMirrors == nil { 60 cfg.RegistryMirrors = map[string]string{} 61 } 62 63 cfg.RegistryMirrors[registry] = registryMirror 64 if err := config.Write(cfg, cfgPath); err != nil { 65 return errors.Wrapf(err, "failed to write to %s", cfgPath) 66 } 67 68 logger.Infof("Registry %s configured with mirror %s", style.Symbol(registry), style.Symbol(registryMirror)) 69 return nil 70 } 71 72 func removeRegistryMirror(args []string, logger logging.Logger, cfg config.Config, cfgPath string) error { 73 registry := args[0] 74 _, ok := cfg.RegistryMirrors[registry] 75 if !ok { 76 logger.Infof("No registry mirror has been set for %s", style.Symbol(registry)) 77 return nil 78 } 79 80 delete(cfg.RegistryMirrors, registry) 81 if err := config.Write(cfg, cfgPath); err != nil { 82 return errors.Wrapf(err, "failed to write to %s", cfgPath) 83 } 84 85 logger.Infof("Removed mirror for %s", style.Symbol(registry)) 86 return nil 87 } 88 89 func listRegistryMirrors(args []string, logger logging.Logger, cfg config.Config) { 90 if len(cfg.RegistryMirrors) == 0 { 91 logger.Info("No registry mirrors have been set") 92 return 93 } 94 95 buf := strings.Builder{} 96 buf.WriteString("Registry Mirrors:\n") 97 for registry, mirror := range cfg.RegistryMirrors { 98 buf.WriteString(fmt.Sprintf(" %s: %s\n", registry, style.Symbol(mirror))) 99 } 100 101 logger.Info(buf.String()) 102 }