mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Merge pull request #33083 from mfojtik/resolve-image
Automatic merge from submit-queue Add ResolveImage function to CLI factory This functions helps to integrate third-party mechanism for resolving the image names. For example, this function can be used in OpenShift to add support for resolving the ImageStreamTag and ImageStreamImage. See: https://github.com/openshift/origin/pull/10995
This commit is contained in:
commit
aae1b14592
@ -35,21 +35,22 @@ import (
|
|||||||
type ImageOptions struct {
|
type ImageOptions struct {
|
||||||
resource.FilenameOptions
|
resource.FilenameOptions
|
||||||
|
|
||||||
Mapper meta.RESTMapper
|
Mapper meta.RESTMapper
|
||||||
Typer runtime.ObjectTyper
|
Typer runtime.ObjectTyper
|
||||||
Infos []*resource.Info
|
Infos []*resource.Info
|
||||||
Encoder runtime.Encoder
|
Encoder runtime.Encoder
|
||||||
Selector string
|
Selector string
|
||||||
Out io.Writer
|
Out io.Writer
|
||||||
Err io.Writer
|
Err io.Writer
|
||||||
DryRun bool
|
DryRun bool
|
||||||
ShortOutput bool
|
ShortOutput bool
|
||||||
All bool
|
All bool
|
||||||
Record bool
|
Record bool
|
||||||
Output string
|
Output string
|
||||||
ChangeCause string
|
ChangeCause string
|
||||||
Local bool
|
Local bool
|
||||||
Cmd *cobra.Command
|
Cmd *cobra.Command
|
||||||
|
ResolveImage func(in string) (string, error)
|
||||||
|
|
||||||
PrintObject func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error
|
PrintObject func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error
|
||||||
UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error)
|
UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error)
|
||||||
@ -120,6 +121,7 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st
|
|||||||
o.PrintObject = f.PrintObject
|
o.PrintObject = f.PrintObject
|
||||||
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
||||||
o.Output = cmdutil.GetFlagString(cmd, "output")
|
o.Output = cmdutil.GetFlagString(cmd, "output")
|
||||||
|
o.ResolveImage = f.ResolveImage
|
||||||
o.Cmd = cmd
|
o.Cmd = cmd
|
||||||
|
|
||||||
cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
|
cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
|
||||||
@ -171,12 +173,27 @@ func (o *ImageOptions) Run() error {
|
|||||||
transformed := false
|
transformed := false
|
||||||
_, err := o.UpdatePodSpecForObject(info.Object, func(spec *api.PodSpec) error {
|
_, err := o.UpdatePodSpecForObject(info.Object, func(spec *api.PodSpec) error {
|
||||||
for name, image := range o.ContainerImages {
|
for name, image := range o.ContainerImages {
|
||||||
containerFound := false
|
var (
|
||||||
|
containerFound bool
|
||||||
|
err error
|
||||||
|
resolved string
|
||||||
|
)
|
||||||
// Find the container to update, and update its image
|
// Find the container to update, and update its image
|
||||||
for i, c := range spec.Containers {
|
for i, c := range spec.Containers {
|
||||||
if c.Name == name || name == "*" {
|
if c.Name == name || name == "*" {
|
||||||
spec.Containers[i].Image = image
|
|
||||||
containerFound = true
|
containerFound = true
|
||||||
|
if len(resolved) == 0 {
|
||||||
|
if resolved, err = o.ResolveImage(image); err != nil {
|
||||||
|
allErrs = append(allErrs, fmt.Errorf("error: unable to resolve image %q for container %q: %v", image, name, err))
|
||||||
|
// Do not loop again if the image resolving failed for wildcard case as we
|
||||||
|
// will report the same error again for the next container.
|
||||||
|
if name == "*" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spec.Containers[i].Image = resolved
|
||||||
// Perform updates
|
// Perform updates
|
||||||
transformed = true
|
transformed = true
|
||||||
}
|
}
|
||||||
|
@ -293,6 +293,10 @@ func (f *FakeFactory) Resumer(info *resource.Info) (bool, error) {
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *FakeFactory) ResolveImage(name string) (string, error) {
|
||||||
|
return name, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (f *FakeFactory) Validator(validate bool, cacheDir string) (validation.Schema, error) {
|
func (f *FakeFactory) Validator(validate bool, cacheDir string) (validation.Schema, error) {
|
||||||
return f.tf.Validator, f.tf.Err
|
return f.tf.Validator, f.tf.Err
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,10 @@ type Factory interface {
|
|||||||
Pauser(info *resource.Info) (bool, error)
|
Pauser(info *resource.Info) (bool, error)
|
||||||
// Resumer resumes a paused object inside the info ie. it will be reconciled by its controller.
|
// Resumer resumes a paused object inside the info ie. it will be reconciled by its controller.
|
||||||
Resumer(info *resource.Info) (bool, error)
|
Resumer(info *resource.Info) (bool, error)
|
||||||
|
// ResolveImage resolves the image names. For kubernetes this function is just
|
||||||
|
// passthrough but it allows to perform more sophisticated image name resolving for
|
||||||
|
// third-party vendors.
|
||||||
|
ResolveImage(imageName string) (string, error)
|
||||||
// Returns a schema that can validate objects stored on disk.
|
// Returns a schema that can validate objects stored on disk.
|
||||||
Validator(validate bool, cacheDir string) (validation.Schema, error)
|
Validator(validate bool, cacheDir string) (validation.Schema, error)
|
||||||
// SwaggerSchema returns the schema declaration for the provided group version kind.
|
// SwaggerSchema returns the schema declaration for the provided group version kind.
|
||||||
@ -654,6 +658,10 @@ func (f *factory) Pauser(info *resource.Info) (bool, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *factory) ResolveImage(name string) (string, error) {
|
||||||
|
return name, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (f *factory) Resumer(info *resource.Info) (bool, error) {
|
func (f *factory) Resumer(info *resource.Info) (bool, error) {
|
||||||
switch obj := info.Object.(type) {
|
switch obj := info.Object.(type) {
|
||||||
case *extensions.Deployment:
|
case *extensions.Deployment:
|
||||||
|
Loading…
Reference in New Issue
Block a user