[PATCH V2 0/2] List iSCSI targets available for initiator while creating iSCSI Pool

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> V1 - V2: support port argument for iscsi server ShaoHe Feng (2): List iSCSI server for initiator while creating iSCSI Pool List iSCSI targets available for initiator while creating iSCSI Pool docs/API.md | 9 +++++++-- src/kimchi/API.json | 9 +++++++-- src/kimchi/model/storagepools.py | 4 +++- src/kimchi/model/storageservers.py | 9 ++++++--- src/kimchi/model/storagetargets.py | 28 ++++++++++++++++++++-------- 5 files changed, 43 insertions(+), 16 deletions(-) -- 1.9.3

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> The server should be already used in an existed iSCSI Pool. Test this patch by: $ curl -k -u <user>:<password> -H "Content-Type: application/json" \
-H "Accept: application/json" \ https://localhost:8001/storageservers?_target_type=iscsi [ { "host":"127.0.0.1" "port":"3260" } ]
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- docs/API.md | 4 +++- src/kimchi/API.json | 2 +- src/kimchi/model/storagepools.py | 4 +++- src/kimchi/model/storageservers.py | 9 ++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/API.md b/docs/API.md index bac30eb..1c7d9e2 100644 --- a/docs/API.md +++ b/docs/API.md @@ -632,7 +632,8 @@ creation. * **GET**: Retrieve a summarized list of used storage servers. * Parameters: - * _target_type: Filter server list with given type, currently support 'netfs'. + * _target_type: Filter server list with given type, currently support + 'netfs' and 'iscsi'. ### Resource: Storage Server @@ -642,6 +643,7 @@ creation. * **GET**: Retrieve description of a Storage Server * host: IP or host name of storage server + * port: port of storage server, only for "iscsi" ### Collection: Storage Targets diff --git a/src/kimchi/API.json b/src/kimchi/API.json index 06da9da..b0df606 100644 --- a/src/kimchi/API.json +++ b/src/kimchi/API.json @@ -416,7 +416,7 @@ "_target_type": { "description": "List storage servers of given type", "type": "string", - "pattern": "^netfs$" + "pattern": "^netfs|iscsi$" } }, "additionalProperties": false, diff --git a/src/kimchi/model/storagepools.py b/src/kimchi/model/storagepools.py index c0f2c58..c699fc6 100644 --- a/src/kimchi/model/storagepools.py +++ b/src/kimchi/model/storagepools.py @@ -37,9 +37,11 @@ 4: 'inaccessible'} # Types of pools supported -# FIXME: Addd 'iscsi' STORAGE_SOURCES = {'netfs': {'addr': '/pool/source/host/@name', 'path': '/pool/source/dir/@path'}, + 'iscsi': {'addr': '/pool/source/host/@name', + 'port': '/pool/source/host/@port', + 'path': '/pool/source/device/@path'}, 'scsi': {'adapter_type': '/pool/source/adapter/@type', 'adapter_name': '/pool/source/adapter/@name', 'wwnn': '/pool/source/adapter/@wwnn', diff --git a/src/kimchi/model/storageservers.py b/src/kimchi/model/storageservers.py index c9dfb25..01a7547 100644 --- a/src/kimchi/model/storageservers.py +++ b/src/kimchi/model/storageservers.py @@ -21,8 +21,7 @@ from kimchi.model.storagepools import StoragePoolModel, StoragePoolsModel # Types of remote storage servers supported -# FIXME: Add iscsi? -STORAGE_SERVERS = ['netfs'] +STORAGE_SERVERS = ['netfs', 'iscsi'] class StorageServersModel(object): @@ -68,7 +67,11 @@ def lookup(self, server): pool_info = self.pool.lookup(pool) if (pool_info['type'] in STORAGE_SERVERS and pool_info['source']['addr'] == server): - return dict(host=server) + info = dict(host=server) + if (pool_info['type'] == "iscsi" and + 'port' in pool_info['source']): + info["port"] = pool_info['source']['port'] + return info except NotFoundError: # Avoid inconsistent pool result because of lease between list # lookup -- 1.9.3

