Merge pull request #17378 from wojtek-t/remove_fake_client_from_master_test_2

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2015-11-19 08:18:14 -08:00
commit ce492e7a28

View File

@ -51,7 +51,6 @@ import (
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/intstr"
"github.com/coreos/go-etcd/etcd"
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -459,9 +458,8 @@ type FooList struct {
Items []Foo `json:"items"` Items []Foo `json:"items"`
} }
func initThirdParty(t *testing.T, version string) (*Master, *tools.FakeEtcdClient, *httptest.Server, *assert.Assertions) { func initThirdParty(t *testing.T, version string) (*Master, *etcdtesting.EtcdTestServer, *httptest.Server, *assert.Assertions) {
master, etcdserver, _, assert := setUp(t) master, etcdserver, _, assert := setUp(t)
defer etcdserver.Terminate(t)
master.thirdPartyResources = map[string]*thirdpartyresourcedatastorage.REST{} master.thirdPartyResources = map[string]*thirdpartyresourcedatastorage.REST{}
api := &extensions.ThirdPartyResource{ api := &extensions.ThirdPartyResource{
@ -476,17 +474,14 @@ func initThirdParty(t *testing.T, version string) (*Master, *tools.FakeEtcdClien
}, },
} }
master.handlerContainer = restful.NewContainer() master.handlerContainer = restful.NewContainer()
master.thirdPartyStorage = etcdstorage.NewEtcdStorage(etcdserver.Client, testapi.Extensions.Codec(), etcdtest.PathPrefix())
fakeClient := tools.NewFakeEtcdClient(t)
fakeClient.Machines = []string{"http://machine1:4001", "http://machine2", "http://machine3:4003"}
master.thirdPartyStorage = etcdstorage.NewEtcdStorage(fakeClient, testapi.Extensions.Codec(), etcdtest.PathPrefix())
if !assert.NoError(master.InstallThirdPartyResource(api)) { if !assert.NoError(master.InstallThirdPartyResource(api)) {
t.FailNow() t.FailNow()
} }
server := httptest.NewServer(master.handlerContainer.ServeMux) server := httptest.NewServer(master.handlerContainer.ServeMux)
return &master, fakeClient, server, assert return &master, etcdserver, server, assert
} }
func TestInstallThirdPartyAPIList(t *testing.T) { func TestInstallThirdPartyAPIList(t *testing.T) {
@ -531,13 +526,14 @@ func testInstallThirdPartyAPIListVersion(t *testing.T, version string) {
}, },
} }
for _, test := range tests { for _, test := range tests {
_, fakeClient, server, assert := initThirdParty(t, version) func() {
_, etcdserver, server, assert := initThirdParty(t, version)
defer server.Close() defer server.Close()
defer etcdserver.Terminate(t)
if test.items == nil { client := etcdserver.Client
fakeClient.ExpectNotFoundGet(etcdtest.PathPrefix() + "/ThirdPartyResourceData/company.com/foos/default") if test.items != nil {
} else { setupEtcdList(client, "/ThirdPartyResourceData/company.com/foos/default", test.items)
setupEtcdList(fakeClient, "/ThirdPartyResourceData/company.com/foos/default", test.items)
} }
resp, err := http.Get(server.URL + "/apis/company.com/" + version + "/namespaces/default/foos") resp, err := http.Get(server.URL + "/apis/company.com/" + version + "/namespaces/default/foos")
@ -560,25 +556,34 @@ func testInstallThirdPartyAPIListVersion(t *testing.T, version string) {
if len(list.Items) != 0 { if len(list.Items) != 0 {
t.Errorf("expected no items, saw: %v", list.Items) t.Errorf("expected no items, saw: %v", list.Items)
} }
continue return
} }
if len(list.Items) != len(test.items) { if len(list.Items) != len(test.items) {
t.Errorf("unexpected length: %d vs %d", len(list.Items), len(test.items)) t.Errorf("unexpected length: %d vs %d", len(list.Items), len(test.items))
continue return
}
// The order of elements in LIST is not guaranteed.
mapping := make(map[string]int)
for ix := range test.items {
mapping[test.items[ix].Name] = ix
} }
for ix := range list.Items { for ix := range list.Items {
// Copy things that are set dynamically on the server // Copy things that are set dynamically on the server
expectedObj := test.items[ix] expectedObj := test.items[mapping[list.Items[ix].Name]]
expectedObj.SelfLink = list.Items[ix].SelfLink expectedObj.SelfLink = list.Items[ix].SelfLink
expectedObj.ResourceVersion = list.Items[ix].ResourceVersion
expectedObj.Namespace = list.Items[ix].Namespace expectedObj.Namespace = list.Items[ix].Namespace
expectedObj.UID = list.Items[ix].UID expectedObj.UID = list.Items[ix].UID
expectedObj.CreationTimestamp = list.Items[ix].CreationTimestamp expectedObj.CreationTimestamp = list.Items[ix].CreationTimestamp
// We endure the order of items by sorting them (using 'mapping')
// so that this function passes.
if !reflect.DeepEqual(list.Items[ix], expectedObj) { if !reflect.DeepEqual(list.Items[ix], expectedObj) {
t.Errorf("expected:\n%#v\nsaw:\n%#v\n", expectedObj, list.Items[ix]) t.Errorf("expected:\n%#v\nsaw:\n%#v\n", expectedObj, list.Items[ix])
} }
} }
}()
} }
} }
@ -594,6 +599,7 @@ func encodeToThirdParty(name string, obj interface{}) ([]byte, error) {
return testapi.Extensions.Codec().Encode(&thirdPartyData) return testapi.Extensions.Codec().Encode(&thirdPartyData)
} }
// TODO: Convert to storage.Interface.
func storeToEtcd(client tools.EtcdClient, path, name string, obj interface{}) error { func storeToEtcd(client tools.EtcdClient, path, name string, obj interface{}) error {
data, err := encodeToThirdParty(name, obj) data, err := encodeToThirdParty(name, obj)
if err != nil { if err != nil {
@ -603,20 +609,13 @@ func storeToEtcd(client tools.EtcdClient, path, name string, obj interface{}) er
return err return err
} }
func setupEtcdList(fakeClient *tools.FakeEtcdClient, path string, list []Foo) error { // TODO: Convert to storage.Interface.
resp := tools.EtcdResponseWithError{ func setupEtcdList(client tools.EtcdClient, path string, list []Foo) error {
R: &etcd.Response{
Node: &etcd.Node{},
},
}
for _, obj := range list { for _, obj := range list {
data, err := encodeToThirdParty(obj.Name, obj) if err := storeToEtcd(client, path+"/"+obj.Name, obj.Name, obj); err != nil {
if err != nil {
return err return err
} }
resp.R.Node.Nodes = append(resp.R.Node.Nodes, &etcd.Node{Value: string(data)})
} }
fakeClient.Data[etcdtest.PathPrefix()+path] = resp
return nil return nil
} }
@ -641,9 +640,11 @@ func TestInstallThirdPartyAPIGet(t *testing.T) {
} }
func testInstallThirdPartyAPIGetVersion(t *testing.T, version string) { func testInstallThirdPartyAPIGetVersion(t *testing.T, version string) {
_, fakeClient, server, assert := initThirdParty(t, version) _, etcdserver, server, assert := initThirdParty(t, version)
defer server.Close() defer server.Close()
defer etcdserver.Terminate(t)
client := etcdserver.Client
expectedObj := Foo{ expectedObj := Foo{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "test", Name: "test",
@ -655,7 +656,7 @@ func testInstallThirdPartyAPIGetVersion(t *testing.T, version string) {
SomeField: "test field", SomeField: "test field",
OtherField: 10, OtherField: 10,
} }
if !assert.NoError(storeToEtcd(fakeClient, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { if !assert.NoError(storeToEtcd(client, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) {
t.FailNow() t.FailNow()
return return
} }
@ -674,6 +675,7 @@ func testInstallThirdPartyAPIGetVersion(t *testing.T, version string) {
} }
// Fill in data that the apiserver injects // Fill in data that the apiserver injects
expectedObj.SelfLink = item.SelfLink expectedObj.SelfLink = item.SelfLink
expectedObj.ResourceVersion = item.ResourceVersion
if !assert.True(reflect.DeepEqual(item, expectedObj)) { if !assert.True(reflect.DeepEqual(item, expectedObj)) {
t.Errorf("expected:\n%#v\nsaw:\n%#v\n", expectedObj, item) t.Errorf("expected:\n%#v\nsaw:\n%#v\n", expectedObj, item)
} }
@ -686,9 +688,11 @@ func TestInstallThirdPartyAPIPost(t *testing.T) {
} }
func testInstallThirdPartyAPIPostForVersion(t *testing.T, version string) { func testInstallThirdPartyAPIPostForVersion(t *testing.T, version string) {
_, fakeClient, server, assert := initThirdParty(t, version) _, etcdserver, server, assert := initThirdParty(t, version)
defer server.Close() defer server.Close()
defer etcdserver.Terminate(t)
client := etcdserver.Client
inputObj := Foo{ inputObj := Foo{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "test", Name: "test",
@ -719,6 +723,7 @@ func testInstallThirdPartyAPIPostForVersion(t *testing.T, version string) {
// fill in fields set by the apiserver // fill in fields set by the apiserver
expectedObj := inputObj expectedObj := inputObj
expectedObj.SelfLink = item.SelfLink expectedObj.SelfLink = item.SelfLink
expectedObj.ResourceVersion = item.ResourceVersion
expectedObj.Namespace = item.Namespace expectedObj.Namespace = item.Namespace
expectedObj.UID = item.UID expectedObj.UID = item.UID
expectedObj.CreationTimestamp = item.CreationTimestamp expectedObj.CreationTimestamp = item.CreationTimestamp
@ -726,7 +731,7 @@ func testInstallThirdPartyAPIPostForVersion(t *testing.T, version string) {
t.Errorf("expected:\n%v\nsaw:\n%v\n", expectedObj, item) t.Errorf("expected:\n%v\nsaw:\n%v\n", expectedObj, item)
} }
etcdResp, err := fakeClient.Get(etcdtest.PathPrefix()+"/ThirdPartyResourceData/company.com/foos/default/test", false, false) etcdResp, err := client.Get(etcdtest.PathPrefix()+"/ThirdPartyResourceData/company.com/foos/default/test", false, false)
if !assert.NoError(err) { if !assert.NoError(err) {
t.FailNow() t.FailNow()
} }
@ -754,9 +759,11 @@ func TestInstallThirdPartyAPIDelete(t *testing.T) {
} }
func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) { func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) {
_, fakeClient, server, assert := initThirdParty(t, version) _, etcdserver, server, assert := initThirdParty(t, version)
defer server.Close() defer server.Close()
defer etcdserver.Terminate(t)
client := etcdserver.Client
expectedObj := Foo{ expectedObj := Foo{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "test", Name: "test",
@ -768,7 +775,7 @@ func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) {
SomeField: "test field", SomeField: "test field",
OtherField: 10, OtherField: 10,
} }
if !assert.NoError(storeToEtcd(fakeClient, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { if !assert.NoError(storeToEtcd(client, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) {
t.FailNow() t.FailNow()
return return
} }
@ -785,6 +792,7 @@ func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) {
// Fill in fields set by the apiserver // Fill in fields set by the apiserver
expectedObj.SelfLink = item.SelfLink expectedObj.SelfLink = item.SelfLink
expectedObj.ResourceVersion = item.ResourceVersion
expectedObj.Namespace = item.Namespace expectedObj.Namespace = item.Namespace
if !assert.True(reflect.DeepEqual(item, expectedObj)) { if !assert.True(reflect.DeepEqual(item, expectedObj)) {
t.Errorf("expected:\n%v\nsaw:\n%v\n", expectedObj, item) t.Errorf("expected:\n%v\nsaw:\n%v\n", expectedObj, item)
@ -804,10 +812,10 @@ func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) {
assert.Equal(http.StatusNotFound, resp.StatusCode) assert.Equal(http.StatusNotFound, resp.StatusCode)
expectDeletedKeys := []string{etcdtest.PathPrefix() + "/ThirdPartyResourceData/company.com/foos/default/test"} expectedDeletedKey := etcdtest.AddPrefix("ThirdPartyResourceData/company.com/foos/default/test")
_, err = client.Get(expectedDeletedKey, false, false)
if !assert.True(reflect.DeepEqual(fakeClient.DeletedKeys, expectDeletedKeys)) { if !etcdstorage.IsEtcdNotFound(err) {
t.Errorf("unexpected deleted keys: %v", fakeClient.DeletedKeys) t.Errorf("expected deletion didn't happen: %v", err)
} }
} }
@ -827,9 +835,11 @@ func TestInstallThirdPartyResourceRemove(t *testing.T) {
} }
func testInstallThirdPartyResourceRemove(t *testing.T, version string) { func testInstallThirdPartyResourceRemove(t *testing.T, version string) {
master, fakeClient, server, assert := initThirdParty(t, version) master, etcdserver, server, assert := initThirdParty(t, version)
defer server.Close() defer server.Close()
defer etcdserver.Terminate(t)
client := etcdserver.Client
expectedObj := Foo{ expectedObj := Foo{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "test", Name: "test",
@ -840,19 +850,17 @@ func testInstallThirdPartyResourceRemove(t *testing.T, version string) {
SomeField: "test field", SomeField: "test field",
OtherField: 10, OtherField: 10,
} }
if !assert.NoError(storeToEtcd(fakeClient, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) { if !assert.NoError(storeToEtcd(client, "/ThirdPartyResourceData/company.com/foos/default/test", "test", expectedObj)) {
t.FailNow() t.FailNow()
return return
} }
secondObj := expectedObj secondObj := expectedObj
secondObj.Name = "bar" secondObj.Name = "bar"
if !assert.NoError(storeToEtcd(fakeClient, "/ThirdPartyResourceData/company.com/foos/default/bar", "bar", secondObj)) { if !assert.NoError(storeToEtcd(client, "/ThirdPartyResourceData/company.com/foos/default/bar", "bar", secondObj)) {
t.FailNow() t.FailNow()
return return
} }
setupEtcdList(fakeClient, "/ThirdPartyResourceData/company.com/foos/default", []Foo{expectedObj, secondObj})
resp, err := http.Get(server.URL + "/apis/company.com/" + version + "/namespaces/default/foos/test") resp, err := http.Get(server.URL + "/apis/company.com/" + version + "/namespaces/default/foos/test")
if !assert.NoError(err) { if !assert.NoError(err) {
t.FailNow() t.FailNow()
@ -886,12 +894,16 @@ func testInstallThirdPartyResourceRemove(t *testing.T, version string) {
if resp.StatusCode != http.StatusNotFound { if resp.StatusCode != http.StatusNotFound {
t.Errorf("unexpected status: %v", resp) t.Errorf("unexpected status: %v", resp)
} }
expectDeletedKeys := []string{
etcdtest.PathPrefix() + "/ThirdPartyResourceData/company.com/foos/default/test", expectedDeletedKeys := []string{
etcdtest.PathPrefix() + "/ThirdPartyResourceData/company.com/foos/default/bar", etcdtest.AddPrefix("/ThirdPartyResourceData/company.com/foos/default/test"),
etcdtest.AddPrefix("/ThirdPartyResourceData/company.com/foos/default/bar"),
}
for _, key := range expectedDeletedKeys {
_, err := client.Get(key, false, false)
if !etcdstorage.IsEtcdNotFound(err) {
t.Errorf("expected deletion didn't happen: %v", err)
} }
if !assert.True(reflect.DeepEqual(fakeClient.DeletedKeys, expectDeletedKeys)) {
t.Errorf("unexpected deleted keys: %v", fakeClient.DeletedKeys)
} }
installed := master.ListThirdPartyResources() installed := master.ListThirdPartyResources()
if len(installed) != 0 { if len(installed) != 0 {