...
1
16
17 package internal
18
19 import (
20 "fmt"
21
22 "k8s.io/apimachinery/pkg/runtime"
23 "k8s.io/apimachinery/pkg/runtime/schema"
24 "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
25 "sigs.k8s.io/structured-merge-diff/v4/merge"
26 "sigs.k8s.io/structured-merge-diff/v4/typed"
27 )
28
29
30
31 type versionConverter struct {
32 typeConverter TypeConverter
33 objectConvertor runtime.ObjectConvertor
34 hubGetter func(from schema.GroupVersion) schema.GroupVersion
35 }
36
37 var _ merge.Converter = &versionConverter{}
38
39
40 func newVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.GroupVersion) merge.Converter {
41 return &versionConverter{
42 typeConverter: t,
43 objectConvertor: o,
44 hubGetter: func(from schema.GroupVersion) schema.GroupVersion {
45 return schema.GroupVersion{
46 Group: from.Group,
47 Version: h.Version,
48 }
49 },
50 }
51 }
52
53
54 func newCRDVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.GroupVersion) merge.Converter {
55 return &versionConverter{
56 typeConverter: t,
57 objectConvertor: o,
58 hubGetter: func(from schema.GroupVersion) schema.GroupVersion {
59 return h
60 },
61 }
62 }
63
64
65 func (v *versionConverter) Convert(object *typed.TypedValue, version fieldpath.APIVersion) (*typed.TypedValue, error) {
66
67 objectToConvert, err := v.typeConverter.TypedToObject(object)
68 if err != nil {
69 return object, err
70 }
71
72
73 groupVersion, err := schema.ParseGroupVersion(string(version))
74 if err != nil {
75 return object, err
76 }
77
78
79 fromVersion := objectToConvert.GetObjectKind().GroupVersionKind().GroupVersion()
80 if fromVersion == groupVersion {
81 return object, nil
82 }
83
84
85 internalObject, err := v.objectConvertor.ConvertToVersion(objectToConvert, v.hubGetter(fromVersion))
86 if err != nil {
87 return object, err
88 }
89
90
91 convertedObject, err := v.objectConvertor.ConvertToVersion(internalObject, groupVersion)
92 if err != nil {
93 return object, err
94 }
95
96
97 return v.typeConverter.ObjectToTyped(convertedObject)
98 }
99
100
101 func (v *versionConverter) IsMissingVersionError(err error) bool {
102 return runtime.IsNotRegisteredError(err) || isNoCorrespondingTypeError(err)
103 }
104
105 type noCorrespondingTypeErr struct {
106 gvk schema.GroupVersionKind
107 }
108
109 func NewNoCorrespondingTypeError(gvk schema.GroupVersionKind) error {
110 return &noCorrespondingTypeErr{gvk: gvk}
111 }
112
113 func (k *noCorrespondingTypeErr) Error() string {
114 return fmt.Sprintf("no corresponding type for %v", k.gvk)
115 }
116
117 func isNoCorrespondingTypeError(err error) bool {
118 if err == nil {
119 return false
120 }
121 _, ok := err.(*noCorrespondingTypeErr)
122 return ok
123 }
124
View as plain text