diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index fb655a82a8d..80fa70efad8 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -23,6 +23,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util" + "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource" "github.com/spf13/cobra" ) @@ -72,56 +73,41 @@ func RunRollingUpdate(f *Factory, out io.Writer, cmd *cobra.Command, args []stri return util.UsageError(cmd, "Must specify the controller to update") } oldName := args[0] - schema, err := f.Validator() - if err != nil { - return err - } - - clientConfig, err := f.ClientConfig() - if err != nil { - return err - } - cmdApiVersion := clientConfig.Version - - mapper, typer := f.Object() - // TODO: use resource.Builder instead - mapping, namespace, newName, data, err := util.ResourceFromFile(filename, typer, mapper, schema, cmdApiVersion) - if err != nil { - return err - } - if mapping.Kind != "ReplicationController" { - return util.UsageError(cmd, "%s does not specify a valid ReplicationController", filename) - } - if oldName == newName { - return util.UsageError(cmd, "%s cannot have the same name as the existing ReplicationController %s", - filename, oldName) - } cmdNamespace, err := f.DefaultNamespace() if err != nil { return err } + + mapper, typer := f.Object() // TODO: use resource.Builder instead - err = util.CompareNamespace(cmdNamespace, namespace) + obj, err := resource.NewBuilder(mapper, typer, f.ClientMapperForCommand(cmd)). + NamespaceParam(cmdNamespace).RequireNamespace(). + FilenameParam(filename). + Do(). + Object() if err != nil { return err } + newRc, ok := obj.(*api.ReplicationController) + if !ok { + return util.UsageError(cmd, "%s does not specify a valid ReplicationController", filename) + } + newName := newRc.Name + if oldName == newName { + return util.UsageError(cmd, "%s cannot have the same name as the existing ReplicationController %s", + filename, oldName) + } client, err := f.Client() if err != nil { return err } - obj, err := mapping.Codec.Decode(data) - if err != nil { - return err - } - newRc := obj.(*api.ReplicationController) - - updater := kubectl.NewRollingUpdater(cmdNamespace, client) + updater := kubectl.NewRollingUpdater(newRc.Namespace, client) // fetch rc - oldRc, err := client.ReplicationControllers(cmdNamespace).Get(oldName) + oldRc, err := client.ReplicationControllers(newRc.Namespace).Get(oldName) if err != nil { return err } diff --git a/pkg/kubectl/cmd/util/resource.go b/pkg/kubectl/cmd/util/resource.go index ad39689d9fd..1ceca6279d0 100644 --- a/pkg/kubectl/cmd/util/resource.go +++ b/pkg/kubectl/cmd/util/resource.go @@ -17,13 +17,9 @@ limitations under the License. package util import ( - "fmt" - "github.com/spf13/cobra" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/meta" - "github.com/GoogleCloudPlatform/kubernetes/pkg/api/validation" - "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" ) // ResourceFromArgs expects two arguments with a given type, and extracts the fields necessary @@ -52,69 +48,3 @@ func ResourceFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTMapper, mapping, err = mapper.RESTMapping(kind, version) return } - -// ResourceFromFile retrieves the name and namespace from a valid file. If the file does not -// resolve to a known type an error is returned. The returned mapping can be used to determine -// the correct REST endpoint to modify this resource with. -// DEPRECATED: Use resource.Builder -func ResourceFromFile(filename string, typer runtime.ObjectTyper, mapper meta.RESTMapper, schema validation.Schema, cmdVersion string) (mapping *meta.RESTMapping, namespace, name string, data []byte, err error) { - data, err = ReadConfigData(filename) - if err != nil { - return - } - - objVersion, kind, err := typer.DataVersionAndKind(data) - if err != nil { - return - } - - // TODO: allow unversioned objects? - if len(objVersion) == 0 { - err = fmt.Errorf("the resource in the provided file has no apiVersion defined") - } - - err = schema.ValidateBytes(data) - if err != nil { - return - } - - // decode using the version stored with the object (allows codec to vary across versions) - mapping, err = mapper.RESTMapping(kind, objVersion) - if err != nil { - return - } - - obj, err := mapping.Codec.Decode(data) - if err != nil { - return - } - - meta := mapping.MetadataAccessor - namespace, err = meta.Namespace(obj) - if err != nil { - return - } - name, err = meta.Name(obj) - if err != nil { - return - } - - // if the preferred API version differs, get a different mapper - if cmdVersion != objVersion { - mapping, err = mapper.RESTMapping(kind, cmdVersion) - } - return -} - -// CompareNamespace returns an error if the namespace the user has provided on the CLI -// or via the default namespace file does not match the namespace of an input file. This -// prevents a user from unintentionally updating the wrong namespace. -// DEPRECATED: Use resource.Builder -func CompareNamespace(defaultNamespace, namespace string) error { - if len(namespace) > 0 { - if defaultNamespace != namespace { - return fmt.Errorf("the namespace from the provided file %q does not match the namespace %q. You must pass '--namespace=%s' to perform this operation.", namespace, defaultNamespace, namespace) - } - } - return nil -}