From cf5010ca6e50cc9c3b873781921b771ff0cf4a14 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Sat, 2 Jul 2016 22:27:09 -0700 Subject: [PATCH 1/2] Fix a problem with multiple APIs clobbering each other in registration. --- pkg/apimachinery/registered/registered.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/apimachinery/registered/registered.go b/pkg/apimachinery/registered/registered.go index 307f55da0a8..d83c8870671 100644 --- a/pkg/apimachinery/registered/registered.go +++ b/pkg/apimachinery/registered/registered.go @@ -22,6 +22,7 @@ import ( "os" "sort" "strings" + "sync" "github.com/golang/glog" @@ -207,11 +208,7 @@ func AddThirdPartyAPIGroupVersions(gvs ...unversioned.GroupVersion) []unversione } RegisterVersions(filteredGVs) EnableVersions(filteredGVs...) - next := make([]unversioned.GroupVersion, len(gvs)) - for ix := range filteredGVs { - next[ix] = filteredGVs[ix] - } - thirdPartyGroupVersions = next + thirdPartyGroupVersions = append(thirdPartyGroupVersions, filteredGVs...) return skippedGVs } From 891bd3e5223777568efb040f41ca5321e7d0550c Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 7 Jul 2016 22:08:09 -0700 Subject: [PATCH 2/2] add a test --- pkg/apimachinery/registered/registered.go | 16 ++++- .../registered/registered_test.go | 72 +++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/pkg/apimachinery/registered/registered.go b/pkg/apimachinery/registered/registered.go index d83c8870671..63cb76e9aaf 100644 --- a/pkg/apimachinery/registered/registered.go +++ b/pkg/apimachinery/registered/registered.go @@ -22,7 +22,6 @@ import ( "os" "sort" "strings" - "sync" "github.com/golang/glog" @@ -56,6 +55,10 @@ var ( ) func init() { + loadKubeAPIVersions() +} + +func loadKubeAPIVersions() { // Env var KUBE_API_VERSIONS is a comma separated list of API versions that // should be registered in the scheme. kubeAPIVersions := os.Getenv("KUBE_API_VERSIONS") @@ -71,6 +74,16 @@ func init() { } } +// Resets everything to clean room for the start of a test +func clearForTesting() { + registeredVersions = map[unversioned.GroupVersion]struct{}{} + thirdPartyGroupVersions = []unversioned.GroupVersion{} + enabledVersions = map[unversioned.GroupVersion]struct{}{} + groupMetaMap = map[string]*apimachinery.GroupMeta{} + envRequestedVersions = []unversioned.GroupVersion{} + loadKubeAPIVersions() +} + // RegisterVersions adds the given group versions to the list of registered group versions. func RegisterVersions(availableVersions []unversioned.GroupVersion) { for _, v := range availableVersions { @@ -209,7 +222,6 @@ func AddThirdPartyAPIGroupVersions(gvs ...unversioned.GroupVersion) []unversione RegisterVersions(filteredGVs) EnableVersions(filteredGVs...) thirdPartyGroupVersions = append(thirdPartyGroupVersions, filteredGVs...) - return skippedGVs } diff --git a/pkg/apimachinery/registered/registered_test.go b/pkg/apimachinery/registered/registered_test.go index 10180575101..ce9f8d5dc9e 100644 --- a/pkg/apimachinery/registered/registered_test.go +++ b/pkg/apimachinery/registered/registered_test.go @@ -23,6 +23,78 @@ import ( "k8s.io/kubernetes/pkg/apimachinery" ) +func TestAddThirdPartyVersionsBasic(t *testing.T) { + clearForTesting() + + registered := []unversioned.GroupVersion{ + { + Group: "", + Version: "v1", + }, + } + skipped := registered + thirdParty := []unversioned.GroupVersion{ + { + Group: "company.com", + Version: "v1", + }, + { + Group: "company.com", + Version: "v2", + }, + } + gvs := append(registered, thirdParty...) + + RegisterVersions(registered) + wasSkipped := AddThirdPartyAPIGroupVersions(gvs...) + if len(wasSkipped) != len(skipped) { + t.Errorf("Expected %v, found %v", skipped, wasSkipped) + } + for ix := range wasSkipped { + found := false + for _, gv := range skipped { + if gv.String() == wasSkipped[ix].String() { + found = true + break + } + } + if !found { + t.Errorf("Couldn't find %v in %v", wasSkipped[ix], skipped) + } + } + for _, gv := range thirdParty { + if !IsThirdPartyAPIGroupVersion(gv) { + t.Errorf("Expected %v to be third party.", gv) + } + } +} + +func TestAddThirdPartyVersionsMultiple(t *testing.T) { + clearForTesting() + + thirdParty := []unversioned.GroupVersion{ + { + Group: "company.com", + Version: "v1", + }, + { + Group: "company.com", + Version: "v2", + }, + } + for _, gv := range thirdParty { + wasSkipped := AddThirdPartyAPIGroupVersions(gv) + if len(wasSkipped) != 0 { + t.Errorf("Expected length 0, found %v", wasSkipped) + } + } + for _, gv := range thirdParty { + if !IsThirdPartyAPIGroupVersion(gv) { + t.Errorf("Expected %v to be third party.", gv) + } + } +} + func TestAllPreferredGroupVersions(t *testing.T) { testCases := []struct { groupMetas []apimachinery.GroupMeta