[Kimchi-devel] [PATCH v2 4/5] storagepool: Support Creating iSCSI storagepool in model.py

Aline Manera alinefm at linux.vnet.ibm.com
Thu Dec 26 15:22:49 UTC 2013


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'>

> +      <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.

>           for poolDef in poolDefs:




More information about the Kimchi-devel mailing list