From 96aa4fb5d234b10f8da13c98ea291b1c11d8908e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20H=C3=B6rl?= Date: Fri, 25 Jan 2019 10:09:00 +0000 Subject: [PATCH] Implement DriversStore as a struct This allows us to hide - the mutex handling - the initialization as implementation details. Signed-off-by: Maria Ntalla --- pkg/volume/csi/BUILD | 2 + pkg/volume/csi/csi_drivers_store.go | 79 ++++++++++++++++++++++++ pkg/volume/csi/csi_drivers_store_test.go | 64 +++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 pkg/volume/csi/csi_drivers_store.go create mode 100644 pkg/volume/csi/csi_drivers_store_test.go diff --git a/pkg/volume/csi/BUILD b/pkg/volume/csi/BUILD index a4ac6145d4..e8aa898d93 100644 --- a/pkg/volume/csi/BUILD +++ b/pkg/volume/csi/BUILD @@ -6,6 +6,7 @@ go_library( "csi_attacher.go", "csi_block.go", "csi_client.go", + "csi_drivers_store.go", "csi_mounter.go", "csi_plugin.go", "csi_util.go", @@ -44,6 +45,7 @@ go_test( "csi_attacher_test.go", "csi_block_test.go", "csi_client_test.go", + "csi_drivers_store_test.go", "csi_mounter_test.go", "csi_plugin_test.go", ], diff --git a/pkg/volume/csi/csi_drivers_store.go b/pkg/volume/csi/csi_drivers_store.go new file mode 100644 index 0000000000..70bfd1b383 --- /dev/null +++ b/pkg/volume/csi/csi_drivers_store.go @@ -0,0 +1,79 @@ +/* +Copyright 2019 The Kubernetes Authors. + +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 csi + +import ( + "sync" + + utilversion "k8s.io/apimachinery/pkg/util/version" +) + +// Driver is a description of a CSI Driver, defined by an enpoint and the +// highest CSI version supported +type Driver struct { + endpoint string + highestSupportedVersion *utilversion.Version +} + +// DriversStore holds a list of CSI Drivers +type DriversStore struct { + store + sync.RWMutex +} + +type store map[string]Driver + +// Get lets you retrieve a CSI Driver by name. +// This method is protected by a mutex. +func (s *DriversStore) Get(driverName string) (Driver, bool) { + s.RLock() + defer s.RUnlock() + + driver, ok := s.store[driverName] + return driver, ok +} + +// Set lets you save a CSI Driver to the list and give it a specific name. +// This method is protected by a mutex. +func (s *DriversStore) Set(driverName string, driver Driver) { + s.Lock() + defer s.Unlock() + + if s.store == nil { + s.store = store{} + } + + s.store[driverName] = driver +} + +// Delete lets you delete a CSI Driver by name. +// This method is protected by a mutex. +func (s *DriversStore) Delete(driverName string) { + s.Lock() + defer s.Unlock() + + delete(s.store, driverName) +} + +// Clear deletes all entries in the store. +// This methiod is protected by a mutex. +func (s *DriversStore) Clear() { + s.Lock() + defer s.Unlock() + + s.store = store{} +} diff --git a/pkg/volume/csi/csi_drivers_store_test.go b/pkg/volume/csi/csi_drivers_store_test.go new file mode 100644 index 0000000000..d7e5c17b62 --- /dev/null +++ b/pkg/volume/csi/csi_drivers_store_test.go @@ -0,0 +1,64 @@ +/* +Copyright 2019 The Kubernetes Authors. + +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 csi_test + +import ( + "reflect" + "testing" + + "k8s.io/kubernetes/pkg/volume/csi" +) + +func TestDriversStore(t *testing.T) { + store := &csi.DriversStore{} + someDriver := csi.Driver{} + + expectAbsent(t, store, "does-not-exist") + + store.Set("some-driver", someDriver) + expectPresent(t, store, "some-driver", someDriver) + + store.Delete("some-driver") + expectAbsent(t, store, "some-driver") + + store.Set("some-driver", someDriver) + + store.Clear() + expectAbsent(t, store, "some-driver") +} + +func expectPresent(t *testing.T, store *csi.DriversStore, name string, expected csi.Driver) { + t.Helper() + + retrieved, ok := store.Get(name) + + if !ok { + t.Fatalf("expected driver '%s' to exist", name) + } + + if !reflect.DeepEqual(retrieved, expected) { + t.Fatalf("expected driver '%s' to be equal to %v", name, expected) + } +} + +func expectAbsent(t *testing.T, store *csi.DriversStore, name string) { + t.Helper() + + if _, ok := store.Get(name); ok { + t.Fatalf("expected driver '%s' not to exist in store", name) + } +}