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(&registryMirror, "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  }