From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> Here we call libvirt findStoragePoolSources to get the iSCSI targets. Zhou Zheng Sheng aslo provides a method to get the iSCSI targets in commit f163d22e. Test this patch by: $ curl -k -u <user>:<password> -H "Content-Type: application/json" \
-H "Accept: application/json" \ https://localhost:8001/storageservers/127.0.0.1/storagetargets?_target_type=iscsi\&_server_port=3260 [ { "host":"127.0.0.1", "target":"iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.edb1a004dc57", "target_type":"iscsi" } ]
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- docs/API.md | 5 ++++- src/kimchi/API.json | 7 ++++++- src/kimchi/model/storagetargets.py | 28 ++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/docs/API.md b/docs/API.md index 1c7d9e2..4f51dd0 100644 --- a/docs/API.md +++ b/docs/API.md @@ -653,7 +653,10 @@ creation. * **GET**: Retrieve a list of available storage targets. * Parameters: - * _target_type: Filter target list with given type, currently support 'netfs'. + * _target_type: Filter target list with given type, currently support + 'netfs' and 'iscsi'. + * _server_port: Filter target list with given server port, + currently support 'iscsi'. * Response: A list with storage targets information. * host: IP or host name of storage server of this target. * target_type: Type of storage target, supported: 'nfs'. diff --git a/src/kimchi/API.json b/src/kimchi/API.json index b0df606..6d1324c 100644 --- a/src/kimchi/API.json +++ b/src/kimchi/API.json @@ -428,7 +428,12 @@ "_target_type": { "description": "List storage servers of given type", "type": "string", - "pattern": "^netfs$" + "pattern": "^netfs|iscsi$" + }, + "_server_port": { + "description": "the port of iscsi storage servers", + "type": "string", + "pattern": "^[0-9]{1,5}$" } }, "additionalProperties": false, diff --git a/src/kimchi/model/storagetargets.py b/src/kimchi/model/storagetargets.py index caa8dbe..971bfca 100644 --- a/src/kimchi/model/storagetargets.py +++ b/src/kimchi/model/storagetargets.py @@ -32,9 +32,8 @@ def __init__(self, **kargs): self.conn = kargs['conn'] self.caps = CapabilitiesModel() - def get_list(self, storage_server, _target_type=None): + def get_list(self, storage_server, _target_type=None, _server_port=None): target_list = list() - if not _target_type: target_types = STORAGE_SERVERS else: @@ -45,7 +44,8 @@ def get_list(self, storage_server, _target_type=None): targets = patch_find_nfs_target(storage_server) else: xml = self._get_storage_server_spec(server=storage_server, - target_type=target_type) + target_type=target_type, + server_port=_server_port) conn = self.conn.get() try: ret = conn.findStoragePoolSources(target_type, xml, 0) @@ -64,9 +64,18 @@ def _get_storage_server_spec(self, **kwargs): # server: # target_type: extra_args = [] - if kwargs['target_type'] == 'netfs': + server_type = kwargs['target_type'] + if server_type == 'netfs': extra_args.append(E.format(type='nfs')) - obj = E.source(E.host(name=kwargs['server']), *extra_args) + else: + extra_args.append(E.format(type=server_type)) + + host_attr = {"name": kwargs['server']} + server_port = kwargs.get("server_port") + if server_port is not None: + host_attr['port'] = server_port + + obj = E.source(E.host(host_attr), *extra_args) xml = ET.tostring(obj) return xml @@ -75,9 +84,12 @@ def _parse_target_source_result(self, target_type, xml_str): ret = [] for source in root.getchildren(): if target_type == 'netfs': - host_name = source.host.get('name') target_path = source.dir.get('path') type = source.format.get('type') - ret.append(dict(host=host_name, target_type=type, - target=target_path)) + if target_type == 'iscsi': + target_path = source.device.get('path') + type = target_type + host_name = source.host.get('name') + ret.append(dict(host=host_name, target_type=type, + target=target_path)) return ret -- 1.9.3

