Private EtcdHelper
This commit is contained in:
@@ -392,7 +392,7 @@ func TestAuthModeAlwaysAllow(t *testing.T) {
|
||||
framework.DeleteAllEtcdKeys()
|
||||
|
||||
// Set up a master
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -403,7 +403,7 @@ func TestAuthModeAlwaysAllow(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -507,7 +507,7 @@ func TestAuthModeAlwaysDeny(t *testing.T) {
|
||||
framework.DeleteAllEtcdKeys()
|
||||
|
||||
// Set up a master
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -519,7 +519,7 @@ func TestAuthModeAlwaysDeny(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -574,7 +574,7 @@ func TestAliceNotForbiddenOrUnauthorized(t *testing.T) {
|
||||
// This file has alice and bob in it.
|
||||
|
||||
// Set up a master
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -586,7 +586,7 @@ func TestAliceNotForbiddenOrUnauthorized(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -661,7 +661,7 @@ func TestBobIsForbidden(t *testing.T) {
|
||||
framework.DeleteAllEtcdKeys()
|
||||
|
||||
// This file has alice and bob in it.
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -673,7 +673,7 @@ func TestBobIsForbidden(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -722,7 +722,7 @@ func TestUnknownUserIsUnauthorized(t *testing.T) {
|
||||
// This file has alice and bob in it.
|
||||
|
||||
// Set up a master
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -734,7 +734,7 @@ func TestUnknownUserIsUnauthorized(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -799,7 +799,7 @@ func TestNamespaceAuthorization(t *testing.T) {
|
||||
framework.DeleteAllEtcdKeys()
|
||||
|
||||
// This file has alice and bob in it.
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -814,7 +814,7 @@ func TestNamespaceAuthorization(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -914,7 +914,7 @@ func TestKindAuthorization(t *testing.T) {
|
||||
// This file has alice and bob in it.
|
||||
|
||||
// Set up a master
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -929,7 +929,7 @@ func TestKindAuthorization(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
@@ -1017,7 +1017,7 @@ func TestReadOnlyAuthorization(t *testing.T) {
|
||||
// This file has alice and bob in it.
|
||||
|
||||
// Set up a master
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -1031,7 +1031,7 @@ func TestReadOnlyAuthorization(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
|
@@ -31,66 +31,57 @@ import (
|
||||
"github.com/GoogleCloudPlatform/kubernetes/test/integration/framework"
|
||||
)
|
||||
|
||||
type stringCodec struct{}
|
||||
|
||||
type fakeAPIObject string
|
||||
|
||||
func (*fakeAPIObject) IsAnAPIObject() {}
|
||||
|
||||
func (c stringCodec) Encode(obj runtime.Object) ([]byte, error) {
|
||||
return []byte(*obj.(*fakeAPIObject)), nil
|
||||
}
|
||||
|
||||
func (c stringCodec) Decode(data []byte) (runtime.Object, error) {
|
||||
o := fakeAPIObject(data)
|
||||
return &o, nil
|
||||
}
|
||||
|
||||
func (c stringCodec) DecodeInto(data []byte, obj runtime.Object) error {
|
||||
o := obj.(*fakeAPIObject)
|
||||
*o = fakeAPIObject(data)
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestSetObj(t *testing.T) {
|
||||
client := framework.NewEtcdClient()
|
||||
helper := tools.EtcdHelper{Client: client, Codec: stringCodec{}}
|
||||
etcdStorage := tools.NewEtcdStorage(client, testapi.Codec(), "")
|
||||
framework.WithEtcdKey(func(key string) {
|
||||
fakeObject := fakeAPIObject("object")
|
||||
if err := helper.SetObj(key, &fakeObject, nil, 0); err != nil {
|
||||
testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||
if err := etcdStorage.SetObj(key, &testObject, nil, 0); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
resp, err := client.Get(key, false, false)
|
||||
if err != nil || resp.Node == nil {
|
||||
t.Fatalf("unexpected error: %v %v", err, resp)
|
||||
}
|
||||
if resp.Node.Value != "object" {
|
||||
t.Errorf("unexpected response: %#v", resp.Node)
|
||||
decoded, err := testapi.Codec().Decode([]byte(resp.Node.Value))
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected response: %#v", resp.Node)
|
||||
}
|
||||
result := *decoded.(*api.ServiceAccount)
|
||||
if !api.Semantic.DeepEqual(testObject, result) {
|
||||
t.Errorf("expected: %#v got: %#v", testObject, result)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestExtractObj(t *testing.T) {
|
||||
client := framework.NewEtcdClient()
|
||||
helper := tools.EtcdHelper{Client: client, Codec: stringCodec{}}
|
||||
etcdStorage := tools.NewEtcdStorage(client, testapi.Codec(), "")
|
||||
framework.WithEtcdKey(func(key string) {
|
||||
_, err := client.Set(key, "object", 0)
|
||||
testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||
coded, err := testapi.Codec().Encode(&testObject)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
s := fakeAPIObject("")
|
||||
if err := helper.ExtractObj(key, &s, false); err != nil {
|
||||
_, err = client.Set(key, string(coded), 0)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "object" {
|
||||
t.Errorf("unexpected response: %#v", s)
|
||||
result := api.ServiceAccount{}
|
||||
if err := etcdStorage.ExtractObj(key, &result, false); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
// Propagate ResourceVersion (it is set automatically).
|
||||
testObject.ObjectMeta.ResourceVersion = result.ObjectMeta.ResourceVersion
|
||||
if !api.Semantic.DeepEqual(testObject, result) {
|
||||
t.Errorf("expected: %#v got: %#v", testObject, result)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestWatch(t *testing.T) {
|
||||
client := framework.NewEtcdClient()
|
||||
helper := tools.NewEtcdHelper(client, testapi.Codec(), etcdtest.PathPrefix())
|
||||
etcdStorage := tools.NewEtcdStorage(client, testapi.Codec(), etcdtest.PathPrefix())
|
||||
framework.WithEtcdKey(func(key string) {
|
||||
key = etcdtest.AddPrefix(key)
|
||||
resp, err := client.Set(key, runtime.EncodeOrDie(testapi.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}), 0)
|
||||
@@ -100,7 +91,7 @@ func TestWatch(t *testing.T) {
|
||||
expectedVersion := resp.Node.ModifiedIndex
|
||||
|
||||
// watch should load the object at the current index
|
||||
w, err := helper.Watch(key, 0, tools.Everything)
|
||||
w, err := etcdStorage.Watch(key, 0, tools.Everything)
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error: %v", err)
|
||||
}
|
||||
|
@@ -41,8 +41,8 @@ func NewEtcdClient() *etcd.Client {
|
||||
return etcd.NewClient([]string{})
|
||||
}
|
||||
|
||||
func NewHelper() (tools.EtcdHelper, error) {
|
||||
return master.NewEtcdHelper(NewEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
func NewEtcdStorage() (tools.StorageInterface, error) {
|
||||
return master.NewEtcdStorage(NewEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
}
|
||||
|
||||
func RequireEtcd() {
|
||||
|
@@ -61,7 +61,7 @@ const (
|
||||
type MasterComponents struct {
|
||||
// Raw http server in front of the master
|
||||
ApiServer *httptest.Server
|
||||
// Kubernetes master, contains an embedded etcd helper
|
||||
// Kubernetes master, contains an embedded etcd storage
|
||||
KubeMaster *master.Master
|
||||
// Restclient used to talk to the kubernetes master
|
||||
RestClient *client.Client
|
||||
@@ -71,8 +71,8 @@ type MasterComponents struct {
|
||||
rcStopCh chan struct{}
|
||||
// Used to stop master components individually, and via MasterComponents.Stop
|
||||
once sync.Once
|
||||
// Kubernetes etcd helper, has embedded etcd client
|
||||
EtcdHelper *tools.EtcdHelper
|
||||
// Kubernetes etcd storage, has embedded etcd client
|
||||
EtcdStorage tools.StorageInterface
|
||||
}
|
||||
|
||||
// Config is a struct of configuration directives for NewMasterComponents.
|
||||
@@ -91,7 +91,7 @@ type Config struct {
|
||||
|
||||
// NewMasterComponents creates, initializes and starts master components based on the given config.
|
||||
func NewMasterComponents(c *Config) *MasterComponents {
|
||||
m, s, h := startMasterOrDie(c.MasterConfig)
|
||||
m, s, e := startMasterOrDie(c.MasterConfig)
|
||||
// TODO: Allow callers to pipe through a different master url and create a client/start components using it.
|
||||
glog.Infof("Master %+v", s.URL)
|
||||
if c.DeleteEtcdKeys {
|
||||
@@ -113,27 +113,27 @@ func NewMasterComponents(c *Config) *MasterComponents {
|
||||
RestClient: restClient,
|
||||
ControllerManager: controllerManager,
|
||||
rcStopCh: rcStopCh,
|
||||
EtcdHelper: h,
|
||||
EtcdStorage: e,
|
||||
once: once,
|
||||
}
|
||||
}
|
||||
|
||||
// startMasterOrDie starts a kubernetes master and an httpserver to handle api requests
|
||||
func startMasterOrDie(masterConfig *master.Config) (*master.Master, *httptest.Server, *tools.EtcdHelper) {
|
||||
func startMasterOrDie(masterConfig *master.Config) (*master.Master, *httptest.Server, tools.StorageInterface) {
|
||||
var m *master.Master
|
||||
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
m.Handler.ServeHTTP(w, req)
|
||||
}))
|
||||
|
||||
var helper tools.EtcdHelper
|
||||
var etcdStorage tools.StorageInterface
|
||||
var err error
|
||||
if masterConfig == nil {
|
||||
helper, err = master.NewEtcdHelper(NewEtcdClient(), "", etcdtest.PathPrefix())
|
||||
etcdStorage, err = master.NewEtcdStorage(NewEtcdClient(), "", etcdtest.PathPrefix())
|
||||
if err != nil {
|
||||
glog.Fatalf("Failed to create etcd helper for master %v", err)
|
||||
glog.Fatalf("Failed to create etcd storage for master %v", err)
|
||||
}
|
||||
masterConfig = &master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableLogsSupport: false,
|
||||
EnableProfiling: true,
|
||||
@@ -143,10 +143,10 @@ func startMasterOrDie(masterConfig *master.Config) (*master.Master, *httptest.Se
|
||||
AdmissionControl: admit.NewAlwaysAdmit(),
|
||||
}
|
||||
} else {
|
||||
helper = masterConfig.EtcdHelper
|
||||
etcdStorage = masterConfig.DatabaseStorage
|
||||
}
|
||||
m = master.New(masterConfig)
|
||||
return m, s, &helper
|
||||
return m, s, etcdStorage
|
||||
}
|
||||
|
||||
func (m *MasterComponents) stopRCManager() {
|
||||
@@ -258,13 +258,13 @@ func StartPods(numPods int, host string, restClient *client.Client) error {
|
||||
|
||||
// TODO: Merge this into startMasterOrDie.
|
||||
func RunAMaster(t *testing.T) (*master.Master, *httptest.Server) {
|
||||
helper, err := master.NewEtcdHelper(NewEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
etcdStorage, err := master.NewEtcdStorage(NewEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
m := master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableLogsSupport: false,
|
||||
EnableProfiling: true,
|
||||
|
@@ -179,7 +179,7 @@ func BenchmarkPodListEtcd(b *testing.B) {
|
||||
defer func() {
|
||||
glog.V(3).Infof("Worker %d: listing pods took %v", id, time.Since(now))
|
||||
}()
|
||||
if response, err := m.EtcdHelper.Client.Get(key, true, true); err != nil {
|
||||
if response, err := m.EtcdStorage.Client.Get(key, true, true); err != nil {
|
||||
return err
|
||||
} else if len(response.Node.Nodes) < podsPerNode {
|
||||
glog.Fatalf("List retrieved %d pods, which is less than %d", len(response.Node.Nodes), podsPerNode)
|
||||
|
@@ -53,9 +53,9 @@ type nodeStateManager struct {
|
||||
}
|
||||
|
||||
func TestUnschedulableNodes(t *testing.T) {
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("Couldn't create etcd helper: %v", err)
|
||||
t.Fatalf("Couldn't create etcd storage: %v", err)
|
||||
}
|
||||
framework.DeleteAllEtcdKeys()
|
||||
|
||||
@@ -66,7 +66,7 @@ func TestUnschedulableNodes(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
|
@@ -47,7 +47,7 @@ func deleteSecretOrErrorf(t *testing.T, c *client.Client, ns, name string) {
|
||||
|
||||
// TestSecrets tests apiserver-side behavior of creation of secret objects and their use by pods.
|
||||
func TestSecrets(t *testing.T) {
|
||||
helper, err := framework.NewHelper()
|
||||
etcdStorage, err := framework.NewEtcdStorage()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -59,7 +59,7 @@ func TestSecrets(t *testing.T) {
|
||||
defer s.Close()
|
||||
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
|
@@ -340,7 +340,7 @@ func startServiceAccountTestServer(t *testing.T) (*client.Client, client.Config,
|
||||
deleteAllEtcdKeys()
|
||||
|
||||
// Etcd
|
||||
helper, err := master.NewEtcdHelper(newEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
etcdStorage, err := master.NewEtcdStorage(newEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
@@ -410,7 +410,7 @@ func startServiceAccountTestServer(t *testing.T) (*client.Client, client.Config,
|
||||
|
||||
// Create a master and install handlers into mux.
|
||||
m = master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableLogsSupport: false,
|
||||
EnableUISupport: false,
|
||||
|
@@ -67,13 +67,13 @@ func deleteAllEtcdKeys() {
|
||||
}
|
||||
|
||||
func runAMaster(t *testing.T) (*master.Master, *httptest.Server) {
|
||||
helper, err := master.NewEtcdHelper(newEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
etcdStorage, err := master.NewEtcdStorage(newEtcdClient(), testapi.Version(), etcdtest.PathPrefix())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
m := master.New(&master.Config{
|
||||
EtcdHelper: helper,
|
||||
DatabaseStorage: etcdStorage,
|
||||
KubeletClient: client.FakeKubeletClient{},
|
||||
EnableCoreControllers: true,
|
||||
EnableLogsSupport: false,
|
||||
|
Reference in New Issue
Block a user