diff --git a/hack/make-rules/test.sh b/hack/make-rules/test.sh index 4dc755988df..f70a4b966dd 100755 --- a/hack/make-rules/test.sh +++ b/hack/make-rules/test.sh @@ -81,13 +81,6 @@ KUBE_COVERPROCS=${KUBE_COVERPROCS:-4} KUBE_RACE=${KUBE_RACE:-} # use KUBE_RACE="-race" to enable race testing # Set to the goveralls binary path to report coverage results to Coveralls.io. KUBE_GOVERALLS_BIN=${KUBE_GOVERALLS_BIN:-} -# Lists of API Versions of each groups that should be tested, groups are -# separated by comma, lists are separated by semicolon. e.g., -# "v1,compute/v1alpha1,experimental/v1alpha2;v1,compute/v2,experimental/v1alpha3" -# FIXME: due to current implementation of a test client (see: pkg/api/testapi/testapi.go) -# ONLY the last version is tested in each group. -ALL_VERSIONS_CSV=$(IFS=',';echo "${KUBE_AVAILABLE_GROUP_VERSIONS[*]// /,}";IFS=$) -KUBE_TEST_API_VERSIONS="${KUBE_TEST_API_VERSIONS:-${ALL_VERSIONS_CSV}}" # once we have multiple group supports # Create a junit-style XML test report in this directory if set. KUBE_JUNIT_REPORT_DIR=${KUBE_JUNIT_REPORT_DIR:-} @@ -372,16 +365,7 @@ checkFDs() { checkFDs - -# Convert the CSVs to arrays. -IFS=';' read -r -a apiVersions <<< "${KUBE_TEST_API_VERSIONS}" -apiVersionsCount=${#apiVersions[@]} -for (( i=0; i 0 { - var ok bool - mediaType, _, err := mime.ParseMediaType(apiMediaType) - if err != nil { - panic(err) - } - serializer, ok = runtime.SerializerInfoForMediaType(legacyscheme.Codecs.SupportedMediaTypes(), mediaType) - if !ok { - panic(fmt.Sprintf("no serializer for %s", apiMediaType)) - } - } - - if storageMediaType := StorageMediaType(); len(storageMediaType) > 0 { - var ok bool - mediaType, _, err := mime.ParseMediaType(storageMediaType) - if err != nil { - panic(err) - } - storageSerializer, ok = runtime.SerializerInfoForMediaType(legacyscheme.Codecs.SupportedMediaTypes(), mediaType) - if !ok { - panic(fmt.Sprintf("no serializer for %s", storageMediaType)) - } - } - - kubeTestAPI := os.Getenv("KUBE_TEST_API") - if len(kubeTestAPI) != 0 { - // priority is "first in list preferred", so this has to run in reverse order - testGroupVersions := strings.Split(kubeTestAPI, ",") - for i := len(testGroupVersions) - 1; i >= 0; i-- { - gvString := testGroupVersions[i] - groupVersion, err := schema.ParseGroupVersion(gvString) - if err != nil { - panic(fmt.Sprintf("Error parsing groupversion %v: %v", gvString, err)) - } - - Groups[groupVersion.Group] = TestGroup{ - externalGroupVersion: groupVersion, - } - } - } - - if _, ok := Groups[api.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: api.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(api.GroupName)[0].Version} - Groups[api.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[extensions.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: extensions.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(extensions.GroupName)[0].Version} - Groups[extensions.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[autoscaling.GroupName]; !ok { - internalTypes := make(map[string]reflect.Type) - for k, t := range legacyscheme.Scheme.KnownTypes(extensions.SchemeGroupVersion) { - if k == "Scale" { - continue - } - internalTypes[k] = t - } - externalGroupVersion := schema.GroupVersion{Group: autoscaling.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(autoscaling.GroupName)[0].Version} - Groups[autoscaling.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[autoscaling.GroupName+"IntraGroup"]; !ok { - internalTypes := make(map[string]reflect.Type) - for k, t := range legacyscheme.Scheme.KnownTypes(extensions.SchemeGroupVersion) { - if k == "Scale" { - internalTypes[k] = t - break - } - } - externalGroupVersion := schema.GroupVersion{Group: autoscaling.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(autoscaling.GroupName)[0].Version} - Groups[autoscaling.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[batch.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: batch.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(batch.GroupName)[0].Version} - Groups[batch.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[apps.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: apps.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(apps.GroupName)[0].Version} - Groups[apps.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[policy.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: policy.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(policy.GroupName)[0].Version} - Groups[policy.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[rbac.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: rbac.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(rbac.GroupName)[0].Version} - Groups[rbac.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[scheduling.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: scheduling.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(scheduling.GroupName)[0].Version} - Groups[scheduling.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[settings.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: settings.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(settings.GroupName)[0].Version} - Groups[settings.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[storage.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: storage.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(storage.GroupName)[0].Version} - Groups[storage.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[certificates.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: certificates.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(certificates.GroupName)[0].Version} - Groups[certificates.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[imagepolicy.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: imagepolicy.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(imagepolicy.GroupName)[0].Version} - Groups[imagepolicy.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[authorization.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: authorization.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(authorization.GroupName)[0].Version} - Groups[authorization.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[admissionregistration.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: admissionregistration.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(admissionregistration.GroupName)[0].Version} - Groups[admissionregistration.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[admission.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: admission.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(admission.GroupName)[0].Version} - Groups[admission.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[networking.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: networking.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(networking.GroupName)[0].Version} - Groups[networking.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[node.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: node.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(node.GroupName)[0].Version} - Groups[node.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[events.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: events.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(events.GroupName)[0].Version} - Groups[events.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[coordination.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: coordination.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(coordination.GroupName)[0].Version} - Groups[coordination.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[auditregistration.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: auditregistration.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(auditregistration.GroupName)[0].Version} - Groups[auditregistration.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - if _, ok := Groups[discovery.GroupName]; !ok { - externalGroupVersion := schema.GroupVersion{Group: discovery.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(discovery.GroupName)[0].Version} - Groups[discovery.GroupName] = TestGroup{ - externalGroupVersion: externalGroupVersion, - } - } - - Default = Groups[api.GroupName] - Autoscaling = Groups[autoscaling.GroupName] - Batch = Groups[batch.GroupName] - Apps = Groups[apps.GroupName] - Policy = Groups[policy.GroupName] - Extensions = Groups[extensions.GroupName] - Rbac = Groups[rbac.GroupName] - Storage = Groups[storage.GroupName] - Admission = Groups[admission.GroupName] -} - -// GroupVersion makes copy of schema.GroupVersion -func (g TestGroup) GroupVersion() *schema.GroupVersion { - copyOfGroupVersion := g.externalGroupVersion - return ©OfGroupVersion -} - -// Codec returns the codec for the API version to test against, as set by the -// KUBE_TEST_API_TYPE env var. -func (g TestGroup) Codec() runtime.Codec { - if serializer.Serializer == nil { - return legacyscheme.Codecs.LegacyCodec(g.externalGroupVersion) - } - return legacyscheme.Codecs.CodecForVersions(serializer.Serializer, legacyscheme.Codecs.UniversalDeserializer(), schema.GroupVersions{g.externalGroupVersion}, nil) -} - -// StorageMediaType finds media type set by KUBE_TEST_API_STORAGE_TYPE env var used to store objects in storage -func StorageMediaType() string { - return os.Getenv("KUBE_TEST_API_STORAGE_TYPE") -} - -// StorageCodec returns the codec for the API version to store in etcd, as set by the -// KUBE_TEST_API_STORAGE_TYPE env var. -func (g TestGroup) StorageCodec() runtime.Codec { - s := storageSerializer.Serializer - - if s == nil { - return legacyscheme.Codecs.LegacyCodec(g.externalGroupVersion) - } - - // etcd2 only supports string data - we must wrap any result before returning - // TODO: remove for etcd3 / make parameterizable - if !storageSerializer.EncodesAsText { - s = runtime.NewBase64Serializer(s, s) - } - ds := recognizer.NewDecoder(s, legacyscheme.Codecs.UniversalDeserializer()) - - return legacyscheme.Codecs.CodecForVersions(s, ds, schema.GroupVersions{g.externalGroupVersion}, nil) -} - -// SelfLink returns a self link that will appear to be for the version Version(). -// 'resource' should be the resource path, e.g. "pods" for the Pod type. 'name' should be -// empty for lists. -func (g TestGroup) SelfLink(resource, name string) string { - if g.externalGroupVersion.Group == api.GroupName { - if name == "" { - return fmt.Sprintf("/api/%s/%s", g.externalGroupVersion.Version, resource) - } - return fmt.Sprintf("/api/%s/%s/%s", g.externalGroupVersion.Version, resource, name) - } - // TODO: will need a /apis prefix once we have proper multi-group - // support - if name == "" { - return fmt.Sprintf("/apis/%s/%s/%s", g.externalGroupVersion.Group, g.externalGroupVersion.Version, resource) - } - return fmt.Sprintf("/apis/%s/%s/%s/%s", g.externalGroupVersion.Group, g.externalGroupVersion.Version, resource, name) -} - -// ResourcePathWithPrefix returns the appropriate path for the given prefix (watch, proxy, redirect, etc), resource, namespace and name. -// For ex, this is of the form: -// /api/v1/watch/namespaces/foo/pods/pod0 for v1. -func (g TestGroup) ResourcePathWithPrefix(prefix, resource, namespace, name string) string { - var path string - if g.externalGroupVersion.Group == api.GroupName { - path = "/api/" + g.externalGroupVersion.Version - } else { - // TODO: switch back once we have proper multiple group support - // path = "/apis/" + g.Group + "/" + Version(group...) - path = "/apis/" + g.externalGroupVersion.Group + "/" + g.externalGroupVersion.Version - } - - if prefix != "" { - path = path + "/" + prefix - } - if namespace != "" { - path = path + "/namespaces/" + namespace - } - // Resource names are lower case. - resource = strings.ToLower(resource) - if resource != "" { - path = path + "/" + resource - } - if name != "" { - path = path + "/" + name - } - return path -} - -// ResourcePath returns the appropriate path for the given resource, namespace and name. -// For example, this is of the form: -// /api/v1/namespaces/foo/pods/pod0 for v1. -func (g TestGroup) ResourcePath(resource, namespace, name string) string { - return g.ResourcePathWithPrefix("", resource, namespace, name) -} - -// SubResourcePath returns the appropriate path for the given resource, namespace, -// name and subresource. -func (g TestGroup) SubResourcePath(resource, namespace, name, sub string) string { - path := g.ResourcePathWithPrefix("", resource, namespace, name) - if sub != "" { - path = path + "/" + sub - } - - return path -} diff --git a/pkg/api/testapi/testapi_test.go b/pkg/api/testapi/testapi_test.go deleted file mode 100644 index f90cb812c66..00000000000 --- a/pkg/api/testapi/testapi_test.go +++ /dev/null @@ -1,204 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package testapi - -import ( - "encoding/json" - "reflect" - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" -) - -func TestResourcePathWithPrefix(t *testing.T) { - testCases := []struct { - prefix string - resource string - namespace string - name string - expected string - }{ - {"prefix", "resource", "mynamespace", "myresource", "/api/" + Default.GroupVersion().Version + "/prefix/namespaces/mynamespace/resource/myresource"}, - {"prefix", "resource", "", "myresource", "/api/" + Default.GroupVersion().Version + "/prefix/resource/myresource"}, - {"prefix", "resource", "mynamespace", "", "/api/" + Default.GroupVersion().Version + "/prefix/namespaces/mynamespace/resource"}, - {"prefix", "resource", "", "", "/api/" + Default.GroupVersion().Version + "/prefix/resource"}, - {"", "resource", "mynamespace", "myresource", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource/myresource"}, - } - for _, item := range testCases { - if actual := Default.ResourcePathWithPrefix(item.prefix, item.resource, item.namespace, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for prefix: %s, resource: %s, namespace: %s and name: %s", item.expected, actual, item.prefix, item.resource, item.namespace, item.name) - } - } - - testGroupCases := []struct { - prefix string - resource string - namespace string - name string - expected string - }{ - {"prefix", "resource", "mynamespace", "myresource", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/prefix/namespaces/mynamespace/resource/myresource"}, - {"prefix", "resource", "", "myresource", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/prefix/resource/myresource"}, - {"prefix", "resource", "mynamespace", "", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/prefix/namespaces/mynamespace/resource"}, - {"prefix", "resource", "", "", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/prefix/resource"}, - {"", "resource", "mynamespace", "myresource", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/namespaces/mynamespace/resource/myresource"}, - } - for _, item := range testGroupCases { - if actual := Admission.ResourcePathWithPrefix(item.prefix, item.resource, item.namespace, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for prefix: %s, resource: %s, namespace: %s and name: %s", item.expected, actual, item.prefix, item.resource, item.namespace, item.name) - } - } -} - -func TestResourcePath(t *testing.T) { - testCases := []struct { - resource string - namespace string - name string - expected string - }{ - {"resource", "mynamespace", "myresource", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource/myresource"}, - {"resource", "", "myresource", "/api/" + Default.GroupVersion().Version + "/resource/myresource"}, - {"resource", "mynamespace", "", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource"}, - {"resource", "", "", "/api/" + Default.GroupVersion().Version + "/resource"}, - } - for _, item := range testCases { - if actual := Default.ResourcePath(item.resource, item.namespace, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for resource: %s, namespace: %s and name: %s", item.expected, actual, item.resource, item.namespace, item.name) - } - } -} - -func TestSubResourcePath(t *testing.T) { - testCases := []struct { - resource string - namespace string - name string - sub string - expected string - }{ - {"resource", "mynamespace", "myresource", "mysub", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource/myresource/mysub"}, - {"resource", "", "myresource", "mysub", "/api/" + Default.GroupVersion().Version + "/resource/myresource/mysub"}, - {"resource", "mynamespace", "", "mysub", "/api/" + Default.GroupVersion().Version + "/namespaces/mynamespace/resource/mysub"}, - {"resource", "", "", "mysub", "/api/" + Default.GroupVersion().Version + "/resource/mysub"}, - } - for _, item := range testCases { - if actual := Default.SubResourcePath(item.resource, item.namespace, item.name, item.sub); actual != item.expected { - t.Errorf("Expected: %s, got: %s for resource: %s, namespace: %s and name: %s", item.expected, actual, item.resource, item.namespace, item.name) - } - } -} - -var status = &metav1.Status{ - Status: metav1.StatusFailure, - Code: 200, - Reason: metav1.StatusReasonUnknown, - Message: "", -} - -func TestSelfLink(t *testing.T) { - testCases := []struct { - resource string - name string - expected string - }{ - {"resource", "name", "/api/" + Default.GroupVersion().Version + "/resource/name"}, - {"resource", "", "/api/" + Default.GroupVersion().Version + "/resource"}, - } - for _, item := range testCases { - if actual := Default.SelfLink(item.resource, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for resource: %s and name: %s", item.expected, actual, item.resource, item.name) - } - } - - testGroupCases := []struct { - resource string - name string - expected string - }{ - {"resource", "name", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/resource/name"}, - {"resource", "", "/apis/" + Admission.GroupVersion().Group + "/" + Admission.GroupVersion().Version + "/resource"}, - } - for _, item := range testGroupCases { - if actual := Admission.SelfLink(item.resource, item.name); actual != item.expected { - t.Errorf("Expected: %s, got: %s for resource: %s and name: %s", item.expected, actual, item.resource, item.name) - } - } -} - -func TestV1EncodeDecodeStatus(t *testing.T) { - v1Codec := Default.Codec() - - encoded, err := runtime.Encode(v1Codec, status) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - typeMeta := metav1.TypeMeta{} - if err := json.Unmarshal(encoded, &typeMeta); err != nil { - t.Errorf("unexpected error: %v", err) - } - if typeMeta.Kind != "Status" { - t.Errorf("Kind is not set to \"Status\". Got %v", string(encoded)) - } - if typeMeta.APIVersion != "v1" { - t.Errorf("APIVersion is not set to \"v1\". Got %v", string(encoded)) - } - decoded, err := runtime.Decode(v1Codec, encoded) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(status, decoded) { - t.Errorf("expected: %#v, got: %#v", status, decoded) - } -} - -func testEncodeDecodeStatus(t *testing.T, codec runtime.Codec) { - encoded, err := runtime.Encode(codec, status) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - typeMeta := metav1.TypeMeta{} - if err := json.Unmarshal(encoded, &typeMeta); err != nil { - t.Errorf("unexpected error: %v", err) - } - if typeMeta.Kind != "Status" { - t.Errorf("Kind is not set to \"Status\". Got %s", encoded) - } - if typeMeta.APIVersion != "v1" { - t.Errorf("APIVersion is not set to \"\". Got %s", encoded) - } - decoded, err := runtime.Decode(codec, encoded) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if !reflect.DeepEqual(status, decoded) { - t.Errorf("expected: %v, got: %v", status, decoded) - } -} - -func TestAutoscalingEncodeDecodeStatus(t *testing.T) { - testEncodeDecodeStatus(t, Autoscaling.Codec()) -} - -func TestBatchEncodeDecodeStatus(t *testing.T) { - testEncodeDecodeStatus(t, Batch.Codec()) -} - -func TestExperimentalEncodeDecodeStatus(t *testing.T) { - testEncodeDecodeStatus(t, Extensions.Codec()) -}