on 2014/06/14 00:28, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
Here we call libvirt findStoragePoolSources to get the iSCSI targets.
Zhou Zheng Sheng aslo provides a method to get the iSCSI targets in commit f163d22e.
I think you can removed the above line, since TargetClient is not used in this patch.
Test this patch by: $ curl -k -u <user>:<password> -H "Content-Type: application/json" \
-H "Accept: application/json" \ https://localhost:8001/storageservers/127.0.0.1/storagetargets?_target_type=iscsi\&_server_port=3260 [ { "host":"127.0.0.1", "target":"iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.edb1a004dc57", "target_type":"iscsi" } ]
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- docs/API.md | 5 ++++- src/kimchi/API.json | 7 ++++++- src/kimchi/model/storagetargets.py | 28 ++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/docs/API.md b/docs/API.md index 1c7d9e2..4f51dd0 100644 --- a/docs/API.md +++ b/docs/API.md @@ -653,7 +653,10 @@ creation.
* **GET**: Retrieve a list of available storage targets. * Parameters: - * _target_type: Filter target list with given type, currently support 'netfs'. + * _target_type: Filter target list with given type, currently support + 'netfs' and 'iscsi'. + * _server_port: Filter target list with given server port, + currently support 'iscsi'. * Response: A list with storage targets information. * host: IP or host name of storage server of this target. * target_type: Type of storage target, supported: 'nfs'. diff --git a/src/kimchi/API.json b/src/kimchi/API.json index b0df606..6d1324c 100644 --- a/src/kimchi/API.json +++ b/src/kimchi/API.json @@ -428,7 +428,12 @@ "_target_type": { "description": "List storage servers of given type", "type": "string", - "pattern": "^netfs$" + "pattern": "^netfs|iscsi$" + }, + "_server_port": { + "description": "the port of iscsi storage servers", + "type": "string", + "pattern": "^[0-9]{1,5}$" } }, "additionalProperties": false, diff --git a/src/kimchi/model/storagetargets.py b/src/kimchi/model/storagetargets.py index caa8dbe..971bfca 100644 --- a/src/kimchi/model/storagetargets.py +++ b/src/kimchi/model/storagetargets.py @@ -32,9 +32,8 @@ def __init__(self, **kargs): self.conn = kargs['conn'] self.caps = CapabilitiesModel()
- def get_list(self, storage_server, _target_type=None): + def get_list(self, storage_server, _target_type=None, _server_port=None): target_list = list() - if not _target_type: target_types = STORAGE_SERVERS else: @@ -45,7 +44,8 @@ def get_list(self, storage_server, _target_type=None): targets = patch_find_nfs_target(storage_server) else: xml = self._get_storage_server_spec(server=storage_server, - target_type=target_type) + target_type=target_type, + server_port=_server_port) conn = self.conn.get() try: ret = conn.findStoragePoolSources(target_type, xml, 0) @@ -64,9 +64,18 @@ def _get_storage_server_spec(self, **kwargs): # server: # target_type: extra_args = [] - if kwargs['target_type'] == 'netfs': + server_type = kwargs['target_type'] + if server_type == 'netfs': extra_args.append(E.format(type='nfs')) - obj = E.source(E.host(name=kwargs['server']), *extra_args) + else: + extra_args.append(E.format(type=server_type)) + + host_attr = {"name": kwargs['server']} + server_port = kwargs.get("server_port") + if server_port is not None: + host_attr['port'] = server_port + + obj = E.source(E.host(host_attr), *extra_args) xml = ET.tostring(obj) return xml
@@ -75,9 +84,12 @@ def _parse_target_source_result(self, target_type, xml_str): ret = [] for source in root.getchildren(): if target_type == 'netfs': - host_name = source.host.get('name') target_path = source.dir.get('path') type = source.format.get('type') - ret.append(dict(host=host_name, target_type=type, - target=target_path)) + if target_type == 'iscsi': + target_path = source.device.get('path') + type = target_type + host_name = source.host.get('name') + ret.append(dict(host=host_name, target_type=type, + target=target_path)) return ret
-- Zhou Zheng Sheng / 周征晟 E-mail: zhshzhou@linux.vnet.ibm.com Telephone: 86-10-82454397

