...
1
16
17 package discovery
18
19 import (
20 "fmt"
21
22 apierrors "k8s.io/apimachinery/pkg/api/errors"
23 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24 "k8s.io/apimachinery/pkg/runtime/schema"
25 "k8s.io/apimachinery/pkg/util/sets"
26 apimachineryversion "k8s.io/apimachinery/pkg/version"
27 )
28
29
30
31 func IsResourceEnabled(client DiscoveryInterface, resourceToCheck schema.GroupVersionResource) (bool, error) {
32
33 resourceList, err := client.ServerResourcesForGroupVersion(resourceToCheck.GroupVersion().String())
34 if apierrors.IsNotFound(err) {
35 return false, nil
36 }
37 if err != nil {
38 return false, err
39 }
40 for _, actualResource := range resourceList.APIResources {
41 if actualResource.Name == resourceToCheck.Resource {
42 return true, nil
43 }
44 }
45
46 return false, nil
47 }
48
49
50
51
52 func MatchesServerVersion(clientVersion apimachineryversion.Info, client DiscoveryInterface) error {
53 sVer, err := client.ServerVersion()
54 if err != nil {
55 return fmt.Errorf("couldn't read version from server: %v", err)
56 }
57
58 if clientVersion.GitVersion != sVer.GitVersion || clientVersion.GitCommit != sVer.GitCommit || clientVersion.GitTreeState != sVer.GitTreeState {
59 return fmt.Errorf("server version (%#v) differs from client version (%#v)", sVer, clientVersion)
60 }
61
62 return nil
63 }
64
65
66 func ServerSupportsVersion(client DiscoveryInterface, requiredGV schema.GroupVersion) error {
67 groups, err := client.ServerGroups()
68 if err != nil {
69
70
71 return err
72 }
73 versions := metav1.ExtractGroupVersions(groups)
74 serverVersions := sets.String{}
75 for _, v := range versions {
76 serverVersions.Insert(v)
77 }
78
79 if serverVersions.Has(requiredGV.String()) {
80 return nil
81 }
82
83
84
85 if len(serverVersions) == 0 {
86 return nil
87 }
88
89 return fmt.Errorf("server does not support API version %q", requiredGV)
90 }
91
92
93 func GroupVersionResources(rls []*metav1.APIResourceList) (map[schema.GroupVersionResource]struct{}, error) {
94 gvrs := map[schema.GroupVersionResource]struct{}{}
95 for _, rl := range rls {
96 gv, err := schema.ParseGroupVersion(rl.GroupVersion)
97 if err != nil {
98 return nil, err
99 }
100 for i := range rl.APIResources {
101 gvrs[schema.GroupVersionResource{Group: gv.Group, Version: gv.Version, Resource: rl.APIResources[i].Name}] = struct{}{}
102 }
103 }
104 return gvrs, nil
105 }
106
107
108 func FilteredBy(pred ResourcePredicate, rls []*metav1.APIResourceList) []*metav1.APIResourceList {
109 result := []*metav1.APIResourceList{}
110 for _, rl := range rls {
111 filtered := *rl
112 filtered.APIResources = nil
113 for i := range rl.APIResources {
114 if pred.Match(rl.GroupVersion, &rl.APIResources[i]) {
115 filtered.APIResources = append(filtered.APIResources, rl.APIResources[i])
116 }
117 }
118 if filtered.APIResources != nil {
119 result = append(result, &filtered)
120 }
121 }
122 return result
123 }
124
125
126 type ResourcePredicate interface {
127 Match(groupVersion string, r *metav1.APIResource) bool
128 }
129
130
131 type ResourcePredicateFunc func(groupVersion string, r *metav1.APIResource) bool
132
133
134 func (fn ResourcePredicateFunc) Match(groupVersion string, r *metav1.APIResource) bool {
135 return fn(groupVersion, r)
136 }
137
138
139 type SupportsAllVerbs struct {
140 Verbs []string
141 }
142
143
144 func (p SupportsAllVerbs) Match(groupVersion string, r *metav1.APIResource) bool {
145 return sets.NewString([]string(r.Verbs)...).HasAll(p.Verbs...)
146 }
147
View as plain text