Run should be flexible to type

OpenShift would like to use its own types as generator arguments
This commit is contained in:
Clayton Coleman 2015-08-20 22:35:28 -04:00
parent 2f1edf7db5
commit 32aebc42cc

View File

@ -28,6 +28,7 @@ import (
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
) )
@ -111,11 +112,6 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
return err return err
} }
client, err := f.Client()
if err != nil {
return err
}
restartPolicy, err := getRestartPolicy(cmd, interactive) restartPolicy, err := getRestartPolicy(cmd, interactive)
if err != nil { if err != nil {
return err return err
@ -151,27 +147,36 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
return err return err
} }
mapper, typer := f.Object()
version, kind, err := typer.ObjectVersionAndKind(obj)
if err != nil {
return err
}
inline := cmdutil.GetFlagString(cmd, "overrides") inline := cmdutil.GetFlagString(cmd, "overrides")
if len(inline) > 0 { if len(inline) > 0 {
var objType string obj, err = cmdutil.Merge(obj, inline, kind)
if restartPolicy == api.RestartPolicyAlways {
objType = "ReplicationController"
} else {
objType = "Pod"
}
obj, err = cmdutil.Merge(obj, inline, objType)
if err != nil { if err != nil {
return err return err
} }
} }
mapping, err := mapper.RESTMapping(kind, version)
if err != nil {
return err
}
client, err := f.RESTClient(mapping)
if err != nil {
return err
}
// 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") {
if restartPolicy == api.RestartPolicyAlways { data, err := mapping.Codec.Encode(obj)
obj, err = client.ReplicationControllers(namespace).Create(obj.(*api.ReplicationController)) if err != nil {
} else { return err
obj, err = client.Pods(namespace).Create(obj.(*api.Pod))
} }
obj, err = resource.NewHelper(client, mapping).Create(namespace, false, data)
if err != nil { if err != nil {
return err return err
} }
@ -205,10 +210,14 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob
return err return err
} }
opts.Client = client opts.Client = client
if restartPolicy == api.RestartPolicyAlways { // TODO: this should be abstracted into Factory to support other types
return handleAttachReplicationController(client, obj.(*api.ReplicationController), opts) switch t := obj.(type) {
} else { case *api.ReplicationController:
return handleAttachPod(client, obj.(*api.Pod), opts) return handleAttachReplicationController(client, t, opts)
case *api.Pod:
return handleAttachPod(client, t, opts)
default:
return fmt.Errorf("cannot attach to %s: not implemented", kind)
} }
} }
return f.PrintObject(cmd, obj, cmdOut) return f.PrintObject(cmd, obj, cmdOut)