// Decode attempts a decode of the object, then tries to convert it to the internal version. If into is provided and the decoding is // successful, the returned runtime.Object will be the value passed as into. Note that this may bypass conversion if you pass an // into that matches the serialized version. func (c *codec) Decode(data []byte, defaultGVK *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) { versioned, isVersioned := into.(*runtime.VersionedObjects) if isVersioned { into = versioned.Last() } obj, gvk, err := c.serializer.Decode(data, defaultGVK, into) if err != nil { return nil, gvk, err } // if we specify a target, use generic conversion. if into != nil { if into == obj { if isVersioned { return versioned, gvk, nil } return into, gvk, nil } if err := c.convertor.Convert(obj, into); err != nil { return nil, gvk, err } if isVersioned { versioned.Objects = []runtime.Object{obj, into} return versioned, gvk, nil } return into, gvk, nil } // invoke a version conversion group := gvk.Group if defaultGVK != nil { group = defaultGVK.Group } var targetGV unversioned.GroupVersion if c.decodeVersion == nil { // convert to internal by default targetGV.Group = group targetGV.Version = runtime.APIVersionInternal } else { gv, ok := c.decodeVersion[group] if !ok { // unknown objects are left in their original version if isVersioned { versioned.Objects = []runtime.Object{obj} return versioned, gvk, nil } return obj, gvk, nil } targetGV = gv } if gvk.GroupVersion() == targetGV { if isVersioned { versioned.Objects = []runtime.Object{obj} return versioned, gvk, nil } return obj, gvk, nil } if isVersioned { // create a copy, because ConvertToVersion does not guarantee non-mutation of objects copied, err := c.copier.Copy(obj) if err != nil { copied = obj } versioned.Objects = []runtime.Object{copied} } // Convert if needed. out, err := c.convertor.ConvertToVersion(obj, targetGV.String()) if err != nil { return nil, gvk, err } if isVersioned { versioned.Objects = append(versioned.Objects, out) return versioned, gvk, nil } return out, gvk, nil }