Skip to content

Commit 9cf4d51

Browse files
Merge pull request #22696 from soltysh/e2e_explain
Migrate oc explain tests to extended
2 parents 4889d78 + b58b9f6 commit 9cf4d51

2 files changed

Lines changed: 296 additions & 30 deletions

File tree

test/cmd/explain.sh

Lines changed: 0 additions & 30 deletions
This file was deleted.

test/extended/cli/explain.go

Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
package cli
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
7+
g "github.com/onsi/ginkgo"
8+
o "github.com/onsi/gomega"
9+
10+
"k8s.io/apimachinery/pkg/runtime/schema"
11+
e2e "k8s.io/kubernetes/test/e2e/framework"
12+
13+
exutil "github.com/openshift/origin/test/extended/util"
14+
)
15+
16+
type explainExceptions struct {
17+
gv schema.GroupVersion
18+
field string
19+
pattern string
20+
}
21+
22+
var (
23+
builtinTypes = []schema.GroupVersionResource{
24+
{Group: "apps.openshift.io", Version: "v1", Resource: "deploymentconfigs"},
25+
26+
{Group: "build.openshift.io", Version: "v1", Resource: "buildconfigs"},
27+
{Group: "build.openshift.io", Version: "v1", Resource: "builds"},
28+
29+
{Group: "image.openshift.io", Version: "v1", Resource: "imagestreamimports"},
30+
{Group: "image.openshift.io", Version: "v1", Resource: "imagestreams"},
31+
32+
{Group: "project.openshift.io", Version: "v1", Resource: "projects"},
33+
34+
{Group: "route.openshift.io", Version: "v1", Resource: "routes"},
35+
36+
{Group: "security.openshift.io", Version: "v1", Resource: "podsecuritypolicyreviews"},
37+
{Group: "security.openshift.io", Version: "v1", Resource: "podsecuritypolicyselfsubjectreviews"},
38+
{Group: "security.openshift.io", Version: "v1", Resource: "podsecuritypolicysubjectreviews"},
39+
40+
{Group: "template.openshift.io", Version: "v1", Resource: "templateinstances"},
41+
}
42+
43+
crdTypes = []schema.GroupVersionResource{
44+
{Group: "operators.coreos.com", Version: "v1", Resource: "catalogsourceconfigs"},
45+
// FIXME:
46+
// schema.GroupVersionResource{Group: "operators.coreos.com", Version: "v1", Resource: "catalogsources"},
47+
// schema.GroupVersionResource{Group: "operators.coreos.com", Version: "v1", Resource: "clusterserviceversions"},
48+
// schema.GroupVersionResource{Group: "operators.coreos.com", Version: "v1", Resource: "installplans"},
49+
{Group: "operators.coreos.com", Version: "v1", Resource: "operatorgroups"},
50+
{Group: "operators.coreos.com", Version: "v1", Resource: "operatorsources"},
51+
// FIXME:
52+
// schema.GroupVersionResource{Group: "operators.coreos.com", Version: "v1", Resource: "subscriptions"},
53+
54+
{Group: "autoscaling.openshift.io", Version: "v1", Resource: "clusterautoscalers"},
55+
// FIXME:
56+
// schema.GroupVersionResource{Group: "autoscaling.openshift.io", Version: "v1", Resource: "machineautoscalers"},
57+
58+
{Group: "config.openshift.io", Version: "v1", Resource: "apiservers"},
59+
{Group: "config.openshift.io", Version: "v1", Resource: "authentications"},
60+
{Group: "config.openshift.io", Version: "v1", Resource: "builds"},
61+
// fixed in https://github.com/openshift/cluster-version-operator/pull/168
62+
// schema.GroupVersionResource{Group: "config.openshift.io", Version: "v1", Resource: "clusteroperators"},
63+
// schema.GroupVersionResource{Group: "config.openshift.io", Version: "v1", Resource: "clusterversions"},
64+
{Group: "config.openshift.io", Version: "v1", Resource: "consoles"},
65+
{Group: "config.openshift.io", Version: "v1", Resource: "dnses"},
66+
{Group: "config.openshift.io", Version: "v1", Resource: "featuregates"},
67+
{Group: "config.openshift.io", Version: "v1", Resource: "images"},
68+
{Group: "config.openshift.io", Version: "v1", Resource: "infrastructures"},
69+
{Group: "config.openshift.io", Version: "v1", Resource: "ingresses"},
70+
{Group: "config.openshift.io", Version: "v1", Resource: "networks"},
71+
{Group: "config.openshift.io", Version: "v1", Resource: "oauths"},
72+
{Group: "config.openshift.io", Version: "v1", Resource: "projects"},
73+
{Group: "config.openshift.io", Version: "v1", Resource: "schedulers"},
74+
75+
{Group: "cloudcredential.openshift.io", Version: "v1", Resource: "credentialsrequests"},
76+
77+
// FIXME
78+
// schema.GroupVersionResource{Group: "healthchecking.openshift.io", Version: "v1", Resource: "machinehealthchecks"},
79+
// schema.GroupVersionResource{Group: "imageregistry.operator.openshift", Version: "v1", Resource: "configs"},
80+
81+
{Group: "machine.openshift.io", Version: "v1beta1", Resource: "machines"},
82+
{Group: "machine.openshift.io", Version: "v1beta1", Resource: "machinesets"},
83+
84+
{Group: "monitoring.coreos.com", Version: "v1", Resource: "alertmanagers"},
85+
{Group: "monitoring.coreos.com", Version: "v1", Resource: "prometheuses"},
86+
{Group: "monitoring.coreos.com", Version: "v1", Resource: "prometheusrules"},
87+
{Group: "monitoring.coreos.com", Version: "v1", Resource: "servicemonitors"},
88+
89+
// FIXME
90+
// schema.GroupVersionResource{Group: "machineconfiguration.openshift.io", Version: "v1", Resource: "containerruntimeconfigs"},
91+
// schema.GroupVersionResource{Group: "machineconfiguration.openshift.io", Version: "v1", Resource: "controllerconfigs"},
92+
// schema.GroupVersionResource{Group: "machineconfiguration.openshift.io", Version: "v1", Resource: "kubeletconfigs"},
93+
// schema.GroupVersionResource{Group: "machineconfiguration.openshift.io", Version: "v1", Resource: "machineconfigpools"},
94+
// schema.GroupVersionResource{Group: "machineconfiguration.openshift.io", Version: "v1", Resource: "machineconfigs"},
95+
// schema.GroupVersionResource{Group: "machineconfiguration.openshift.io", Version: "v1", Resource: "mcoconfigs"},
96+
97+
{Group: "network.openshift.io", Version: "v1", Resource: "egressnetworkpolicies"},
98+
99+
{Group: "operator.openshift.io", Version: "v1", Resource: "authentications"},
100+
{Group: "operator.openshift.io", Version: "v1", Resource: "consoles"},
101+
{Group: "operator.openshift.io", Version: "v1", Resource: "dnses"},
102+
{Group: "operator.openshift.io", Version: "v1", Resource: "ingresscontrollers"},
103+
{Group: "operator.openshift.io", Version: "v1", Resource: "kubeapiservers"},
104+
{Group: "operator.openshift.io", Version: "v1", Resource: "kubecontrollermanagers"},
105+
{Group: "operator.openshift.io", Version: "v1", Resource: "kubeschedulers"},
106+
{Group: "operator.openshift.io", Version: "v1", Resource: "networks"},
107+
{Group: "operator.openshift.io", Version: "v1", Resource: "openshiftapiservers"},
108+
{Group: "operator.openshift.io", Version: "v1", Resource: "openshiftcontrollermanagers"},
109+
{Group: "operator.openshift.io", Version: "v1", Resource: "servicecas"},
110+
{Group: "operator.openshift.io", Version: "v1", Resource: "servicecatalogapiservers"},
111+
{Group: "operator.openshift.io", Version: "v1", Resource: "servicecatalogcontrollermanagers"},
112+
113+
{Group: "quota.openshift.io", Version: "v1", Resource: "clusterresourcequotas"},
114+
115+
// FIXME
116+
// schema.GroupVersionResource{Group: "samples.operator.openshift.io", Version: "v1", Resource: "configs"},
117+
118+
{Group: "tuned.openshift.io", Version: "v1", Resource: "tuneds"},
119+
}
120+
121+
specialTypes = []explainExceptions{
122+
{
123+
gv: schema.GroupVersion{Group: "apps.openshift.io", Version: "v1"},
124+
field: "dc.status.replicas",
125+
pattern: `FIELD\: +replicas`,
126+
},
127+
{
128+
gv: schema.GroupVersion{Group: "route.openshift.io", Version: "v1"},
129+
field: "route.metadata.name",
130+
pattern: `string`,
131+
},
132+
{
133+
gv: schema.GroupVersion{Group: "authorization.openshift.io", Version: "v1"},
134+
field: "resourceaccessreviews.resourceAPIGroup",
135+
pattern: `FIELD\: +resourceAPIGroup`,
136+
},
137+
{
138+
gv: schema.GroupVersion{Group: "authorization.openshift.io", Version: "v1"},
139+
field: "resourceaccessreviews.resourceAPIVersion",
140+
pattern: `FIELD\: +resourceAPIVersion`,
141+
},
142+
{
143+
gv: schema.GroupVersion{Group: "authorization.openshift.io", Version: "v1"},
144+
field: "rolebindingrestrictions.spec",
145+
pattern: `FIELDS\:.*`,
146+
},
147+
{
148+
gv: schema.GroupVersion{Group: "image.openshift.io", Version: "v1"},
149+
field: "images.dockerImageReference",
150+
pattern: `FIELD\: +dockerImageReference.*<string>`,
151+
},
152+
{
153+
gv: schema.GroupVersion{Group: "image.openshift.io", Version: "v1"},
154+
field: "imagesignatures.imageIdentity",
155+
pattern: `FIELD\: +imageIdentity`,
156+
},
157+
{
158+
gv: schema.GroupVersion{Group: "image.openshift.io", Version: "v1"},
159+
field: "imagestreamimages.image",
160+
pattern: `FIELDS\:.*`,
161+
},
162+
{
163+
gv: schema.GroupVersion{Group: "image.openshift.io", Version: "v1"},
164+
field: "imagestreammappings.image",
165+
pattern: `FIELDS\:.*`,
166+
},
167+
{
168+
gv: schema.GroupVersion{Group: "image.openshift.io", Version: "v1"},
169+
field: "imagestreamtags.tag",
170+
pattern: `FIELDS\:.*`,
171+
},
172+
{
173+
gv: schema.GroupVersion{Group: "oauth.openshift.io", Version: "v1"},
174+
field: "oauthaccesstokens.refreshToken",
175+
pattern: `FIELD\: +refreshToken`,
176+
},
177+
{
178+
gv: schema.GroupVersion{Group: "oauth.openshift.io", Version: "v1"},
179+
field: "oauthauthorizetokens.redirectURI",
180+
pattern: `FIELD\: +redirectURI`,
181+
},
182+
{
183+
gv: schema.GroupVersion{Group: "oauth.openshift.io", Version: "v1"},
184+
field: "oauthclientauthorizations.scopes",
185+
pattern: `FIELD\: +scopes`,
186+
},
187+
{
188+
gv: schema.GroupVersion{Group: "oauth.openshift.io", Version: "v1"},
189+
field: "oauthclients.redirectURIs",
190+
pattern: `FIELD\: +redirectURIs`,
191+
},
192+
{
193+
gv: schema.GroupVersion{Group: "project.openshift.io", Version: "v1"},
194+
field: "projectrequests.displayName",
195+
pattern: `FIELD\: +displayName`,
196+
},
197+
{
198+
gv: schema.GroupVersion{Group: "security.openshift.io", Version: "v1"},
199+
field: "rangeallocations.range",
200+
pattern: `FIELD\: +range`,
201+
},
202+
{
203+
gv: schema.GroupVersion{Group: "template.openshift.io", Version: "v1"},
204+
field: "processedtemplates.objects",
205+
pattern: `FIELDS\:.*`,
206+
},
207+
{
208+
gv: schema.GroupVersion{Group: "template.openshift.io", Version: "v1"},
209+
field: "templates.objects",
210+
pattern: `FIELDS\:.*`,
211+
},
212+
{
213+
gv: schema.GroupVersion{Group: "user.openshift.io", Version: "v1"},
214+
field: "identities.user",
215+
pattern: `FIELDS\:.*`,
216+
},
217+
{
218+
gv: schema.GroupVersion{Group: "user.openshift.io", Version: "v1"},
219+
field: "groups.users",
220+
pattern: `FIELD\: +users`,
221+
},
222+
{
223+
gv: schema.GroupVersion{Group: "user.openshift.io", Version: "v1"},
224+
field: "useridentitymappings.user",
225+
pattern: `FIELDS\:.*`,
226+
},
227+
{
228+
gv: schema.GroupVersion{Group: "user.openshift.io", Version: "v1"},
229+
field: "users.fullName",
230+
pattern: `FIELD\: +fullName`,
231+
},
232+
{
233+
gv: schema.GroupVersion{Group: "network.openshift.io", Version: "v1"},
234+
field: "clusternetworks.network",
235+
pattern: `FIELD\: +network`,
236+
},
237+
{
238+
gv: schema.GroupVersion{Group: "network.openshift.io", Version: "v1"},
239+
field: "hostsubnets.subnet",
240+
pattern: `FIELD\: +subnet`,
241+
},
242+
{
243+
gv: schema.GroupVersion{Group: "network.openshift.io", Version: "v1"},
244+
field: "netnamespaces.netname",
245+
pattern: `FIELD\: +netname`,
246+
},
247+
}
248+
)
249+
250+
var _ = g.Describe("[cli] oc explain", func() {
251+
defer g.GinkgoRecover()
252+
253+
oc := exutil.NewCLI("oc-explain", exutil.KubeConfigPath())
254+
255+
g.It("should contain spec+status for builtinTypes", func() {
256+
for _, bt := range builtinTypes {
257+
e2e.Logf("Checking %s...", bt)
258+
o.Expect(verifySpecStatusExplain(oc, bt)).NotTo(o.HaveOccurred())
259+
}
260+
})
261+
262+
g.It("should contain proper spec+status for CRDs", func() {
263+
for _, ct := range crdTypes {
264+
e2e.Logf("Checking %s...", ct)
265+
o.Expect(verifyCRDSpecStatusExplain(oc, ct)).NotTo(o.HaveOccurred())
266+
}
267+
})
268+
269+
g.It("should contain proper fields description for special types", func() {
270+
for _, st := range specialTypes {
271+
e2e.Logf("Checking %s, Field=%s...", st.gv, st.field)
272+
o.Expect(verifyExplain(oc, st.pattern, st.field, fmt.Sprintf("--api-version=%s", st.gv))).NotTo(o.HaveOccurred())
273+
}
274+
})
275+
})
276+
277+
func verifySpecStatusExplain(oc *exutil.CLI, gvr schema.GroupVersionResource) error {
278+
return verifyExplain(oc, `(?s)DESCRIPTION:.*FIELDS:.*spec.*<Object>.*[Ss]pec(ification)?.*status.*<Object>.*[Ss]tatus.*`, gvr.Resource, fmt.Sprintf("--api-version=%s", gvr.GroupVersion()))
279+
}
280+
281+
func verifyCRDSpecStatusExplain(oc *exutil.CLI, gvr schema.GroupVersionResource) error {
282+
// TODO ideally we'd want to check for reasonable description in both spec and status
283+
return verifyExplain(oc, `(?s)DESCRIPTION:.*FIELDS:.*spec.*<.*>.*(status.*<.*>.*)?`, gvr.Resource, fmt.Sprintf("--api-version=%s", gvr.GroupVersion()))
284+
}
285+
286+
func verifyExplain(oc *exutil.CLI, pattern string, args ...string) error {
287+
result, err := oc.Run("explain").Args(args...).Output()
288+
if err != nil {
289+
return fmt.Errorf("failed to explain %q: %v", args, err)
290+
}
291+
r := regexp.MustCompile(pattern)
292+
if !r.Match([]byte(result)) {
293+
return fmt.Errorf("oc explain %q result {%s} doesn't match pattern {%s}", args, result, pattern)
294+
}
295+
return nil
296+
}

0 commit comments

Comments
 (0)