diff --git a/docs/storage-class-parameters.md b/docs/storage-class-parameters.md index e7e6ba9..da50195 100644 --- a/docs/storage-class-parameters.md +++ b/docs/storage-class-parameters.md @@ -64,6 +64,9 @@ parameters: ... ``` +Note that it is currently not supported by Synology devices to restore a snapshot onto a different volume. You can +create volumes from snapshots, but you should use the same `StorageClass` as the original volume of the snapshot did. + ### Enabling CHAP Authentication You can enable CHAP Authentication for `StorageClass`es by supplying an appropriate `StorageClass` secret (see the [documentation](https://kubernetes-csi.github.io/docs/secrets-and-credentials-storage-class.html) for more details). You diff --git a/src/driver/controller-synology/http/index.js b/src/driver/controller-synology/http/index.js index 328b5bd..03d6013 100644 --- a/src/driver/controller-synology/http/index.js +++ b/src/driver/controller-synology/http/index.js @@ -39,7 +39,12 @@ class SynologyError extends GrpcError { class SynologyHttpClient { constructor(options = {}) { - this.options = JSON.parse(JSON.stringify(options)); + this.options = Object.assign({ + protocol: "https", + port: 5001, + allowInsecure: false, + session: "democratic-csi" + }, JSON.parse(JSON.stringify(options))); this.logger = console; this.doLoginMutex = new Mutex(); this.apiSerializeMutex = new Mutex(); @@ -618,7 +623,7 @@ class SynologyHttpClient { return await this.do_request("GET", "entry.cgi", create_cloned_volume); } - async CreateVolumeFromSnapshot(src_lun_uuid, snapshot_uuid, cloned_lun_name) { + async CreateVolumeFromSnapshot(src_lun_uuid, snapshot_uuid, cloned_lun_name, description) { const create_volume_from_snapshot = { api: "SYNO.Core.ISCSI.LUN", version: 1, @@ -628,6 +633,9 @@ class SynologyHttpClient { cloned_lun_name: cloned_lun_name, // cloned lun name clone_type: "democratic-csi", // check }; + if (description) { + create_volume_from_snapshot.description = description; + } return await this.do_request( "GET", "entry.cgi", diff --git a/src/driver/controller-synology/index.js b/src/driver/controller-synology/index.js index dead5dd..6670422 100644 --- a/src/driver/controller-synology/index.js +++ b/src/driver/controller-synology/index.js @@ -441,7 +441,8 @@ class ControllerSynologyDriver extends CsiBaseDriver { await httpClient.CreateVolumeFromSnapshot( src_lun_uuid, snapshot_uuid, - iscsiName + iscsiName, + normalizedParameters.description ); } break; @@ -465,7 +466,12 @@ class ControllerSynologyDriver extends CsiBaseDriver { `invalid volume_id: ${volume_content_source.volume.volume_id}` ); } - await httpClient.CreateClonedVolume(src_lun_uuid, iscsiName, driver.getLocation(normalizedParameters)); + await httpClient.CreateClonedVolume( + src_lun_uuid, + iscsiName, + driver.getLocation(normalizedParameters), + normalizedParameters.description + ); } break; default: @@ -549,13 +555,13 @@ class ControllerSynologyDriver extends CsiBaseDriver { iqn, }); if ('headerChecksum' in normalizedParameters) { - data.has_data_checksum = normalizedParameters['headerChecksum']; + data.has_data_checksum = normalizedParameters.headerChecksum; } if ('dataChecksum' in normalizedParameters) { - data.has_data_checksum = normalizedParameters['dataChecksum']; + data.has_data_checksum = normalizedParameters.dataChecksum; } if ('maxSessions' in normalizedParameters) { - data.max_sessions = Number(normalizedParameters['maxSessions']); + data.max_sessions = Number(normalizedParameters.maxSessions); if (isNaN(data.max_sessions)) { throw new GrpcError( grpc.status.INVALID_ARGUMENT, @@ -567,7 +573,7 @@ class ControllerSynologyDriver extends CsiBaseDriver { data.multi_sessions = data.max_sessions == 1; } if ('maxReceiveSegmentBytes' in normalizedParameters) { - data.max_recv_seg_bytes = Number(normalizedParameters['maxReceiveSegmentBytes']); + data.max_recv_seg_bytes = Number(normalizedParameters.maxReceiveSegmentBytes); if (isNaN(data.max_recv_seg_bytes)) { throw new GrpcError( grpc.status.INVALID_ARGUMENT, @@ -576,7 +582,7 @@ class ControllerSynologyDriver extends CsiBaseDriver { } } if ('maxSendSegmentBytes' in normalizedParameters) { - data.max_send_seg_bytes = Number(normalizedParameters['maxSendSegmentBytes']); + data.max_send_seg_bytes = Number(normalizedParameters.maxSendSegmentBytes); if (isNaN(data.max_send_seg_bytes)) { throw new GrpcError( grpc.status.INVALID_ARGUMENT, @@ -588,7 +594,7 @@ class ControllerSynologyDriver extends CsiBaseDriver { if ('user' in call.request.secrets && 'password' in call.request.secrets) { data.user = call.request.secrets.user; data.password = call.request.secrets.password; - data['chap'] = true; + data.chap = true; if ('mutualUser' in call.request.secrets && 'mutualPassword' in call.request.secrets) { data.mutual_user = call.request.secrets.mutualUser; data.mutual_password = call.request.secrets.mutualPassword; @@ -1001,12 +1007,12 @@ class ControllerSynologyDriver extends CsiBaseDriver { description: name, //check }); if ('isLocked' in normalizedParameters) { - data['is_locked'] = driver.parseBoolean(normalizedParameters.isLocked); + data.is_locked = driver.parseBoolean(normalizedParameters.isLocked); } if (normalizedParameters.consistency === "AppConsistent") { - data['is_app_consistent'] = true; + data.is_app_consistent = true; } else if (normalizedParameters.consistency === 'CrashConsistent') { - data['is_app_consistent'] = false; + data.is_app_consistent = false; } else if ('consistency' in normalizedParameters.consistency) { throw new GrpcError( grpc.status.INVALID_ARGUMENT,