mirror of https://github.com/k3s-io/k3s
Merge pull request #64118 from deads2k/cli-65-podspec
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. move updatepodspecforobject out of factory Updating a podspec is a polymorphic helper, but it isn't a factory method. @kubernetes/sig-cli-maintainers /assign @juanvallejo ```release-note NONE ```pull/8/head
commit
8cccc022b0
|
@ -27,6 +27,7 @@ go_library(
|
|||
"//pkg/kubectl/genericclioptions:go_default_library",
|
||||
"//pkg/kubectl/genericclioptions/printers:go_default_library",
|
||||
"//pkg/kubectl/genericclioptions/resource:go_default_library",
|
||||
"//pkg/kubectl/polymorphichelpers:go_default_library",
|
||||
"//pkg/kubectl/scheme:go_default_library",
|
||||
"//pkg/kubectl/util/i18n:go_default_library",
|
||||
"//vendor/github.com/golang/glog:go_default_library",
|
||||
|
|
|
@ -36,6 +36,7 @@ import (
|
|||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/printers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||
"k8s.io/kubernetes/pkg/kubectl/polymorphichelpers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/scheme"
|
||||
)
|
||||
|
||||
|
@ -114,7 +115,7 @@ type EnvOptions struct {
|
|||
output string
|
||||
dryRun bool
|
||||
builder func() *resource.Builder
|
||||
updatePodSpecForObject func(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error)
|
||||
updatePodSpecForObject polymorphichelpers.UpdatePodSpecForObjectFunc
|
||||
namespace string
|
||||
enforceNamespace bool
|
||||
clientset *kubernetes.Clientset
|
||||
|
@ -192,7 +193,7 @@ func (o *EnvOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []stri
|
|||
return fmt.Errorf("all resources must be specified before environment changes: %s", strings.Join(args, " "))
|
||||
}
|
||||
|
||||
o.updatePodSpecForObject = f.UpdatePodSpecForObject
|
||||
o.updatePodSpecForObject = polymorphichelpers.UpdatePodSpecForObjectFn
|
||||
o.output = cmdutil.GetFlagString(cmd, "output")
|
||||
o.dryRun = cmdutil.GetDryRunFlag(cmd)
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import (
|
|||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/printers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||
"k8s.io/kubernetes/pkg/kubectl/polymorphichelpers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/scheme"
|
||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||
)
|
||||
|
@ -54,7 +55,7 @@ type SetImageOptions struct {
|
|||
PrintObj printers.ResourcePrinterFunc
|
||||
Recorder genericclioptions.Recorder
|
||||
|
||||
UpdatePodSpecForObject func(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error)
|
||||
UpdatePodSpecForObject polymorphichelpers.UpdatePodSpecForObjectFunc
|
||||
Resources []string
|
||||
ContainerImages map[string]string
|
||||
|
||||
|
@ -134,7 +135,7 @@ func (o *SetImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [
|
|||
return err
|
||||
}
|
||||
|
||||
o.UpdatePodSpecForObject = f.UpdatePodSpecForObject
|
||||
o.UpdatePodSpecForObject = polymorphichelpers.UpdatePodSpecForObjectFn
|
||||
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
||||
o.Output = cmdutil.GetFlagString(cmd, "output")
|
||||
o.ResolveImage = f.ResolveImage
|
||||
|
|
|
@ -33,6 +33,7 @@ import (
|
|||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/printers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||
"k8s.io/kubernetes/pkg/kubectl/polymorphichelpers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/scheme"
|
||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||
)
|
||||
|
@ -83,7 +84,7 @@ type SetResourcesOptions struct {
|
|||
Requests string
|
||||
ResourceRequirements v1.ResourceRequirements
|
||||
|
||||
UpdatePodSpecForObject func(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error)
|
||||
UpdatePodSpecForObject polymorphichelpers.UpdatePodSpecForObjectFunc
|
||||
Resources []string
|
||||
|
||||
genericclioptions.IOStreams
|
||||
|
@ -152,7 +153,7 @@ func (o *SetResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, ar
|
|||
return err
|
||||
}
|
||||
|
||||
o.UpdatePodSpecForObject = f.UpdatePodSpecForObject
|
||||
o.UpdatePodSpecForObject = polymorphichelpers.UpdatePodSpecForObjectFn
|
||||
o.Output = cmdutil.GetFlagString(cmd, "output")
|
||||
o.DryRun = cmdutil.GetDryRunFlag(cmd)
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ import (
|
|||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/printers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
|
||||
"k8s.io/kubernetes/pkg/kubectl/polymorphichelpers"
|
||||
"k8s.io/kubernetes/pkg/kubectl/scheme"
|
||||
"k8s.io/kubernetes/pkg/kubectl/util/i18n"
|
||||
)
|
||||
|
@ -66,7 +67,7 @@ type SetServiceAccountOptions struct {
|
|||
all bool
|
||||
output string
|
||||
local bool
|
||||
updatePodSpecForObject func(runtime.Object, func(*v1.PodSpec) error) (bool, error)
|
||||
updatePodSpecForObject polymorphichelpers.UpdatePodSpecForObjectFunc
|
||||
infos []*resource.Info
|
||||
serviceAccountName string
|
||||
|
||||
|
@ -129,7 +130,7 @@ func (o *SetServiceAccountOptions) Complete(f cmdutil.Factory, cmd *cobra.Comman
|
|||
o.shortOutput = cmdutil.GetFlagString(cmd, "output") == "name"
|
||||
o.dryRun = cmdutil.GetDryRunFlag(cmd)
|
||||
o.output = cmdutil.GetFlagString(cmd, "output")
|
||||
o.updatePodSpecForObject = f.UpdatePodSpecForObject
|
||||
o.updatePodSpecForObject = polymorphichelpers.UpdatePodSpecForObjectFn
|
||||
|
||||
if o.dryRun {
|
||||
o.PrintFlags.Complete("%s (dry run)")
|
||||
|
|
|
@ -36,11 +36,9 @@ go_library(
|
|||
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||
"//vendor/k8s.io/api/apps/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/apps/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/api/apps/v1beta2:go_default_library",
|
||||
"//vendor/k8s.io/api/batch/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/batch/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
|
@ -79,10 +78,6 @@ type ClientAccessFactory interface {
|
|||
// and which implements the common patterns for CLI interactions with generic resources.
|
||||
NewBuilder() *resource.Builder
|
||||
|
||||
// UpdatePodSpecForObject will call the provided function on the pod spec this object supports,
|
||||
// return false if no pod spec is supported, or return an error.
|
||||
UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error)
|
||||
|
||||
// MapBasedSelectorForObject returns the map-based selector associated with the provided object. If a
|
||||
// new set-based selector is provided, an error is returned if the selector cannot be converted to a
|
||||
// map-based selector
|
||||
|
|
|
@ -26,14 +26,11 @@ import (
|
|||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
appsv1beta1 "k8s.io/api/apps/v1beta1"
|
||||
appsv1beta2 "k8s.io/api/apps/v1beta2"
|
||||
batchv1 "k8s.io/api/batch/v1"
|
||||
batchv1beta1 "k8s.io/api/batch/v1beta1"
|
||||
batchv2alpha1 "k8s.io/api/batch/v2alpha1"
|
||||
|
@ -129,67 +126,6 @@ func (f *ring0Factory) RESTClient() (*restclient.RESTClient, error) {
|
|||
return restclient.RESTClientFor(clientConfig)
|
||||
}
|
||||
|
||||
func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error) {
|
||||
// TODO: replace with a swagger schema based approach (identify pod template via schema introspection)
|
||||
switch t := obj.(type) {
|
||||
case *v1.Pod:
|
||||
return true, fn(&t.Spec)
|
||||
// ReplicationController
|
||||
case *v1.ReplicationController:
|
||||
if t.Spec.Template == nil {
|
||||
t.Spec.Template = &v1.PodTemplateSpec{}
|
||||
}
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// Deployment
|
||||
case *extensionsv1beta1.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta1.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// DaemonSet
|
||||
case *extensionsv1beta1.DaemonSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.DaemonSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.DaemonSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// ReplicaSet
|
||||
case *extensionsv1beta1.ReplicaSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.ReplicaSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.ReplicaSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// StatefulSet
|
||||
case *appsv1beta1.StatefulSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.StatefulSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.StatefulSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// Job
|
||||
case *batchv1.Job:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// CronJob
|
||||
case *batchv1beta1.CronJob:
|
||||
return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec)
|
||||
case *batchv2alpha1.CronJob:
|
||||
return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec)
|
||||
|
||||
default:
|
||||
return false, fmt.Errorf("the object is not a pod or does not have a pod template: %T", t)
|
||||
}
|
||||
}
|
||||
|
||||
func (f *ring0Factory) MapBasedSelectorForObject(object runtime.Object) (string, error) {
|
||||
// TODO: replace with a swagger schema based approach (identify pod selector via schema introspection)
|
||||
switch t := object.(type) {
|
||||
|
|
|
@ -9,6 +9,7 @@ go_library(
|
|||
"interface.go",
|
||||
"logsforobject.go",
|
||||
"statusviewer.go",
|
||||
"updatepodspec.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubectl/polymorphichelpers",
|
||||
visibility = ["//visibility:public"],
|
||||
|
@ -27,6 +28,8 @@ go_library(
|
|||
"//vendor/k8s.io/api/apps/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/api/apps/v1beta2:go_default_library",
|
||||
"//vendor/k8s.io/api/batch/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/batch/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||
|
|
|
@ -19,6 +19,7 @@ package polymorphichelpers
|
|||
import (
|
||||
"time"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/client-go/rest"
|
||||
|
@ -50,3 +51,10 @@ type StatusViewerFunc func(restClientGetter genericclioptions.RESTClientGetter,
|
|||
|
||||
// StatusViewerFn gives a way to easily override the function for unit testing if needed
|
||||
var StatusViewerFn StatusViewerFunc = statusViewer
|
||||
|
||||
// UpdatePodSpecForObjectFunc will call the provided function on the pod spec this object supports,
|
||||
// return false if no pod spec is supported, or return an error.
|
||||
type UpdatePodSpecForObjectFunc func(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error)
|
||||
|
||||
// UpdatePodSpecForObjectFn gives a way to easily override the function for unit testing if needed
|
||||
var UpdatePodSpecForObjectFn UpdatePodSpecForObjectFunc = updatePodSpecForObject
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package polymorphichelpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
appsv1beta1 "k8s.io/api/apps/v1beta1"
|
||||
appsv1beta2 "k8s.io/api/apps/v1beta2"
|
||||
batchv1 "k8s.io/api/batch/v1"
|
||||
batchv1beta1 "k8s.io/api/batch/v1beta1"
|
||||
batchv2alpha1 "k8s.io/api/batch/v2alpha1"
|
||||
"k8s.io/api/core/v1"
|
||||
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
||||
func updatePodSpecForObject(obj runtime.Object, fn func(*v1.PodSpec) error) (bool, error) {
|
||||
switch t := obj.(type) {
|
||||
case *v1.Pod:
|
||||
return true, fn(&t.Spec)
|
||||
// ReplicationController
|
||||
case *v1.ReplicationController:
|
||||
if t.Spec.Template == nil {
|
||||
t.Spec.Template = &v1.PodTemplateSpec{}
|
||||
}
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// Deployment
|
||||
case *extensionsv1beta1.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta1.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.Deployment:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// DaemonSet
|
||||
case *extensionsv1beta1.DaemonSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.DaemonSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.DaemonSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// ReplicaSet
|
||||
case *extensionsv1beta1.ReplicaSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.ReplicaSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.ReplicaSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// StatefulSet
|
||||
case *appsv1beta1.StatefulSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1beta2.StatefulSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
case *appsv1.StatefulSet:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// Job
|
||||
case *batchv1.Job:
|
||||
return true, fn(&t.Spec.Template.Spec)
|
||||
|
||||
// CronJob
|
||||
case *batchv1beta1.CronJob:
|
||||
return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec)
|
||||
case *batchv2alpha1.CronJob:
|
||||
return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec)
|
||||
|
||||
default:
|
||||
return false, fmt.Errorf("the object is not a pod or does not have a pod template: %T", t)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue