diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index 417ee212c00..f81458a9412 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -45,7 +45,7 @@ Examples: } schema, err := f.Validator(cmd) checkErr(err) - mapping, namespace, name, data := ResourceFromFile(filename, f.Typer, f.Mapper, schema) + mapping, namespace, name, data := ResourceFromFile(cmd, filename, f.Typer, f.Mapper, schema) client, err := f.Client(cmd, mapping) checkErr(err) diff --git a/pkg/kubectl/cmd/resource.go b/pkg/kubectl/cmd/resource.go index 83455bf7522..9055a308d58 100644 --- a/pkg/kubectl/cmd/resource.go +++ b/pkg/kubectl/cmd/resource.go @@ -216,7 +216,7 @@ func ResourceFromArgsOrFile(cmd *cobra.Command, args []string, filename string, usageError(cmd, "Must specify filename or command line params") } - mapping, namespace, name, _ = ResourceFromFile(filename, typer, mapper, schema) + mapping, namespace, name, _ = ResourceFromFile(cmd, filename, typer, mapper, schema) if len(name) == 0 { checkErr(fmt.Errorf("the resource in the provided file has no name (or ID) defined")) } @@ -281,23 +281,24 @@ func ResourceOrTypeFromArgs(cmd *cobra.Command, args []string, mapper meta.RESTM // 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. -func ResourceFromFile(filename string, typer runtime.ObjectTyper, mapper meta.RESTMapper, schema validation.Schema) (mapping *meta.RESTMapping, namespace, name string, data []byte) { +func ResourceFromFile(cmd *cobra.Command, filename string, typer runtime.ObjectTyper, mapper meta.RESTMapper, schema validation.Schema) (mapping *meta.RESTMapping, namespace, name string, data []byte) { configData, err := ReadConfigData(filename) checkErr(err) data = configData - version, kind, err := typer.DataVersionAndKind(data) + objVersion, kind, err := typer.DataVersionAndKind(data) checkErr(err) // TODO: allow unversioned objects? - if len(version) == 0 { + if len(objVersion) == 0 { checkErr(fmt.Errorf("the resource in the provided file has no apiVersion defined")) } err = schema.ValidateBytes(data) checkErr(err) - mapping, err = mapper.RESTMapping(kind, version) + // decode using the version stored with the object (allows codec to vary across versions) + mapping, err = mapper.RESTMapping(kind, objVersion) checkErr(err) obj, err := mapping.Codec.Decode(data) @@ -309,6 +310,13 @@ func ResourceFromFile(filename string, typer runtime.ObjectTyper, mapper meta.RE name, err = meta.Name(obj) checkErr(err) + // if the preferred API version differs, get a different mapper + version := GetFlagString(cmd, "api-version") + if version != objVersion { + mapping, err = mapper.RESTMapping(kind, version) + checkErr(err) + } + return } diff --git a/pkg/kubectl/cmd/update.go b/pkg/kubectl/cmd/update.go index 2a35cddbd78..8f812bc070c 100644 --- a/pkg/kubectl/cmd/update.go +++ b/pkg/kubectl/cmd/update.go @@ -45,7 +45,7 @@ Examples: } schema, err := f.Validator(cmd) checkErr(err) - mapping, namespace, name, data := ResourceFromFile(filename, f.Typer, f.Mapper, schema) + mapping, namespace, name, data := ResourceFromFile(cmd, filename, f.Typer, f.Mapper, schema) client, err := f.Client(cmd, mapping) checkErr(err)