From 4bdf0963c52cdb637184e66c39793bbafa30ab59 Mon Sep 17 00:00:00 2001 From: York Wong Date: Tue, 31 May 2022 18:32:11 +0800 Subject: [PATCH] [registry] support create pull-through registry cache --- cmd/registry/registryCreate.go | 44 ++++++++++++++++++++++++++++++---- pkg/client/registry.go | 17 +++++++++++++ pkg/types/registry.go | 33 ++++++++++++++----------- 3 files changed, 76 insertions(+), 18 deletions(-) diff --git a/cmd/registry/registryCreate.go b/cmd/registry/registryCreate.go index 47e5fc98..ea73b467 100644 --- a/cmd/registry/registryCreate.go +++ b/cmd/registry/registryCreate.go @@ -38,12 +38,16 @@ import ( type regCreatePreProcessedFlags struct { Port string Clusters []string + Volumes []string } type regCreateFlags struct { - Image string - Network string - NoHelp bool + Image string + Network string + ProxyRemoteURL string + ProxyUsername string + ProxyPassword string + NoHelp bool } var helptext string = `# You can now use the registry like this (example): @@ -103,8 +107,12 @@ func NewCmdRegistryCreate() *cobra.Command { cmd.Flags().StringVarP(&flags.Image, "image", "i", fmt.Sprintf("%s:%s", k3d.DefaultRegistryImageRepo, k3d.DefaultRegistryImageTag), "Specify image used for the registry") cmd.Flags().StringVarP(&ppFlags.Port, "port", "p", "random", "Select which port the registry should be listening on on your machine (localhost) (Format: `[HOST:]HOSTPORT`)\n - Example: `k3d registry create --port 0.0.0.0:5111`") + cmd.Flags().StringArrayVarP(&ppFlags.Volumes, "volume", "v", nil, "Mount volumes into the registry node (Format: `[SOURCE:]DEST`") cmd.Flags().StringVar(&flags.Network, "default-network", k3d.DefaultRuntimeNetwork, "Specify the network connected to the registry") + cmd.Flags().StringVar(&flags.ProxyRemoteURL, "proxy-remote-url", "", "Specify the url of the proxied remote registry") + cmd.Flags().StringVar(&flags.ProxyUsername, "proxy-username", "", "Specify the username of the proxied remote registry") + cmd.Flags().StringVar(&flags.ProxyPassword, "proxy-password", "", "Specify the password of the proxied remote registry") cmd.Flags().BoolVar(&flags.NoHelp, "no-help", false, "Disable the help text (How-To use the registry)") @@ -138,5 +146,33 @@ func parseCreateRegistryCmd(cmd *cobra.Command, args []string, flags *regCreateF registryName = fmt.Sprintf("%s-%s", k3d.DefaultObjectNamePrefix, args[0]) } - return &k3d.Registry{Host: registryName, Image: flags.Image, ExposureOpts: *exposePort, Network: flags.Network}, clusters + // -- proxy + var options k3d.RegistryOptions + + if flags.ProxyRemoteURL != "" { + proxy := k3d.RegistryProxy{ + RemoteURL: flags.ProxyRemoteURL, + Username: flags.ProxyUsername, + Password: flags.ProxyPassword, + } + options.Proxy = proxy + l.Log().Traceln("Proxy info:", proxy) + } + + // --volume + var volumes []string + if len(ppFlags.Volumes) > 0 { + volumes = []string{} + + for _, volumeFlag := range ppFlags.Volumes { + volume, _, err := cliutil.SplitFiltersFromFlag(volumeFlag) + if err != nil { + l.Log().Fatalln(err) + } + volumes = append(volumes, volume) + } + + } + + return &k3d.Registry{Host: registryName, Image: flags.Image, ExposureOpts: *exposePort, Network: flags.Network, Options: options, Volumes: volumes}, clusters } diff --git a/pkg/client/registry.go b/pkg/client/registry.go index ca69f9e5..be551f3a 100644 --- a/pkg/client/registry.go +++ b/pkg/client/registry.go @@ -72,6 +72,23 @@ func RegistryCreate(ctx context.Context, runtime runtimes.Runtime, reg *k3d.Regi Role: k3d.RegistryRole, Networks: []string{reg.Network}, Restart: true, + Env: []string{}, + } + + if reg.Options.Proxy.RemoteURL != "" { + registryNode.Env = append(registryNode.Env, fmt.Sprintf("REGISTRY_PROXY_REMOTEURL=%s", reg.Options.Proxy.RemoteURL)) + + if reg.Options.Proxy.Username != "" { + registryNode.Env = append(registryNode.Env, fmt.Sprintf("REGISTRY_PROXY_USERNAME=%s", reg.Options.Proxy.Username)) + } + + if reg.Options.Proxy.Password != "" { + registryNode.Env = append(registryNode.Env, fmt.Sprintf("REGISTRY_PROXY_PASSWORD=%s", reg.Options.Proxy.Password)) + } + } + + if len(reg.Volumes) > 0 { + registryNode.Volumes = reg.Volumes } // error out if that registry exists already diff --git a/pkg/types/registry.go b/pkg/types/registry.go index 5f727eeb..117efcb4 100644 --- a/pkg/types/registry.go +++ b/pkg/types/registry.go @@ -32,22 +32,27 @@ const ( DefaultLocalRegistryHostingConfigmapTempPath = "/tmp/localRegistryHostingCM.yaml" ) +type RegistryOptions struct { + ConfigFile string `yaml:"configFile,omitempty" json:"configFile,omitempty"` + Proxy RegistryProxy `yaml:"proxy,omitempty" json:"proxy,omitempty"` +} + +type RegistryProxy struct { + RemoteURL string `yaml:"remoteURL" json:"remoteURL"` + Username string `yaml:"username,omitempty" json:"username,omitempty"` + Password string `yaml:"password,omitempty" json:"password,omitempty"` +} + // Registry describes a k3d-managed registry type Registry struct { - ClusterRef string // filled automatically -> if created with a cluster - Protocol string `yaml:"protocol,omitempty" json:"protocol,omitempty"` // default: http - Host string `yaml:"host" json:"host"` - Image string `yaml:"image,omitempty" json:"image,omitempty"` - Network string `yaml:"Network,omitempty" json:"Network,omitempty"` - ExposureOpts ExposureOpts `yaml:"expose" json:"expose"` - Options struct { - ConfigFile string `yaml:"configFile,omitempty" json:"configFile,omitempty"` - Proxy struct { - RemoteURL string `yaml:"remoteURL" json:"remoteURL"` - Username string `yaml:"username,omitempty" json:"username,omitempty"` - Password string `yaml:"password,omitempty" json:"password,omitempty"` - } `yaml:"proxy,omitempty" json:"proxy,omitempty"` - } `yaml:"options,omitempty" json:"options,omitempty"` + ClusterRef string // filled automatically -> if created with a cluster + Protocol string `yaml:"protocol,omitempty" json:"protocol,omitempty"` // default: http + Host string `yaml:"host" json:"host"` + Image string `yaml:"image,omitempty" json:"image,omitempty"` + Network string `yaml:"Network,omitempty" json:"Network,omitempty"` + Volumes []string `yaml:"Volumes,omitempty" json:"Volumes,omitempty"` + ExposureOpts ExposureOpts `yaml:"expose" json:"expose"` + Options RegistryOptions `yaml:"options,omitempty" json:"options,omitempty"` } // RegistryExternal describes a minimal spec for an "external" registry