func TestGet(t *testing.T) { client := framework.NewEtcdClient() keysAPI := etcd.NewKeysAPI(client) etcdStorage := etcdstorage.NewEtcdStorage(client, testapi.Default.Codec(), "", false) ctx := context.TODO() framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} coded, err := runtime.Encode(testapi.Default.Codec(), &testObject) if err != nil { t.Fatalf("unexpected error: %v", err) } _, err = keysAPI.Set(ctx, key, string(coded), nil) if err != nil { t.Fatalf("unexpected error: %v", err) } result := api.ServiceAccount{} if err := etcdStorage.Get(ctx, 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() keysAPI := etcd.NewKeysAPI(client) etcdStorage := etcdstorage.NewEtcdStorage(client, testapi.Default.Codec(), etcdtest.PathPrefix(), false) ctx := context.TODO() framework.WithEtcdKey(func(key string) { key = etcdtest.AddPrefix(key) resp, err := keysAPI.Set(ctx, key, runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}), nil) if err != nil { t.Fatalf("unexpected error: %v", err) } expectedVersion := resp.Node.ModifiedIndex // watch should load the object at the current index w, err := etcdStorage.Watch(ctx, key, "0", storage.Everything) if err != nil { t.Fatalf("Unexpected error: %v", err) } event := <-w.ResultChan() if event.Type != watch.Added || event.Object == nil { t.Fatalf("expected first value to be set to ADDED, got %#v", event) } // version should match what we set pod := event.Object.(*api.Pod) if pod.ResourceVersion != strconv.FormatUint(expectedVersion, 10) { t.Errorf("expected version %d, got %#v", expectedVersion, pod) } // should be no events in the stream select { case event, ok := <-w.ResultChan(): if !ok { t.Fatalf("channel closed unexpectedly") } t.Fatalf("unexpected object in channel: %#v", event) default: } // should return the previously deleted item in the watch, but with the latest index resp, err = keysAPI.Delete(ctx, key, nil) if err != nil { t.Fatalf("unexpected error: %v", err) } expectedVersion = resp.Node.ModifiedIndex event = <-w.ResultChan() if event.Type != watch.Deleted { t.Errorf("expected deleted event %#v", event) } pod = event.Object.(*api.Pod) if pod.ResourceVersion != strconv.FormatUint(expectedVersion, 10) { t.Errorf("expected version %d, got %#v", expectedVersion, pod) } }) }
func TestWriteTTL(t *testing.T) { client := framework.NewEtcdClient() keysAPI := etcd.NewKeysAPI(client) etcdStorage := etcdstorage.NewEtcdStorage(client, testapi.Default.Codec(), "", false) ctx := context.TODO() framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} if err := etcdStorage.Set(ctx, key, &testObject, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } result := &api.ServiceAccount{} err := etcdStorage.GuaranteedUpdate(ctx, key, result, false, nil, func(obj runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { if in, ok := obj.(*api.ServiceAccount); !ok || in.Name != "foo" { t.Fatalf("unexpected existing object: %v", obj) } if res.TTL != 0 { t.Fatalf("unexpected TTL: %#v", res) } ttl := uint64(10) out := &api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "out"}} return out, &ttl, nil }) if err != nil { t.Fatalf("unexpected error: %v", err) } if result.Name != "out" { t.Errorf("unexpected response: %#v", result) } if res, err := keysAPI.Get(ctx, key, nil); err != nil || res == nil || res.Node.TTL != 10 { t.Fatalf("unexpected get: %v %#v", err, res) } result = &api.ServiceAccount{} err = etcdStorage.GuaranteedUpdate(ctx, key, result, false, nil, func(obj runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { if in, ok := obj.(*api.ServiceAccount); !ok || in.Name != "out" { t.Fatalf("unexpected existing object: %v", obj) } if res.TTL <= 1 { t.Fatalf("unexpected TTL: %#v", res) } out := &api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "out2"}} return out, nil, nil }) if err != nil { t.Fatalf("unexpected error: %v", err) } if result.Name != "out2" { t.Errorf("unexpected response: %#v", result) } if res, err := keysAPI.Get(ctx, key, nil); err != nil || res == nil || res.Node.TTL <= 1 { t.Fatalf("unexpected get: %v %#v", err, res) } }) }
func TestIgnoreClusterName(t *testing.T) { config := framework.NewMasterConfig() prefix := config.StorageFactory.(*genericapiserver.DefaultStorageFactory).StorageConfig.Prefix _, s := framework.RunAMaster(config) defer s.Close() client := clientset.NewForConfigOrDie(&restclient.Config{Host: s.URL, ContentConfig: restclient.ContentConfig{GroupVersion: ®istered.GroupOrDie(v1.GroupName).GroupVersion}}) etcdClient := framework.NewEtcdClient() etcdStorage := etcdstorage.NewEtcdStorage(etcdClient, testapi.Default.Codec(), prefix+"/namespaces/", false, etcdtest.DeserializationCacheSize) ctx := context.TODO() ns := v1.Namespace{ ObjectMeta: v1.ObjectMeta{ Name: "test-namespace", ClusterName: "cluster-name-to-ignore", }, } nsNew, err := client.Core().Namespaces().Create(&ns) assert.Nil(t, err) assert.Equal(t, ns.Name, nsNew.Name) assert.Empty(t, nsNew.ClusterName) nsEtcd := v1.Namespace{} err = etcdStorage.Get(ctx, ns.Name, &nsEtcd, false) assert.Nil(t, err) assert.Equal(t, ns.Name, nsEtcd.Name) assert.Empty(t, nsEtcd.ClusterName) nsNew, err = client.Core().Namespaces().Update(&ns) assert.Nil(t, err) assert.Equal(t, ns.Name, nsNew.Name) assert.Empty(t, nsNew.ClusterName) nsEtcd = v1.Namespace{} err = etcdStorage.Get(ctx, ns.Name, &nsEtcd, false) assert.Nil(t, err) assert.Equal(t, ns.Name, nsEtcd.Name) assert.Empty(t, nsEtcd.ClusterName) }
func TestSet(t *testing.T) { client := framework.NewEtcdClient() etcdStorage := etcd.NewEtcdStorage(client, testapi.Default.Codec(), "") framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} if err := etcdStorage.Set(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) } decoded, err := testapi.Default.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 TestCreate(t *testing.T) { client := framework.NewEtcdClient() keysAPI := etcd.NewKeysAPI(client) etcdStorage := etcdstorage.NewEtcdStorage(client, testapi.Default.Codec(), "", false, etcdtest.DeserializationCacheSize) ctx := context.TODO() framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} if err := etcdStorage.Create(ctx, key, &testObject, nil, 0); err != nil { t.Fatalf("unexpected error: %v", err) } resp, err := keysAPI.Get(ctx, key, nil) if err != nil || resp.Node == nil { t.Fatalf("unexpected error: %v %v", err, resp) } decoded, err := runtime.Decode(testapi.Default.Codec(), []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) } }) }