mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 10:51:29 +00:00
Remove kubectl column output test
This commit is contained in:
parent
cb38560422
commit
a35ca04dd6
@ -19,20 +19,15 @@ go_library(
|
||||
"//staging/src/k8s.io/api/rbac/v1:go_default_library",
|
||||
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||
"//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library",
|
||||
"//staging/src/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/discovery:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||
"//staging/src/k8s.io/kubectl/pkg/polymorphichelpers:go_default_library",
|
||||
"//test/e2e/common:go_default_library",
|
||||
@ -44,7 +39,6 @@ go_library(
|
||||
"//test/e2e/framework/service:go_default_library",
|
||||
"//test/e2e/framework/testfiles:go_default_library",
|
||||
"//test/e2e/scheduling:go_default_library",
|
||||
"//test/integration/etcd:go_default_library",
|
||||
"//test/utils:go_default_library",
|
||||
"//test/utils/crd:go_default_library",
|
||||
"//test/utils/image:go_default_library",
|
||||
|
@ -48,20 +48,15 @@ import (
|
||||
rbacv1 "k8s.io/api/rbac/v1"
|
||||
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||
"k8s.io/apimachinery/pkg/util/rand"
|
||||
"k8s.io/apimachinery/pkg/util/uuid"
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
"k8s.io/apiserver/pkg/authentication/serviceaccount"
|
||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||
"k8s.io/client-go/discovery"
|
||||
"k8s.io/client-go/dynamic"
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/kubectl/pkg/polymorphichelpers"
|
||||
"k8s.io/kubernetes/pkg/controller"
|
||||
@ -74,7 +69,6 @@ import (
|
||||
e2eservice "k8s.io/kubernetes/test/e2e/framework/service"
|
||||
"k8s.io/kubernetes/test/e2e/framework/testfiles"
|
||||
"k8s.io/kubernetes/test/e2e/scheduling"
|
||||
"k8s.io/kubernetes/test/integration/etcd"
|
||||
testutils "k8s.io/kubernetes/test/utils"
|
||||
"k8s.io/kubernetes/test/utils/crd"
|
||||
imageutils "k8s.io/kubernetes/test/utils/image"
|
||||
@ -349,107 +343,6 @@ var _ = SIGDescribe("Kubectl client", func() {
|
||||
})
|
||||
})
|
||||
|
||||
ginkgo.Describe("kubectl get output", func() {
|
||||
ginkgo.It("should contain custom columns for each resource", func() {
|
||||
randString := rand.String(10)
|
||||
|
||||
ignoredResources := map[string]bool{
|
||||
// ignored for intentionally using standard fields.
|
||||
// This assumption is based on a lack of TableColumnDefinition
|
||||
// in pkg/printers/internalversion/printers.go
|
||||
"ClusterRole": true,
|
||||
"Role": true,
|
||||
"LimitRange": true,
|
||||
"PodPreset": true,
|
||||
|
||||
// ignored for being disruptive in an e2e, and getting automatically deleted by a controller
|
||||
"Node": true,
|
||||
|
||||
// ignored temporarily while waiting for bug fix.
|
||||
"CustomResourceDefinition": true,
|
||||
|
||||
// ignored because no test data exists.
|
||||
// Do not add anything to this list, instead add fixtures in
|
||||
// the test/integration/etcd package.
|
||||
"BackendConfig": true,
|
||||
"ComponentStatus": true,
|
||||
"NodeMetrics": true,
|
||||
"PodMetrics": true,
|
||||
"VolumeSnapshotClass": true,
|
||||
"VolumeSnapshotContent": true,
|
||||
"VolumeSnapshot": true,
|
||||
}
|
||||
|
||||
apiGroups, err := c.Discovery().ServerPreferredResources()
|
||||
|
||||
if discovery.IsGroupDiscoveryFailedError(err) {
|
||||
discoveryErr := err.(*discovery.ErrGroupDiscoveryFailed)
|
||||
for gv := range discoveryErr.Groups {
|
||||
if strings.Contains(gv.Group, ".") && !strings.HasSuffix(gv.Group, ".k8s.io") {
|
||||
// tolerate discovery errors for non-k8s.io groups (like aggregated/crd groups)
|
||||
continue
|
||||
}
|
||||
if gv.Group == "metrics.k8s.io" {
|
||||
// tolerate discovery errors for known test k8s.io groups like aggregated/metrics groups
|
||||
continue
|
||||
}
|
||||
// otherwise, fail
|
||||
framework.ExpectNoError(err)
|
||||
}
|
||||
} else {
|
||||
// fail immediately if this isn't a discovery error
|
||||
framework.ExpectNoError(err)
|
||||
|
||||
}
|
||||
|
||||
testableResources := etcd.GetEtcdStorageDataForNamespace(f.Namespace.Name)
|
||||
|
||||
for _, group := range apiGroups {
|
||||
// This limits the scope of this test to exclude CRDs. This
|
||||
// assumes that CRDs will not have a .k8s.io group and will have
|
||||
// a . in their name.
|
||||
if !strings.Contains(group.GroupVersion, ".k8s.io") && strings.Contains(group.GroupVersion, ".") {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, resource := range group.APIResources {
|
||||
if !verbsContain(resource.Verbs, "get") || ignoredResources[resource.Kind] || strings.HasPrefix(resource.Name, "e2e-test") {
|
||||
continue
|
||||
}
|
||||
|
||||
// compute gvr
|
||||
gv, err := schema.ParseGroupVersion(group.GroupVersion)
|
||||
framework.ExpectNoError(err)
|
||||
gvr := gv.WithResource(resource.Name)
|
||||
|
||||
// assert test data exists
|
||||
testData := testableResources[gvr]
|
||||
gomega.ExpectWithOffset(1, testData).ToNot(gomega.BeZero(), "No test data available for %s", gvr)
|
||||
|
||||
// create test resource
|
||||
mapping := &meta.RESTMapping{
|
||||
Resource: gvr,
|
||||
GroupVersionKind: gv.WithKind(resource.Kind),
|
||||
}
|
||||
|
||||
if resource.Namespaced {
|
||||
mapping.Scope = meta.RESTScopeNamespace
|
||||
} else {
|
||||
mapping.Scope = meta.RESTScopeRoot
|
||||
}
|
||||
|
||||
client, obj, err := etcd.JSONToUnstructured(testData.Stub, f.Namespace.Name, mapping, f.DynamicClient)
|
||||
framework.ExpectNoError(err)
|
||||
if resource.Kind != "APIService" && resource.Kind != "CustomResourceDefinition" {
|
||||
obj.SetName(obj.GetName() + randString)
|
||||
}
|
||||
|
||||
createObjValidateOutputAndCleanup(f.Namespace.Name, client, obj, resource)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
ginkgo.Describe("Simple pod", func() {
|
||||
var podYaml string
|
||||
ginkgo.BeforeEach(func() {
|
||||
@ -2224,52 +2117,3 @@ waitLoop:
|
||||
// Reaching here means that one of more checks failed multiple times. Assuming its not a race condition, something is broken.
|
||||
framework.Failf("Timed out after %v seconds waiting for %s pods to reach valid state", framework.PodStartTimeout.Seconds(), testname)
|
||||
}
|
||||
|
||||
// verbsContain returns true if the provided list of verbs contain the provided
|
||||
// verb string.
|
||||
func verbsContain(verbs metav1.Verbs, str string) bool {
|
||||
for _, v := range verbs {
|
||||
if v == str {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// deleteObj deletes an Object with the provided client and name.
|
||||
func deleteObj(client dynamic.ResourceInterface, name string) {
|
||||
err := client.Delete(context.TODO(), name, metav1.DeleteOptions{})
|
||||
framework.ExpectNoError(err)
|
||||
}
|
||||
|
||||
// createObjValidateOutputAndCleanup creates an object using the provided client
|
||||
// and then verifies that the kubectl get output provides custom columns. Once
|
||||
// the test has completed, it deletes the object.
|
||||
func createObjValidateOutputAndCleanup(namespace string, client dynamic.ResourceInterface, obj *unstructured.Unstructured, resource metav1.APIResource) {
|
||||
_, err := client.Create(context.TODO(), obj, metav1.CreateOptions{})
|
||||
framework.ExpectNoError(err)
|
||||
defer deleteObj(client, obj.GetName())
|
||||
|
||||
// get test resource
|
||||
output := framework.RunKubectlOrDie(namespace, "get", resource.Name, "--all-namespaces")
|
||||
if output == "" {
|
||||
framework.Failf("No stdout from kubectl get for %s (likely need to define test resources)", resource.Name)
|
||||
}
|
||||
|
||||
splitOutput := strings.SplitN(output, "\n", 2)
|
||||
fields := strings.Fields(splitOutput[0])
|
||||
|
||||
defaultColumns := [][]string{
|
||||
// namespaced, server-side
|
||||
{"NAMESPACE", "NAME", "CREATED", "AT"},
|
||||
// namespaced, client-side
|
||||
{"NAMESPACE", "NAME", "AGE"},
|
||||
// cluster-scoped, server-side
|
||||
{"NAME", "CREATED", "AT"},
|
||||
// cluster-scoped, client-side
|
||||
{"NAME", "AGE"},
|
||||
}
|
||||
for _, defaults := range defaultColumns {
|
||||
framework.ExpectNotEqual(fields, defaults, fmt.Sprintf("expected non-default fields for resource: %s", resource.Name))
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user