diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index a95362a27b..3883e38732 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -19,6 +19,7 @@ package set import ( "fmt" "io" + "strings" "github.com/spf13/cobra" "k8s.io/kubernetes/pkg/api" @@ -37,8 +38,8 @@ var ( Specify compute resource requirements (cpu, memory) for any resource that defines a pod template. If a pod is successfully scheduled, it is guaranteed the amount of resource requested, but may burst up to its specified limits. for each compute resource, if a limit is specified and a request is omitted, the request will default to the limit. - - Possible resources include (case insensitive):`) + + Possible resources include (case insensitive): %s.`) resources_example = templates.Examples(` # Set a deployments nginx container cpu limits to "200m" and memory to "512Mi" @@ -87,17 +88,16 @@ func NewCmdResources(f cmdutil.Factory, out io.Writer, errOut io.Writer) *cobra. Out: out, Err: errOut, } - var pod_specs string - RESTMappings := cmdutil.ResourcesWithPodSpecs() - for _, Map := range RESTMappings { - pod_specs = pod_specs + ", " + Map.Resource + resourceTypesWithPodTemplate := []string{} + for _, resource := range f.SuggestedPodTemplateResources() { + resourceTypesWithPodTemplate = append(resourceTypesWithPodTemplate, resource.Resource) } cmd := &cobra.Command{ Use: "resources (-f FILENAME | TYPE NAME) ([--limits=LIMITS & --requests=REQUESTS]", Short: "update resource requests/limits on objects with pod templates", - Long: resources_long + " " + pod_specs[2:], + Long: fmt.Sprintf(resources_long, strings.Join(resourceTypesWithPodTemplate, ", ")), Example: resources_example, Run: func(cmd *cobra.Command, args []string) { cmdutil.CheckErr(options.Complete(f, cmd, args)) diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index 711ae9516d..96b06709d8 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -340,6 +340,10 @@ func (f *FakeFactory) DefaultResourceFilterFunc() kubectl.Filters { return nil } +func (f *FakeFactory) SuggestedPodTemplateResources() []unversioned.GroupResource { + return []unversioned.GroupResource{} +} + type fakeMixedFactory struct { cmdutil.Factory tf *TestFactory @@ -507,6 +511,10 @@ func (f *fakeAPIFactory) NewBuilder() *resource.Builder { return resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } +func (f *fakeAPIFactory) SuggestedPodTemplateResources() []unversioned.GroupResource { + return []unversioned.GroupResource{} +} + func NewAPIFactory() (cmdutil.Factory, *TestFactory, runtime.Codec, runtime.NegotiatedSerializer) { t := &TestFactory{ Validator: validation.NullSchema{}, diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index bae3a24b81..e3059a367a 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -178,6 +178,9 @@ type Factory interface { PrinterForMapping(cmd *cobra.Command, mapping *meta.RESTMapping, withNamespace bool) (kubectl.ResourcePrinter, error) // One stop shopping for a Builder NewBuilder() *resource.Builder + + // SuggestedPodTemplateResources returns a list of resource types that declare a pod template + SuggestedPodTemplateResources() []unversioned.GroupResource } const ( @@ -1333,6 +1336,16 @@ func (f *factory) NewBuilder() *resource.Builder { return resource.NewBuilder(mapper, typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) } +func (f *factory) SuggestedPodTemplateResources() []unversioned.GroupResource { + return []unversioned.GroupResource{ + {Resource: "replicationcontroller"}, + {Resource: "deployment"}, + {Resource: "daemonset"}, + {Resource: "job"}, + {Resource: "replicaset"}, + } +} + // registerThirdPartyResources inspects the discovery endpoint to find thirdpartyresources in the discovery doc // and then registers them with the apimachinery code. I think this is done so that scheme/codec stuff works, // but I really don't know. Feels like this code should go away once kubectl is completely generic for generic @@ -1383,20 +1396,3 @@ func registerThirdPartyResources(discoveryClient discovery.DiscoveryInterface) e return nil } - -func ResourcesWithPodSpecs() []*meta.RESTMapping { - restMaps := []*meta.RESTMapping{} - resourcesWithTemplates := []string{"ReplicationController", "Deployment", "DaemonSet", "Job", "ReplicaSet"} - mapper, _ := NewFactory(nil).Object() - - for _, resource := range resourcesWithTemplates { - restmap, err := mapper.RESTMapping(unversioned.GroupKind{Kind: resource}) - if err == nil { - restMaps = append(restMaps, restmap) - } else { - mapping, _ := mapper.RESTMapping(extensions.Kind(resource)) - restMaps = append(restMaps, mapping) - } - } - return restMaps -}