Commit e81663c8 authored by k8s-merge-robot's avatar k8s-merge-robot

Merge pull request #24006 from caesarxuchao/thirdparty-preferredversion

Automatic merge from submit-queue Use the first version as thirdparty resource preferredVersion First commit is a one-liner, which implements the server-half of #23985. The other two commits rearrange the test code, and add back a commented out test of thirdparty resource. @lavalamp @nikhiljindal
parents 1b74e7bf f315ffd8
...@@ -643,8 +643,9 @@ func (m *Master) InstallThirdPartyResource(rsrc *extensions.ThirdPartyResource) ...@@ -643,8 +643,9 @@ func (m *Master) InstallThirdPartyResource(rsrc *extensions.ThirdPartyResource)
Version: rsrc.Versions[0].Name, Version: rsrc.Versions[0].Name,
} }
apiGroup := unversioned.APIGroup{ apiGroup := unversioned.APIGroup{
Name: group, Name: group,
Versions: []unversioned.GroupVersionForDiscovery{groupVersion}, Versions: []unversioned.GroupVersionForDiscovery{groupVersion},
PreferredVersion: groupVersion,
} }
apiserver.AddGroupWebService(api.Codecs, m.HandlerContainer, path, apiGroup) apiserver.AddGroupWebService(api.Codecs, m.HandlerContainer, path, apiGroup)
m.addThirdPartyResourceStorage(path, thirdparty.Storage[strings.ToLower(kind)+"s"].(*thirdpartyresourcedataetcd.REST), apiGroup) m.addThirdPartyResourceStorage(path, thirdparty.Storage[strings.ToLower(kind)+"s"].(*thirdpartyresourcedataetcd.REST), apiGroup)
......
...@@ -36,9 +36,14 @@ import ( ...@@ -36,9 +36,14 @@ import (
utilnet "k8s.io/kubernetes/pkg/util/net" utilnet "k8s.io/kubernetes/pkg/util/net"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
apiutil "k8s.io/kubernetes/pkg/api/util"
apiv1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling"
autoscalingapiv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
batchapiv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/genericapiserver" "k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/registry/endpoint" "k8s.io/kubernetes/pkg/registry/endpoint"
...@@ -83,20 +88,11 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. ...@@ -83,20 +88,11 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
storageVersions[extensions.GroupName] = testapi.Extensions.GroupVersion().String() storageVersions[extensions.GroupName] = testapi.Extensions.GroupVersion().String()
config.StorageVersions = storageVersions config.StorageVersions = storageVersions
config.PublicAddress = net.ParseIP("192.168.10.4") config.PublicAddress = net.ParseIP("192.168.10.4")
master.nodeRegistry = registrytest.NewNodeRegistry([]string{"node1", "node2"}, api.NodeResources{})
return master, server, config, assert.New(t)
}
func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
_, etcdserver, config, assert := setUp(t)
config.Serializer = api.Codecs config.Serializer = api.Codecs
config.KubeletClient = client.FakeKubeletClient{} config.KubeletClient = client.FakeKubeletClient{}
config.APIPrefix = "/api" config.APIPrefix = "/api"
config.APIGroupPrefix = "/apis" config.APIGroupPrefix = "/apis"
config.APIResourceConfigSource = DefaultAPIResourceConfigSource() config.APIResourceConfigSource = DefaultAPIResourceConfigSource()
config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil } config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil }
config.ProxyTLSClientConfig = &tls.Config{} config.ProxyTLSClientConfig = &tls.Config{}
...@@ -108,6 +104,33 @@ func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *ass ...@@ -108,6 +104,33 @@ func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *ass
// run the sync routine and register types manually. // run the sync routine and register types manually.
config.disableThirdPartyControllerForTesting = true config.disableThirdPartyControllerForTesting = true
master.nodeRegistry = registrytest.NewNodeRegistry([]string{"node1", "node2"}, api.NodeResources{})
return master, server, config, assert.New(t)
}
func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
_, etcdserver, config, assert := setUp(t)
master, err := New(&config)
if err != nil {
t.Fatalf("Error in bringing up the master: %v", err)
}
return master, etcdserver, config, assert
}
// limitedAPIResourceConfigSource only enables the core group, the extensions group, the batch group, and the autoscaling group.
func limitedAPIResourceConfigSource() *genericapiserver.ResourceConfig {
ret := genericapiserver.NewResourceConfig()
ret.EnableVersions(apiv1.SchemeGroupVersion, extensionsapiv1beta1.SchemeGroupVersion, batchapiv1.SchemeGroupVersion, autoscalingapiv1.SchemeGroupVersion)
return ret
}
// newLimitedMaster only enables the core group, the extensions group, the batch group, and the autoscaling group.
func newLimitedMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
_, etcdserver, config, assert := setUp(t)
config.APIResourceConfigSource = limitedAPIResourceConfigSource()
master, err := New(&config) master, err := New(&config)
if err != nil { if err != nil {
t.Fatalf("Error in bringing up the master: %v", err) t.Fatalf("Error in bringing up the master: %v", err)
...@@ -370,114 +393,98 @@ func TestAPIVersionOfDiscoveryEndpoints(t *testing.T) { ...@@ -370,114 +393,98 @@ func TestAPIVersionOfDiscoveryEndpoints(t *testing.T) {
} }
func TestDiscoveryAtAPIS(t *testing.T) { func TestDiscoveryAtAPIS(t *testing.T) {
// TODO(caesarxuchao): make this pass now that batch is added, master, etcdserver, config, assert := newLimitedMaster(t)
// and rewrite it so that the indexes do not need to change each time a new api group is added. defer etcdserver.Terminate(t)
/*
master, etcdserver, config, assert := newMaster(t)
defer etcdserver.Terminate(t)
server := httptest.NewServer(master.HandlerContainer.ServeMux)
resp, err := http.Get(server.URL + "/apis")
if !assert.NoError(err) {
t.Errorf("unexpected error: %v", err)
}
assert.Equal(http.StatusOK, resp.StatusCode) server := httptest.NewServer(master.HandlerContainer.ServeMux)
resp, err := http.Get(server.URL + "/apis")
if !assert.NoError(err) {
t.Errorf("unexpected error: %v", err)
}
groupList := unversioned.APIGroupList{} assert.Equal(http.StatusOK, resp.StatusCode)
assert.NoError(decodeResponse(resp, &groupList))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
expectGroupNames := []string{autoscaling.GroupName, batch.GroupName, extensions.GroupName} groupList := unversioned.APIGroupList{}
expectVersions := [][]unversioned.GroupVersionForDiscovery{ assert.NoError(decodeResponse(resp, &groupList))
{ if err != nil {
{ t.Fatalf("unexpected error: %v", err)
GroupVersion: testapi.Autoscaling.GroupVersion().String(), }
Version: testapi.Autoscaling.GroupVersion().Version,
}, expectGroupNames := sets.NewString(autoscaling.GroupName, batch.GroupName, extensions.GroupName)
}, expectVersions := map[string][]unversioned.GroupVersionForDiscovery{
{ autoscaling.GroupName: {
{
GroupVersion: testapi.Batch.GroupVersion().String(),
Version: testapi.Batch.GroupVersion().Version,
},
},
{
{
GroupVersion: testapi.Extensions.GroupVersion().String(),
Version: testapi.Extensions.GroupVersion().Version,
},
},
}
expectPreferredVersion := []unversioned.GroupVersionForDiscovery{
{ {
GroupVersion: config.StorageVersions[autoscaling.GroupName], GroupVersion: testapi.Autoscaling.GroupVersion().String(),
Version: apiutil.GetVersion(config.StorageVersions[autoscaling.GroupName]), Version: testapi.Autoscaling.GroupVersion().Version,
}, },
},
batch.GroupName: {
{ {
GroupVersion: config.StorageVersions[batch.GroupName], GroupVersion: testapi.Batch.GroupVersion().String(),
Version: apiutil.GetVersion(config.StorageVersions[batch.GroupName]), Version: testapi.Batch.GroupVersion().Version,
}, },
},
extensions.GroupName: {
{ {
GroupVersion: config.StorageVersions[extensions.GroupName], GroupVersion: testapi.Extensions.GroupVersion().String(),
Version: apiutil.GetVersion(config.StorageVersions[extensions.GroupName]), Version: testapi.Extensions.GroupVersion().Version,
}, },
} },
}
expectPreferredVersion := map[string]unversioned.GroupVersionForDiscovery{
assert.Equal(2, len(groupList.Groups)) autoscaling.GroupName: {
assert.Equal(expectGroupNames[0], groupList.Groups[0].Name) GroupVersion: config.StorageVersions[autoscaling.GroupName],
assert.Equal(expectGroupNames[1], groupList.Groups[1].Name) Version: apiutil.GetVersion(config.StorageVersions[autoscaling.GroupName]),
},
assert.Equal(expectVersions[0], groupList.Groups[0].Versions) batch.GroupName: {
assert.Equal(expectVersions[1], groupList.Groups[1].Versions) GroupVersion: config.StorageVersions[batch.GroupName],
Version: apiutil.GetVersion(config.StorageVersions[batch.GroupName]),
},
extensions.GroupName: {
GroupVersion: config.StorageVersions[extensions.GroupName],
Version: apiutil.GetVersion(config.StorageVersions[extensions.GroupName]),
},
}
assert.Equal(expectPreferredVersion[0], groupList.Groups[0].PreferredVersion) assert.Equal(3, len(groupList.Groups))
assert.Equal(expectPreferredVersion[1], groupList.Groups[1].PreferredVersion) for _, group := range groupList.Groups {
if !expectGroupNames.Has(group.Name) {
t.Errorf("got unexpected group %s", group.Name)
}
assert.Equal(expectVersions[group.Name], group.Versions)
assert.Equal(expectPreferredVersion[group.Name], group.PreferredVersion)
}
thirdPartyGV := unversioned.GroupVersionForDiscovery{GroupVersion: "company.com/v1", Version: "v1"} thirdPartyGV := unversioned.GroupVersionForDiscovery{GroupVersion: "company.com/v1", Version: "v1"}
master.addThirdPartyResourceStorage("/apis/company.com/v1", nil, master.addThirdPartyResourceStorage("/apis/company.com/v1", nil,
unversioned.APIGroup{ unversioned.APIGroup{
Name: "company.com", Name: "company.com",
Versions: []unversioned.GroupVersionForDiscovery{thirdPartyGV}, Versions: []unversioned.GroupVersionForDiscovery{thirdPartyGV},
PreferredVersion: thirdPartyGV, PreferredVersion: thirdPartyGV,
}) })
resp, err = http.Get(server.URL + "/apis") resp, err = http.Get(server.URL + "/apis")
if !assert.NoError(err) { if !assert.NoError(err) {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
assert.Equal(http.StatusOK, resp.StatusCode)
assert.NoError(decodeResponse(resp, &groupList))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
assert.Equal(http.StatusOK, resp.StatusCode) assert.Equal(4, len(groupList.Groups))
assert.NoError(decodeResponse(resp, &groupList)) expectGroupNames.Insert("company.com")
if err != nil { expectVersions["company.com"] = []unversioned.GroupVersionForDiscovery{thirdPartyGV}
t.Fatalf("unexpected error: %v", err) expectPreferredVersion["company.com"] = thirdPartyGV
for _, group := range groupList.Groups {
if !expectGroupNames.Has(group.Name) {
t.Errorf("got unexpected group %s", group.Name)
} }
assert.Equal(expectVersions[group.Name], group.Versions)
thirdPartyGroupName := "company.com" assert.Equal(expectPreferredVersion[group.Name], group.PreferredVersion)
thirdPartyExpectVersions := []unversioned.GroupVersionForDiscovery{thirdPartyGV} }
assert.Equal(4, len(groupList.Groups))
// autoscaling group
assert.Equal(expectGroupNames[0], groupList.Groups[0].Name)
assert.Equal(expectVersions[0], groupList.Groups[0].Versions)
assert.Equal(expectPreferredVersion[0], groupList.Groups[0].PreferredVersion)
// batch group
assert.Equal(expectGroupNames[1], groupList.Groups[1].Name)
assert.Equal(expectVersions[1], groupList.Groups[1].Versions)
assert.Equal(expectPreferredVersion[1], groupList.Groups[1].PreferredVersion)
// third party
assert.Equal(thirdPartyGroupName, groupList.Groups[2].Name)
assert.Equal(thirdPartyExpectVersions, groupList.Groups[2].Versions)
assert.Equal(thirdPartyGV, groupList.Groups[2].PreferredVersion)
// extensions group
assert.Equal(expectGroupNames[2], groupList.Groups[3].Name)
assert.Equal(expectVersions[2], groupList.Groups[3].Versions)
assert.Equal(expectPreferredVersion[2], groupList.Groups[3].PreferredVersion)
*/
} }
var versionsToTest = []string{"v1", "v3"} var versionsToTest = []string{"v1", "v3"}
...@@ -1004,13 +1011,13 @@ func testThirdPartyDiscovery(t *testing.T, version string) { ...@@ -1004,13 +1011,13 @@ func testThirdPartyDiscovery(t *testing.T, version string) {
assert.Equal(group.APIVersion, "v1") assert.Equal(group.APIVersion, "v1")
assert.Equal(group.Kind, "APIGroup") assert.Equal(group.Kind, "APIGroup")
assert.Equal(group.Name, "company.com") assert.Equal(group.Name, "company.com")
assert.Equal(group.Versions, []unversioned.GroupVersionForDiscovery{ expectedVersion := unversioned.GroupVersionForDiscovery{
{ GroupVersion: "company.com/" + version,
GroupVersion: "company.com/" + version, Version: version,
Version: version, }
},
}) assert.Equal(group.Versions, []unversioned.GroupVersionForDiscovery{expectedVersion})
assert.Equal(group.PreferredVersion, unversioned.GroupVersionForDiscovery{}) assert.Equal(group.PreferredVersion, expectedVersion)
resp, err = http.Get(server.URL + "/apis/company.com/" + version) resp, err = http.Get(server.URL + "/apis/company.com/" + version)
if !assert.NoError(err) { if !assert.NoError(err) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment