Added support for cloning
This commit is contained in:
		
							parent
							
								
									a1ddfda03d
								
							
						
					
					
						commit
						7bcb24cb7c
					
				|  | @ -174,6 +174,23 @@ class SynologyHttpClient { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   async GetLunByID(lun_id) { | ||||||
|  |     const lun_list = { | ||||||
|  |       api: "SYNO.Core.ISCSI.LUN", | ||||||
|  |       version: "1", | ||||||
|  |       method: "list", | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let response = await this.do_request("GET", "entry.cgi", lun_list); | ||||||
|  |     let lun = response.body.data.luns.find((i) => { | ||||||
|  |       return i.lun_id == lun_id; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     if (lun) { | ||||||
|  |       return lun; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   async GetLunByName(name) { |   async GetLunByName(name) { | ||||||
|     const lun_list = { |     const lun_list = { | ||||||
|       api: "SYNO.Core.ISCSI.LUN", |       api: "SYNO.Core.ISCSI.LUN", | ||||||
|  | @ -464,6 +481,36 @@ class SynologyHttpClient { | ||||||
|       Object.assign({}, iscsi_lun_extend, { uuid: uuid, new_size: size }) |       Object.assign({}, iscsi_lun_extend, { uuid: uuid, new_size: size }) | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   async CreateClonedVolume(src_lun_uuid, dst_lun_name) { | ||||||
|  |     const create_cloned_volume = { | ||||||
|  |       api: "SYNO.Core.ISCSI.LUN", | ||||||
|  |       version: 1, | ||||||
|  |       method: "clone", | ||||||
|  |       src_lun_uuid: JSON.stringify(src_lun_uuid), // src lun uuid
 | ||||||
|  |       dst_lun_name: dst_lun_name, // dst lun name
 | ||||||
|  |       is_same_pool: true, // always true? string?
 | ||||||
|  |       clone_type: "democratic-csi", // check
 | ||||||
|  |     } | ||||||
|  |     return await this.do_request("GET", "entry.cgi", create_cloned_volume); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   async CreateVolumeFromSnapshot(src_lun_uuid, snapshot_uuid, cloned_lun_name) { | ||||||
|  |     const create_volume_from_snapshot = { | ||||||
|  |       api: "SYNO.Core.ISCSI.LUN", | ||||||
|  |       version: 1, | ||||||
|  |       method: "clone_snapshot", | ||||||
|  |       src_lun_uuid: src_lun_uuid, // src lun uuid, snapshot id?
 | ||||||
|  |       snapshot_uuid: JSON.stringify(snapshot_uuid), // shaptop uuid
 | ||||||
|  |       cloned_lun_name: cloned_lun_name, // cloned lun name
 | ||||||
|  |       clone_type: "democratic-csi", // check
 | ||||||
|  |     } | ||||||
|  |     return await this.do_request("GET", "entry.cgi", create_volume_from_snapshot); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module.exports.SynologyHttpClient = SynologyHttpClient; | module.exports.SynologyHttpClient = SynologyHttpClient; | ||||||
|  |  | ||||||
|  | @ -280,14 +280,63 @@ class ControllerSynologyDriver extends CsiBaseDriver { | ||||||
|         let data; |         let data; | ||||||
|         let target; |         let target; | ||||||
|         let lun_mapping; |         let lun_mapping; | ||||||
|  |         let lun_uuid; | ||||||
|  |         let existingLun; | ||||||
| 
 | 
 | ||||||
|  |         if (volume_content_source) { | ||||||
|  |           let src_lun_uuid; | ||||||
|  |           let src_lun_id; | ||||||
|  |           switch (volume_content_source.type) { | ||||||
|  |             case "snapshot": | ||||||
|  |               let parts = volume_content_source.snapshot.snapshot_id.split("/"); | ||||||
|  |               src_lun_id = parts[2]; | ||||||
|  |               let snapshot_uuid = parts[3]; | ||||||
|  |               let src_lun = await httpClient.GetLunByID(src_lun_id); | ||||||
|  |               src_lun_uuid = src_lun.uuid; | ||||||
|  | 
 | ||||||
|  |               existingLun = await httpClient.GetLunByName(iscsiName); | ||||||
|  |               if (!existingLun) { | ||||||
|  |                 await httpClient.CreateVolumeFromSnapshot( | ||||||
|  |                   src_lun_uuid, | ||||||
|  |                   snapshot_uuid, | ||||||
|  |                   iscsiName | ||||||
|  |                 ); | ||||||
|  |               } | ||||||
|  |               break; | ||||||
|  |             case "volume": | ||||||
|  |               let srcLunName = driver.buildIscsiName( | ||||||
|  |                 volume_content_source.volume.volume_id | ||||||
|  |               ); | ||||||
|  |               src_lun_uuid = await httpClient.GetLunUUIDByName(srcLunName); | ||||||
|  | 
 | ||||||
|  |               existingLun = httpClient.GetLunByName(iscsiName); | ||||||
|  |               if (!existingLun) { | ||||||
|  |                 await httpClient.CreateClonedVolume(src_lun_uuid, iscsiName); | ||||||
|  |               } | ||||||
|  |               break; | ||||||
|  |             default: | ||||||
|  |               throw new GrpcError( | ||||||
|  |                 grpc.status.INVALID_ARGUMENT, | ||||||
|  |                 `invalid volume_content_source type: ${volume_content_source.type}` | ||||||
|  |               ); | ||||||
|  |               break; | ||||||
|  |           } | ||||||
|  |           // resize to requested amount
 | ||||||
|  | 
 | ||||||
|  |           let lun = await httpClient.GetLunByName(iscsiName); | ||||||
|  |           lun_uuid = lun.uuid; | ||||||
|  |           if (lun.size < capacity_bytes) { | ||||||
|  |             await httpClient.ExpandISCSILun(lun_uuid, capacity_bytes); | ||||||
|  |           } | ||||||
|  |         } else { | ||||||
|           // create lun
 |           // create lun
 | ||||||
|           data = Object.assign({}, driver.options.iscsi.lunAttributes, { |           data = Object.assign({}, driver.options.iscsi.lunAttributes, { | ||||||
|             name: iscsiName, |             name: iscsiName, | ||||||
|             location: driver.options.synology.volume, |             location: driver.options.synology.volume, | ||||||
|             size: capacity_bytes, |             size: capacity_bytes, | ||||||
|           }); |           }); | ||||||
|         let lun_uuid = await httpClient.CreateLun(data); |           lun_uuid = await httpClient.CreateLun(data); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         // create target
 |         // create target
 | ||||||
|         let iqn = driver.options.iscsi.baseiqn + iscsiName; |         let iqn = driver.options.iscsi.baseiqn + iscsiName; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue