Merge pull request #7699 from kargakis/make-expose-generic

expose: Create objects in a generic way
This commit is contained in:
Clayton Coleman 2015-05-04 15:01:37 -04:00
commit 82b939760e

View File

@ -20,9 +20,11 @@ import (
"fmt" "fmt"
"io" "io"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/meta"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl"
cmdutil "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util" cmdutil "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource"
"github.com/spf13/cobra" "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 { 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); { switch l := len(args); {
case l == 2: case l == 2:
resource, name = args[0], args[1] res, name = args[0], args[1]
default: default:
return cmdutil.UsageError(cmd, "the type and name of a resource to expose are required arguments") 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 { if err != nil {
return err return err
} }
client, err := f.Client()
if err != nil {
return err
}
generatorName := cmdutil.GetFlagString(cmd, "generator") generatorName := cmdutil.GetFlagString(cmd, "generator")
@ -101,13 +99,14 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
} else { } else {
params["name"] = cmdutil.GetFlagString(cmd, "service-name") 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 { if s, found := params["selector"]; !found || len(s) == 0 || cmdutil.GetFlagInt(cmd, "port") < 1 {
mapper, _ := f.Object() mapper, _ := f.Object()
v, k, err := mapper.VersionAndKindForResource(resource) v, k, err := mapper.VersionAndKindForResource(res)
if err != nil { if err != nil {
return err return err
} }
mapping, err := mapper.RESTMapping(k, v) mapping, err = mapper.RESTMapping(k, v)
if err != nil { if err != nil {
return err return err
} }
@ -118,7 +117,14 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
} }
params["selector"] = s 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) ports, err := f.PortsForResource(mapping, namespace, name)
if err != nil { if err != nil {
return err return err
@ -141,14 +147,14 @@ func RunExpose(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
return err return err
} }
service, err := generator.Generate(params) object, err := generator.Generate(params)
if err != nil { if err != nil {
return err return err
} }
inline := cmdutil.GetFlagString(cmd, "overrides") inline := cmdutil.GetFlagString(cmd, "overrides")
if len(inline) > 0 { if len(inline) > 0 {
service, err = cmdutil.Merge(service, inline, "Service") object, err = cmdutil.Merge(object, inline, mapping.Kind)
if err != nil { if err != nil {
return err 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. // TODO: extract this flag to a central location, when such a location exists.
if !cmdutil.GetFlagBool(cmd, "dry-run") { 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 { if err != nil {
return err return err
} }
} }
return f.PrintObject(cmd, service, out) return f.PrintObject(cmd, object, out)
} }