On 06/16/2014 02:15 AM, Zhou Zheng Sheng wrote:
on 2014/06/14 00:28, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
Here we call libvirt findStoragePoolSources to get the iSCSI targets.
Zhou Zheng Sheng aslo provides a method to get the iSCSI targets in commit f163d22e. I think you can removed the above line, since TargetClient is not used in this patch.
ACK. I will do that before applying.
Test this patch by: $ curl -k -u <user>:<password> -H "Content-Type: application/json" \
-H "Accept: application/json" \ https://localhost:8001/storageservers/127.0.0.1/storagetargets?_target_type=iscsi\&_server_port=3260 [ { "host":"127.0.0.1", "target":"iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.edb1a004dc57", "target_type":"iscsi" } ]
Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- docs/API.md | 5 ++++- src/kimchi/API.json | 7 ++++++- src/kimchi/model/storagetargets.py | 28 ++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/docs/API.md b/docs/API.md index 1c7d9e2..4f51dd0 100644 --- a/docs/API.md +++ b/docs/API.md @@ -653,7 +653,10 @@ creation.
* **GET**: Retrieve a list of available storage targets. * Parameters: - * _target_type: Filter target list with given type, currently support 'netfs'. + * _target_type: Filter target list with given type, currently support + 'netfs' and 'iscsi'. + * _server_port: Filter target list with given server port, + currently support 'iscsi'. * Response: A list with storage targets information. * host: IP or host name of storage server of this target. * target_type: Type of storage target, supported: 'nfs'. diff --git a/src/kimchi/API.json b/src/kimchi/API.json index b0df606..6d1324c 100644 --- a/src/kimchi/API.json +++ b/src/kimchi/API.json @@ -428,7 +428,12 @@ "_target_type": { "description": "List storage servers of given type", "type": "string", - "pattern": "^netfs$" + "pattern": "^netfs|iscsi$" + }, + "_server_port": { + "description": "the port of iscsi storage servers", + "type": "string", + "pattern": "^[0-9]{1,5}$" } }, "additionalProperties": false, diff --git a/src/kimchi/model/storagetargets.py b/src/kimchi/model/storagetargets.py index caa8dbe..971bfca 100644 --- a/src/kimchi/model/storagetargets.py +++ b/src/kimchi/model/storagetargets.py @@ -32,9 +32,8 @@ def __init__(self, **kargs): self.conn = kargs['conn'] self.caps = CapabilitiesModel()
- def get_list(self, storage_server, _target_type=None): + def get_list(self, storage_server, _target_type=None, _server_port=None): target_list = list() - if not _target_type: target_types = STORAGE_SERVERS else: @@ -45,7 +44,8 @@ def get_list(self, storage_server, _target_type=None): targets = patch_find_nfs_target(storage_server) else: xml = self._get_storage_server_spec(server=storage_server, - target_type=target_type) + target_type=target_type, + server_port=_server_port) conn = self.conn.get() try: ret = conn.findStoragePoolSources(target_type, xml, 0) @@ -64,9 +64,18 @@ def _get_storage_server_spec(self, **kwargs): # server: # target_type: extra_args = [] - if kwargs['target_type'] == 'netfs': + server_type = kwargs['target_type'] + if server_type == 'netfs': extra_args.append(E.format(type='nfs')) - obj = E.source(E.host(name=kwargs['server']), *extra_args) + else: + extra_args.append(E.format(type=server_type)) + + host_attr = {"name": kwargs['server']} + server_port = kwargs.get("server_port") + if server_port is not None: + host_attr['port'] = server_port + + obj = E.source(E.host(host_attr), *extra_args) xml = ET.tostring(obj) return xml
@@ -75,9 +84,12 @@ def _parse_target_source_result(self, target_type, xml_str): ret = [] for source in root.getchildren(): if target_type == 'netfs': - host_name = source.host.get('name') target_path = source.dir.get('path') type = source.format.get('type') - ret.append(dict(host=host_name, target_type=type, - target=target_path)) + if target_type == 'iscsi': + target_path = source.device.get('path') + type = target_type + host_name = source.host.get('name') + ret.append(dict(host=host_name, target_type=type, + target=target_path)) return ret

Reviewed-by: Royce Lv<lvroyce@linux.vnet.ibm.com> On 2014年06月14日 00:28, shaohef@linux.vnet.ibm.com wrote:
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com>
V1 - V2: support port argument for iscsi server
ShaoHe Feng (2): List iSCSI server for initiator while creating iSCSI Pool List iSCSI targets available for initiator while creating iSCSI Pool
docs/API.md | 9 +++++++-- src/kimchi/API.json | 9 +++++++-- src/kimchi/model/storagepools.py | 4 +++- src/kimchi/model/storageservers.py | 9 ++++++--- src/kimchi/model/storagetargets.py | 28 ++++++++++++++++++++-------- 5 files changed, 43 insertions(+), 16 deletions(-)
participants (4)
-
Aline Manera
-
Royce Lv
-
shaohef@linux.vnet.ibm.com
-
Zhou Zheng Sheng