diff --git a/cluster/addons/dns/kube2sky/kube2sky.go b/cluster/addons/dns/kube2sky/kube2sky.go index 6a6b2679413..ea298bb8a4d 100644 --- a/cluster/addons/dns/kube2sky/kube2sky.go +++ b/cluster/addons/dns/kube2sky/kube2sky.go @@ -37,7 +37,7 @@ import ( kclientcmd "github.com/GoogleCloudPlatform/kubernetes/pkg/client/clientcmd" kframework "github.com/GoogleCloudPlatform/kubernetes/pkg/controller/framework" kSelector "github.com/GoogleCloudPlatform/kubernetes/pkg/fields" - tools "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/util/wait" etcd "github.com/coreos/go-etcd/etcd" @@ -354,7 +354,7 @@ func newEtcdClient(etcdServer string) (*etcd.Client, error) { err error ) for attempt := 1; attempt <= maxConnectAttempts; attempt++ { - if _, err = tools.GetEtcdVersion(etcdServer); err == nil { + if _, err = etcdstorage.GetEtcdVersion(etcdServer); err == nil { break } if attempt == maxConnectAttempts { diff --git a/cmd/kubernetes/kubernetes.go b/cmd/kubernetes/kubernetes.go index c664fa7c503..d510e2f3f32 100644 --- a/cmd/kubernetes/kubernetes.go +++ b/cmd/kubernetes/kubernetes.go @@ -41,6 +41,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools" "github.com/GoogleCloudPlatform/kubernetes/pkg/master" "github.com/GoogleCloudPlatform/kubernetes/pkg/service" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler" @@ -167,7 +168,7 @@ func main() { defer util.FlushLogs() glog.Infof("Creating etcd client pointing to %v", *etcdServer) - etcdClient, err := tools.NewEtcdClientStartServerIfNecessary(*etcdServer) + etcdClient, err := etcdstorage.NewEtcdClientStartServerIfNecessary(*etcdServer) if err != nil { glog.Fatalf("Failed to connect to etcd: %v", err) } diff --git a/contrib/mesos/pkg/election/etcd_master.go b/contrib/mesos/pkg/election/etcd_master.go index 59183a90580..81b435ee985 100644 --- a/contrib/mesos/pkg/election/etcd_master.go +++ b/contrib/mesos/pkg/election/etcd_master.go @@ -20,6 +20,7 @@ import ( "fmt" "time" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" @@ -90,10 +91,10 @@ func (e *etcdMasterElector) extendMaster(path, id string, ttl uint64, res *etcd. // We don't handle the TTL delete w/o a write case here, it's handled in the next loop // iteration. _, err := e.etcd.CompareAndSwap(path, id, ttl, "", res.Node.ModifiedIndex) - if err != nil && !tools.IsEtcdTestFailed(err) { + if err != nil && !etcdstorage.IsEtcdTestFailed(err) { return "", err } - if err != nil && tools.IsEtcdTestFailed(err) { + if err != nil && etcdstorage.IsEtcdTestFailed(err) { return "", nil } return id, nil @@ -105,11 +106,11 @@ func (e *etcdMasterElector) extendMaster(path, id string, ttl uint64, res *etcd. // returns "", err if an error occurred func (e *etcdMasterElector) becomeMaster(path, id string, ttl uint64) (string, error) { _, err := e.etcd.Create(path, id, ttl) - if err != nil && !tools.IsEtcdNodeExist(err) { + if err != nil && !etcdstorage.IsEtcdNodeExist(err) { // unexpected error return "", err } - if err != nil && tools.IsEtcdNodeExist(err) { + if err != nil && etcdstorage.IsEtcdNodeExist(err) { return "", nil } return id, nil @@ -124,12 +125,12 @@ func (e *etcdMasterElector) handleMaster(path, id string, ttl uint64) (string, e res, err := e.etcd.Get(path, false, false) // Unexpected error, bail out - if err != nil && !tools.IsEtcdNotFound(err) { + if err != nil && !etcdstorage.IsEtcdNotFound(err) { return "", err } // There is no master, try to become the master. - if err != nil && tools.IsEtcdNotFound(err) { + if err != nil && etcdstorage.IsEtcdNotFound(err) { return e.becomeMaster(path, id, ttl) } diff --git a/contrib/mesos/pkg/scheduler/service/service.go b/contrib/mesos/pkg/scheduler/service/service.go index c9aab079493..3411db10bd9 100644 --- a/contrib/mesos/pkg/scheduler/service/service.go +++ b/contrib/mesos/pkg/scheduler/service/service.go @@ -47,6 +47,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/clientauth" "github.com/GoogleCloudPlatform/kubernetes/pkg/master/ports" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/coreos/go-etcd/etcd" @@ -740,7 +741,7 @@ func (s *SchedulerServer) buildFrameworkInfo() (info *mesos.FrameworkInfo, cred func (s *SchedulerServer) fetchFrameworkID(client tools.EtcdClient) (*mesos.FrameworkID, error) { if s.FailoverTimeout > 0 { if response, err := client.Get(meta.FrameworkIDKey, false, false); err != nil { - if !tools.IsEtcdNotFound(err) { + if !etcdstorage.IsEtcdNotFound(err) { return nil, fmt.Errorf("unexpected failure attempting to load framework ID from etcd: %v", err) } log.V(1).Infof("did not find framework ID in etcd") @@ -751,7 +752,7 @@ func (s *SchedulerServer) fetchFrameworkID(client tools.EtcdClient) (*mesos.Fram } else { //TODO(jdef) this seems like a totally hackish way to clean up the framework ID if _, err := client.Delete(meta.FrameworkIDKey, true); err != nil { - if !tools.IsEtcdNotFound(err) { + if !etcdstorage.IsEtcdNotFound(err) { return nil, fmt.Errorf("failed to delete framework ID from etcd: %v", err) } log.V(1).Infof("nothing to delete: did not find framework ID in etcd") diff --git a/contrib/pod-master/podmaster.go b/contrib/pod-master/podmaster.go index 71d3f4a2c4d..08b94e4cb28 100644 --- a/contrib/pod-master/podmaster.go +++ b/contrib/pod-master/podmaster.go @@ -27,7 +27,7 @@ import ( "strings" "time" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/coreos/go-etcd/etcd" "github.com/golang/glog" @@ -72,7 +72,7 @@ func (c *Config) leaseAndUpdateLoop(etcdClient *etcd.Client) { func (c *Config) acquireOrRenewLease(etcdClient *etcd.Client) (bool, error) { result, err := etcdClient.Get(c.key, false, false) if err != nil { - if tools.IsEtcdNotFound(err) { + if etcdstorage.IsEtcdNotFound(err) { // there is no current master, try to become master, create will fail if the key already exists _, err := etcdClient.Create(c.key, c.whoami, c.ttl) if err != nil { diff --git a/docs/proposals/apiserver_watch.md b/docs/proposals/apiserver_watch.md index ce866b6d686..5610ccbc68c 100644 --- a/docs/proposals/apiserver_watch.md +++ b/docs/proposals/apiserver_watch.md @@ -163,7 +163,7 @@ resource type. However, this watch can potentially expire at any time and reconnecting can return "too old resource version". In that case relisting is necessary. In such case, to avoid LIST requests coming from all watchers at the same time, we can introduce an additional etcd event type: -[EtcdResync](../../pkg/tools/etcd_watcher.go#L36) +[EtcdResync](../../pkg/storage/etcd/etcd_watcher.go#L36) Whenever reslisting will be done to refresh the internal watch to etcd, EtcdResync event will be send to all the watchers. It will contain the diff --git a/pkg/api/errors/etcd/etcd.go b/pkg/api/errors/etcd/etcd.go index 4a6656c74ef..3b85aaffcd3 100644 --- a/pkg/api/errors/etcd/etcd.go +++ b/pkg/api/errors/etcd/etcd.go @@ -18,14 +18,14 @@ package etcd import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" ) // InterpretGetError converts a generic etcd error on a retrieval // operation into the appropriate API error. func InterpretGetError(err error, kind, name string) error { switch { - case tools.IsEtcdNotFound(err): + case etcdstorage.IsEtcdNotFound(err): return errors.NewNotFound(kind, name) default: return err @@ -36,7 +36,7 @@ func InterpretGetError(err error, kind, name string) error { // operation into the appropriate API error. func InterpretCreateError(err error, kind, name string) error { switch { - case tools.IsEtcdNodeExist(err): + case etcdstorage.IsEtcdNodeExist(err): return errors.NewAlreadyExists(kind, name) default: return err @@ -47,7 +47,7 @@ func InterpretCreateError(err error, kind, name string) error { // operation into the appropriate API error. func InterpretUpdateError(err error, kind, name string) error { switch { - case tools.IsEtcdTestFailed(err), tools.IsEtcdNodeExist(err): + case etcdstorage.IsEtcdTestFailed(err), etcdstorage.IsEtcdNodeExist(err): return errors.NewConflict(kind, name, err) default: return err @@ -58,7 +58,7 @@ func InterpretUpdateError(err error, kind, name string) error { // operation into the appropriate API error. func InterpretDeleteError(err error, kind, name string) error { switch { - case tools.IsEtcdNotFound(err): + case etcdstorage.IsEtcdNotFound(err): return errors.NewNotFound(kind, name) default: return err diff --git a/pkg/apiserver/errors.go b/pkg/apiserver/errors.go index e234f0472a2..503d45ac5ba 100644 --- a/pkg/apiserver/errors.go +++ b/pkg/apiserver/errors.go @@ -21,7 +21,7 @@ import ( "net/http" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" ) @@ -52,7 +52,7 @@ func errToAPIStatus(err error) *api.Status { status := http.StatusInternalServerError switch { //TODO: replace me with NewConflictErr - case tools.IsEtcdTestFailed(err): + case etcdstorage.IsEtcdTestFailed(err): status = http.StatusConflict } // Log errors that were not converted to an error status diff --git a/pkg/master/master.go b/pkg/master/master.go index 070ccf15e61..43a5c47e85e 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -70,6 +70,7 @@ import ( ipallocator "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/service/ipallocator" serviceaccountetcd "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/serviceaccount/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/ui" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -234,7 +235,7 @@ func NewEtcdStorage(client tools.EtcdClient, version string, prefix string) (etc if err != nil { return etcdStorage, err } - return tools.NewEtcdStorage(client, versionInterfaces.Codec, prefix), nil + return etcdstorage.NewEtcdStorage(client, versionInterfaces.Codec, prefix), nil } // setDefaults fills in any fields not set that are required to have valid data. @@ -722,7 +723,7 @@ func (m *Master) getServersToValidate(c *Config) map[string]apiserver.Server { addr = etcdUrl.Host port = 4001 } - serversToValidate[fmt.Sprintf("etcd-%d", ix)] = apiserver.Server{Addr: addr, Port: port, Path: "/health", Validate: tools.EtcdHealthCheck} + serversToValidate[fmt.Sprintf("etcd-%d", ix)] = apiserver.Server{Addr: addr, Port: port, Path: "/health", Validate: etcdstorage.EtcdHealthCheck} } return serversToValidate } diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 16ddfcce4fa..6dfd56eb5a5 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -22,6 +22,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest" "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/registrytest" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" ) @@ -31,7 +32,7 @@ func TestGetServersToValidate(t *testing.T) { config := Config{} fakeClient := tools.NewFakeEtcdClient(t) fakeClient.Machines = []string{"http://machine1:4001", "http://machine2", "http://machine3:4003"} - config.DatabaseStorage = tools.NewEtcdStorage(fakeClient, latest.Codec, etcdtest.PathPrefix()) + config.DatabaseStorage = etcdstorage.NewEtcdStorage(fakeClient, latest.Codec, etcdtest.PathPrefix()) master.nodeRegistry = registrytest.NewMinionRegistry([]string{"node1", "node2"}, api.NodeResources{}) diff --git a/pkg/registry/controller/etcd/etcd_test.go b/pkg/registry/controller/etcd/etcd_test.go index 37fc2a6e1a1..3477892a86d 100644 --- a/pkg/registry/controller/etcd/etcd_test.go +++ b/pkg/registry/controller/etcd/etcd_test.go @@ -31,6 +31,7 @@ import ( etcdgeneric "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/coreos/go-etcd/etcd" @@ -44,7 +45,7 @@ const ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } @@ -625,10 +626,10 @@ func TestEtcdWatchControllersFields(t *testing.T) { }, } testEtcdActions := []string{ - tools.EtcdCreate, - tools.EtcdSet, - tools.EtcdCAS, - tools.EtcdDelete} + etcdstorage.EtcdCreate, + etcdstorage.EtcdSet, + etcdstorage.EtcdCAS, + etcdstorage.EtcdDelete} controller := &api.ReplicationController{ ObjectMeta: api.ObjectMeta{ @@ -654,7 +655,7 @@ func TestEtcdWatchControllersFields(t *testing.T) { node := &etcd.Node{ Value: string(controllerBytes), } - if action == tools.EtcdDelete { + if action == etcdstorage.EtcdDelete { prevNode = node } fakeClient.WaitForWatchCompletion() diff --git a/pkg/registry/endpoint/etcd/etcd_test.go b/pkg/registry/endpoint/etcd/etcd_test.go index 4daed4444b4..9ad3a9cd621 100644 --- a/pkg/registry/endpoint/etcd/etcd_test.go +++ b/pkg/registry/endpoint/etcd/etcd_test.go @@ -26,6 +26,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/labels" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -36,7 +37,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/etcd/etcd.go b/pkg/registry/etcd/etcd.go index 1723c718d8a..b9acedff0cb 100644 --- a/pkg/registry/etcd/etcd.go +++ b/pkg/registry/etcd/etcd.go @@ -27,7 +27,6 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/endpoint" "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/pod" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" ) @@ -159,7 +158,7 @@ func (r *Registry) UpdateService(ctx api.Context, svc *api.Service) (*api.Servic // WatchServices begins watching for new, changed, or deleted service configurations. func (r *Registry) WatchServices(ctx api.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { - version, err := tools.ParseWatchResourceVersion(resourceVersion, "service") + version, err := storage.ParseWatchResourceVersion(resourceVersion, "service") if err != nil { return nil, err } diff --git a/pkg/registry/etcd/etcd_test.go b/pkg/registry/etcd/etcd_test.go index 8771273ac07..57ad7bc1016 100644 --- a/pkg/registry/etcd/etcd_test.go +++ b/pkg/registry/etcd/etcd_test.go @@ -31,6 +31,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/pod" podetcd "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/pod/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" @@ -38,13 +39,13 @@ import ( ) func NewTestEtcdRegistry(client tools.EtcdClient) *Registry { - storage := tools.NewEtcdStorage(client, latest.Codec, etcdtest.PathPrefix()) + storage := etcdstorage.NewEtcdStorage(client, latest.Codec, etcdtest.PathPrefix()) registry := NewRegistry(storage, nil, nil) return registry } func NewTestEtcdRegistryWithPods(client tools.EtcdClient) *Registry { - etcdStorage := tools.NewEtcdStorage(client, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(client, latest.Codec, etcdtest.PathPrefix()) podStorage := podetcd.NewStorage(etcdStorage, nil) endpointStorage := endpointetcd.NewStorage(etcdStorage) registry := NewRegistry(etcdStorage, pod.NewRegistry(podStorage.Pod), endpoint.NewRegistry(endpointStorage)) diff --git a/pkg/registry/event/registry_test.go b/pkg/registry/event/registry_test.go index 7ea78814ff9..c54fbad9e20 100644 --- a/pkg/registry/event/registry_test.go +++ b/pkg/registry/event/registry_test.go @@ -26,6 +26,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic" etcdgeneric "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -39,7 +40,7 @@ func NewTestEventEtcdRegistry(t *testing.T) (*tools.FakeEtcdClient, generic.Regi f := tools.NewFakeEtcdClient(t) f.TestIndex = true - s := tools.NewEtcdStorage(f, testapi.Codec(), etcdtest.PathPrefix()) + s := etcdstorage.NewEtcdStorage(f, testapi.Codec(), etcdtest.PathPrefix()) return f, NewEtcdRegistry(s, testTTL) } diff --git a/pkg/registry/generic/etcd/etcd.go b/pkg/registry/generic/etcd/etcd.go index edc61d56dbc..2429c340b5b 100644 --- a/pkg/registry/generic/etcd/etcd.go +++ b/pkg/registry/generic/etcd/etcd.go @@ -30,7 +30,6 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" @@ -456,7 +455,7 @@ func (e *Etcd) Watch(ctx api.Context, label labels.Selector, field fields.Select // WatchPredicate starts a watch for the items that m matches. func (e *Etcd) WatchPredicate(ctx api.Context, m generic.Matcher, resourceVersion string) (watch.Interface, error) { - version, err := tools.ParseWatchResourceVersion(resourceVersion, e.EndpointName) + version, err := storage.ParseWatchResourceVersion(resourceVersion, e.EndpointName) if err != nil { return nil, err } diff --git a/pkg/registry/generic/etcd/etcd_test.go b/pkg/registry/generic/etcd/etcd_test.go index 85e08d39a1a..7b0b9603269 100644 --- a/pkg/registry/generic/etcd/etcd_test.go +++ b/pkg/registry/generic/etcd/etcd_test.go @@ -26,6 +26,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi" "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -69,7 +70,7 @@ func hasCreated(t *testing.T, pod *api.Pod) func(runtime.Object) bool { func NewTestGenericEtcdRegistry(t *testing.T) (*tools.FakeEtcdClient, *Etcd) { f := tools.NewFakeEtcdClient(t) f.TestIndex = true - s := tools.NewEtcdStorage(f, testapi.Codec(), etcdtest.PathPrefix()) + s := etcdstorage.NewEtcdStorage(f, testapi.Codec(), etcdtest.PathPrefix()) strategy := &testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true} podPrefix := "/pods" return f, &Etcd{ diff --git a/pkg/registry/limitrange/registry_test.go b/pkg/registry/limitrange/registry_test.go index 900da79d09a..ea5d6020a6a 100644 --- a/pkg/registry/limitrange/registry_test.go +++ b/pkg/registry/limitrange/registry_test.go @@ -27,6 +27,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic" etcdgeneric "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/generic/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -37,7 +38,7 @@ import ( func NewTestLimitRangeEtcdRegistry(t *testing.T) (*tools.FakeEtcdClient, generic.Registry) { f := tools.NewFakeEtcdClient(t) f.TestIndex = true - s := tools.NewEtcdStorage(f, testapi.Codec(), etcdtest.PathPrefix()) + s := etcdstorage.NewEtcdStorage(f, testapi.Codec(), etcdtest.PathPrefix()) return f, NewEtcdRegistry(s) } diff --git a/pkg/registry/minion/etcd/etcd_test.go b/pkg/registry/minion/etcd/etcd_test.go index e065dddbda6..884c4fa0271 100644 --- a/pkg/registry/minion/etcd/etcd_test.go +++ b/pkg/registry/minion/etcd/etcd_test.go @@ -30,6 +30,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/labels" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" @@ -51,7 +52,7 @@ func (fakeConnectionInfoGetter) GetConnectionInfo(host string) (string, uint, ht func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/namespace/etcd/etcd_test.go b/pkg/registry/namespace/etcd/etcd_test.go index 1c63d11daf9..864210e1924 100644 --- a/pkg/registry/namespace/etcd/etcd_test.go +++ b/pkg/registry/namespace/etcd/etcd_test.go @@ -27,6 +27,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/namespace" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -37,7 +38,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/persistentvolume/etcd/etcd_test.go b/pkg/registry/persistentvolume/etcd/etcd_test.go index eab2fe50324..bfd71f0e1da 100644 --- a/pkg/registry/persistentvolume/etcd/etcd_test.go +++ b/pkg/registry/persistentvolume/etcd/etcd_test.go @@ -28,6 +28,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/registrytest" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -42,7 +43,7 @@ type testRegistry struct { func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) storage, statusStorage := NewStorage(etcdStorage) return storage, statusStorage, fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go b/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go index a663edceef6..6f298d5a739 100644 --- a/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go +++ b/pkg/registry/persistentvolumeclaim/etcd/etcd_test.go @@ -28,6 +28,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/registrytest" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -42,7 +43,7 @@ type testRegistry struct { func newStorage(t *testing.T) (*REST, *StatusREST, *tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) storage, statusStorage := NewStorage(etcdStorage) return storage, statusStorage, fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/pod/etcd/etcd.go b/pkg/registry/pod/etcd/etcd.go index 335f61625e6..a830a17e1ab 100644 --- a/pkg/registry/pod/etcd/etcd.go +++ b/pkg/registry/pod/etcd/etcd.go @@ -36,7 +36,6 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/pod" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util/fielderrors" ) @@ -144,7 +143,7 @@ func (r *BindingREST) setPodHostAndAnnotations(ctx api.Context, podID, oldMachin if err != nil { return nil, err } - err = r.store.Storage.GuaranteedUpdate(podKey, &api.Pod{}, false, tools.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) { + err = r.store.Storage.GuaranteedUpdate(podKey, &api.Pod{}, false, storage.SimpleUpdate(func(obj runtime.Object) (runtime.Object, error) { pod, ok := obj.(*api.Pod) if !ok { return nil, fmt.Errorf("unexpected object: %#v", obj) diff --git a/pkg/registry/pod/etcd/etcd_test.go b/pkg/registry/pod/etcd/etcd_test.go index 3e22533a017..e8999e63a68 100644 --- a/pkg/registry/pod/etcd/etcd_test.go +++ b/pkg/registry/pod/etcd/etcd_test.go @@ -34,6 +34,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/securitycontext" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -44,7 +45,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/podtemplate/etcd/etcd_test.go b/pkg/registry/podtemplate/etcd/etcd_test.go index 7070fcce638..f6277c9ae82 100644 --- a/pkg/registry/podtemplate/etcd/etcd_test.go +++ b/pkg/registry/podtemplate/etcd/etcd_test.go @@ -23,6 +23,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api/rest/resttest" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" ) @@ -30,7 +31,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/resourcequota/etcd/etcd_test.go b/pkg/registry/resourcequota/etcd/etcd_test.go index d98ad3e3bd0..1b195d50a6b 100644 --- a/pkg/registry/resourcequota/etcd/etcd_test.go +++ b/pkg/registry/resourcequota/etcd/etcd_test.go @@ -32,6 +32,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/resourcequota" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -42,7 +43,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, latest.Codec, etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/secret/etcd/etcd_test.go b/pkg/registry/secret/etcd/etcd_test.go index 4c4e2ae258d..6a32e5dee67 100644 --- a/pkg/registry/secret/etcd/etcd_test.go +++ b/pkg/registry/secret/etcd/etcd_test.go @@ -23,6 +23,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api/rest/resttest" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" ) @@ -30,7 +31,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/service/allocator/etcd/etcd.go b/pkg/registry/service/allocator/etcd/etcd.go index 8548e3df24d..57d45721b6b 100644 --- a/pkg/registry/service/allocator/etcd/etcd.go +++ b/pkg/registry/service/allocator/etcd/etcd.go @@ -28,7 +28,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/service/allocator" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" ) var ( @@ -142,7 +142,7 @@ func (e *Etcd) Release(item int) error { // tryUpdate performs a read-update to persist the latest snapshot state of allocation. func (e *Etcd) tryUpdate(fn func() error) error { err := e.storage.GuaranteedUpdate(e.baseKey, &api.RangeAllocation{}, true, - tools.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) { + storage.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) { existing := input.(*api.RangeAllocation) if len(existing.ResourceVersion) == 0 { return nil, fmt.Errorf("cannot allocate resources of type %s at this time", e.kind) @@ -172,7 +172,7 @@ func (e *Etcd) Refresh() (*api.RangeAllocation, error) { existing := &api.RangeAllocation{} if err := e.storage.Get(e.baseKey, existing, false); err != nil { - if tools.IsEtcdNotFound(err) { + if etcdstorage.IsEtcdNotFound(err) { return nil, nil } return nil, etcderr.InterpretGetError(err, e.kind, "") @@ -199,7 +199,7 @@ func (e *Etcd) CreateOrUpdate(snapshot *api.RangeAllocation) error { last := "" err := e.storage.GuaranteedUpdate(e.baseKey, &api.RangeAllocation{}, true, - tools.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) { + storage.SimpleUpdate(func(input runtime.Object) (output runtime.Object, err error) { existing := input.(*api.RangeAllocation) switch { case len(snapshot.ResourceVersion) != 0 && len(existing.ResourceVersion) != 0: diff --git a/pkg/registry/service/allocator/etcd/etcd_test.go b/pkg/registry/service/allocator/etcd/etcd_test.go index 449a9508fe1..a3ff425db5e 100644 --- a/pkg/registry/service/allocator/etcd/etcd_test.go +++ b/pkg/registry/service/allocator/etcd/etcd_test.go @@ -27,6 +27,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/service/allocator" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" ) @@ -34,7 +35,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/service/ipallocator/etcd/etcd_test.go b/pkg/registry/service/ipallocator/etcd/etcd_test.go index 284b4cc9809..e85d9119b86 100644 --- a/pkg/registry/service/ipallocator/etcd/etcd_test.go +++ b/pkg/registry/service/ipallocator/etcd/etcd_test.go @@ -30,6 +30,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/registry/service/ipallocator" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" ) @@ -37,7 +38,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/registry/serviceaccount/etcd/etcd_test.go b/pkg/registry/serviceaccount/etcd/etcd_test.go index 6719ad3b140..9f74985bd6f 100644 --- a/pkg/registry/serviceaccount/etcd/etcd_test.go +++ b/pkg/registry/serviceaccount/etcd/etcd_test.go @@ -23,6 +23,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api/rest/resttest" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + etcdstorage "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" ) @@ -30,7 +31,7 @@ import ( func newEtcdStorage(t *testing.T) (*tools.FakeEtcdClient, storage.Interface) { fakeEtcdClient := tools.NewFakeEtcdClient(t) fakeEtcdClient.TestIndex = true - etcdStorage := tools.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) + etcdStorage := etcdstorage.NewEtcdStorage(fakeEtcdClient, testapi.Codec(), etcdtest.PathPrefix()) return fakeEtcdClient, etcdStorage } diff --git a/pkg/tools/etcd_object.go b/pkg/storage/etcd/api_object_versioner.go similarity index 99% rename from pkg/tools/etcd_object.go rename to pkg/storage/etcd/api_object_versioner.go index 4877a69b5aa..41a605f33ed 100644 --- a/pkg/tools/etcd_object.go +++ b/pkg/storage/etcd/api_object_versioner.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( "strconv" diff --git a/pkg/tools/etcd_object_test.go b/pkg/storage/etcd/api_object_versioner_test.go similarity index 99% rename from pkg/tools/etcd_object_test.go rename to pkg/storage/etcd/api_object_versioner_test.go index 6675fe35013..3e3129ce1ab 100644 --- a/pkg/tools/etcd_object_test.go +++ b/pkg/storage/etcd/api_object_versioner_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( "testing" diff --git a/pkg/storage/etcd/doc.go b/pkg/storage/etcd/doc.go new file mode 100644 index 00000000000..44a2b9d4450 --- /dev/null +++ b/pkg/storage/etcd/doc.go @@ -0,0 +1,17 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package etcd diff --git a/pkg/tools/etcd_helper.go b/pkg/storage/etcd/etcd_helper.go similarity index 96% rename from pkg/tools/etcd_helper.go rename to pkg/storage/etcd/etcd_helper.go index e66da7d842e..53a9e302e77 100644 --- a/pkg/tools/etcd_helper.go +++ b/pkg/storage/etcd/etcd_helper.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( "errors" @@ -28,6 +28,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/metrics" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" @@ -36,7 +37,7 @@ import ( "github.com/golang/glog" ) -func NewEtcdStorage(client EtcdClient, codec runtime.Codec, prefix string) storage.Interface { +func NewEtcdStorage(client tools.EtcdClient, codec runtime.Codec, prefix string) storage.Interface { return &etcdHelper{ client: client, codec: codec, @@ -49,7 +50,7 @@ func NewEtcdStorage(client EtcdClient, codec runtime.Codec, prefix string) stora // etcdHelper is the reference implementation of storage.Interface. type etcdHelper struct { - client EtcdClient + client tools.EtcdClient codec runtime.Codec copier runtime.ObjectCopier // optional, has to be set to perform any atomic operations @@ -365,16 +366,6 @@ func (h *etcdHelper) listEtcdNode(key string) ([]*etcd.Node, uint64, error) { return result.Node.Nodes, result.EtcdIndex, nil } -type SimpleUpdateFunc func(runtime.Object) (runtime.Object, error) - -// SimpleUpdateFunc converts SimpleUpdateFunc into UpdateFunc -func SimpleUpdate(fn SimpleUpdateFunc) storage.UpdateFunc { - return func(input runtime.Object, _ storage.ResponseMeta) (runtime.Object, *uint64, error) { - out, err := fn(input) - return out, nil, err - } -} - // Implements storage.Interface. func (h *etcdHelper) GuaranteedUpdate(key string, ptrToType runtime.Object, ignoreNotFound bool, tryUpdate storage.UpdateFunc) error { v, err := conversion.EnforcePtr(ptrToType) diff --git a/pkg/tools/etcd_helper_test.go b/pkg/storage/etcd/etcd_helper_test.go similarity index 92% rename from pkg/tools/etcd_helper_test.go rename to pkg/storage/etcd/etcd_helper_test.go index 9298fc5a6e1..4fa597fb0e5 100644 --- a/pkg/tools/etcd_helper_test.go +++ b/pkg/storage/etcd/etcd_helper_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( "errors" @@ -35,6 +35,7 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/conversion" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/coreos/go-etcd/etcd" "github.com/stretchr/testify/assert" @@ -66,7 +67,7 @@ func init() { ) } -func newEtcdHelper(client EtcdClient, codec runtime.Codec, prefix string) etcdHelper { +func newEtcdHelper(client tools.EtcdClient, codec runtime.Codec, prefix string) etcdHelper { return *NewEtcdStorage(client, codec, prefix).(*etcdHelper) } @@ -76,7 +77,7 @@ func TestIsEtcdNotFound(t *testing.T) { t.Errorf("Expected %#v to return %v, but it did not", err, isNotFound) } } - try(EtcdErrorNotFound, true) + try(tools.EtcdErrorNotFound, true) try(&etcd.EtcdError{ErrorCode: 101}, false) try(nil, false) try(fmt.Errorf("some other kind of error"), false) @@ -91,10 +92,10 @@ func getEncodedPod(name string) string { } func TestList(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") - fakeClient.Data[key] = EtcdResponseWithError{ + fakeClient.Data[key] = tools.EtcdResponseWithError{ R: &etcd.Response{ EtcdIndex: 10, Node: &etcd.Node{ @@ -161,10 +162,10 @@ func TestList(t *testing.T) { // TestListAcrossDirectories ensures that the client excludes directories and flattens tree-response - simulates cross-namespace query func TestListAcrossDirectories(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") - fakeClient.Data[key] = EtcdResponseWithError{ + fakeClient.Data[key] = tools.EtcdResponseWithError{ R: &etcd.Response{ EtcdIndex: 10, Node: &etcd.Node{ @@ -244,10 +245,10 @@ func TestListAcrossDirectories(t *testing.T) { } func TestListExcludesDirectories(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") - fakeClient.Data[key] = EtcdResponseWithError{ + fakeClient.Data[key] = tools.EtcdResponseWithError{ R: &etcd.Response{ EtcdIndex: 10, Node: &etcd.Node{ @@ -315,7 +316,7 @@ func TestListExcludesDirectories(t *testing.T) { } func TestGet(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") expect := api.Pod{ @@ -337,10 +338,10 @@ func TestGet(t *testing.T) { } func TestGetNotFoundErr(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) key1 := etcdtest.AddPrefix("/some/key") - fakeClient.Data[key1] = EtcdResponseWithError{ + fakeClient.Data[key1] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, @@ -349,13 +350,13 @@ func TestGetNotFoundErr(t *testing.T) { }, } key2 := etcdtest.AddPrefix("/some/key2") - fakeClient.Data[key2] = EtcdResponseWithError{ + fakeClient.Data[key2] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, } key3 := etcdtest.AddPrefix("/some/key3") - fakeClient.Data[key3] = EtcdResponseWithError{ + fakeClient.Data[key3] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: "", @@ -381,7 +382,7 @@ func TestGetNotFoundErr(t *testing.T) { func TestCreate(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) returnedObj := &api.Pod{} err := helper.Create("/some/key", obj, returnedObj, 5) @@ -407,7 +408,7 @@ func TestCreate(t *testing.T) { func TestCreateNilOutParam(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) err := helper.Create("/some/key", obj, nil, 5) if err != nil { @@ -417,7 +418,7 @@ func TestCreateNilOutParam(t *testing.T) { func TestSet(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) returnedObj := &api.Pod{} err := helper.Set("/some/key", obj, returnedObj, 5) @@ -444,7 +445,7 @@ func TestSet(t *testing.T) { func TestSetFailCAS(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.CasErr = fakeClient.NewError(123) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) err := helper.Set("/some/key", obj, nil, 5) @@ -455,11 +456,11 @@ func TestSetFailCAS(t *testing.T) { func TestSetWithVersion(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo", ResourceVersion: "1"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.TestIndex = true helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") - fakeClient.Data[key] = EtcdResponseWithError{ + fakeClient.Data[key] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: runtime.EncodeOrDie(testapi.Codec(), obj), @@ -492,7 +493,7 @@ func TestSetWithVersion(t *testing.T) { func TestSetWithoutResourceVersioner(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) helper.versioner = nil returnedObj := &api.Pod{} @@ -520,7 +521,7 @@ func TestSetWithoutResourceVersioner(t *testing.T) { func TestSetNilOutParam(t *testing.T) { obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) helper := newEtcdHelper(fakeClient, testapi.Codec(), etcdtest.PathPrefix()) helper.versioner = nil err := helper.Set("/some/key", obj, nil, 3) @@ -530,7 +531,7 @@ func TestSetNilOutParam(t *testing.T) { } func TestGuaranteedUpdate(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.TestIndex = true helper := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") @@ -538,7 +539,7 @@ func TestGuaranteedUpdate(t *testing.T) { // Create a new node. fakeClient.ExpectNotFoundGet(key) obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - err := helper.GuaranteedUpdate("/some/key", &TestResource{}, true, SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + err := helper.GuaranteedUpdate("/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { return obj, nil })) if err != nil { @@ -557,7 +558,7 @@ func TestGuaranteedUpdate(t *testing.T) { // Update an existing node. callbackCalled := false objUpdate := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2} - err = helper.GuaranteedUpdate("/some/key", &TestResource{}, true, SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + err = helper.GuaranteedUpdate("/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { callbackCalled = true if in.(*TestResource).Value != 1 { @@ -585,7 +586,7 @@ func TestGuaranteedUpdate(t *testing.T) { } func TestGuaranteedUpdateTTL(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.TestIndex = true helper := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") @@ -686,7 +687,7 @@ func TestGuaranteedUpdateTTL(t *testing.T) { } func TestGuaranteedUpdateNoChange(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.TestIndex = true helper := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") @@ -694,7 +695,7 @@ func TestGuaranteedUpdateNoChange(t *testing.T) { // Create a new node. fakeClient.ExpectNotFoundGet(key) obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - err := helper.GuaranteedUpdate("/some/key", &TestResource{}, true, SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + err := helper.GuaranteedUpdate("/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { return obj, nil })) if err != nil { @@ -704,7 +705,7 @@ func TestGuaranteedUpdateNoChange(t *testing.T) { // Update an existing node with the same data callbackCalled := false objUpdate := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - err = helper.GuaranteedUpdate("/some/key", &TestResource{}, true, SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + err = helper.GuaranteedUpdate("/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { fakeClient.Err = errors.New("should not be called") callbackCalled = true return objUpdate, nil @@ -718,7 +719,7 @@ func TestGuaranteedUpdateNoChange(t *testing.T) { } func TestGuaranteedUpdateKeyNotFound(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.TestIndex = true helper := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") @@ -727,7 +728,7 @@ func TestGuaranteedUpdateKeyNotFound(t *testing.T) { fakeClient.ExpectNotFoundGet(key) obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1} - f := SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + f := storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { return obj, nil }) @@ -745,7 +746,7 @@ func TestGuaranteedUpdateKeyNotFound(t *testing.T) { } func TestGuaranteedUpdate_CreateCollision(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) fakeClient.TestIndex = true helper := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) key := etcdtest.AddPrefix("/some/key") @@ -764,7 +765,7 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) { defer wgDone.Done() firstCall := true - err := helper.GuaranteedUpdate("/some/key", &TestResource{}, true, SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + err := helper.GuaranteedUpdate("/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { defer func() { firstCall = false }() if firstCall { @@ -843,7 +844,7 @@ func TestGetEtcdVersion_NotListening(t *testing.T) { } func TestPrefixEtcdKey(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) prefix := path.Join("/", etcdtest.PathPrefix()) helper := newEtcdHelper(fakeClient, testapi.Codec(), prefix) diff --git a/pkg/tools/etcd_util.go b/pkg/storage/etcd/etcd_util.go similarity index 83% rename from pkg/tools/etcd_util.go rename to pkg/storage/etcd/etcd_util.go index ebcab56ded9..c5f0231d05a 100644 --- a/pkg/tools/etcd_util.go +++ b/pkg/storage/etcd/etcd_util.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( "encoding/json" @@ -23,41 +23,42 @@ import ( "net/http" "os/exec" - "github.com/coreos/go-etcd/etcd" + "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + goetcd "github.com/coreos/go-etcd/etcd" "github.com/golang/glog" ) // IsEtcdNotFound returns true iff err is an etcd not found error. func IsEtcdNotFound(err error) bool { - return isEtcdErrorNum(err, EtcdErrorCodeNotFound) + return isEtcdErrorNum(err, tools.EtcdErrorCodeNotFound) } // IsEtcdNodeExist returns true iff err is an etcd node aleady exist error. func IsEtcdNodeExist(err error) bool { - return isEtcdErrorNum(err, EtcdErrorCodeNodeExist) + return isEtcdErrorNum(err, tools.EtcdErrorCodeNodeExist) } // IsEtcdTestFailed returns true iff err is an etcd write conflict. func IsEtcdTestFailed(err error) bool { - return isEtcdErrorNum(err, EtcdErrorCodeTestFailed) + return isEtcdErrorNum(err, tools.EtcdErrorCodeTestFailed) } // IsEtcdWatchStoppedByUser returns true iff err is a client triggered stop. func IsEtcdWatchStoppedByUser(err error) bool { - return etcd.ErrWatchStoppedByUser == err + return goetcd.ErrWatchStoppedByUser == err } // isEtcdErrorNum returns true iff err is an etcd error, whose errorCode matches errorCode func isEtcdErrorNum(err error, errorCode int) bool { - etcdError, ok := err.(*etcd.EtcdError) + etcdError, ok := err.(*goetcd.EtcdError) return ok && etcdError != nil && etcdError.ErrorCode == errorCode } // etcdErrorIndex returns the index associated with the error message and whether the // index was available. func etcdErrorIndex(err error) (uint64, bool) { - if etcdError, ok := err.(*etcd.EtcdError); ok { + if etcdError, ok := err.(*goetcd.EtcdError); ok { return etcdError.Index, true } return 0, false @@ -90,7 +91,7 @@ func startEtcd() (*exec.Cmd, error) { return cmd, nil } -func NewEtcdClientStartServerIfNecessary(server string) (EtcdClient, error) { +func NewEtcdClientStartServerIfNecessary(server string) (tools.EtcdClient, error) { _, err := GetEtcdVersion(server) if err != nil { glog.Infof("Failed to find etcd, attempting to start.") @@ -101,7 +102,7 @@ func NewEtcdClientStartServerIfNecessary(server string) (EtcdClient, error) { } servers := []string{server} - return etcd.NewClient(servers), nil + return goetcd.NewClient(servers), nil } type etcdHealth struct { diff --git a/pkg/tools/etcd_watcher.go b/pkg/storage/etcd/etcd_watcher.go similarity index 90% rename from pkg/tools/etcd_watcher.go rename to pkg/storage/etcd/etcd_watcher.go index fcc62357a25..403709712bb 100644 --- a/pkg/tools/etcd_watcher.go +++ b/pkg/storage/etcd/etcd_watcher.go @@ -14,19 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( - "strconv" "sync" "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" - "github.com/GoogleCloudPlatform/kubernetes/pkg/util/fielderrors" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" "github.com/coreos/go-etcd/etcd" @@ -42,22 +40,6 @@ const ( EtcdDelete = "delete" ) -// ParseWatchResourceVersion takes a resource version argument and converts it to -// the etcd version we should pass to helper.Watch(). Because resourceVersion is -// an opaque value, the default watch behavior for non-zero watch is to watch -// the next value (if you pass "1", you will see updates from "2" onwards). -func ParseWatchResourceVersion(resourceVersion, kind string) (uint64, error) { - if resourceVersion == "" || resourceVersion == "0" { - return 0, nil - } - version, err := strconv.ParseUint(resourceVersion, 10, 64) - if err != nil { - // TODO: Does this need to be a ValidationErrorList? I can't convince myself it does. - return 0, errors.NewInvalid(kind, "", fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("resourceVersion", resourceVersion, err.Error())}) - } - return version + 1, nil -} - // TransformFunc attempts to convert an object to another object for use with a watcher. type TransformFunc func(runtime.Object) (runtime.Object, error) @@ -134,7 +116,7 @@ func newEtcdWatcher(list bool, include includeFunc, filter storage.FilterFunc, e // etcdWatch calls etcd's Watch function, and handles any errors. Meant to be called // as a goroutine. -func (w *etcdWatcher) etcdWatch(client EtcdClient, key string, resourceVersion uint64) { +func (w *etcdWatcher) etcdWatch(client tools.EtcdClient, key string, resourceVersion uint64) { defer util.HandleCrash() defer close(w.etcdError) if resourceVersion == 0 { @@ -152,7 +134,7 @@ func (w *etcdWatcher) etcdWatch(client EtcdClient, key string, resourceVersion u } // etcdGetInitialWatchState turns an etcd Get request into a watch equivalent -func etcdGetInitialWatchState(client EtcdClient, key string, recursive bool, incoming chan<- *etcd.Response) (resourceVersion uint64, err error) { +func etcdGetInitialWatchState(client tools.EtcdClient, key string, recursive bool, incoming chan<- *etcd.Response) (resourceVersion uint64, err error) { resp, err := client.Get(key, false, recursive) if err != nil { if !IsEtcdNotFound(err) { diff --git a/pkg/tools/etcd_watcher_test.go b/pkg/storage/etcd/etcd_watcher_test.go similarity index 90% rename from pkg/tools/etcd_watcher_test.go rename to pkg/storage/etcd/etcd_watcher_test.go index 423892984ec..5edfde8d69b 100644 --- a/pkg/tools/etcd_watcher_test.go +++ b/pkg/storage/etcd/etcd_watcher_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package tools +package etcd import ( "fmt" @@ -22,10 +22,10 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" "github.com/coreos/go-etcd/etcd" @@ -216,8 +216,8 @@ func TestWatchInterpretation_ResponseBadData(t *testing.T) { func TestWatchEtcdError(t *testing.T) { codec := latest.Codec - fakeClient := NewFakeEtcdClient(t) - fakeClient.expectNotFoundGetSet["/some/key"] = struct{}{} + fakeClient := tools.NewFakeEtcdClient(t) + fakeClient.ExpectNotFoundGet("/some/key") fakeClient.WatchImmediateError = fmt.Errorf("immediate error") h := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) @@ -245,10 +245,10 @@ func TestWatchEtcdError(t *testing.T) { func TestWatch(t *testing.T) { codec := latest.Codec - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) - fakeClient.expectNotFoundGetSet[prefixedKey] = struct{}{} + fakeClient.ExpectNotFoundGet(prefixedKey) h := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) watching, err := h.Watch(key, 0, storage.Everything) @@ -323,13 +323,13 @@ func TestWatchEtcdState(t *testing.T) { Endpoints []api.EndpointSubset } testCases := map[string]struct { - Initial map[string]EtcdResponseWithError + Initial map[string]tools.EtcdResponseWithError Responses []*etcd.Response From uint64 Expected []*T }{ "from not found": { - Initial: map[string]EtcdResponseWithError{}, + Initial: map[string]tools.EtcdResponseWithError{}, Responses: []*etcd.Response{ { Action: "create", @@ -374,7 +374,7 @@ func TestWatchEtcdState(t *testing.T) { }, }, "from initial state": { - Initial: map[string]EtcdResponseWithError{ + Initial: map[string]tools.EtcdResponseWithError{ prefixedKey: { R: &etcd.Response{ Action: "get", @@ -420,7 +420,7 @@ func TestWatchEtcdState(t *testing.T) { } for k, testCase := range testCases { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) for key, value := range testCase.Initial { fakeClient.Data[key] = value } @@ -457,12 +457,12 @@ func TestWatchFromZeroIndex(t *testing.T) { pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} testCases := map[string]struct { - Response EtcdResponseWithError + Response tools.EtcdResponseWithError ExpectedVersion string ExpectedType watch.EventType }{ "get value created": { - EtcdResponseWithError{ + tools.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: runtime.EncodeOrDie(codec, pod), @@ -477,7 +477,7 @@ func TestWatchFromZeroIndex(t *testing.T) { watch.Added, }, "get value modified": { - EtcdResponseWithError{ + tools.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Value: runtime.EncodeOrDie(codec, pod), @@ -494,7 +494,7 @@ func TestWatchFromZeroIndex(t *testing.T) { } for k, testCase := range testCases { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) fakeClient.Data[prefixedKey] = testCase.Response @@ -535,8 +535,8 @@ func TestWatchListFromZeroIndex(t *testing.T) { pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) - fakeClient := NewFakeEtcdClient(t) - fakeClient.Data[prefixedKey] = EtcdResponseWithError{ + fakeClient := tools.NewFakeEtcdClient(t) + fakeClient.Data[prefixedKey] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: &etcd.Node{ Dir: true, @@ -598,7 +598,7 @@ func TestWatchListIgnoresRootKey(t *testing.T) { key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) h := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) watching, err := h.WatchList(key, 1, storage.Everything) @@ -640,10 +640,10 @@ func TestWatchListIgnoresRootKey(t *testing.T) { } func TestWatchFromNotFound(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) - fakeClient.Data[prefixedKey] = EtcdResponseWithError{ + fakeClient.Data[prefixedKey] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, @@ -667,10 +667,10 @@ func TestWatchFromNotFound(t *testing.T) { } func TestWatchFromOtherError(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) - fakeClient.Data[prefixedKey] = EtcdResponseWithError{ + fakeClient.Data[prefixedKey] = tools.EtcdResponseWithError{ R: &etcd.Response{ Node: nil, }, @@ -709,12 +709,12 @@ func TestWatchFromOtherError(t *testing.T) { } func TestWatchPurposefulShutdown(t *testing.T) { - fakeClient := NewFakeEtcdClient(t) + fakeClient := tools.NewFakeEtcdClient(t) h := newEtcdHelper(fakeClient, codec, etcdtest.PathPrefix()) key := "/some/key" prefixedKey := etcdtest.AddPrefix(key) - fakeClient.expectNotFoundGetSet[prefixedKey] = struct{}{} + fakeClient.ExpectNotFoundGet(prefixedKey) // Test purposeful shutdown watching, err := h.Watch(key, 0, storage.Everything) @@ -733,38 +733,3 @@ func TestWatchPurposefulShutdown(t *testing.T) { t.Errorf("An injected error did not cause a graceful shutdown") } } - -func TestEtcdParseWatchResourceVersion(t *testing.T) { - testCases := []struct { - Version string - Kind string - ExpectVersion uint64 - Err bool - }{ - {Version: "", ExpectVersion: 0}, - {Version: "a", Err: true}, - {Version: " ", Err: true}, - {Version: "1", ExpectVersion: 2}, - {Version: "10", ExpectVersion: 11}, - } - for _, testCase := range testCases { - version, err := ParseWatchResourceVersion(testCase.Version, testCase.Kind) - switch { - case testCase.Err: - if err == nil { - t.Errorf("%s: unexpected non-error", testCase.Version) - continue - } - if !errors.IsInvalid(err) { - t.Errorf("%s: unexpected error: %v", testCase.Version, err) - continue - } - case !testCase.Err && err != nil: - t.Errorf("%s: unexpected error: %v", testCase.Version, err) - continue - } - if version != testCase.ExpectVersion { - t.Errorf("%s: expected version %d but was %d", testCase.Version, testCase.ExpectVersion, version) - } - } -} diff --git a/pkg/storage/util.go b/pkg/storage/util.go new file mode 100644 index 00000000000..e95735e2ac0 --- /dev/null +++ b/pkg/storage/util.go @@ -0,0 +1,51 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "strconv" + + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" + "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util/fielderrors" +) + +type SimpleUpdateFunc func(runtime.Object) (runtime.Object, error) + +// SimpleUpdateFunc converts SimpleUpdateFunc into UpdateFunc +func SimpleUpdate(fn SimpleUpdateFunc) UpdateFunc { + return func(input runtime.Object, _ ResponseMeta) (runtime.Object, *uint64, error) { + out, err := fn(input) + return out, nil, err + } +} + +// ParseWatchResourceVersion takes a resource version argument and converts it to +// the etcd version we should pass to helper.Watch(). Because resourceVersion is +// an opaque value, the default watch behavior for non-zero watch is to watch +// the next value (if you pass "1", you will see updates from "2" onwards). +func ParseWatchResourceVersion(resourceVersion, kind string) (uint64, error) { + if resourceVersion == "" || resourceVersion == "0" { + return 0, nil + } + version, err := strconv.ParseUint(resourceVersion, 10, 64) + if err != nil { + // TODO: Does this need to be a ValidationErrorList? I can't convince myself it does. + return 0, errors.NewInvalid(kind, "", fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("resourceVersion", resourceVersion, err.Error())}) + } + return version + 1, nil +} diff --git a/pkg/storage/util_test.go b/pkg/storage/util_test.go new file mode 100644 index 00000000000..4445b6c1db3 --- /dev/null +++ b/pkg/storage/util_test.go @@ -0,0 +1,58 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "testing" + + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" +) + +func TestEtcdParseWatchResourceVersion(t *testing.T) { + testCases := []struct { + Version string + Kind string + ExpectVersion uint64 + Err bool + }{ + {Version: "", ExpectVersion: 0}, + {Version: "a", Err: true}, + {Version: " ", Err: true}, + {Version: "1", ExpectVersion: 2}, + {Version: "10", ExpectVersion: 11}, + } + for _, testCase := range testCases { + version, err := ParseWatchResourceVersion(testCase.Version, testCase.Kind) + switch { + case testCase.Err: + if err == nil { + t.Errorf("%s: unexpected non-error", testCase.Version) + continue + } + if !errors.IsInvalid(err) { + t.Errorf("%s: unexpected error: %v", testCase.Version, err) + continue + } + case !testCase.Err && err != nil: + t.Errorf("%s: unexpected error: %v", testCase.Version, err) + continue + } + if version != testCase.ExpectVersion { + t.Errorf("%s: expected version %d but was %d", testCase.Version, testCase.ExpectVersion, version) + } + } +} diff --git a/pkg/tools/fake_etcd_client.go b/pkg/tools/fake_etcd_client.go index 45232f5d8b9..bf4b7fdd1f4 100644 --- a/pkg/tools/fake_etcd_client.go +++ b/pkg/tools/fake_etcd_client.go @@ -281,7 +281,8 @@ func (f *FakeEtcdClient) Delete(key string, recursive bool) (*etcd.Response, err Index: f.ChangeIndex, } } - if IsEtcdNotFound(existing.E) { + etcdError, ok := existing.E.(*etcd.EtcdError) + if ok && etcdError != nil && etcdError.ErrorCode == EtcdErrorCodeNotFound { f.DeletedKeys = append(f.DeletedKeys, key) return existing.R, existing.E } diff --git a/test/integration/etcd_tools_test.go b/test/integration/etcd_tools_test.go index 258b20787be..f28fda0eb58 100644 --- a/test/integration/etcd_tools_test.go +++ b/test/integration/etcd_tools_test.go @@ -25,7 +25,8 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/testapi" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + "github.com/GoogleCloudPlatform/kubernetes/pkg/storage" + "github.com/GoogleCloudPlatform/kubernetes/pkg/storage/etcd" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools/etcdtest" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" "github.com/GoogleCloudPlatform/kubernetes/test/integration/framework" @@ -33,7 +34,7 @@ import ( func TestSet(t *testing.T) { client := framework.NewEtcdClient() - etcdStorage := tools.NewEtcdStorage(client, testapi.Codec(), "") + etcdStorage := etcd.NewEtcdStorage(client, testapi.Codec(), "") framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} if err := etcdStorage.Set(key, &testObject, nil, 0); err != nil { @@ -56,7 +57,7 @@ func TestSet(t *testing.T) { func TestGet(t *testing.T) { client := framework.NewEtcdClient() - etcdStorage := tools.NewEtcdStorage(client, testapi.Codec(), "") + etcdStorage := etcd.NewEtcdStorage(client, testapi.Codec(), "") framework.WithEtcdKey(func(key string) { testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}} coded, err := testapi.Codec().Encode(&testObject) @@ -81,7 +82,7 @@ func TestGet(t *testing.T) { func TestWatch(t *testing.T) { client := framework.NewEtcdClient() - etcdStorage := tools.NewEtcdStorage(client, testapi.Codec(), etcdtest.PathPrefix()) + etcdStorage := etcd.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) @@ -91,7 +92,7 @@ func TestWatch(t *testing.T) { expectedVersion := resp.Node.ModifiedIndex // watch should load the object at the current index - w, err := etcdStorage.Watch(key, 0, tools.Everything) + w, err := etcdStorage.Watch(key, 0, storage.Everything) if err != nil { t.Fatalf("Unexpected error: %v", err) }