Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 33 additions & 20 deletions test/extended/cli/explain.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import (
g "github.com/onsi/ginkgo"
o "github.com/onsi/gomega"

apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
apiextensionsscheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
e2e "k8s.io/kubernetes/test/e2e/framework"

Expand Down Expand Up @@ -108,17 +112,17 @@ var (
{Group: "operator.openshift.io", Version: "v1", Resource: "openshiftapiservers"},

// FIXME
// {Group: "operator.openshift.io", Version: "v1", Resource: "authentications"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "credentialsrequestses"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "ingresscontrollers"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "kubeapiservers"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "kubecontrollermanagers"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "kubeschedulers"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "networks"},
{Group: "operator.openshift.io", Version: "v1", Resource: "authentications"},
{Group: "operator.openshift.io", Version: "v1", Resource: "ingresscontrollers"},
{Group: "operator.openshift.io", Version: "v1", Resource: "kubeapiservers"},
{Group: "operator.openshift.io", Version: "v1", Resource: "kubecontrollermanagers"},
{Group: "operator.openshift.io", Version: "v1", Resource: "kubeschedulers"},
{Group: "operator.openshift.io", Version: "v1", Resource: "openshiftcontrollermanagers"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "servicecas"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "servicecatalogapiservers"},
// {Group: "operator.openshift.io", Version: "v1", Resource: "servicecatalogcontrollermanagers"},
{Group: "operator.openshift.io", Version: "v1", Resource: "servicecas"},
{Group: "operator.openshift.io", Version: "v1", Resource: "servicecatalogapiservers"},
{Group: "operator.openshift.io", Version: "v1", Resource: "servicecatalogcontrollermanagers"},

{Group: "quota.openshift.io", Version: "v1", Resource: "appliedclusterresourcequotas"},

Expand All @@ -130,11 +134,9 @@ var (
// FIXME
// {Group: "ingress.operator.openshift.io", Version: "v1", Resource: "dnsrecords"},

// FIXME
// {Group: "samples.operator.openshift.io", Version: "v1", Resource: "configs"},
{Group: "samples.operator.openshift.io", Version: "v1", Resource: "configs"},

// FIXME
// {Group: "tuned.openshift.io", Version: "v1", Resource: "tuneds"},
{Group: "tuned.openshift.io", Version: "v1", Resource: "tuneds"},

// FIXME
// {Group: "network.openshift.io", Version: "v1", Resource: "clusternetworks"},
Expand Down Expand Up @@ -327,45 +329,56 @@ var _ = g.Describe("[cli] oc explain", func() {
defer g.GinkgoRecover()

oc := exutil.NewCLI("oc-explain", exutil.KubeConfigPath())
crdClient := apiextensionsclientset.NewForConfigOrDie(oc.AdminConfig())

g.It("should contain spec+status for builtinTypes", func() {
for _, bt := range builtinTypes {
e2e.Logf("Checking %s...", bt)
o.Expect(verifySpecStatusExplain(oc, bt)).NotTo(o.HaveOccurred())
o.Expect(verifySpecStatusExplain(oc, nil, bt)).NotTo(o.HaveOccurred())
}
})

g.It("should contain proper spec+status for CRDs", func() {
for _, ct := range crdTypes {
e2e.Logf("Checking %s...", ct)
o.Expect(verifyCRDSpecStatusExplain(oc, ct)).NotTo(o.HaveOccurred())
o.Expect(verifyCRDSpecStatusExplain(oc, crdClient, ct)).NotTo(o.HaveOccurred())
}
})

g.It("should contain proper fields description for special types", func() {
for _, st := range specialTypes {
e2e.Logf("Checking %s, Field=%s...", st.gv, st.field)
o.Expect(verifyExplain(oc, st.pattern, st.field, fmt.Sprintf("--api-version=%s", st.gv))).NotTo(o.HaveOccurred())
o.Expect(verifyExplain(oc, nil, schema.GroupVersionResource{},
st.pattern, st.field, fmt.Sprintf("--api-version=%s", st.gv))).NotTo(o.HaveOccurred())
}
})
})

func verifySpecStatusExplain(oc *exutil.CLI, gvr schema.GroupVersionResource) error {
return verifyExplain(oc, `(?s)DESCRIPTION:.*FIELDS:.*spec.*<Object>.*[Ss]pec(ification)?.*status.*<Object>.*[Ss]tatus.*`, gvr.Resource, fmt.Sprintf("--api-version=%s", gvr.GroupVersion()))
func verifySpecStatusExplain(oc *exutil.CLI, crdClient apiextensionsclientset.Interface, gvr schema.GroupVersionResource) error {
return verifyExplain(oc, crdClient, gvr,
`(?s)DESCRIPTION:.*FIELDS:.*spec.*<Object>.*[Ss]pec(ification)?.*status.*<Object>.*[Ss]tatus.*`,
gvr.Resource, fmt.Sprintf("--api-version=%s", gvr.GroupVersion()))
}

func verifyCRDSpecStatusExplain(oc *exutil.CLI, gvr schema.GroupVersionResource) error {
func verifyCRDSpecStatusExplain(oc *exutil.CLI, crdClient apiextensionsclientset.Interface, gvr schema.GroupVersionResource) error {
// TODO ideally we'd want to check for reasonable description in both spec and status
return verifyExplain(oc, `(?s)DESCRIPTION:.*FIELDS:.*spec.*<.*>.*(status.*<.*>.*)?`, gvr.Resource, fmt.Sprintf("--api-version=%s", gvr.GroupVersion()))
return verifyExplain(oc, crdClient, gvr,
`(?s)DESCRIPTION:.*FIELDS:.*spec.*<.*>.*(status.*<.*>.*)?`,
gvr.Resource, fmt.Sprintf("--api-version=%s", gvr.GroupVersion()))
}

func verifyExplain(oc *exutil.CLI, pattern string, args ...string) error {
func verifyExplain(oc *exutil.CLI, crdClient apiextensionsclientset.Interface, gvr schema.GroupVersionResource, pattern string, args ...string) error {
result, err := oc.Run("explain").Args(args...).Output()
if err != nil {
return fmt.Errorf("failed to explain %q: %v", args, err)
}
r := regexp.MustCompile(pattern)
if !r.Match([]byte(result)) {
if crdClient != nil {
if crd, err := crdClient.ApiextensionsV1().CustomResourceDefinitions().Get(gvr.GroupResource().String(), metav1.GetOptions{}); err == nil {
e2e.Logf("CRD yaml is:\n%s\n", runtime.EncodeOrDie(apiextensionsscheme.Codecs.LegacyCodec(apiextensionsscheme.Scheme.PrioritizedVersionsAllGroups()...), crd))
}
}
return fmt.Errorf("oc explain %q result {%s} doesn't match pattern {%s}", args, result, pattern)
}
return nil
Expand Down