<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 12/24/2013 04:18 AM, Mark Wu wrote:<br>
    </div>
    <blockquote cite="mid:52B92740.2010808@linux.vnet.ibm.com"
      type="cite">On 12/24/2013 02:41 AM, Aline Manera wrote:
      <br>
      <blockquote type="cite">From: Aline Manera
        <a class="moz-txt-link-rfc2396E" href="mailto:alinefm@br.ibm.com">&lt;alinefm@br.ibm.com&gt;</a>
        <br>
        <br>
        StoragePools(Collection), StoragePool(Resource) and
        IsoPool(Resource) were moved
        <br>
        to a new - control/storagepools.py
        <br>
        That way we can easily know where storage pool resource is
        implemented.
        <br>
        <br>
        Signed-off-by: Aline Manera <a class="moz-txt-link-rfc2396E" href="mailto:alinefm@br.ibm.com">&lt;alinefm@br.ibm.com&gt;</a>
        <br>
        ---
        <br>
        &nbsp; Makefile.am&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; 1 +
        <br>
        &nbsp; src/kimchi/control/storagepools.py |&nbsp; 125
        ++++++++++++++++++++++++++++++++++++
        <br>
        &nbsp; 2 files changed, 126 insertions(+)
        <br>
        &nbsp; create mode 100644 src/kimchi/control/storagepools.py
        <br>
        <br>
        diff --git a/Makefile.am b/Makefile.am
        <br>
        index a16cd2a..f67af3d 100644
        <br>
        --- a/Makefile.am
        <br>
        +++ b/Makefile.am
        <br>
        @@ -47,6 +47,7 @@ PEP8_WHITELIST = \
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/kimchi/server.py \
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/kimchi/control/base.py \
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/kimchi/control/debugreports.py \
        <br>
        +&nbsp;&nbsp;&nbsp; src/kimchi/control/storagepools.py \
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/kimchi/control/templates.py \
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/kimchi/control/utils.py \
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/kimchi/control/vms.py \
        <br>
        diff --git a/src/kimchi/control/storagepools.py
        b/src/kimchi/control/storagepools.py
        <br>
        new file mode 100644
        <br>
        index 0000000..f4fffd7
        <br>
        --- /dev/null
        <br>
        +++ b/src/kimchi/control/storagepools.py
        <br>
        @@ -0,0 +1,125 @@
        <br>
        +#
        <br>
        +# Project Kimchi
        <br>
        +#
        <br>
        +# Copyright IBM, Corp. 2013
        <br>
        +#
        <br>
        +# Authors:
        <br>
        +#&nbsp; Adam Litke <a class="moz-txt-link-rfc2396E" href="mailto:agl@linux.vnet.ibm.com">&lt;agl@linux.vnet.ibm.com&gt;</a>
        <br>
        +#&nbsp; Aline Manera <a class="moz-txt-link-rfc2396E" href="mailto:alinefm@linux.vnet.ibm.com">&lt;alinefm@linux.vnet.ibm.com&gt;</a>
        <br>
        +#
        <br>
        +# This library is free software; you can redistribute it and/or
        <br>
        +# modify it under the terms of the GNU Lesser General Public
        <br>
        +# License as published by the Free Software Foundation; either
        <br>
        +# version 2.1 of the License, or (at your option) any later
        version.
        <br>
        +#
        <br>
        +# This library is distributed in the hope that it will be
        useful,
        <br>
        +# but WITHOUT ANY WARRANTY; without even the implied warranty
        of
        <br>
        +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the
        GNU
        <br>
        +# Lesser General Public License for more details.
        <br>
        +#
        <br>
        +# You should have received a copy of the GNU Lesser General
        Public
        <br>
        +# License along with this library; if not, write to the Free
        Software
        <br>
        +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
        MA&nbsp; 02110-1301 USA
        <br>
        +
        <br>
        +import cherrypy
        <br>
        +
        <br>
        +
        <br>
        +from kimchi.control.base import Collection, Resource
        <br>
        +from kimchi.control.storagevolumes import IsoVolumes,
        StorageVolumes
        <br>
        +from kimchi.control.utils import get_class_name, model_fn,
        parse_request
        <br>
        +from kimchi.model import ISO_POOL_NAME
        <br>
        +
        <br>
        +
        <br>
        +class StoragePools(Collection):
        <br>
        +&nbsp;&nbsp;&nbsp; def __init__(self, model):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(StoragePools, self).__init__(model)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.resource = StoragePool
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isos = IsoPool(model)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isos.exposed = True
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setattr(self, ISO_POOL_NAME, isos)
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def create(self, *args):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create = getattr(self.model, model_fn(self,
        'create'))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except AttributeError:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise cherrypy.HTTPError(405,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Create is not allowed for %s' %
        get_class_name(self))
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params = parse_request()
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args = self.model_args + [params]
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = create(*args)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args = self.resource_args + [name]
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = self.resource(self.model, *args)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resp = res.get()
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 'task_id' in res.data:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cherrypy.response.status = 202
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cherrypy.response.status = 201
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return resp
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def _get_resources(self):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res_list = super(StoragePools,
        self)._get_resources()
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Append reserved pools
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isos = getattr(self, ISO_POOL_NAME)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isos.lookup()
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res_list.append(isos)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except AttributeError:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return res_list
        <br>
        +
        <br>
        +
        <br>
        +class StoragePool(Resource):
        <br>
        +&nbsp;&nbsp;&nbsp; def __init__(self, model, ident):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(StoragePool, self).__init__(model, ident)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.update_params = ["autostart"]
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.uri_fmt = "/storagepools/%s"
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.activate = self.generate_action_handler(self,
        'activate')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.deactivate = self.generate_action_handler(self,
        'deactivate')
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; @property
        <br>
        +&nbsp;&nbsp;&nbsp; def data(self):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = {'name': self.ident,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'state': self.info['state'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'capacity': self.info['capacity'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'allocated': self.info['allocated'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'available': self.info['available'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path': self.info['path'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'source': self.info['source'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type': self.info['type'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'nr_volumes': self.info['nr_volumes'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'autostart': self.info['autostart']}
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val = self.info.get('task_id')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if val:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res['task_id'] = val
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return res
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def _cp_dispatch(self, vpath):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if vpath:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subcollection = vpath.pop(0)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if subcollection == 'storagevolumes':
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # incoming text, from URL, is not unicode, need
        decode
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return StorageVolumes(self.model,
        self.ident.decode("utf-8"))
        <br>
        +
        <br>
        +
        <br>
        +class IsoPool(Resource):
        <br>
        +&nbsp;&nbsp;&nbsp; def __init__(self, model):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(IsoPool, self).__init__(model, ISO_POOL_NAME)
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; @property
        <br>
        +&nbsp;&nbsp;&nbsp; def data(self):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {'name': self.ident,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'state': self.info['state'],
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type': self.info['type']}
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def _cp_dispatch(self, vpath):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if vpath:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subcollection = vpath.pop(0)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if subcollection == 'storagevolumes':
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # incoming text, from URL, is not unicode, need
        decode
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return IsoVolumes(self.model,
        self.ident.decode("utf-8"))
        <br>
      </blockquote>
      PEP8 error:
      <br>
      src/kimchi/control/base.py:285:17: E128 continuation line
      under-indented for visual indent
      <br>
      <br>
    </blockquote>
    <br>
    <font face="DejaVu Sans Mono">Same as I commented previously.<br>
      I didn't get this error.<br>
      <br>
      alinefm@alinefm:~/kimchi$ sudo make check-local<br>
      /usr/bin/pep8 --version<br>
      1.2<br>
      /usr/bin/pep8 --filename '*.py,*.py.in' src/kimchi/asynctask.py
      src/kimchi/auth.py src/kimchi/cachebust.py src/kimchi/config.py.in
      src/kimchi/disks.py src/kimchi/root.py src/kimchi/server.py
      src/kimchi/control/base.py src/kimchi/control/config.py
      src/kimchi/control/debugreports.py src/kimchi/control/host.py
      src/kimchi/control/interfaces.py src/kimchi/control/networks.py
      src/kimchi/control/plugins.py src/kimchi/control/storagepools.py
      src/kimchi/control/storagevolumes.py src/kimchi/control/tasks.py
      src/kimchi/control/templates.py src/kimchi/control/utils.py
      src/kimchi/control/vms.py plugins/__init__.py
      plugins/sample/__init__.py plugins/sample/model.py
      tests/test_plugin.py <br>
      <br>
    </font>
  </body>
</html>