From ba1914d514f8bcb9cc1fef38076083e73851a377 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Mon, 9 Oct 2017 14:57:23 -0400 Subject: [PATCH] add ApproximatePodTemplateForObject factory method --- pkg/kubectl/cmd/testing/fake.go | 8 +++++++ pkg/kubectl/cmd/util/factory.go | 5 ++++ .../cmd/util/factory_object_mapping.go | 23 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index cb46de9378..8ceff3c96f 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -454,6 +454,10 @@ func (f *FakeFactory) AttachablePodForObject(ob runtime.Object, timeout time.Dur return nil, nil } +func (f *FakeFactory) ApproximatePodTemplateForObject(obj runtime.Object) (*api.PodTemplateSpec, error) { + return f.ApproximatePodTemplateForObject(obj) +} + func (f *FakeFactory) UpdatePodSpecForObject(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error) { return false, nil } @@ -718,6 +722,10 @@ func (f *fakeAPIFactory) AttachablePodForObject(object runtime.Object, timeout t } } +func (f *fakeAPIFactory) ApproximatePodTemplateForObject(obj runtime.Object) (*api.PodTemplateSpec, error) { + return f.Factory.ApproximatePodTemplateForObject(obj) +} + func (f *fakeAPIFactory) Validator(validate bool) (validation.Schema, error) { return f.tf.Validator, f.tf.Err } diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 774fef1bad..4872fc05bf 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -231,6 +231,11 @@ type ObjectMappingFactory interface { // AttachablePodForObject returns the pod to which to attach given an object. AttachablePodForObject(object runtime.Object, timeout time.Duration) (*api.Pod, error) + // ApproximatePodTemplateForObject returns a pod template object for the provided source. + // It may return both an error and a object. It attempt to return the best possible template + // available at the current time. + ApproximatePodTemplateForObject(runtime.Object) (*api.PodTemplateSpec, error) + // Returns a schema that can validate objects stored on disk. Validator(validate bool) (validation.Schema, error) // SwaggerSchema returns the schema declaration for the provided group version kind. diff --git a/pkg/kubectl/cmd/util/factory_object_mapping.go b/pkg/kubectl/cmd/util/factory_object_mapping.go index 20226f4c1c..218c4eae0c 100644 --- a/pkg/kubectl/cmd/util/factory_object_mapping.go +++ b/pkg/kubectl/cmd/util/factory_object_mapping.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "os" + "reflect" "sort" "sync" "time" @@ -354,6 +355,28 @@ func (f *ring1Factory) StatusViewer(mapping *meta.RESTMapping) (kubectl.StatusVi return kubectl.StatusViewerFor(mapping.GroupVersionKind.GroupKind(), clientset) } +func (f *ring1Factory) ApproximatePodTemplateForObject(object runtime.Object) (*api.PodTemplateSpec, error) { + switch t := object.(type) { + case *api.Pod: + return &api.PodTemplateSpec{ + ObjectMeta: t.ObjectMeta, + Spec: t.Spec, + }, nil + case *api.ReplicationController: + return t.Spec.Template, nil + case *extensions.ReplicaSet: + return &t.Spec.Template, nil + case *extensions.DaemonSet: + return &t.Spec.Template, nil + case *extensions.Deployment: + return &t.Spec.Template, nil + case *batch.Job: + return &t.Spec.Template, nil + } + + return nil, fmt.Errorf("unable to extract pod template from type %v", reflect.TypeOf(object)) +} + func (f *ring1Factory) AttachablePodForObject(object runtime.Object, timeout time.Duration) (*api.Pod, error) { clientset, err := f.clientAccessFactory.ClientSetForVersion(nil) if err != nil {