[Kimchi-devel] [PATCH v2 4/5] storagepool: Support Creating iSCSI storagepool in model.py
Zhou Zheng Sheng
zhshzhou at linux.vnet.ibm.com
Fri Dec 27 01:56:07 UTC 2013
on 201312/26 23:22, Aline Manera wrote:
> On 12/22/2013 08:55 AM, Zhou Zheng Sheng wrote:
>> This patch implements creating iSCSI storagepool for libvirt.
>> Each LUN in iSCSI storagepool can be used as a volume, but iSCSI
>> storagepool does not provide ability to create volume. For now in kimchi
>> we create volume for each newly created VM. Next is to implement
>> attaching existing volume to a new VM.
>>
>> As we are going to support more types of pool, we want to add pool
>> source validation, and we should also move the XML definition generation
>> code along with all other pool related code into one or several dedicated
>> module. This requires mass refactoring. So this patch just skip this
>> part and add just code into the current framework.
>>
>> How to test it manually
>>
>> Prerequisite
>> An running iSCSI target on the network.
>>
>> Create:
>> curl -u root -H 'Content-type: application/json' \
>> -H 'Accept: application/json' \
>> -d '{"source": {
>> "target": "iqn.YouriSCSITargetIQN.XXX",
>> "host": "10.0.0.X"},
>> "type": "iscsi",
>> "name": "iscsipool"}' \
>> http://127.0.0.1:8000/storagepools
>>
>> Show Info:
>> curl -u root -H 'Accept: application/json' \
>> http://127.0.0.1:8000/storagepools/iscsipool
>>
>> Activate:
>> curl -u root -H 'Content-type: application/json' \
>> -H 'Accept: application/json' \
>> -d '' http://127.0.0.1:8000/storagepools/iscsipool/activate
>>
>> Examine:
>> iscsiadm -m session
>>
>> Deactivate:
>> curl -u root -H 'Content-type: application/json' \
>> -H 'Accept: application/json' \
>> -d '' http://127.0.0.1:8000/storagepools/iscsipool/deactivate
>>
>> Delete:
>> curl -u root -X DELETE -H 'Accept: application/json' \
>> http://127.0.0.1:8000/storagepools/iscsipool
>>
>> Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
>> ---
>> docs/API.md | 8 ++++++--
>> src/kimchi/model.py | 34 ++++++++++++++++++++++++++++++++++
>> tests/test_storagepool.py | 19 +++++++++++++++++++
>> 3 files changed, 59 insertions(+), 2 deletions(-)
>>
>> diff --git a/docs/API.md b/docs/API.md
>> index d5c8ff6..c1f3938 100644
>> --- a/docs/API.md
>> +++ b/docs/API.md
>> @@ -182,17 +182,21 @@ Represents a snapshot of the Virtual Machine's
>> primary monitor.
>> * **POST**: Create a new Storage Pool
>> * name: The name of the Storage Pool.
>> * type: The type of the defined Storage Pool.
>> - Supported types: 'dir', 'kimchi-iso', 'netfs', 'logical'
>> + Supported types: 'dir', 'kimchi-iso', 'netfs', 'logical',
>> 'iscsi'
>> * path: The path of the defined Storage Pool.
>> For 'kimchi-iso' pool refers to targeted deep scan path.
>> Pool types: 'dir', 'kimchi-iso'.
>> * source: Dictionary containing source information of the pool.
>> * host: IP or hostname of server for a pool backed from a
>> remote host.
>> - Pool types: 'nfs'.
>> + Pool types: 'nfs', 'iscsi'.
>> * path: Export path on NFS server for NFS pool.
>> Pool types: 'nfs'.
>> * devices: Array of devices to be used in the Storage Pool
>> Pool types: 'logical'.
>> + * target: Target IQN of an iSCSI pooVl.
>> + Pool types: 'iscsi'.
>> + * port *(optional)*: Listening port of a remote storage server.
>> + Pool types: 'iscsi'.
>>
>> ### Resource: Storage Pool
>>
>> diff --git a/src/kimchi/model.py b/src/kimchi/model.py
>> index a2fe76c..f45fe13 100644
>> --- a/src/kimchi/model.py
>> +++ b/src/kimchi/model.py
>> @@ -1502,6 +1502,39 @@ def _get_logical_storagepool_xml(poolArgs):
>> return xml
>>
>>
>> +def _get_iscsi_storagepool_xml(poolArgs):
>> + # Required parameters
>> + # name:
>> + # type:
>> + # source[host]:
>> + # source[target]:
>> + #
>> + # Optional parameters
>> + # source[port]:
>> +
>> + try:
>> + portAttr = "port='%s'" % poolArgs['source']['port']
>> + except KeyError:
>> + portAttr = ""
>> +
>> + poolArgs['source']['port'] = portAttr
>> + poolArgs['path'] = '/dev/disk/by-id'
>> +
>> + xml = """
>> + <pool type='{type}'>
>
> Same as I commented on previous patch.
> As you separated functions by type you can use type directly in xml
>
> <pool type='iscsi'>
>
Yes. I'll do it. Thanks for mentioning it!
>> + <name>{name}</name>
>> + <source>
>> + <host name='{source[host]}' {source[port]}/>
>> + <device path='{source[target]}'/>
>> + </source>
>> + <target>
>> + <path>{path}</path>
>> + </target>
>> + </pool>
>> + """.format(**poolArgs)
>> + return xml
>> +
>> +
>> def _get_pool_xml(**kwargs):
>> # REMIND: When add new pool type, also add the related test in
>> # tests/test_storagepool.py
>> @@ -1509,6 +1542,7 @@ def _get_pool_xml(**kwargs):
>> 'dir': _get_dir_storagepool_xml,
>> 'netfs': _get_netfs_storagepool_xml,
>> 'logical': _get_logical_storagepool_xml,
>> + 'iscsi': _get_iscsi_storagepool_xml,
>> }[kwargs['type']]
>> return getPoolXml(kwargs)
>>
>> diff --git a/tests/test_storagepool.py b/tests/test_storagepool.py
>> index 5d5a7cd..9e6f6e3 100644
>> --- a/tests/test_storagepool.py
>> +++ b/tests/test_storagepool.py
>> @@ -78,6 +78,25 @@ class stroagepoolTests(unittest.TestCase):
>>
>> <path>/var/lib/kimchi/logical_mount/unitTestLogicalPool</path>
>> </target>
>> </pool>
>> + """},
>> + {'def':
>> + {'type': 'iscsi',
>> + 'name': 'unitTestISCSIPool',
>> + 'source': {
>> + 'host': '127.0.0.1',
>> + 'target':
>> 'iqn.2003-01.org.linux-iscsi.localhost'}},
>> + 'xml':
>> + """
>> + <pool type='iscsi'>
>> + <name>unitTestISCSIPool</name>
>> + <source>
>> + <host name='127.0.0.1' />
>> + <device path='iqn.2003-01.org.linux-iscsi.localhost'/>
>> + </source>
>> + <target>
>> + <path>/dev/disk/by-id</path>
>> + </target>
>> + </pool>
>> """}]
>
> Add a test with 'port' parameter too.
>
Correct. I'll add it.
>> for poolDef in poolDefs:
>
--
Thanks and best regards!
Zhou Zheng Sheng / 周征晟
E-mail: zhshzhou at linux.vnet.ibm.com
Telephone: 86-10-82454397
More information about the Kimchi-devel
mailing list