diff --git a/Gopkg.lock b/Gopkg.lock index d3270adf6..d3cf700d8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -528,6 +528,7 @@ "k8s.io/apimachinery/pkg/api/errors", "k8s.io/apimachinery/pkg/apis/meta/v1", "k8s.io/apimachinery/pkg/util/sets", + "k8s.io/apimachinery/pkg/util/validation", "k8s.io/apimachinery/pkg/util/wait", "k8s.io/client-go/kubernetes", "k8s.io/client-go/rest", diff --git a/deploy/cephfs/helm/Chart.yaml b/deploy/cephfs/helm/Chart.yaml index f3eb6458f..dc94bb2af 100644 --- a/deploy/cephfs/helm/Chart.yaml +++ b/deploy/cephfs/helm/Chart.yaml @@ -4,7 +4,7 @@ appVersion: "1.0.0" description: "Container Storage Interface (CSI) driver, provisioner, and attacher for Ceph cephfs" name: ceph-csi-cephfs -version: 0.5.3 +version: 0.6.0 keywords: - ceph - cephfs diff --git a/deploy/cephfs/helm/templates/nodeplugin-daemonset.yaml b/deploy/cephfs/helm/templates/nodeplugin-daemonset.yaml index c56e70bb4..24ffc8420 100644 --- a/deploy/cephfs/helm/templates/nodeplugin-daemonset.yaml +++ b/deploy/cephfs/helm/templates/nodeplugin-daemonset.yaml @@ -49,7 +49,7 @@ spec: valueFrom: fieldRef: fieldPath: spec.nodeName - imagePullPolicy: {{ .Values.nodeplugin.registrar.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.registrar.image.pullPolicy }} volumeMounts: - name: plugin-dir mountPath: /csi @@ -82,7 +82,7 @@ spec: fieldPath: spec.nodeName - name: CSI_ENDPOINT value: "unix:/{{ .Values.socketDir }}/{{ .Values.socketFile }}" - imagePullPolicy: {{ .Values.nodeplugin.plugin.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.plugin.image.pullPolicy }} volumeMounts: - name: mount-cache-dir mountPath: /mount-cache-dir diff --git a/deploy/cephfs/helm/templates/provisioner-statefulset.yaml b/deploy/cephfs/helm/templates/provisioner-statefulset.yaml index 2bef74612..539647ab1 100644 --- a/deploy/cephfs/helm/templates/provisioner-statefulset.yaml +++ b/deploy/cephfs/helm/templates/provisioner-statefulset.yaml @@ -79,7 +79,7 @@ spec: fieldPath: spec.nodeName - name: CSI_ENDPOINT value: "unix:/{{ .Values.socketDir }}/{{ .Values.socketFile }}" - imagePullPolicy: {{ .Values.nodeplugin.plugin.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.plugin.image.pullPolicy }} volumeMounts: - name: socket-dir mountPath: {{ .Values.socketDir }} diff --git a/deploy/rbd/helm/Chart.yaml b/deploy/rbd/helm/Chart.yaml index a69ba7e38..a36450e34 100644 --- a/deploy/rbd/helm/Chart.yaml +++ b/deploy/rbd/helm/Chart.yaml @@ -4,7 +4,7 @@ appVersion: "1.0.0" description: "Container Storage Interface (CSI) driver, provisioner, snapshotter, and attacher for Ceph RBD" name: ceph-csi-rbd -version: 0.5.3 +version: 0.6.0 keywords: - ceph - rbd diff --git a/deploy/rbd/helm/templates/nodeplugin-daemonset.yaml b/deploy/rbd/helm/templates/nodeplugin-daemonset.yaml index 355983b49..6290dd978 100644 --- a/deploy/rbd/helm/templates/nodeplugin-daemonset.yaml +++ b/deploy/rbd/helm/templates/nodeplugin-daemonset.yaml @@ -49,7 +49,7 @@ spec: valueFrom: fieldRef: fieldPath: spec.nodeName - imagePullPolicy: {{ .Values.nodeplugin.registrar.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.registrar.image.pullPolicy }} volumeMounts: - name: plugin-dir mountPath: /csi @@ -82,7 +82,7 @@ spec: fieldPath: spec.nodeName - name: CSI_ENDPOINT value: "unix:/{{ .Values.socketDir }}/{{ .Values.socketFile }}" - imagePullPolicy: {{ .Values.nodeplugin.plugin.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.plugin.image.pullPolicy }} volumeMounts: - name: plugin-dir mountPath: {{ .Values.socketDir }} diff --git a/deploy/rbd/helm/templates/provisioner-statefulset.yaml b/deploy/rbd/helm/templates/provisioner-statefulset.yaml index 6ebdfc388..abe778074 100644 --- a/deploy/rbd/helm/templates/provisioner-statefulset.yaml +++ b/deploy/rbd/helm/templates/provisioner-statefulset.yaml @@ -43,7 +43,7 @@ spec: {{ toYaml .Values.provisioner.resources | indent 12 }} - name: csi-snapshotter image: {{ .Values.snapshotter.image.repository }}:{{ .Values.snapshotter.image.tag }} - imagePullPolicy: {{ .Values.nodeplugin.plugin.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.plugin.image.pullPolicy }} args: - "--csi-address=$(ADDRESS)" - "--connection-timeout=15s" @@ -97,7 +97,7 @@ spec: fieldPath: spec.nodeName - name: CSI_ENDPOINT value: "unix:/{{ .Values.socketDir }}/{{ .Values.socketFile }}" - imagePullPolicy: {{ .Values.nodeplugin.plugin.image.imagePullPolicy }} + imagePullPolicy: {{ .Values.nodeplugin.plugin.image.pullPolicy }} volumeMounts: - name: socket-dir mountPath: {{ .Values.socketDir }} diff --git a/pkg/rbd/controllerserver.go b/pkg/rbd/controllerserver.go index 5ce0ccff4..3beb87d75 100644 --- a/pkg/rbd/controllerserver.go +++ b/pkg/rbd/controllerserver.go @@ -50,8 +50,8 @@ type ControllerServer struct { } var ( - rbdVolumes = map[string]*rbdVolume{} - rbdSnapshots = map[string]*rbdSnapshot{} + rbdVolumes = map[string]rbdVolume{} + rbdSnapshots = map[string]rbdSnapshot{} ) // LoadExDataFromMetadataStore loads the rbd volume and snapshot @@ -60,14 +60,14 @@ func (cs *ControllerServer) LoadExDataFromMetadataStore() error { vol := &rbdVolume{} // nolint cs.MetadataStore.ForAll("csi-rbd-vol-", vol, func(identifier string) error { - rbdVolumes[identifier] = vol + rbdVolumes[identifier] = *vol return nil }) snap := &rbdSnapshot{} // nolint cs.MetadataStore.ForAll("csi-rbd-(.*)-snap-", snap, func(identifier string) error { - rbdSnapshots[identifier] = snap + rbdSnapshots[identifier] = *snap return nil }) @@ -194,7 +194,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol // size in bytes) rbdVol.VolSize = rbdVol.VolSize * util.MiB - rbdVolumes[rbdVol.VolID] = rbdVol + rbdVolumes[rbdVol.VolID] = *rbdVol if err = storeVolumeMetadata(rbdVol, cs.MetadataStore); err != nil { return nil, status.Error(codes.Internal, err.Error()) @@ -434,7 +434,7 @@ func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateS rbdSnap.CreatedAt = ptypes.TimestampNow().GetSeconds() - rbdSnapshots[snapshotID] = rbdSnap + rbdSnapshots[snapshotID] = *rbdSnap if err = storeSnapshotMetadata(rbdSnap, cs.MetadataStore); err != nil { return nil, status.Error(codes.Internal, err.Error()) diff --git a/pkg/rbd/controllerserver_test.go b/pkg/rbd/controllerserver_test.go new file mode 100644 index 000000000..d9eadc25d --- /dev/null +++ b/pkg/rbd/controllerserver_test.go @@ -0,0 +1,81 @@ +package rbd + +import ( + "testing" + + "github.com/ceph/ceph-csi/pkg/util" +) + +type testCachePersister struct { + volumes map[string]rbdVolume + snapshots map[string]rbdSnapshot +} + +func (t *testCachePersister) Create(identifier string, data interface{}) error { + return nil +} + +func (t *testCachePersister) Get(identifier string, data interface{}) error { + return nil +} + +func (t *testCachePersister) ForAll(pattern string, destObj interface{}, f util.ForAllFunc) error { + + switch pattern { + case "csi-rbd-vol-": + for identifier, vol := range t.volumes { + *destObj.(*rbdVolume) = vol + if err := f(identifier); err != nil { + return err + } + } + case "csi-rbd-(.*)-snap-": + for identifier, snap := range t.snapshots { + *destObj.(*rbdSnapshot) = snap + if err := f(identifier); err != nil { + return err + } + } + } + + return nil +} + +func (t *testCachePersister) Delete(identifier string) error { + return nil +} + +func TestLoadExDataFromMetadataStore(t *testing.T) { + cs := &ControllerServer{ + MetadataStore: &testCachePersister{ + volumes: map[string]rbdVolume{ + "item1": { + VolID: "1", + }, + "item2": { + VolID: "2", + }, + }, + snapshots: map[string]rbdSnapshot{ + "item1": { + SnapID: "1", + }, + "item2": { + SnapID: "2", + }, + }, + }, + } + + if err := cs.LoadExDataFromMetadataStore(); err != nil { + t.Error(err) + } + + if rbdVolumes["item1"] == rbdVolumes["item2"] { + t.Error("rbd volume entries contain pointer to same volume") + } + + if rbdSnapshots["item1"] == rbdSnapshots["item2"] { + t.Error("rbd snapshot entries contain pointer to same snapshot") + } +} diff --git a/pkg/rbd/rbd_util.go b/pkg/rbd/rbd_util.go index fccd281ac..413ab558a 100644 --- a/pkg/rbd/rbd_util.go +++ b/pkg/rbd/rbd_util.go @@ -400,7 +400,7 @@ func hasSnapshotFeature(imageFeatures string) bool { func getRBDVolumeByID(volumeID string) (*rbdVolume, error) { if rbdVol, ok := rbdVolumes[volumeID]; ok { - return rbdVol, nil + return &rbdVol, nil } return nil, fmt.Errorf("volume id %s does not exit in the volumes list", volumeID) } @@ -408,7 +408,8 @@ func getRBDVolumeByID(volumeID string) (*rbdVolume, error) { func getRBDVolumeByName(volName string) (*rbdVolume, error) { for _, rbdVol := range rbdVolumes { if rbdVol.VolName == volName { - return rbdVol, nil + v := rbdVol + return &v, nil } } return nil, fmt.Errorf("volume name %s does not exit in the volumes list", volName) @@ -417,7 +418,8 @@ func getRBDVolumeByName(volName string) (*rbdVolume, error) { func getRBDSnapshotByName(snapName string) (*rbdSnapshot, error) { for _, rbdSnap := range rbdSnapshots { if rbdSnap.SnapName == snapName { - return rbdSnap, nil + s := rbdSnap + return &s, nil } } return nil, fmt.Errorf("snapshot name %s does not exit in the snapshots list", snapName) @@ -467,7 +469,7 @@ func protectSnapshot(pOpts *rbdSnapshot, adminID string, credentials map[string] return nil } -func extractStoredVolOpt(r *rbdVolume) map[string]string { +func extractStoredVolOpt(r rbdVolume) map[string]string { volOptions := make(map[string]string) volOptions["pool"] = r.Pool