From fa42901798b194ddc08cc7280fb1eaa99374bb1d Mon Sep 17 00:00:00 2001 From: kargakis Date: Mon, 4 May 2015 14:17:30 +0200 Subject: [PATCH] expose: Create objects in a generic way --- pkg/kubectl/cmd/expose.go | 44 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/pkg/kubectl/cmd/expose.go b/pkg/kubectl/cmd/expose.go index 9e373ab9e9..10d30156ef 100644 --- a/pkg/kubectl/cmd/expose.go +++ b/pkg/kubectl/cmd/expose.go @@ -20,9 +20,11 @@ import ( "fmt" "io" - "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/meta" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl" cmdutil "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util" + "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource" + "github.com/spf13/cobra" ) @@ -71,10 +73,10 @@ func NewCmdExposeService(f *cmdutil.Factory, out io.Writer) *cobra.Command { } func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) error { - var name, resource string + var name, res string switch l := len(args); { case l == 2: - resource, name = args[0], args[1] + res, name = args[0], args[1] default: return cmdutil.UsageError(cmd, "the type and name of a resource to expose are required arguments") } @@ -83,10 +85,6 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str if err != nil { return err } - client, err := f.Client() - if err != nil { - return err - } generatorName := cmdutil.GetFlagString(cmd, "generator") @@ -101,13 +99,14 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str } else { params["name"] = cmdutil.GetFlagString(cmd, "service-name") } + var mapping *meta.RESTMapping if s, found := params["selector"]; !found || len(s) == 0 || cmdutil.GetFlagInt(cmd, "port") < 1 { mapper, _ := f.Object() - v, k, err := mapper.VersionAndKindForResource(resource) + v, k, err := mapper.VersionAndKindForResource(res) if err != nil { return err } - mapping, err := mapper.RESTMapping(k, v) + mapping, err = mapper.RESTMapping(k, v) if err != nil { return err } @@ -118,7 +117,14 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str } params["selector"] = s } - if cmdutil.GetFlagInt(cmd, "port") < 0 { + noPorts := true + for _, param := range names { + if param.Name == "port" { + noPorts = false + break + } + } + if cmdutil.GetFlagInt(cmd, "port") < 0 && !noPorts { ports, err := f.PortsForResource(mapping, namespace, name) if err != nil { return err @@ -141,14 +147,14 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str return err } - service, err := generator.Generate(params) + object, err := generator.Generate(params) if err != nil { return err } inline := cmdutil.GetFlagString(cmd, "overrides") if len(inline) > 0 { - service, err = cmdutil.Merge(service, inline, "Service") + object, err = cmdutil.Merge(object, inline, mapping.Kind) if err != nil { return err } @@ -156,11 +162,21 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str // TODO: extract this flag to a central location, when such a location exists. if !cmdutil.GetFlagBool(cmd, "dry-run") { - service, err = client.Services(namespace).Create(service.(*api.Service)) + mapper, typer := f.Object() + resourceMapper := &resource.Mapper{typer, mapper, f.ClientMapperForCommand()} + info, err := resourceMapper.InfoForObject(object) + if err != nil { + return err + } + data, err := info.Mapping.Codec.Encode(object) + if err != nil { + return err + } + _, err = resource.NewHelper(info.Client, info.Mapping).Create(namespace, false, data) if err != nil { return err } } - return f.PrintObject(cmd, service, out) + return f.PrintObject(cmd, object, out) }