mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
Merge pull request #17057 from wojtek-t/remove_fake_client_from_contrib
Auto commit by PR queue bot
This commit is contained in:
commit
068e70dba8
@ -17,18 +17,24 @@ limitations under the License.
|
|||||||
package election
|
package election
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/coreos/go-etcd/etcd"
|
"github.com/coreos/go-etcd/etcd"
|
||||||
|
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
||||||
"k8s.io/kubernetes/pkg/tools"
|
"k8s.io/kubernetes/pkg/tools"
|
||||||
"k8s.io/kubernetes/pkg/watch"
|
"k8s.io/kubernetes/pkg/watch"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestEtcdMasterOther(t *testing.T) {
|
func TestEtcdMasterOther(t *testing.T) {
|
||||||
|
server := etcdtesting.NewEtcdTestClientServer(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
|
||||||
path := "foo"
|
path := "foo"
|
||||||
etcd := tools.NewFakeEtcdClient(t)
|
if _, err := server.Client.Set(path, "baz", 0); err != nil {
|
||||||
etcd.Set(path, "baz", 0)
|
t.Errorf("unexpected error: %v", err)
|
||||||
master := NewEtcdMasterElector(etcd)
|
}
|
||||||
|
master := NewEtcdMasterElector(server.Client)
|
||||||
w := master.Elect(path, "bar")
|
w := master.Elect(path, "bar")
|
||||||
result := <-w.ResultChan()
|
result := <-w.ResultChan()
|
||||||
if result.Type != watch.Modified || result.Object.(Master) != "baz" {
|
if result.Type != watch.Modified || result.Object.(Master) != "baz" {
|
||||||
@ -38,18 +44,11 @@ func TestEtcdMasterOther(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestEtcdMasterNoOther(t *testing.T) {
|
func TestEtcdMasterNoOther(t *testing.T) {
|
||||||
|
server := etcdtesting.NewEtcdTestClientServer(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
|
||||||
path := "foo"
|
path := "foo"
|
||||||
e := tools.NewFakeEtcdClient(t)
|
master := NewEtcdMasterElector(server.Client)
|
||||||
e.TestIndex = true
|
|
||||||
e.Data["foo"] = tools.EtcdResponseWithError{
|
|
||||||
R: &etcd.Response{
|
|
||||||
Node: nil,
|
|
||||||
},
|
|
||||||
E: &etcd.EtcdError{
|
|
||||||
ErrorCode: tools.EtcdErrorCodeNotFound,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
master := NewEtcdMasterElector(e)
|
|
||||||
w := master.Elect(path, "bar")
|
w := master.Elect(path, "bar")
|
||||||
result := <-w.ResultChan()
|
result := <-w.ResultChan()
|
||||||
if result.Type != watch.Modified || result.Object.(Master) != "bar" {
|
if result.Type != watch.Modified || result.Object.(Master) != "bar" {
|
||||||
@ -58,41 +57,77 @@ func TestEtcdMasterNoOther(t *testing.T) {
|
|||||||
w.Stop()
|
w.Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MockClient is wrapper aroung tools.EtcdClient.
|
||||||
|
type MockClient struct {
|
||||||
|
client tools.EtcdClient
|
||||||
|
t *testing.T
|
||||||
|
// afterGetFunc is called after each Get() call.
|
||||||
|
afterGetFunc func()
|
||||||
|
calls []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) GetCluster() []string {
|
||||||
|
return m.client.GetCluster()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) Get(key string, sort, recursive bool) (*etcd.Response, error) {
|
||||||
|
m.calls = append(m.calls, "get")
|
||||||
|
defer m.afterGetFunc()
|
||||||
|
response, err := m.client.Get(key, sort, recursive)
|
||||||
|
return response, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) Set(key, value string, ttl uint64) (*etcd.Response, error) {
|
||||||
|
return m.client.Set(key, value, ttl)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) Create(key, value string, ttl uint64) (*etcd.Response, error) {
|
||||||
|
m.calls = append(m.calls, "create")
|
||||||
|
return m.client.Create(key, value, ttl)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) CompareAndSwap(key, value string, ttl uint64, prevValue string, prevIndex uint64) (*etcd.Response, error) {
|
||||||
|
return m.client.CompareAndSwap(key, value, ttl, prevValue, prevIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) Delete(key string, recursive bool) (*etcd.Response, error) {
|
||||||
|
return m.client.Delete(key, recursive)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MockClient) Watch(prefix string, waitIndex uint64, recursive bool, receiver chan *etcd.Response, stop chan bool) (*etcd.Response, error) {
|
||||||
|
return m.client.Watch(prefix, waitIndex, recursive, receiver, stop)
|
||||||
|
}
|
||||||
|
|
||||||
func TestEtcdMasterNoOtherThenConflict(t *testing.T) {
|
func TestEtcdMasterNoOtherThenConflict(t *testing.T) {
|
||||||
|
server := etcdtesting.NewEtcdTestClientServer(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
|
||||||
|
// We set up the following scenario:
|
||||||
|
// - after each Get() call, we write "baz" to a path
|
||||||
|
// - this is simulating someone else writing a data
|
||||||
|
// - the value written by someone else is the new value
|
||||||
path := "foo"
|
path := "foo"
|
||||||
e := tools.NewFakeEtcdClient(t)
|
client := &MockClient{
|
||||||
e.TestIndex = true
|
client: server.Client,
|
||||||
// Ok, so we set up a chain of responses from etcd:
|
t: t,
|
||||||
// 1) Nothing there
|
afterGetFunc: func() {
|
||||||
// 2) conflict (someone else wrote)
|
if _, err := server.Client.Set(path, "baz", 0); err != nil {
|
||||||
// 3) new value (the data they wrote)
|
t.Errorf("unexpected error: %v", err)
|
||||||
empty := tools.EtcdResponseWithError{
|
}
|
||||||
R: &etcd.Response{
|
|
||||||
Node: nil,
|
|
||||||
},
|
|
||||||
E: &etcd.EtcdError{
|
|
||||||
ErrorCode: tools.EtcdErrorCodeNotFound,
|
|
||||||
},
|
},
|
||||||
|
calls: make([]string, 0),
|
||||||
}
|
}
|
||||||
empty.N = &tools.EtcdResponseWithError{
|
|
||||||
R: &etcd.Response{},
|
master := NewEtcdMasterElector(client)
|
||||||
E: &etcd.EtcdError{
|
|
||||||
ErrorCode: tools.EtcdErrorCodeNodeExist,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
empty.N.N = &tools.EtcdResponseWithError{
|
|
||||||
R: &etcd.Response{
|
|
||||||
Node: &etcd.Node{
|
|
||||||
Value: "baz",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
e.Data["foo"] = empty
|
|
||||||
master := NewEtcdMasterElector(e)
|
|
||||||
w := master.Elect(path, "bar")
|
w := master.Elect(path, "bar")
|
||||||
result := <-w.ResultChan()
|
result := <-w.ResultChan()
|
||||||
if result.Type != watch.Modified || result.Object.(Master) != "bar" {
|
if result.Type != watch.Modified || result.Object.(Master) != "baz" {
|
||||||
t.Errorf("unexpected event: %#v", result)
|
t.Errorf("unexpected event: %#v", result)
|
||||||
}
|
}
|
||||||
w.Stop()
|
w.Stop()
|
||||||
|
|
||||||
|
expectedCalls := []string{"get", "create", "get"}
|
||||||
|
if !reflect.DeepEqual(client.calls, expectedCalls) {
|
||||||
|
t.Errorf("unexpected calls: %#v", client.calls)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user