@@ -26,26 +26,37 @@ import (
2626 "k8s.io/kubernetes/pkg/api/unversioned"
2727)
2828
29- func (s * Scheme ) DecodeToVersionedObject (data []byte ) (obj interface {}, version , kind string , err error ) {
30- version , kind , err = s .DataVersionAndKind (data )
29+ func (s * Scheme ) DecodeToVersionedObject (data []byte ) (interface {}, string , string , error ) {
30+ version , kind , err : = s .DataVersionAndKind (data )
3131 if err != nil {
32- return
32+ return nil , "" , "" , err
33+ }
34+
35+ gv , err := unversioned .ParseGroupVersion (version )
36+ if err != nil {
37+ return nil , "" , "" , err
38+ }
39+
40+ internalGV , exists := s .InternalVersions [gv .Group ]
41+ if ! exists {
42+ return nil , "" , "" , fmt .Errorf ("no internalVersion specified for %v" , gv )
3343 }
34- if version == "" && s .InternalVersion != "" {
44+
45+ if len (gv .Version ) == 0 && len (internalGV .Version ) != 0 {
3546 return nil , "" , "" , fmt .Errorf ("version not set in '%s'" , string (data ))
3647 }
3748 if kind == "" {
3849 return nil , "" , "" , fmt .Errorf ("kind not set in '%s'" , string (data ))
3950 }
40- obj , err = s .NewObject (version , kind )
51+ obj , err : = s .NewObject (version , kind )
4152 if err != nil {
4253 return nil , "" , "" , err
4354 }
4455
4556 if err := codec .NewDecoderBytes (data , new (codec.JsonHandle )).Decode (obj ); err != nil {
4657 return nil , "" , "" , err
4758 }
48- return
59+ return obj , version , kind , nil
4960}
5061
5162// Decode converts a JSON string back into a pointer to an api object.
@@ -54,15 +65,16 @@ func (s *Scheme) DecodeToVersionedObject(data []byte) (obj interface{}, version,
5465// s.InternalVersion type before being returned. Decode will not decode
5566// objects without version set unless InternalVersion is also "".
5667func (s * Scheme ) Decode (data []byte ) (interface {}, error ) {
57- // TODO this is cleaned up when internal types are fixed
58- return s .DecodeToVersion (data , unversioned .ParseGroupVersionOrDie (s .InternalVersion ))
68+ return s .DecodeToVersion (data , unversioned.GroupVersion {})
5969}
6070
6171// DecodeToVersion converts a JSON string back into a pointer to an api object.
6272// Deduces the type based upon the fields added by the MetaInsertionFactory
6373// technique. The object will be converted, if necessary, into the versioned
6474// type before being returned. Decode will not decode objects without version
6575// set unless version is also "".
76+ // a GroupVersion with .IsEmpty() == true is means "use the internal version for
77+ // the object's group"
6678func (s * Scheme ) DecodeToVersion (data []byte , gv unversioned.GroupVersion ) (interface {}, error ) {
6779 obj , sourceVersion , kind , err := s .DecodeToVersionedObject (data )
6880 if err != nil {
@@ -73,8 +85,23 @@ func (s *Scheme) DecodeToVersion(data []byte, gv unversioned.GroupVersion) (inte
7385 return nil , err
7486 }
7587
88+ sourceGV , err := unversioned .ParseGroupVersion (sourceVersion )
89+ if err != nil {
90+ return nil , err
91+ }
92+
93+ // if the gv is empty, then we want the internal version, but the internal version varies by
94+ // group. We can lookup the group now because we have knowledge of the group
95+ if gv .IsEmpty () {
96+ exists := false
97+ gv , exists = s .InternalVersions [sourceGV .Group ]
98+ if ! exists {
99+ return nil , fmt .Errorf ("no internalVersion specified for %v" , gv )
100+ }
101+ }
102+
76103 // Convert if needed.
77- if gv . String () != sourceVersion {
104+ if gv != sourceGV {
78105 objOut , err := s .NewObject (gv .String (), kind )
79106 if err != nil {
80107 return nil , err
@@ -118,7 +145,7 @@ func (s *Scheme) DecodeIntoWithSpecifiedVersionKind(data []byte, obj interface{}
118145 if dataKind == "" {
119146 dataKind = gvk .Kind
120147 }
121- if (len (gvk .GroupVersion (). Group ) > 0 || len (gvk . GroupVersion () .Version ) > 0 ) && (dataVersion != gvk .GroupVersion ().String ()) {
148+ if (len (gvk .Group ) > 0 || len (gvk .Version ) > 0 ) && (dataVersion != gvk .GroupVersion ().String ()) {
122149 return errors .New (fmt .Sprintf ("The apiVersion in the data (%s) does not match the specified apiVersion(%v)" , dataVersion , gvk .GroupVersion ()))
123150 }
124151 if len (gvk .Kind ) > 0 && (dataKind != gvk .Kind ) {
0 commit comments