<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 03/26/2014 03:33 AM, Aline Manera
      wrote:<br>
    </div>
    <blockquote cite="mid:5331D9F3.8060401@linux.vnet.ibm.com"
      type="cite">On 03/25/2014 09:49 AM, <a class="moz-txt-link-abbreviated" href="mailto:shaohef@linux.vnet.ibm.com">shaohef@linux.vnet.ibm.com</a>
      wrote:
      <br>
      <blockquote type="cite">From: ShaoHe Feng
        <a class="moz-txt-link-rfc2396E" href="mailto:shaohef@linux.vnet.ibm.com">&lt;shaohef@linux.vnet.ibm.com&gt;</a>
        <br>
        <br>
        When the pool of template is iscsi or scsi, the volume parameter
        can not
        <br>
        be NULL.
        <br>
        And as we discussion, we do not mix disks from 2 different types
        of
        <br>
        storage pools, for instance: we do not create a template with 2
        <br>
        disks, where one comes from a SCSI pool and other is a .img in
        <br>
        a DIR pool.
        <br>
        <br>
        Signed-off-by: ShaoHe Feng <a class="moz-txt-link-rfc2396E" href="mailto:shaohef@linux.vnet.ibm.com">&lt;shaohef@linux.vnet.ibm.com&gt;</a>
        <br>
        ---
        <br>
        &nbsp; src/kimchi/i18n.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 2 ++
        <br>
        &nbsp; src/kimchi/model/templates.py | 50
        +++++++++++++++++++++++++++++++++----------
        <br>
        &nbsp; 2 files changed, 41 insertions(+), 11 deletions(-)
        <br>
        <br>
        diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
        <br>
        index 1f84034..bcc15b7 100644
        <br>
        --- a/src/kimchi/i18n.py
        <br>
        +++ b/src/kimchi/i18n.py
        <br>
        @@ -107,6 +107,8 @@ messages = {
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "KCHTMPL0015E": _("Invalid storage pool URI %(value)s
        specified for template"),
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "KCHTMPL0016E": _("Specify an ISO image as CDROM to create
        a template"),
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "KCHTMPL0017E": _("All networks for the template must be
        specified in a list."),
        <br>
        +&nbsp;&nbsp;&nbsp; "KCHTMPL0018E": _("Must specify a volume to a template,
        when storage pool is iscsi or scsi"),
        <br>
        +&nbsp;&nbsp;&nbsp; "KCHTMPL0019E": _("The volume: %(volume)s in not in storage
        pool %(pool)"),
        <br>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "KCHPOOL0001E": _("Storage pool %(name)s already exists"),
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "KCHPOOL0002E": _("Storage pool %(name)s does not exist"),
        <br>
        diff --git a/src/kimchi/model/templates.py
        b/src/kimchi/model/templates.py
        <br>
        index d49632e..0e5c2b2 100644
        <br>
        --- a/src/kimchi/model/templates.py
        <br>
        +++ b/src/kimchi/model/templates.py
        <br>
        @@ -55,15 +55,17 @@ class TemplatesModel(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params['name'] = name
        <br>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = self.conn.get()
        <br>
        -
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_uri = params.get(u'storagepool', '')
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if pool_uri:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_name = pool_name_from_uri(pool_uri)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_name = pool_name_from_uri(pool_uri)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool =
        conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except Exception:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise InvalidParameter("KCHTMPL0004E",
        {'pool': pool_name,
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        'template': name})
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp_volumes = [disk['volume'] for disk in
        params.get('disks', [])
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 'volume' in disk]
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.template_volume_validate(tmp_volumes, pool)
        <br>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for net_name in params.get(u'networks', []):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        @@ -83,6 +85,28 @@ class TemplatesModel(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with self.objstore as session:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return session.get_list('template')
        <br>
        <br>
        +&nbsp;&nbsp;&nbsp; def template_volume_validate(self, tmp_volumes, pool):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kwargs = {'conn': self.conn, 'objstore': self.objstore}
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_type = xmlutils.xpath_get_text(pool.XMLDesc(0),
        "/pool/@type")[0]
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_name = pool.name()
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # as we discussion, we do not mix disks from 2
        different types of
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # storage pools, for instance: we do not create a
        template with 2
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # disks, where one comes from a SCSI pool and other is
        a .img in
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # a DIR pool.
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if pool_type in ['iscsi', 'scsi']:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not tmp_volumes:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise InvalidParameter("KCHTMPL0018E")
        <br>
        +
        <br>
      </blockquote>
      <br>
      <blockquote type="cite">+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; storagevolumes =
        __import__("kimchi.model.storagevolumes",
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fromlist=[''])
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_volumes = storagevolumes.StorageVolumesModel(
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **kwargs).get_list(pool_name)
        <br>
      </blockquote>
      <br>
      Why are you importing it that way?
      <br>
    </blockquote>
    I feel strange use normal importing.<br>
    $ git diff<br>
    diff --git a/src/kimchi/model/templates.py
    b/src/kimchi/model/templates.py<br>
    index 0e5c2b2..b6d80cf 100644<br>
    --- a/src/kimchi/model/templates.py<br>
    +++ b/src/kimchi/model/templates.py<br>
    @@ -30,6 +30,7 @@ from kimchi.utils import pool_name_from_uri<br>
    &nbsp;from kimchi.utils import probe_file_permission_as_user<br>
    &nbsp;from kimchi.vmtemplate import VMTemplate<br>
    &nbsp;from lxml import objectify<br>
    <font color="#3333ff">+from kimchi.model.storagevolumes import
      StorageVolumesModel</font><br>
    <br>
    <br>
    <font color="#3333ff">and error:</font><br>
    $ sudo PYTHONPATH=src ./src/kimchid --host "0.0.0.0" --port 8000 $@
    <br>
    Traceback (most recent call last):<br>
    &nbsp; File "./src/kimchid", line 26, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; import kimchi.server<br>
    &nbsp; File "/home/shhfeng/work/workdir/kimchi/src/kimchi/server.py",
    line 30, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi import mockmodel<br>
    &nbsp; File "/home/shhfeng/work/workdir/kimchi/src/kimchi/mockmodel.py",
    line 49, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi.model.storagepools import ISO_POOL_NAME,
    STORAGE_SOURCES<br>
    &nbsp; File
    "/home/shhfeng/work/workdir/kimchi/src/kimchi/model/storagepools.py",
    line 27, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi.model.host import DeviceModel<br>
    &nbsp; File "/home/shhfeng/work/workdir/kimchi/src/kimchi/model/host.py",
    line 35, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi.model.vms import DOM_STATE_MAP<br>
    &nbsp; File "/home/shhfeng/work/workdir/kimchi/src/kimchi/model/vms.py",
    line 34, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi.model.templates import TemplateModel<br>
    &nbsp; File
    "/home/shhfeng/work/workdir/kimchi/src/kimchi/model/templates.py",
    line 33, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi.model.storagevolumes import StorageVolumesModel<br>
    &nbsp; File
    "/home/shhfeng/work/workdir/kimchi/src/kimchi/model/storagevolumes.py",
    line 29, in &lt;module&gt;<br>
    &nbsp;&nbsp;&nbsp; from kimchi.model.storagepools import StoragePoolModel<br>
    ImportError: cannot import name StoragePoolModel<br>
    <br>
    <br>
    In [1]: from kimchi.model.storagevolumes import StorageVolumesModel<br>
---------------------------------------------------------------------------<br>
    <font color="#ff0000">ImportError</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Traceback (most recent call last)<br>
    &lt;ipython-input-1-c7a006156f1e&gt; in &lt;module&gt;()<br>
    <font color="#3333ff">----&gt; 1 from kimchi.model.storagevolumes
      import StorageVolumesModel</font><br>
    <br>
    <font color="#009900">/home/shhfeng/work/workdir/kimchi/src/kimchi/model/storagevolumes.py</font>
    in &lt;module&gt;()<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 27 from kimchi.exception import MissingParameter,
    NotFoundError, OperationFailed<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 28 from kimchi.isoinfo import IsoImage<br>
    -<font color="#3333ff">--&gt; 29 from kimchi.model.storagepools
      import StoragePoolModel</font><br>
    &nbsp;&nbsp;&nbsp;&nbsp; 30 from kimchi.utils import kimchi_log<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 31 from kimchi.model.vms import VMsModel<br>
    <br>
    <font color="#009900">/home/shhfeng/work/workdir/kimchi/src/kimchi/model/storagepools.py</font>
    in &lt;module&gt;()<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 25 from kimchi.exception import NotFoundError, OperationFailed<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 26 from kimchi.model.config import CapabilitiesModel<br>
    <font color="#3333ff">---&gt; 27 from kimchi.model.host import
      DeviceModel</font><br>
    &nbsp;&nbsp;&nbsp;&nbsp; 28 from kimchi.model.libvirtstoragepool import StoragePoolDef<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 29 from kimchi.utils import add_task, kimchi_log,
    pool_name_from_uri, run_command<br>
    <br>
    <font color="#009900">/home/shhfeng/work/workdir/kimchi/src/kimchi/model/host.py</font>
    in &lt;module&gt;()<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 33 from kimchi.model.config import CapabilitiesModel<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 34 from kimchi.model.tasks import TaskModel<br>
    <font color="#3333ff">---&gt; 35 from kimchi.model.vms import
      DOM_STATE_MAP</font><br>
    &nbsp;&nbsp;&nbsp;&nbsp; 36 from kimchi.repositories import Repositories<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 37 from kimchi.swupdate import SoftwareUpdate<br>
    <font color="#009900"><br>
      /home/shhfeng/work/workdir/kimchi/src/kimchi/model/vms.py</font>
    in &lt;module&gt;()<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 32 from kimchi.exception import MissingParameter,
    NotFoundError, OperationFailed<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 33 from kimchi.model.config import CapabilitiesModel<br>
    <font color="#3333ff">---&gt; 34 from kimchi.model.templates import
      <font color="#cc0000">TemplateModel</font></font><br>
    &nbsp;&nbsp;&nbsp;&nbsp; 35 from kimchi.model.utils import get_vm_name<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 36 from kimchi.screenshot import VMScreenshot<br>
    <br>
    <font color="#009900">/home/shhfeng/work/workdir/kimchi/src/kimchi/model/templates.py</font>
    in &lt;module&gt;()<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 31 from kimchi.vmtemplate import VMTemplate<br>
    &nbsp;&nbsp;&nbsp;&nbsp; 32 from lxml import objectify<br>
    <font color="#3333ff">---&gt; 33 from kimchi.model.storagevolumes
      import <font color="#cc0000">StorageVolumesModel</font></font><br>
    &nbsp;&nbsp;&nbsp;&nbsp; 34 <br>
    &nbsp;&nbsp;&nbsp;&nbsp; 35 <br>
    <br>
    <font color="#ff0000">ImportError: cannot import name
      StorageVolumesModel</font><br>
    <br>
    I find this is a loop:<br>
    make is simple:<br>
    <font color="#3333ff"><font color="#3333ff">storagevolumes</font>, import
      xxx <br>
      xxx, import </font><font color="#3333ff">templates</font><br>
    <font color="#3333ff">templates</font><font color="#3333ff"><font
        color="#3333ff">,&nbsp; import</font> </font><font color="#3333ff"><font
        color="#3333ff">storagevolumes</font></font><br>
    <br>
    <br>
    But I think python interpret should avoid this loop. <br>
    <blockquote cite="mid:5331D9F3.8060401@linux.vnet.ibm.com"
      type="cite">
      <br>
      <blockquote type="cite">+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vols = set(tmp_volumes) -
        set(pool_volumes)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if vols:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise InvalidParameter("KCHTMPL0019E", {'pool':
        pool_name,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        'volume': vols})
        <br>
        +
        <br>
        <br>
        &nbsp; class TemplateModel(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, **kargs):
        <br>
        @@ -128,18 +152,22 @@ class TemplateModel(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new_t.update(params)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ident = name
        <br>
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = self.conn.get()
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_uri = new_t.get(u'storagepool', '')
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_name = pool_name_from_uri(pool_uri)
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = self.conn.get()
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except Exception:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise InvalidParameter("KCHTMPL0004E", {'pool':
        pool_name,
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'template':
        name})
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if pool_uri:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool_name = pool_name_from_uri(pool_uri)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool =
        conn.storagePoolLookupByName(pool_name.encode("utf-8"))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except Exception:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise InvalidParameter("KCHTMPL0004E", {'pool':
        pool_name,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        'template': name})
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp_volumes = [disk['volume'] for disk in
        new_t.get('disks', [])
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 'volume' in disk]
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        self.templates.template_volume_validate(tmp_volumes, pool)
        <br>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for net_name in params.get(u'networks', []):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = self.conn.get()
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.networkLookupByName(net_name)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except Exception:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise InvalidParameter("KCHTMPL0003E",
        {'network': net_name,
        <br>
      </blockquote>
      <br>
      <br>
      <br>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
Thanks and best regards!

Sheldon Feng(&#20911;&#23569;&#21512;)<a class="moz-txt-link-rfc2396E" href="mailto:shaohef@linux.vnet.ibm.com">&lt;shaohef@linux.vnet.ibm.com&gt;</a>
IBM Linux Technology Center</pre>
  </body>
</html>