@@ -12,6 +12,7 @@ import (
12
12
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
13
14
14
"k8s.io/apimachinery/pkg/api/meta"
15
+ "k8s.io/apimachinery/pkg/runtime/schema"
15
16
"k8s.io/client-go/discovery"
16
17
"k8s.io/client-go/openapi"
17
18
"k8s.io/kube-openapi/pkg/validation/spec"
23
24
ErrGVKNotPreferred = errors .New ("failed to find CRD GVK in API preferred resources" )
24
25
)
25
26
27
+ type GroupKindVersions struct {
28
+ * metav1.GroupKind
29
+ Versions []string
30
+ }
31
+
26
32
type CRDResolver struct {
27
33
* discovery.DiscoveryClient
28
34
meta.RESTMapper
@@ -33,44 +39,44 @@ func (cr *CRDResolver) Resolve() ([]byte, error) {
33
39
}
34
40
35
41
func (cr * CRDResolver ) ResolveApiSchema (crd * apiextensionsv1.CustomResourceDefinition ) ([]byte , error ) {
36
- gvk , err := getCRDGroupVersionKind (crd .Spec )
37
- if err != nil {
38
- return nil , fmt .Errorf ("failed to get CRD GVK: %w" , err )
39
- }
42
+ gkv := getCRDGroupKindVersions (crd .Spec )
40
43
41
44
apiResLists , err := cr .ServerPreferredResources ()
42
45
if err != nil {
43
46
return nil , fmt .Errorf ("failed to get server preferred resources: %w" , err )
44
47
}
45
48
46
- preferredApiGroups , err := errorIfCRDNotInPreferredApiGroups (gvk , apiResLists )
49
+ preferredApiGroups , err := errorIfCRDNotInPreferredApiGroups (gkv , apiResLists )
47
50
if err != nil {
48
51
return nil , fmt .Errorf ("failed to filter server preferred resources: %w" , err )
49
52
}
50
53
51
54
return resolveForPaths (cr .OpenAPIV3 (), preferredApiGroups , cr .RESTMapper )
52
55
}
53
56
54
- func errorIfCRDNotInPreferredApiGroups (gvk * metav1.GroupVersionKind , apiResLists []* metav1.APIResourceList ) ([]string , error ) {
55
- targetGV := gvk .Group + "/" + gvk .Version
56
- isGVFound := false
57
+ func errorIfCRDNotInPreferredApiGroups (gkv * GroupKindVersions , apiResLists []* metav1.APIResourceList ) ([]string , error ) {
58
+ isKindFound := false
57
59
preferredApiGroups := make ([]string , 0 , len (apiResLists ))
58
60
for _ , apiResources := range apiResLists {
59
- gv := apiResources .GroupVersion
60
- isGVFound = gv == targetGV
61
- if isGVFound && ! isCRDKindIncluded (gvk , apiResources ) {
62
- return nil , ErrGVKNotPreferred
61
+ gv , err := schema .ParseGroupVersion (apiResources .GroupVersion )
62
+ if err != nil {
63
+ //TODO: debug log?
64
+ continue
65
+ }
66
+ isGroupFound := gkv .Group == gv .Group
67
+ isVersionFound := slices .Contains (gkv .Versions , gv .Version )
68
+ if isGroupFound && isVersionFound && ! isKindFound {
69
+ isKindFound = isCRDKindIncluded (gkv , apiResources )
63
70
}
64
- preferredApiGroups = append (preferredApiGroups , gv )
71
+ preferredApiGroups = append (preferredApiGroups , apiResources . GroupVersion )
65
72
}
66
-
67
- if ! isGVFound {
73
+ if ! isKindFound {
68
74
return nil , ErrGVKNotPreferred
69
75
}
70
76
return preferredApiGroups , nil
71
77
}
72
78
73
- func isCRDKindIncluded (gvk * metav1. GroupVersionKind , apiResources * metav1.APIResourceList ) bool {
79
+ func isCRDKindIncluded (gvk * GroupKindVersions , apiResources * metav1.APIResourceList ) bool {
74
80
for _ , res := range apiResources .APIResources {
75
81
if res .Kind == gvk .Kind {
76
82
return true
@@ -79,17 +85,18 @@ func isCRDKindIncluded(gvk *metav1.GroupVersionKind, apiResources *metav1.APIRes
79
85
return false
80
86
}
81
87
82
- func getCRDGroupVersionKind (spec apiextensionsv1.CustomResourceDefinitionSpec ) (* metav1.GroupVersionKind , error ) {
88
+ func getCRDGroupKindVersions (spec apiextensionsv1.CustomResourceDefinitionSpec ) * GroupKindVersions {
89
+ versions := make ([]string , 0 , len (spec .Versions ))
83
90
for _ , v := range spec .Versions {
84
- if v .Storage {
85
- return & metav1.GroupVersionKind {
86
- Group : spec .Group ,
87
- Version : v .Name ,
88
- Kind : spec .Names .Kind ,
89
- }, nil
90
- }
91
+ versions = append (versions , v .Name )
92
+ }
93
+ return & GroupKindVersions {
94
+ GroupKind : & metav1.GroupKind {
95
+ Group : spec .Group ,
96
+ Kind : spec .Names .Kind ,
97
+ },
98
+ Versions : versions ,
91
99
}
92
- return nil , errors .New ("failed to find storage version" )
93
100
}
94
101
95
102
func getSchemaForPath (preferredApiGroups []string , path string , gv openapi.GroupVersion ) (map [string ]* spec.Schema , error ) {
0 commit comments