[Kimchi-devel] [PATCH 01/15] V4 Ginger Base : Taking off the host tab functionality from kimchi

Chandra Shehkhar Reddy Potula chandra at linux.vnet.ibm.com
Thu Oct 8 17:51:55 UTC 2015


Hi Daniel,

I suppose you missed to apply patch 4/15 because of size 484 kb size 
(due to the fact that it has png files).

Aline could you please release the patch 4/15 from mailing list ?

Thanks and Regards
Chandra


On 10/08/2015 10:04 PM, Daniel Henrique Barboza wrote:
>
>
> On 10/08/2015 12:44 PM, Paulo Ricardo Paz Vital wrote:
>> On Thu, 2015-10-08 at 11:47 -0300, Daniel Henrique Barboza wrote:
>>> Good news first: all patches applied with no errors in kimchi master
>>> branch.
>>>
>>> Now for the improvements:
>>>
>>> 1 - there is no Makefile.in in the plug-in. This means that the plug
>>> -in cannot be built. Running
>>> "./autogen.sh --system" returns
>>>
>>> "config.status: error: cannot find input file: `Makefile.in'¨
>>>
>>> and then it's impossible to execute make:
>>>
>>> $ make
>>> make: *** No targets specified and no makefile found.  Stop.
>> Daniel, the Makefile.in and Makefile files are generated by automake
>> (executed by autogen.sh) based on Makefile.am. Only this last file
>> (Makefile.am) must be present in the git repository of the plugin.
>>
>> If during the execution of autogen.sh you got this error, you have
>> something wrong on Makefile.am or you are missing some file (or
>> directory) used by automake to generate the Makefile.in file.
>
> Yeah. After some investigation I found out that the problem was that
> the current Makefile.am and configure.am of gingerbase is pointing to a
> nonexistent dir called 'docs'. After fixing it, the plug-in now 
> compiles but fails to
> start when launching  wok.
>
> Chandra, these are the changes I've made to fix the autogen.sh problem.
> Feel free to add them in the next review:
>
> -------------------------
>
> diff --git a/src/wok/plugins/gingerbase/Makefile.am 
> b/src/wok/plugins/gingerbase/Makefile.am
> index c24bb16..321ec65 100644
> --- a/src/wok/plugins/gingerbase/Makefile.am
> +++ b/src/wok/plugins/gingerbase/Makefile.am
> @@ -17,7 +17,7 @@
>  # License along with this library; if not, write to the Free Software
>  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
> 02110-1301  USA
>
> -SUBDIRS = contrib control docs model po tests ui
> +SUBDIRS = contrib control model po tests ui
>
>  gingerbase_PYTHON = $(filter-out config.py, $(wildcard *.py))
>
> diff --git a/src/wok/plugins/gingerbase/configure.ac 
> b/src/wok/plugins/gingerbase/configure.ac
> index 00aba89..2143908 100644
> --- a/src/wok/plugins/gingerbase/configure.ac
> +++ b/src/wok/plugins/gingerbase/configure.ac
> @@ -68,7 +68,6 @@ AC_CONFIG_FILES([
>      po/Makefile.in
>      po/gen-pot
>      Makefile
> -    docs/Makefile
>      control/Makefile
>      model/Makefile
>      ui/Makefile
>
> --------------------
>>
>>
>>>
>>> 2 - the plug-in can't be executed in wok, saying that it failed to
>>> import it. It can be directly related
>>> to the first issue:
>>>
>>> $ sudo ./src/wokd --environment=development
>>> [sudo] password for danielhb:
>>> Failed to import plugin plugins.gingerbase.GingerBase
>>> WARNING: no 'numpy' module, HyBi protocol will be slower
>>> [08/Oct/2015:11:20:21] ENGINE Listening for SIGHUP.
>>> [08/Oct/2015:11:20:21] ENGINE Listening for SIGTERM.
>>> [08/Oct/2015:11:20:21] ENGINE Listening for SIGUSR1.
>>> [08/Oct/2015:11:20:21] ENGINE Bus STARTING
>>>
>>> 3 - Unit tests script (run_tests.sh) wasn't built because of the
>>> problem with the Makefile.
>>>
>>> 4- Kimchi unit tests were broken in the process.
>>>
>>>
>>> I am saying everything that went wrong in my tests fully aware that
>>> there is a lot that
>>> can go wrong because this work is not trivial. I do not expect you to
>>> get all these issues
>>> right in the next review. Let's start by making the plug-in
>>> "buildable". Refer to the
>>> Makefile.in and Makefile.am files of Kimchi/Ginger plug-in to see how
>>> it's being done.
>>>
>>>
>>> Let me know if you need any assistance.
>>>
>>>
>>> Daniel
>>>
>>>
>>> On 10/08/2015 08:44 AM, chandra at linux.vnet.ibm.com wrote:
>>>> From: chandrureddy <chandra at linux.vnet.ibm.com>
>>>>
>>>> ---
>>>>   src/wok/plugins/kimchi/API.json                    | 134 ---------
>>>>   src/wok/plugins/kimchi/Makefile.am                 |   3 +-
>>>>   src/wok/plugins/kimchi/config.py.in                |   4 -
>>>>   src/wok/plugins/kimchi/control/host.py             |  99 +-----
>>>>   src/wok/plugins/kimchi/docs/README.md              |   6 +-
>>>>   src/wok/plugins/kimchi/i18n.py                     |  52 ----
>>>>   src/wok/plugins/kimchi/kimchi.conf                 |   7 -
>>>>   src/wok/plugins/kimchi/mockmodel.py                |  20 --
>>>>   src/wok/plugins/kimchi/model/config.py             |  21 --
>>>>   src/wok/plugins/kimchi/model/host.py               | 334 +--------
>>>> ------------
>>>>   src/wok/plugins/kimchi/root.py                     |   1 -
>>>>   src/wok/plugins/kimchi/tests/test_authorization.py |   6 -
>>>>   src/wok/plugins/kimchi/tests/test_config.py.in     |   8 -
>>>>   src/wok/plugins/kimchi/tests/test_host.py          |  97 +-----
>>>>   src/wok/plugins/kimchi/tests/test_model.py         | 239 +--------
>>>> ------
>>>>   src/wok/plugins/kimchi/tests/test_rest.py          |  54 ----
>>>>   src/wok/plugins/kimchi/ui/config/tab-ext.xml       |   7 -
>>>>   17 files changed, 12 insertions(+), 1080 deletions(-)
>>>>
>>>> diff --git a/src/wok/plugins/kimchi/API.json
>>>> b/src/wok/plugins/kimchi/API.json
>>>> index fc1d2dd..6189207 100644
>>>> --- a/src/wok/plugins/kimchi/API.json
>>>> +++ b/src/wok/plugins/kimchi/API.json
>>>> @@ -59,30 +59,6 @@
>>>>           }
>>>>       },
>>>>       "properties": {
>>>> -        "debugreports_create": {
>>>> -            "type": "object",
>>>> -            "error": "KCHDR0006E",
>>>> -            "properties": {
>>>> -                "name": {
>>>> -                    "description": "The name for the debug report
>>>> file.",
>>>> -                    "type": "string",
>>>> -                    "pattern": "^[_A-Za-z0-9-]*$",
>>>> -                    "error": "KCHDR0007E"
>>>> -                }
>>>> -            }
>>>> -        },
>>>> -        "debugreport_update": {
>>>> -            "type": "object",
>>>> -            "properties": {
>>>> -                "name": {
>>>> -                    "description": "New name of debug report",
>>>> -                    "type": "string",
>>>> -                    "pattern": "^[_A-Za-z0-9-]*$",
>>>> -                    "error": "KCHDR0007E"
>>>> -                }
>>>> -            },
>>>> -            "additionalProperties": false
>>>> -        },
>>>>           "storagepools_create": {
>>>>               "type": "object",
>>>>               "error": "KCHPOOL0026E",
>>>> @@ -684,116 +660,6 @@
>>>>               "additionalProperties": false,
>>>>               "error": "KCHAPI0001E"
>>>>           },
>>>> -        "repositories_create": {
>>>> -            "type": "object",
>>>> -            "properties": {
>>>> -                "repo_id": {
>>>> -                    "description": "Repository ID used for YUM
>>>> repository.",
>>>> -                    "type": "string",
>>>> -                    "error": "KCHREPOS0001E"
>>>> -                },
>>>> -                "baseurl": {
>>>> -                    "description": "URL to the directory where the
>>>> repodata directory of a repository is located. Can be an
>>>> http://, ftp:// or file://  URL.",
>>>> -                    "type": "string",
>>>> -                    "error": "KCHREPOS0002E"
>>>> -                },
>>>> -                "config": {
>>>> -                    "description": "Dictionary containing
>>>> repository configuration",
>>>> -                    "type": "object",
>>>> -                    "error": "KCHREPOS0003E",
>>>> -                    "properties": {
>>>> -                        "dist": {
>>>> -                            "description": "Distribution to DEB
>>>> repository",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0004E"
>>>> -                        },
>>>> -                        "comps": {
>>>> -                            "description": "List of components to
>>>> DEB repository",
>>>> -                            "type": "array",
>>>> -                            "error": "KCHREPOS0005E",
>>>> -                            "uniqueItems": true,
>>>> -                            "items": {
>>>> -                                "description": "Component name",
>>>> -                                "type": "string",
>>>> -                                "error": "KCHREPOS0006E"
>>>> -                            }
>>>> -                        },
>>>> -                        "repo_name": {
>>>> -                            "description": "YUM repository name",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0023E"
>>>> -                        },
>>>> -                        "mirrorlist": {
>>>> -                            "description": "URL to a file
>>>> containing a list of baseurls",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0007E"
>>>> -                        },
>>>> -                        "metalink": {
>>>> -                            "description": "URL to a metalink file
>>>> for the repomd.xml",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0029E"
>>>> -                        }
>>>> -                    }
>>>> -                }
>>>> -            },
>>>> -            "additionalProperties": false,
>>>> -            "error": "KCHAPI0001E"
>>>> -        },
>>>> -        "repository_update": {
>>>> -            "type": "object",
>>>> -            "properties": {
>>>> -                "baseurl": {
>>>> -                    "description": "URL to the directory where the
>>>> repodata directory of a repository is located. Can be an
>>>> http://, ftp:// or file://  URL.",
>>>> -                    "type": "string",
>>>> -                    "error": "KCHREPOS0002E"
>>>> -                },
>>>> -                "config": {
>>>> -                    "description": "Dictionary containing
>>>> repository configuration",
>>>> -                    "type": "object",
>>>> -                    "error": "KCHREPOS0003E",
>>>> -                    "properties": {
>>>> -                        "dist": {
>>>> -                            "description": "Distribution to DEB
>>>> repository",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0004E"
>>>> -                        },
>>>> -                        "comps": {
>>>> -                            "description": "List of components to
>>>> DEB repository",
>>>> -                            "type": "array",
>>>> -                            "error": "KCHREPOS0005E",
>>>> -                            "uniqueItems": true,
>>>> -                            "items": {
>>>> -                                "description": "Component name",
>>>> -                                "type": "string",
>>>> -                                "error": "KCHREPOS0006E"
>>>> -                            }
>>>> -                        },
>>>> -                        "repo_name": {
>>>> -                            "description": "Human-readable string
>>>> describing the YUM repository.",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0008E"
>>>> -                        },
>>>> -                        "mirrorlist": {
>>>> -                            "description": "URL to a file
>>>> containing a list of baseurls for YUM repository",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0007E"
>>>> -                        },
>>>> -                        "gpgcheck": {
>>>> -                            "description": "Indicates if a GPG
>>>> signature check on the packages gotten from repository should be
>>>> performed.",
>>>> -                            "type": "boolean",
>>>> -                            "error": "KCHREPOS0009E"
>>>> -                        },
>>>> -                        "gpgkey": {
>>>> -                            "description": "URL pointing to the
>>>> ASCII-armored GPG key file for the repository.",
>>>> -                            "type": "string",
>>>> -                            "error": "KCHREPOS0010E"
>>>> -                        }
>>>> -                    }
>>>> -                }
>>>> -            },
>>>> -            "additionalProperties": false,
>>>> -            "error": "KCHAPI0001E"
>>>> -        },
>>>>           "devices_get_list": {
>>>>               "type": "object",
>>>>               "properties": {
>>>> diff --git a/src/wok/plugins/kimchi/Makefile.am
>>>> b/src/wok/plugins/kimchi/Makefile.am
>>>> index 34ddef4..f2b05cd 100644
>>>> --- a/src/wok/plugins/kimchi/Makefile.am
>>>> +++ b/src/wok/plugins/kimchi/Makefile.am
>>>> @@ -101,7 +101,6 @@ install-deb: install
>>>>       mkdir -p $(DESTDIR)/$(localstatedir)/lib/wok/
>>>>       touch $(DESTDIR)/$(localstatedir)/lib/wok/objectstore
>>>>       mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/vnc-tokens
>>>> -    mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/debugreports
>>>>       mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/screenshots
>>>>       mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/isos
>>>>
>>>> @@ -144,7 +143,7 @@ install-data-local:
>>>>       $(MKDIR_P) $(DESTDIR)$(kimchidir)
>>>>       $(INSTALL_DATA) API.json $(DESTDIR)$(kimchidir)/API.json
>>>>       mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/vnc-tokens
>>>> -    mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/{debugreports,is
>>>> os,screenshots}
>>>> +    mkdir -p
>>>> $(DESTDIR)/$(localstatedir)/lib/wok/plugins/kimchi/{isos,screenshot
>>>> s}
>>>>
>>>>   uninstall-local:
>>>>       $(RM) $(DESTDIR)$(kimchidir)/API.json
>>>> diff --git a/src/wok/plugins/kimchi/config.py.in
>>>> b/src/wok/plugins/kimchi/config.py.in
>>>> index 6ae0ccd..43e7811 100644
>>>> --- a/src/wok/plugins/kimchi/config.py.in
>>>> +++ b/src/wok/plugins/kimchi/config.py.in
>>>> @@ -38,10 +38,6 @@ def get_distros_store():
>>>>       return os.path.join(PluginPaths('kimchi').conf_dir,
>>>> 'distros.d')
>>>>
>>>>
>>>> -def get_debugreports_path():
>>>> -    return os.path.join(PluginPaths('kimchi').state_dir,
>>>> 'debugreports')
>>>> -
>>>> -
>>>>   def get_screenshot_path():
>>>>       return os.path.join(PluginPaths('kimchi').state_dir,
>>>> 'screenshots')
>>>>
>>>> diff --git a/src/wok/plugins/kimchi/control/host.py
>>>> b/src/wok/plugins/kimchi/control/host.py
>>>> index 0a40f1b..91edd73 100644
>>>> --- a/src/wok/plugins/kimchi/control/host.py
>>>> +++ b/src/wok/plugins/kimchi/control/host.py
>>>> @@ -19,7 +19,6 @@
>>>>
>>>>   from wok.control.base import Collection, Resource,
>>>> SimpleCollection
>>>>   from wok.control.utils import UrlSubNode
>>>> -from wok.exception import NotFoundError
>>>>
>>>>   from cpuinfo import CPUInfo
>>>>
>>>> @@ -31,14 +30,7 @@ class Host(Resource):
>>>>           self.role_key = 'host'
>>>>           self.admin_methods = ['GET', 'POST']
>>>>           self.uri_fmt = '/host/%s'
>>>> -        self.reboot = self.generate_action_handler('reboot')
>>>> -        self.shutdown = self.generate_action_handler('shutdown')
>>>> -        self.stats = HostStats(self.model)
>>>> -        self.partitions = Partitions(self.model)
>>>>           self.devices = Devices(self.model)
>>>> -        self.packagesupdate = PackagesUpdate(self.model)
>>>> -        self.repositories = Repositories(self.model)
>>>> -        self.swupdate =
>>>> self.generate_action_handler_task('swupdate')
>>>>           self.cpuinfo = CPUInfo(self.model)
>>>>
>>>>       @property
>>>> @@ -46,54 +38,6 @@ class Host(Resource):
>>>>           return self.info
>>>>
>>>>
>>>> -class HostStats(Resource):
>>>> -    def __init__(self, model, id=None):
>>>> -        super(HostStats, self).__init__(model, id)
>>>> -        self.role_key = 'host'
>>>> -        self.admin_methods = ['GET']
>>>> -        self.history = HostStatsHistory(self.model)
>>>> -
>>>> -    @property
>>>> -    def data(self):
>>>> -        return self.info
>>>> -
>>>> -
>>>> -class HostStatsHistory(Resource):
>>>> -    @property
>>>> -    def data(self):
>>>> -        return self.info
>>>> -
>>>> -
>>>> -class Partitions(Collection):
>>>> -    def __init__(self, model):
>>>> -        super(Partitions, self).__init__(model)
>>>> -        self.role_key = 'storage'
>>>> -        self.admin_methods = ['GET']
>>>> -        self.resource = Partition
>>>> -
>>>> -    # Defining get_resources in order to return list of partitions
>>>> in UI
>>>> -    # sorted by their path
>>>> -    def _get_resources(self, flag_filter):
>>>> -        res_list = super(Partitions,
>>>> self)._get_resources(flag_filter)
>>>> -        res_list = filter(lambda x: x.info['available'], res_list)
>>>> -        res_list.sort(key=lambda x: x.info['path'])
>>>> -        return res_list
>>>> -
>>>> -
>>>> -class Partition(Resource):
>>>> -    def __init__(self, model, id):
>>>> -        self.role_key = 'storage'
>>>> -        self.admin_methods = ['GET']
>>>> -        super(Partition, self).__init__(model, id)
>>>> -
>>>> -    @property
>>>> -    def data(self):
>>>> -        if not self.info['available']:
>>>> -            raise NotFoundError("KCHPART0001E", {'name':
>>>> self.info['name']})
>>>> -
>>>> -        return self.info
>>>> -
>>>> -
>>>>   class Devices(Collection):
>>>>       def __init__(self, model):
>>>>           super(Devices, self).__init__(model)
>>>> @@ -113,45 +57,4 @@ class Device(Resource):
>>>>
>>>>       @property
>>>>       def data(self):
>>>> -        return self.info
>>>> -
>>>> -
>>>> -class PackagesUpdate(Collection):
>>>> -    def __init__(self, model):
>>>> -        super(PackagesUpdate, self).__init__(model)
>>>> -        self.role_key = 'host'
>>>> -        self.admin_methods = ['GET']
>>>> -        self.resource = PackageUpdate
>>>> -
>>>> -
>>>> -class PackageUpdate(Resource):
>>>> -    def __init__(self, model, id=None):
>>>> -        super(PackageUpdate, self).__init__(model, id)
>>>> -        self.role_key = 'host'
>>>> -        self.admin_methods = ['GET']
>>>> -
>>>> -    @property
>>>> -    def data(self):
>>>> -        return self.info
>>>> -
>>>> -
>>>> -class Repositories(Collection):
>>>> -    def __init__(self, model):
>>>> -        super(Repositories, self).__init__(model)
>>>> -        self.role_key = 'host'
>>>> -        self.admin_methods = ['GET', 'POST']
>>>> -        self.resource = Repository
>>>> -
>>>> -
>>>> -class Repository(Resource):
>>>> -    def __init__(self, model, id):
>>>> -        super(Repository, self).__init__(model, id)
>>>> -        self.role_key = 'host'
>>>> -        self.admin_methods = ['GET', 'PUT', 'POST', 'DELETE']
>>>> -        self.uri_fmt = "/host/repositories/%s"
>>>> -        self.enable = self.generate_action_handler('enable')
>>>> -        self.disable = self.generate_action_handler('disable')
>>>> -
>>>> -    @property
>>>> -    def data(self):
>>>> -        return self.info
>>>> +        return self.info
>>>> \ No newline at end of file
>>>> diff --git a/src/wok/plugins/kimchi/docs/README.md
>>>> b/src/wok/plugins/kimchi/docs/README.md
>>>> index fb0aef9..c838f0e 100644
>>>> --- a/src/wok/plugins/kimchi/docs/README.md
>>>> +++ b/src/wok/plugins/kimchi/docs/README.md
>>>> @@ -177,13 +177,13 @@ Usage
>>>>
>>>>   Connect your browser to https://localhost:8001.  You should see a
>>>> screen like:
>>>>
>>>> -![Wok Login Screen](/docs/kimchi-login.png)
>>>> +![Wok Login Screen](docs/kimchi-login.png)
>>>>
>>>>   Wok uses PAM to authenticate users so you can log in with the same
>>>> username
>>>>   and password that you would use to log in to the machine itself.
>>>>   Once logged in
>>>>   you will see a screen like:
>>>>
>>>> -![Kimchi Guest View](/docs/kimchi-guest.png)
>>>> +![Kimchi Guest View](docs/kimchi-guest.png)
>>>>
>>>>   This shows you the list of running guests including a live
>>>> screenshot of
>>>>   the guest session.  You can use the action buttons to shutdown the
>>>> guests
>>>> @@ -197,7 +197,7 @@ top navigation bar.
>>>>
>>>>   The template screen looks like:
>>>>
>>>> -![Kimchi Template View](/docs/kimchi-templates.png)
>>>> +![Kimchi Template View](docs/kimchi-templates.png)
>>>>
>>>>   From this view, you can change the parameters of a template or
>>>> create a
>>>>   new template using the "+" button in the upper right corner.
>>>> diff --git a/src/wok/plugins/kimchi/i18n.py
>>>> b/src/wok/plugins/kimchi/i18n.py
>>>> index ea325b8..ca48160 100644
>>>> --- a/src/wok/plugins/kimchi/i18n.py
>>>> +++ b/src/wok/plugins/kimchi/i18n.py
>>>> @@ -32,9 +32,6 @@ messages = {
>>>>       "KCHDEVS0003E": _('"_passthrough_affected_by" should be a
>>>> device name string'),
>>>>       "KCHDEVS0004E": _('"_available_only" should be "true" or
>>>> "false"'),
>>>>
>>>> -    "KCHDISKS0001E": _("Error while getting block devices.
>>>> Details: %(err)s"),
>>>> -    "KCHDISKS0002E": _("Error while getting block device
>>>> information for %(device)s."),
>>>> -
>>>>       "KCHDL0001E": _("Unable to find distro file: %(filename)s"),
>>>>       "KCHDL0002E": _("Unable to parse distro file: %(filename)s.
>>>> Make sure, it is a JSON file."),
>>>>
>>>> @@ -246,31 +243,13 @@ messages = {
>>>>       "KCHNET0021E": _("Failed to activate interface %(iface)s.
>>>> Please check the physical link status."),
>>>>       "KCHNET0022E": _("Failed to start network %(name)s. Details:
>>>> %(err)s"),
>>>>
>>>> -    "KCHDR0001E": _("Debug report %(name)s does not exist"),
>>>> -    "KCHDR0002E": _("Debug report tool not found in system"),
>>>> -    "KCHDR0003E": _("Unable to create debug report %(name)s.
>>>> Details: %(err)s."),
>>>> -    "KCHDR0004E": _("Can not find any debug report with the given
>>>> name %(name)s"),
>>>> -    "KCHDR0005E": _("Unable to generate debug report %(name)s.
>>>> Details: %(err)s"),
>>>> -    "KCHDR0006E": _("You should give a name for the debug report
>>>> file."),
>>>> -    "KCHDR0007E": _("Debug report name must be a string. Only
>>>> letters, digits, underscore ('_') and hyphen ('-') are allowed."),
>>>> -    "KCHDR0008E": _("The debug report with specified name
>>>> \"%(name)s\" already exists. Please use another one."),
>>>> -
>>>>       "KCHSR0001E": _("Storage server %(server)s was not used by
>>>> Kimchi"),
>>>>
>>>>       "KCHDISTRO0001E": _("Distro '%(name)s' does not exist"),
>>>>
>>>> -    "KCHPART0001E": _("Partition %(name)s does not exist in the
>>>> host"),
>>>> -
>>>> -    "KCHHOST0001E": _("Unable to shutdown host machine as there
>>>> are running virtual machines"),
>>>> -    "KCHHOST0002E": _("Unable to reboot host machine as there are
>>>> running virtual machines"),
>>>>       "KCHHOST0003E": _("Node device '%(name)s' not found"),
>>>>       "KCHHOST0004E": _("Conflicting flag filters specified."),
>>>>
>>>> -    "KCHPKGUPD0001E": _("No packages marked for update"),
>>>> -    "KCHPKGUPD0002E": _("Package %(name)s is not marked to be
>>>> updated."),
>>>> -    "KCHPKGUPD0003E": _("Error while getting packages marked to be
>>>> updated. Details: %(err)s"),
>>>> -    "KCHPKGUPD0004E": _("There is no compatible package manager
>>>> for this system."),
>>>> -
>>>>       "KCHUTILS0003E": _("Unable to choose a virtual machine name"),
>>>>
>>>>       "KCHVMSTOR0002E": _("Invalid storage type. Types supported:
>>>> 'cdrom', 'disk'"),
>>>> @@ -289,37 +268,6 @@ messages = {
>>>>       "KCHVMSTOR0017E": _("Only one of path or pool/volume can be
>>>> specified to add a new virtual machine disk"),
>>>>       "KCHVMSTOR0018E": _("Volume chosen with format %(format)s does
>>>> not fit in the storage type %(type)s"),
>>>>
>>>> -    "KCHREPOS0001E": _("YUM Repository ID must be one word only
>>>> string."),
>>>> -    "KCHREPOS0002E": _("Repository URL must be an http://, ftp://
>>>> or file:// URL."),
>>>> -    "KCHREPOS0003E": _("Repository configuration is a dictionary
>>>> with specific values according to repository type."),
>>>> -    "KCHREPOS0004E": _("Distribution to DEB repository must be a
>>>> string"),
>>>> -    "KCHREPOS0005E": _("Components to DEB repository must be
>>>> listed in a array"),
>>>> -    "KCHREPOS0006E": _("Components to DEB repository must be a
>>>> string"),
>>>> -    "KCHREPOS0007E": _("Mirror list to repository must be a
>>>> string"),
>>>> -    "KCHREPOS0008E": _("YUM Repository name must be string."),
>>>> -    "KCHREPOS0009E": _("GPG check must be a boolean value."),
>>>> -    "KCHREPOS0010E": _("GPG key must be a URL pointing to the
>>>> ASCII-armored file."),
>>>> -    "KCHREPOS0011E": _("Could not update repository
>>>> %(repo_id)s."),
>>>> -    "KCHREPOS0012E": _("Repository %(repo_id)s does not exist."),
>>>> -    "KCHREPOS0013E": _("Specify repository base URL, mirror list
>>>> or metalink in order to create or update a YUM repository."),
>>>> -    "KCHREPOS0014E": _("Repository management tool was not
>>>> recognized for your system."),
>>>> -    "KCHREPOS0015E": _("Repository %(repo_id)s is already
>>>> enabled."),
>>>> -    "KCHREPOS0016E": _("Repository %(repo_id)s is already
>>>> disabled."),
>>>> -    "KCHREPOS0017E": _("Could not remove repository
>>>> %(repo_id)s."),
>>>> -    "KCHREPOS0018E": _("Could not write repository configuration
>>>> file %(repo_file)s"),
>>>> -    "KCHREPOS0019E": _("Specify repository distribution in order
>>>> to create a DEB repository."),
>>>> -    "KCHREPOS0020E": _("Could not enable repository
>>>> %(repo_id)s."),
>>>> -    "KCHREPOS0021E": _("Could not disable repository
>>>> %(repo_id)s."),
>>>> -    "KCHREPOS0022E": _("YUM Repository ID already exists"),
>>>> -    "KCHREPOS0023E": _("YUM Repository name must be a string"),
>>>> -    "KCHREPOS0024E": _("Unable to list repositories. Details:
>>>> '%(err)s'"),
>>>> -    "KCHREPOS0025E": _("Unable to retrieve repository information.
>>>> Details: '%(err)s'"),
>>>> -    "KCHREPOS0026E": _("Unable to add repository. Details:
>>>> '%(err)s'"),
>>>> -    "KCHREPOS0027E": _("Unable to remove repository. Details:
>>>> '%(err)s'"),
>>>> -    "KCHREPOS0028E": _("Configuration items: '%(items)s' are not
>>>> supported by repository manager"),
>>>> -    "KCHREPOS0029E": _("Repository metalink must be an
>>>> http://, ftp:// or file:// URL."),
>>>> -    "KCHREPOS0030E": _("Cannot specify mirrorlist and metalink at
>>>> the same time."),
>>>> -
>>>>       "KCHSNAP0001E": _("Virtual machine '%(vm)s' must be stopped
>>>> before creating a snapshot of it."),
>>>>       "KCHSNAP0002E": _("Unable to create snapshot '%(name)s' on
>>>> virtual machine '%(vm)s'. Details: %(err)s"),
>>>>       "KCHSNAP0003E": _("Snapshot '%(name)s' does not exist on
>>>> virtual machine '%(vm)s'."),
>>>> diff --git a/src/wok/plugins/kimchi/kimchi.conf
>>>> b/src/wok/plugins/kimchi/kimchi.conf
>>>> index 1bf78e4..ebf346f 100644
>>>> --- a/src/wok/plugins/kimchi/kimchi.conf
>>>> +++ b/src/wok/plugins/kimchi/kimchi.conf
>>>> @@ -23,13 +23,6 @@ tools.staticdir.on = True
>>>>   tools.staticdir.dir = wok.config.PluginPaths('kimchi').state_dir +
>>>> '/screenshots'
>>>>   tools.nocache.on = False
>>>>
>>>> -[/data/debugreports]
>>>> -tools.staticdir.on = True
>>>> -tools.staticdir.dir = wok.config.PluginPaths('kimchi').state_dir +
>>>> '/debugreports'
>>>> -tools.nocache.on = False
>>>> -tools.wokauth.on = True
>>>> -tools.staticdir.content_types = {'xz': 'application/x-xz'}
>>>> -
>>>>   [/help]
>>>>   tools.staticdir.on = True
>>>>   tools.staticdir.dir = wok.config.PluginPaths('kimchi').ui_dir +
>>>> '/pages/help'
>>>> diff --git a/src/wok/plugins/kimchi/mockmodel.py
>>>> b/src/wok/plugins/kimchi/mockmodel.py
>>>> index 0832b20..e16deb2 100644
>>>> --- a/src/wok/plugins/kimchi/mockmodel.py
>>>> +++ b/src/wok/plugins/kimchi/mockmodel.py
>>>> @@ -20,7 +20,6 @@
>>>>   import libvirt
>>>>   import lxml.etree as ET
>>>>   import os
>>>> -import random
>>>>   import time
>>>>   from lxml import objectify
>>>>   from lxml.builder import E
>>>> @@ -30,12 +29,10 @@ from wok.objectstore import ObjectStore
>>>>   from wok.utils import add_task, get_next_clone_name, wok_log
>>>>   from wok.xmlutils.utils import xml_item_update
>>>>
>>>> -import config
>>>>   import imageinfo
>>>>   import osinfo
>>>>   from model import cpuinfo
>>>>   from model import vmifaces
>>>> -from model.debugreports import DebugReportsModel
>>>>   from model.host import DeviceModel
>>>>   from model.libvirtstoragepool import IscsiPoolDef, NetfsPoolDef
>>>>   from model.libvirtstoragepool import StoragePoolDef
>>>> @@ -119,7 +116,6 @@ class MockModel(Model):
>>>>           StoragePoolModel._update_lvm_disks =
>>>> self._update_lvm_disks
>>>>           StorageVolumesModel.get_list =
>>>> self._mock_storagevolumes_get_list
>>>>           StorageVolumeModel.doUpload =
>>>> self._mock_storagevolume_doUpload
>>>> -        DebugReportsModel._gen_debugreport_file =
>>>> self._gen_debugreport_file
>>>>           LibvirtVMTemplate._get_volume_path = self._get_volume_path
>>>>           VMTemplate.get_iso_info = self._probe_image
>>>>           imageinfo.probe_image = self._probe_image
>>>> @@ -258,22 +254,6 @@ class MockModel(Model):
>>>>
>>>>           return MockModel._libvirt_get_vol_path(pool, vol)
>>>>
>>>> -    def _gen_debugreport_file(self, name):
>>>> -        return add_task('/plugins/kimchi/debugreports/%s' % name,
>>>> -                        self._create_log, self.objstore, name)
>>>> -
>>>> -    def _create_log(self, cb, name):
>>>> -        path = config.get_debugreports_path()
>>>> -        tmpf = os.path.join(path, name + '.tmp')
>>>> -        realf = os.path.join(path, name + '.txt')
>>>> -        length = random.randint(1000, 10000)
>>>> -        with open(tmpf, 'w') as fd:
>>>> -            while length:
>>>> -                fd.write('I am logged')
>>>> -                length = length - 1
>>>> -        os.rename(tmpf, realf)
>>>> -        cb("OK", True)
>>>> -
>>>>       def _update_lvm_disks(self, pool_name, disks):
>>>>           conn = self.conn.get()
>>>>           pool = conn.storagePoolLookupByName(pool_name.encode('utf
>>>> -8'))
>>>> diff --git a/src/wok/plugins/kimchi/model/config.py
>>>> b/src/wok/plugins/kimchi/model/config.py
>>>> index b6cc4d9..d00bb29 100644
>>>> --- a/src/wok/plugins/kimchi/model/config.py
>>>> +++ b/src/wok/plugins/kimchi/model/config.py
>>>> @@ -28,10 +28,7 @@ from wok.utils import check_url_path,
>>>> run_command, wok_log
>>>>
>>>>   from ..config import find_qemu_binary
>>>>   from ..distroloader import DistroLoader
>>>> -from ..repositories import Repositories
>>>>   from ..screenshot import VMScreenshot
>>>> -from ..swupdate import SoftwareUpdate
>>>> -from debugreports import DebugReportsModel
>>>>   from featuretests import FeatureTests, FEATURETEST_POOL_NAME
>>>>   from featuretests import FEATURETEST_VM_NAME
>>>>
>>>> @@ -114,28 +111,10 @@ class CapabilitiesModel(object):
>>>>           return False
>>>>
>>>>       def lookup(self, *ident):
>>>> -        report_tool = DebugReportsModel.get_system_report_tool()
>>>> -        try:
>>>> -            SoftwareUpdate()
>>>> -        except Exception:
>>>> -            update_tool = False
>>>> -        else:
>>>> -            update_tool = True
>>>> -
>>>> -        try:
>>>> -            repo = Repositories()
>>>> -        except Exception:
>>>> -            repo_mngt_tool = None
>>>> -        else:
>>>> -            repo_mngt_tool = repo._pkg_mnger.TYPE
>>>> -
>>>>           return {'libvirt_stream_protocols':
>>>> self.libvirt_stream_protocols,
>>>>                   'qemu_spice': self._qemu_support_spice(),
>>>>                   'qemu_stream': self.qemu_stream,
>>>>                   'screenshot':
>>>> VMScreenshot.get_stream_test_result(),
>>>> -                'system_report_tool': bool(report_tool),
>>>> -                'update_tool': update_tool,
>>>> -                'repo_mngt_tool': repo_mngt_tool,
>>>>                   'federation': kconfig.get("server", "federation"),
>>>>                   'auth': kconfig.get("authentication", "method"),
>>>>                   'kernel_vfio': self.kernel_vfio,
>>>> diff --git a/src/wok/plugins/kimchi/model/host.py
>>>> b/src/wok/plugins/kimchi/model/host.py
>>>> index f32cf62..f211a6a 100644
>>>> --- a/src/wok/plugins/kimchi/model/host.py
>>>> +++ b/src/wok/plugins/kimchi/model/host.py
>>>> @@ -18,28 +18,17 @@
>>>>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>>>>   02110-1301 USA
>>>>
>>>>   import libvirt
>>>> -import os
>>>> -import platform
>>>>   import psutil
>>>> -import time
>>>> -from cherrypy.process.plugins import BackgroundTask
>>>> -from collections import defaultdict
>>>>   from lxml import objectify
>>>>
>>>> -from wok.basemodel import Singleton
>>>> -from wok.exception import InvalidOperation, InvalidParameter
>>>> -from wok.exception import NotFoundError, OperationFailed
>>>> -from wok.utils import add_task, wok_log
>>>> +from wok.exception import InvalidParameter
>>>> +from wok.exception import NotFoundError
>>>>   from wok.xmlutils.utils import xpath_get_text
>>>>   from wok.model.tasks import TaskModel
>>>>
>>>>   import hostdev
>>>> -from wok.plugins.kimchi import disks
>>>> -from wok.plugins.kimchi import netinfo
>>>> -from wok.plugins.kimchi.repositories import Repositories
>>>> -from wok.plugins.kimchi.swupdate import SoftwareUpdate
>>>>   from config import CapabilitiesModel
>>>> -from vms import DOM_STATE_MAP, VMModel, VMsModel
>>>> +from vms import VMModel, VMsModel
>>>>
>>>>
>>>>   HOST_STATS_INTERVAL = 1
>>>> @@ -50,60 +39,10 @@ class HostModel(object):
>>>>           self.conn = kargs['conn']
>>>>           self.objstore = kargs['objstore']
>>>>           self.task = TaskModel(**kargs)
>>>> -        self.host_info = self._get_host_info()
>>>> -
>>>> -    def _get_ppc_cpu_info(self):
>>>> -        res = {}
>>>> -        with open('/proc/cpuinfo') as f:
>>>> -            for line in f.xreadlines():
>>>> -                # Parse CPU, CPU's revision and CPU's clock
>>>> information
>>>> -                for key in ['cpu', 'revision', 'clock']:
>>>> -                    if key in line:
>>>> -                        info = line.split(':')[1].strip()
>>>> -                        if key == 'clock':
>>>> -                            value =
>>>> float(info.split('MHz')[0].strip()) / 1000
>>>> -                        else:
>>>> -                            value = info.split('(')[0].strip()
>>>> -                        res[key] = value
>>>> -
>>>> -                        # Power machines show, for each cpu/core,
>>>> a block with
>>>> -                        # all cpu information. Here we control the
>>>> scan of the
>>>> -                        # necessary information (1st block
>>>> provides
>>>> -                        # everything), skipping the function when
>>>> find all
>>>> -                        # information.
>>>> -                        if len(res.keys()) == 3:
>>>> -                            return "%(cpu)s (%(revision)s) @
>>>> %(clock)s GHz\
>>>> -                                    " % res
>>>> -
>>>> -        return ""
>>>> -
>>>> -    def _get_host_info(self):
>>>> -        res = {}
>>>> -        if platform.machine().startswith('ppc'):
>>>> -            res['cpu_model'] = self._get_ppc_cpu_info()
>>>> -        else:
>>>> -            with open('/proc/cpuinfo') as f:
>>>> -                for line in f.xreadlines():
>>>> -                    if "model name" in line:
>>>> -                        res['cpu_model'] =
>>>> line.split(':')[1].strip()
>>>> -                        break
>>>> -
>>>> -        res['cpus'] = 0
>>>> -        res['memory'] = 0L
>>>> -
>>>> -        # Include IBM PowerKVM name to supported distro names
>>>> -        _sup_distros = platform._supported_dists +
>>>> ('ibm_powerkvm',)
>>>> -        # 'fedora' '17' 'Beefy Miracle'
>>>> -        distro, version, codename = platform.linux_distribution(
>>>> -            supported_dists=_sup_distros)
>>>> -        res['os_distro'] = distro
>>>> -        res['os_version'] = version
>>>> -        res['os_codename'] = unicode(codename, "utf-8")
>>>> -
>>>> -        return res
>>>> +        self.host_info = {}
>>>>
>>>>       def lookup(self, *name):
>>>> -        cpus = 0
>>>> +        cpus = psutil.NUM_CPUS
>>>>
>>>>           # psutil is unstable on how to get the number of
>>>>           # cpus, different versions call it differently
>>>> @@ -128,184 +67,6 @@ class HostModel(object):
>>>>               self.host_info['memory'] =
>>>> psutil.virtual_memory().total
>>>>           return self.host_info
>>>>
>>>> -    def swupdate(self, *name):
>>>> -        try:
>>>> -            swupdate = SoftwareUpdate()
>>>> -        except:
>>>> -            raise OperationFailed('KCHPKGUPD0004E')
>>>> -
>>>> -        pkgs = swupdate.getNumOfUpdates()
>>>> -        if pkgs == 0:
>>>> -            raise OperationFailed('KCHPKGUPD0001E')
>>>> -
>>>> -        wok_log.debug('Host is going to be updated.')
>>>> -        taskid = add_task('/plugins/kimchi/host/swupdate',
>>>> swupdate.doUpdate,
>>>> -                          self.objstore, None)
>>>> -        return self.task.lookup(taskid)
>>>> -
>>>> -    def shutdown(self, args=None):
>>>> -        # Check for running vms before shutdown
>>>> -        running_vms = self._get_vms_list_by_state('running')
>>>> -        if len(running_vms) > 0:
>>>> -            raise OperationFailed("KCHHOST0001E")
>>>> -
>>>> -        wok_log.info('Host is going to shutdown.')
>>>> -        os.system('shutdown -h now')
>>>> -
>>>> -    def reboot(self, args=None):
>>>> -        # Find running VMs
>>>> -        running_vms = self._get_vms_list_by_state('running')
>>>> -        if len(running_vms) > 0:
>>>> -            raise OperationFailed("KCHHOST0002E")
>>>> -
>>>> -        wok_log.info('Host is going to reboot.')
>>>> -        os.system('reboot')
>>>> -
>>>> -    def _get_vms_list_by_state(self, state):
>>>> -        conn = self.conn.get()
>>>> -        return [dom.name().decode('utf-8')
>>>> -                for dom in conn.listAllDomains(0)
>>>> -                if (DOM_STATE_MAP[dom.info()[0]]) == state]
>>>> -
>>>> -
>>>> -class HostStatsModel(object):
>>>> -    __metaclass__ = Singleton
>>>> -
>>>> -    def __init__(self, **kargs):
>>>> -        self.host_stats = defaultdict(list)
>>>> -        self.host_stats_thread =
>>>> BackgroundTask(HOST_STATS_INTERVAL,
>>>> -
>>>>   self._update_host_stats)
>>>> -        self.host_stats_thread.start()
>>>> -
>>>> -    def lookup(self, *name):
>>>> -        return {'cpu_utilization':
>>>> self.host_stats['cpu_utilization'][-1],
>>>> -                'memory': self.host_stats['memory'][-1],
>>>> -                'disk_read_rate':
>>>> self.host_stats['disk_read_rate'][-1],
>>>> -                'disk_write_rate':
>>>> self.host_stats['disk_write_rate'][-1],
>>>> -                'net_recv_rate': self.host_stats['net_recv_rate'][
>>>> -1],
>>>> -                'net_sent_rate': self.host_stats['net_sent_rate'][
>>>> -1]}
>>>> -
>>>> -    def _update_host_stats(self):
>>>> -        preTimeStamp = self.host_stats['timestamp']
>>>> -        timestamp = time.time()
>>>> -        # FIXME when we upgrade psutil, we can get uptime by
>>>> psutil.uptime
>>>> -        # we get uptime by
>>>> float(open("/proc/uptime").readline().split()[0])
>>>> -        # and calculate the first io_rate after the OS started.
>>>> -        with open("/proc/uptime") as time_f:
>>>> -            seconds = (timestamp - preTimeStamp if preTimeStamp
>>>> else
>>>> -                       float(time_f.readline().split()[0]))
>>>> -
>>>> -        self.host_stats['timestamp'] = timestamp
>>>> -        self._get_host_disk_io_rate(seconds)
>>>> -        self._get_host_network_io_rate(seconds)
>>>> -
>>>> -        self._get_percentage_host_cpu_usage()
>>>> -        self._get_host_memory_stats()
>>>> -
>>>> -        # store only 60 stats (1 min)
>>>> -        for key, value in self.host_stats.iteritems():
>>>> -            if isinstance(value, list):
>>>> -                if len(value) == 60:
>>>> -                    self.host_stats[key] = value[10:]
>>>> -
>>>> -    def _get_percentage_host_cpu_usage(self):
>>>> -        # This is cpu usage producer. This producer will calculate
>>>> the usage
>>>> -        # at an interval of HOST_STATS_INTERVAL.
>>>> -        # The psutil.cpu_percent works as non blocking.
>>>> -        # psutil.cpu_percent maintains a cpu time sample.
>>>> -        # It will update the cpu time sample when it is called.
>>>> -        # So only this producer can call psutil.cpu_percent in
>>>> kimchi.
>>>> -
>>>> self.host_stats['cpu_utilization'].append(psutil.cpu_percent(None)
>>>> )
>>>> -
>>>> -    def _get_host_memory_stats(self):
>>>> -        virt_mem = psutil.virtual_memory()
>>>> -        # available:
>>>> -        #  the actual amount of available memory that can be given
>>>> -        #  instantly to processes that request more memory in
>>>> bytes; this
>>>> -        #  is calculated by summing different memory values
>>>> depending on
>>>> -        #  the platform (e.g. free + buffers + cached on Linux)
>>>> -        memory_stats = {'total': virt_mem.total,
>>>> -                        'free': virt_mem.free,
>>>> -                        'cached': virt_mem.cached,
>>>> -                        'buffers': virt_mem.buffers,
>>>> -                        'avail': virt_mem.available}
>>>> -        self.host_stats['memory'].append(memory_stats)
>>>> -
>>>> -    def _get_host_disk_io_rate(self, seconds):
>>>> -        disk_read_bytes = self.host_stats['disk_read_bytes']
>>>> -        disk_write_bytes = self.host_stats['disk_write_bytes']
>>>> -        prev_read_bytes = disk_read_bytes[-1] if disk_read_bytes
>>>> else 0
>>>> -        prev_write_bytes = disk_write_bytes[-1] if
>>>> disk_write_bytes else 0
>>>> -
>>>> -        disk_io = psutil.disk_io_counters(False)
>>>> -        read_bytes = disk_io.read_bytes
>>>> -        write_bytes = disk_io.write_bytes
>>>> -
>>>> -        rd_rate = int(float(read_bytes - prev_read_bytes) /
>>>> seconds + 0.5)
>>>> -        wr_rate = int(float(write_bytes - prev_write_bytes) /
>>>> seconds + 0.5)
>>>> -
>>>> -        self.host_stats['disk_read_rate'].append(rd_rate)
>>>> -        self.host_stats['disk_write_rate'].append(wr_rate)
>>>> - self.host_stats['disk_read_bytes'].append(read_bytes)
>>>> - self.host_stats['disk_write_bytes'].append(write_bytes)
>>>> -
>>>> -    def _get_host_network_io_rate(self, seconds):
>>>> -        net_recv_bytes = self.host_stats['net_recv_bytes']
>>>> -        net_sent_bytes = self.host_stats['net_sent_bytes']
>>>> -        prev_recv_bytes = net_recv_bytes[-1] if net_recv_bytes
>>>> else 0
>>>> -        prev_sent_bytes = net_sent_bytes[-1] if net_sent_bytes
>>>> else 0
>>>> -
>>>> -        net_ios = None
>>>> -        if hasattr(psutil, 'net_io_counters'):
>>>> -            net_ios = psutil.net_io_counters(True)
>>>> -        elif hasattr(psutil, 'network_io_counters'):
>>>> -            net_ios = psutil.network_io_counters(True)
>>>> -
>>>> -        recv_bytes = 0
>>>> -        sent_bytes = 0
>>>> -        for key in set(netinfo.nics() +
>>>> -                       netinfo.wlans()) & set(net_ios.iterkeys()):
>>>> -            recv_bytes = recv_bytes + net_ios[key].bytes_recv
>>>> -            sent_bytes = sent_bytes + net_ios[key].bytes_sent
>>>> -
>>>> -        rx_rate = int(float(recv_bytes - prev_recv_bytes) /
>>>> seconds + 0.5)
>>>> -        tx_rate = int(float(sent_bytes - prev_sent_bytes) /
>>>> seconds + 0.5)
>>>> -
>>>> -        self.host_stats['net_recv_rate'].append(rx_rate)
>>>> -        self.host_stats['net_sent_rate'].append(tx_rate)
>>>> - self.host_stats['net_recv_bytes'].append(recv_bytes)
>>>> - self.host_stats['net_sent_bytes'].append(sent_bytes)
>>>> -
>>>> -
>>>> -class HostStatsHistoryModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        self.history = HostStatsModel(**kargs)
>>>> -
>>>> -    def lookup(self, *name):
>>>> -        return {'cpu_utilization':
>>>> self.history.host_stats['cpu_utilization'],
>>>> -                'memory': self.history.host_stats['memory'],
>>>> -                'disk_read_rate':
>>>> self.history.host_stats['disk_read_rate'],
>>>> -                'disk_write_rate':
>>>> self.history.host_stats['disk_write_rate'],
>>>> -                'net_recv_rate':
>>>> self.history.host_stats['net_recv_rate'],
>>>> -                'net_sent_rate':
>>>> self.history.host_stats['net_sent_rate']}
>>>> -
>>>> -
>>>> -class PartitionsModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        pass
>>>> -
>>>> -    def get_list(self):
>>>> -        result = disks.get_partitions_names()
>>>> -        return result
>>>> -
>>>> -
>>>> -class PartitionModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        pass
>>>> -
>>>> -    def lookup(self, name):
>>>> -        return disks.get_partition_details(name)
>>>> -
>>>>
>>>>   class DevicesModel(object):
>>>>       def __init__(self, **kargs):
>>>> @@ -501,88 +262,3 @@ class DeviceModel(object):
>>>>               if ebus == ibus and edevice == idevice:
>>>>                   return usb_info['name']
>>>>           return unknown_dev
>>>> -
>>>> -
>>>> -class PackagesUpdateModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        try:
>>>> -            self.host_swupdate = SoftwareUpdate()
>>>> -        except:
>>>> -            self.host_swupdate = None
>>>> -
>>>> -    def get_list(self):
>>>> -        if self.host_swupdate is None:
>>>> -            raise OperationFailed('KCHPKGUPD0004E')
>>>> -
>>>> -        return self.host_swupdate.getUpdates()
>>>> -
>>>> -
>>>> -class PackageUpdateModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        pass
>>>> -
>>>> -    def lookup(self, name):
>>>> -        try:
>>>> -            swupdate = SoftwareUpdate()
>>>> -        except Exception:
>>>> -            raise OperationFailed('KCHPKGUPD0004E')
>>>> -
>>>> -        return swupdate.getUpdate(name)
>>>> -
>>>> -
>>>> -class RepositoriesModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        try:
>>>> -            self.host_repositories = Repositories()
>>>> -        except:
>>>> -            self.host_repositories = None
>>>> -
>>>> -    def get_list(self):
>>>> -        if self.host_repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return sorted(self.host_repositories.getRepositories())
>>>> -
>>>> -    def create(self, params):
>>>> -        if self.host_repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return self.host_repositories.addRepository(params)
>>>> -
>>>> -
>>>> -class RepositoryModel(object):
>>>> -    def __init__(self, **kargs):
>>>> -        try:
>>>> -            self._repositories = Repositories()
>>>> -        except:
>>>> -            self._repositories = None
>>>> -
>>>> -    def lookup(self, repo_id):
>>>> -        if self._repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return self._repositories.getRepository(repo_id)
>>>> -
>>>> -    def enable(self, repo_id):
>>>> -        if self._repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return self._repositories.enableRepository(repo_id)
>>>> -
>>>> -    def disable(self, repo_id):
>>>> -        if self._repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return self._repositories.disableRepository(repo_id)
>>>> -
>>>> -    def update(self, repo_id, params):
>>>> -        if self._repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return self._repositories.updateRepository(repo_id,
>>>> params)
>>>> -
>>>> -    def delete(self, repo_id):
>>>> -        if self._repositories is None:
>>>> -            raise InvalidOperation('KCHREPOS0014E')
>>>> -
>>>> -        return self._repositories.removeRepository(repo_id)
>>>> diff --git a/src/wok/plugins/kimchi/root.py
>>>> b/src/wok/plugins/kimchi/root.py
>>>> index 1e2bfc7..2c8ac5b 100644
>>>> --- a/src/wok/plugins/kimchi/root.py
>>>> +++ b/src/wok/plugins/kimchi/root.py
>>>> @@ -58,7 +58,6 @@ class KimchiRoot(WokRoot):
>>>>
>>>>           make_dirs = [
>>>>               os.path.abspath(config.get_distros_store()),
>>>> - os.path.abspath(config.get_debugreports_path()),
>>>>               os.path.abspath(config.get_screenshot_path())
>>>>           ]
>>>>           for directory in make_dirs:
>>>> diff --git a/src/wok/plugins/kimchi/tests/test_authorization.py
>>>> b/src/wok/plugins/kimchi/tests/test_authorization.py
>>>> index 87d68ab..fda86a3 100644
>>>> --- a/src/wok/plugins/kimchi/tests/test_authorization.py
>>>> +++ b/src/wok/plugins/kimchi/tests/test_authorization.py
>>>> @@ -77,12 +77,6 @@ class AuthorizationTests(unittest.TestCase):
>>>>           resp = self.request('/plugins/kimchi/host/shutdown', '{}',
>>>> 'POST')
>>>>           self.assertEquals(403, resp.status)
>>>>
>>>> -        # Non-root users can not get or debug reports
>>>> -        resp = self.request('/plugins/kimchi/debugreports', '{}',
>>>> 'GET')
>>>> -        self.assertEquals(403, resp.status)
>>>> -        resp = self.request('/plugins/kimchi/debugreports', '{}',
>>>> 'POST')
>>>> -        self.assertEquals(403, resp.status)
>>>> -
>>>>           # Non-root users can not create or delete network (only
>>>> get)
>>>>           resp = self.request('/plugins/kimchi/networks', '{}',
>>>> 'GET')
>>>>           self.assertEquals(200, resp.status)
>>>> diff --git a/src/wok/plugins/kimchi/tests/test_config.py.in
>>>> b/src/wok/plugins/kimchi/tests/test_config.py.in
>>>> index e4db15a..09d12aa 100644
>>>> --- a/src/wok/plugins/kimchi/tests/test_config.py.in
>>>> +++ b/src/wok/plugins/kimchi/tests/test_config.py.in
>>>> @@ -22,7 +22,6 @@ from cherrypy.lib.reprconf import Parser
>>>>
>>>>   from wok.config import Paths, PluginPaths, WokConfig
>>>>
>>>> -from wok.plugins.kimchi.config import get_debugreports_path
>>>>   from wok.plugins.kimchi.config import get_screenshot_path
>>>>   from wok.plugins.kimchi.config import KimchiConfig, KimchiPaths
>>>>
>>>> @@ -253,13 +252,6 @@ class ConfigTests(unittest.TestCase):
>>>>                   'tools.staticdir.dir': get_screenshot_path(),
>>>>                   'tools.nocache.on': False
>>>>               },
>>>> -            '/data/debugreports': {
>>>> -                'tools.staticdir.on': True,
>>>> -                'tools.staticdir.dir': get_debugreports_path(),
>>>> -                'tools.nocache.on': False,
>>>> -                'tools.wokauth.on': True,
>>>> -                'tools.staticdir.content_types': {'xz':
>>>> 'application/x-xz'}
>>>> -            },
>>>>               '/help': {
>>>>                   'tools.staticdir.on': True,
>>>>                   'tools.staticdir.dir': '%s/ui/pages/help' %
>>>> pluginPrefix,
>>>> diff --git a/src/wok/plugins/kimchi/tests/test_host.py
>>>> b/src/wok/plugins/kimchi/tests/test_host.py
>>>> index f3da49b..86cf5d0 100644
>>>> --- a/src/wok/plugins/kimchi/tests/test_host.py
>>>> +++ b/src/wok/plugins/kimchi/tests/test_host.py
>>>> @@ -20,16 +20,13 @@
>>>>
>>>>   import json
>>>>   import os
>>>> -import platform
>>>> -import psutil
>>>>   import tempfile
>>>> -import time
>>>>   import unittest
>>>>   from functools import partial
>>>>
>>>>   from wok.plugins.kimchi.mockmodel import MockModel
>>>>
>>>> -from utils import get_free_port, patch_auth, request, run_server,
>>>> wait_task
>>>> +from utils import get_free_port, patch_auth, request, run_server
>>>>
>>>>
>>>>   test_server = None
>>>> @@ -62,98 +59,6 @@ class HostTests(unittest.TestCase):
>>>>       def setUp(self):
>>>>           self.request = partial(request, host, ssl_port)
>>>>
>>>> -    def test_hostinfo(self):
>>>> -        resp = self.request('/plugins/kimchi/host').read()
>>>> -        info = json.loads(resp)
>>>> -        keys = ['os_distro', 'os_version', 'os_codename',
>>>> 'cpu_model',
>>>> -                'memory', 'cpus']
>>>> -        self.assertEquals(sorted(keys), sorted(info.keys()))
>>>> -
>>>> -        distro, version, codename = platform.linux_distribution()
>>>> -        self.assertEquals(distro, info['os_distro'])
>>>> -        self.assertEquals(version, info['os_version'])
>>>> -        self.assertEquals(unicode(codename, "utf-8"),
>>>> info['os_codename'])
>>>> -        self.assertEquals(psutil.TOTAL_PHYMEM, info['memory'])
>>>> -
>>>> -    def test_hoststats(self):
>>>> -        time.sleep(1)
>>>> -        stats_keys = ['cpu_utilization', 'memory',
>>>> 'disk_read_rate',
>>>> -                      'disk_write_rate', 'net_recv_rate',
>>>> 'net_sent_rate']
>>>> -        resp = self.request('/plugins/kimchi/host/stats').read()
>>>> -        stats = json.loads(resp)
>>>> -        self.assertEquals(sorted(stats_keys),
>>>> sorted(stats.keys()))
>>>> -
>>>> -        cpu_utilization = stats['cpu_utilization']
>>>> -        self.assertIsInstance(cpu_utilization, float)
>>>> -        self.assertGreaterEqual(cpu_utilization, 0.0)
>>>> -        self.assertTrue(cpu_utilization <= 100.0)
>>>> -
>>>> -        memory_stats = stats['memory']
>>>> -        self.assertIn('total', memory_stats)
>>>> -        self.assertIn('free', memory_stats)
>>>> -        self.assertIn('cached', memory_stats)
>>>> -        self.assertIn('buffers', memory_stats)
>>>> -        self.assertIn('avail', memory_stats)
>>>> -
>>>> -        resp =
>>>> self.request('/plugins/kimchi/host/stats/history').read()
>>>> -        history = json.loads(resp)
>>>> -        self.assertEquals(sorted(stats_keys),
>>>> sorted(history.keys()))
>>>> -
>>>> -    def test_host_actions(self):
>>>> -        def _task_lookup(taskid):
>>>> -            return json.loads(
>>>> -                self.request('/plugins/kimchi/tasks/%s' %
>>>> taskid).read()
>>>> -            )
>>>> -
>>>> -        resp = self.request('/plugins/kimchi/host/shutdown', '{}',
>>>> 'POST')
>>>> -        self.assertEquals(200, resp.status)
>>>> -        resp = self.request('/plugins/kimchi/host/reboot', '{}',
>>>> 'POST')
>>>> -        self.assertEquals(200, resp.status)
>>>> -
>>>> -        # Test system update
>>>> -        resp = self.request('/plugins/kimchi/host/packagesupdate',
>>>> None, 'GET')
>>>> -        pkgs = json.loads(resp.read())
>>>> -        self.assertEquals(3, len(pkgs))
>>>> -
>>>> -        pkg_keys = ['package_name', 'repository', 'arch',
>>>> 'version']
>>>> -        for p in pkgs:
>>>> -            name = p['package_name']
>>>> -            resp =
>>>> self.request('/plugins/kimchi/host/packagesupdate/' + name,
>>>> -                                None, 'GET')
>>>> -            info = json.loads(resp.read())
>>>> -            self.assertEquals(sorted(pkg_keys),
>>>> sorted(info.keys()))
>>>> -
>>>> -        resp = self.request('/plugins/kimchi/host/swupdate', '{}',
>>>> 'POST')
>>>> -        task = json.loads(resp.read())
>>>> -        task_params = [u'id', u'message', u'status',
>>>> u'target_uri']
>>>> -        self.assertEquals(sorted(task_params),
>>>> sorted(task.keys()))
>>>> -
>>>> -        resp = self.request('/tasks/' + task[u'id'], None,
>>>> -                            'GET')
>>>> -        task_info = json.loads(resp.read())
>>>> -        self.assertEquals(task_info['status'], 'running')
>>>> -        wait_task(_task_lookup, task_info['id'])
>>>> -        resp = self.request('/tasks/' + task[u'id'], None,
>>>> -                            'GET')
>>>> -        task_info = json.loads(resp.read())
>>>> -        self.assertEquals(task_info['status'], 'finished')
>>>> -        self.assertIn(u'All packages updated',
>>>> task_info['message'])
>>>> -        pkgs = model.packagesupdate_get_list()
>>>> -        self.assertEquals(0, len(pkgs))
>>>> -
>>>> -    def test_host_partitions(self):
>>>> -        resp = self.request('/plugins/kimchi/host/partitions')
>>>> -        self.assertEquals(200, resp.status)
>>>> -        partitions = json.loads(resp.read())
>>>> -
>>>> -        keys = ['name', 'path', 'type', 'fstype', 'size',
>>>> 'mountpoint',
>>>> -                'available']
>>>> -        for item in partitions:
>>>> -            resp =
>>>> self.request('/plugins/kimchi/host/partitions/%s' %
>>>> -                                item['name'])
>>>> -            info = json.loads(resp.read())
>>>> -            self.assertEquals(sorted(info.keys()), sorted(keys))
>>>> -
>>>>       def test_host_devices(self):
>>>>           def asset_devices_type(devices, dev_type):
>>>>               for dev in devices:
>>>> diff --git a/src/wok/plugins/kimchi/tests/test_model.py
>>>> b/src/wok/plugins/kimchi/tests/test_model.py
>>>> index 55117cf..c772dc5 100644
>>>> --- a/src/wok/plugins/kimchi/tests/test_model.py
>>>> +++ b/src/wok/plugins/kimchi/tests/test_model.py
>>>> @@ -25,7 +25,6 @@ import re
>>>>   import shutil
>>>>   import time
>>>>   import unittest
>>>> -import uuid
>>>>
>>>>   import wok.objectstore
>>>>   from wok.basemodel import Singleton
>>>> @@ -1065,54 +1064,6 @@ class ModelTests(unittest.TestCase):
>>>>
>>>>               self.assertTrue('kimchi-vm' in vms)
>>>>
>>>> -    @unittest.skipUnless(utils.running_as_root(), 'Must be run as
>>>> root')
>>>> -    def test_debug_reports(self):
>>>> -        inst = model.Model('test:///default',
>>>> -                           objstore_loc=self.tmp_store)
>>>> -
>>>> -        if not inst.capabilities_lookup()['system_report_tool']:
>>>> -            raise unittest.SkipTest("Without debug report tool")
>>>> -
>>>> -        try:
>>>> -            timeout = int(os.environ['TEST_REPORT_TIMEOUT'])
>>>> -        except (ValueError, KeyError):
>>>> -            timeout = 120
>>>> -
>>>> -        namePrefix = 'unitTestReport'
>>>> -        # sosreport always deletes unsual letters like '-' and '_'
>>>> in the
>>>> -        # generated report file name.
>>>> -        uuidstr = str(uuid.uuid4()).translate(None, "-_")
>>>> -        reportName = namePrefix + uuidstr
>>>> -        try:
>>>> -            inst.debugreport_delete(namePrefix + '*')
>>>> -        except NotFoundError:
>>>> -            pass
>>>> -        with RollbackContext() as rollback:
>>>> -            report_list = inst.debugreports_get_list()
>>>> -            self.assertFalse(reportName in report_list)
>>>> -            try:
>>>> -                tmp_name = reportName + "_1"
>>>> -                task = inst.debugreports_create({'name':
>>>> reportName})
>>>> - rollback.prependDefer(inst.debugreport_delete,
>>>> tmp_name)
>>>> -                taskid = task['id']
>>>> -                inst.task_wait(taskid, timeout)
>>>> -                self.assertEquals('finished',
>>>> -
>>>>   inst.task_lookup(taskid)['status'],
>>>> -                                  "It is not necessary an error.
>>>>   "
>>>> -                                  "You may need to increase the "
>>>> -                                  "timeout number by "
>>>> -                                  "TEST_REPORT_TIMEOUT=200 "
>>>> -                                  "./run_tests.sh test_model")
>>>> -                report_list = inst.debugreports_get_list()
>>>> -                self.assertTrue(reportName in report_list)
>>>> -                name = inst.debugreport_update(reportName,
>>>> {'name': tmp_name})
>>>> -                self.assertEquals(name, tmp_name)
>>>> -                report_list = inst.debugreports_get_list()
>>>> -                self.assertTrue(tmp_name in report_list)
>>>> -            except OperationFailed, e:
>>>> -                if 'debugreport tool not found' not in e.message:
>>>> -                    raise e
>>>> -
>>>>       def test_get_distros(self):
>>>>           inst = model.Model('test:///default',
>>>>                              objstore_loc=self.tmp_store)
>>>> @@ -1151,194 +1102,6 @@ class ModelTests(unittest.TestCase):
>>>>               volumes = inst.storagevolumes_get_list(args['name'])
>>>>               self.assertEquals(len(volumes), 2)
>>>>
>>>> -    def test_repository_create(self):
>>>> -        inst = model.Model('test:///default',
>>>> -                           objstore_loc=self.tmp_store)
>>>> -
>>>> -        yum_repos = [{'repo_id': 'fedora-fake',
>>>> -                      'baseurl': 'http://www.fedora.org'},
>>>> -                     {'repo_id': 'fedora-updates-fake',
>>>> -                      'config':
>>>> -                      {'mirrorlist': '
>>>> http://www.fedoraproject.org'}}]
>>>> -
>>>> -        deb_repos = [{'baseurl': '
>>>> http://archive.ubuntu.com/ubuntu/',
>>>> -                      'config': {'dist': 'quantal'}},
>>>> -                     {'baseurl': '
>>>> http://archive.ubuntu.com/ubuntu/',
>>>> -                      'config': {'dist': 'quantal', 'comps':
>>>> ['main']}}]
>>>> -
>>>> -        yum_invalid_repos = []
>>>> -        deb_invalid_repos = []
>>>> -
>>>> -        for url in invalid_repository_urls:
>>>> -            wrong_baseurl = {'repo_id': 'wrong-id', 'baseurl':
>>>> url}
>>>> -            wrong_mirrorlist = {'repo_id': 'wrong-id',
>>>> -                                'baseurl': 'www.example.com',
>>>> -                                'config': {'mirrorlist': url}}
>>>> -            wrong_config_item = {
>>>> -                'repo_id': 'wrong-id',
>>>> -                'baseurl': 'www.example.com',
>>>> -                'config': {
>>>> -                    'gpgkey': 'file:///tmp/KEY-fedora-updates-fake
>>>> -19'}}
>>>> -
>>>> -            yum_invalid_repos.append(wrong_baseurl)
>>>> -            yum_invalid_repos.append(wrong_mirrorlist)
>>>> -            yum_invalid_repos.append(wrong_config_item)
>>>> -
>>>> -            wrong_baseurl['config'] = {'dist': 'tasty'}
>>>> -            wrong_config = {'baseurl': deb_repos[0]['baseurl'],
>>>> -                            'config': {
>>>> -                                'unsupported_item':
>>>> "a_unsupported_item"}}
>>>> -            deb_invalid_repos.append(wrong_baseurl)
>>>> -            deb_invalid_repos.append(wrong_config)
>>>> -
>>>> -        repo_type = inst.capabilities_lookup()['repo_mngt_tool']
>>>> -        if repo_type == 'yum':
>>>> -            test_repos = yum_repos
>>>> -            invalid_repos = yum_invalid_repos
>>>> -        elif repo_type == 'deb':
>>>> -            test_repos = deb_repos
>>>> -            invalid_repos = deb_invalid_repos
>>>> -        else:
>>>> -            # repository management tool was not recognized by
>>>> Kimchi
>>>> -            # skip test case
>>>> -            return
>>>> -
>>>> -        # create repositories with invalid data
>>>> -        for repo in invalid_repos:
>>>> -            self.assertRaises(InvalidParameter,
>>>> inst.repositories_create, repo)
>>>> -
>>>> -        for repo in test_repos:
>>>> -            system_host_repos = len(inst.repositories_get_list())
>>>> -            repo_id = inst.repositories_create(repo)
>>>> -            host_repos = inst.repositories_get_list()
>>>> -            self.assertEquals(system_host_repos + 1,
>>>> len(host_repos))
>>>> -
>>>> -            repo_info = inst.repository_lookup(repo_id)
>>>> -            self.assertEquals(repo_id, repo_info['repo_id'])
>>>> -            self.assertEquals(True, repo_info.get('enabled'))
>>>> -            self.assertEquals(repo.get('baseurl', ''),
>>>> -                              repo_info.get('baseurl'))
>>>> -
>>>> -            original_config = repo.get('config', {})
>>>> -            config_info = repo_info.get('config', {})
>>>> -
>>>> -            if repo_type == 'yum':
>>>> -
>>>>   self.assertEquals(original_config.get('mirrorlist', ''),
>>>> - config_info.get('mirrorlist',
>>>> ''))
>>>> -                self.assertEquals(True, config_info['gpgcheck'])
>>>> -            else:
>>>> -                self.assertEquals(original_config['dist'],
>>>> config_info['dist'])
>>>> - self.assertEquals(original_config.get('comps',
>>>> []),
>>>> -                                  config_info.get('comps', []))
>>>> -
>>>> -            inst.repository_delete(repo_id)
>>>> -            self.assertRaises(NotFoundError,
>>>> inst.repository_lookup, repo_id)
>>>> -
>>>> -        self.assertRaises(NotFoundError, inst.repository_lookup,
>>>> 'google')
>>>> -
>>>> -    def test_repository_update(self):
>>>> -        inst = model.Model('test:///default',
>>>> -                           objstore_loc=self.tmp_store)
>>>> -
>>>> -        yum_repo = {'repo_id': 'fedora-fake',
>>>> -                    'baseurl': 'http://www.fedora.org'}
>>>> -        yum_new_repo = {'baseurl': 'http://www.fedoraproject.org'}
>>>> -
>>>> -        deb_repo = {'baseurl': 'http://archive.ubuntu.com/ubuntu/'
>>>> ,
>>>> -                    'config': {'dist': 'quantal'}}
>>>> -        deb_new_repo = {'baseurl': '
>>>> http://br.archive.canonical.com/ubuntu/',
>>>> -                        'config': {'dist': 'utopic'}}
>>>> -
>>>> -        yum_invalid_repos = []
>>>> -        deb_invalid_repos = []
>>>> -
>>>> -        for url in invalid_repository_urls:
>>>> -            wrong_baseurl = {'baseurl': url}
>>>> -            wrong_mirrorlist = {'baseurl': 'www.example.com',
>>>> -                                'config': {'mirrorlist': url}}
>>>> -
>>>> -            yum_invalid_repos.append(wrong_baseurl)
>>>> -            yum_invalid_repos.append(wrong_mirrorlist)
>>>> -
>>>> -            wrong_baseurl['config'] = {'dist': 'tasty'}
>>>> -            deb_invalid_repos.append(wrong_baseurl)
>>>> -
>>>> -        repo_type = inst.capabilities_lookup()['repo_mngt_tool']
>>>> -        if repo_type == 'yum':
>>>> -            repo = yum_repo
>>>> -            new_repo = yum_new_repo
>>>> -            invalid_repos = yum_invalid_repos
>>>> -        elif repo_type == 'deb':
>>>> -            repo = deb_repo
>>>> -            new_repo = deb_new_repo
>>>> -            invalid_repos = deb_invalid_repos
>>>> -        else:
>>>> -            # repository management tool was not recognized by
>>>> Kimchi
>>>> -            # skip test case
>>>> -            return
>>>> -
>>>> -        system_host_repos = len(inst.repositories_get_list())
>>>> -
>>>> -        with RollbackContext() as rollback:
>>>> -            repo_id = inst.repositories_create(repo)
>>>> -            rollback.prependDefer(inst.repository_delete, repo_id)
>>>> -
>>>> -            host_repos = inst.repositories_get_list()
>>>> -            self.assertEquals(system_host_repos + 1,
>>>> len(host_repos))
>>>> -
>>>> -            # update repositories with invalid data
>>>> -            for tmp_repo in invalid_repos:
>>>> -                self.assertRaises(InvalidParameter,
>>>> inst.repository_update,
>>>> -                                  repo_id, tmp_repo)
>>>> -
>>>> -            new_repo_id = inst.repository_update(repo_id,
>>>> new_repo)
>>>> -            repo_info = inst.repository_lookup(new_repo_id)
>>>> -
>>>> -            self.assertEquals(new_repo_id, repo_info['repo_id'])
>>>> -            self.assertEquals(new_repo['baseurl'],
>>>> repo_info['baseurl'])
>>>> -            self.assertEquals(True, repo_info['enabled'])
>>>> -            inst.repository_update(new_repo_id, repo)
>>>> -
>>>> -    def test_repository_disable_enable(self):
>>>> -        inst = model.Model('test:///default',
>>>> -                           objstore_loc=self.tmp_store)
>>>> -
>>>> -        yum_repo = {'repo_id': 'fedora-fake',
>>>> -                    'baseurl': 'http://www.fedora.org'}
>>>> -        deb_repo = {'baseurl': 'http://archive.ubuntu.com/ubuntu/'
>>>> ,
>>>> -                    'config': {'dist': 'quantal'}}
>>>> -
>>>> -        repo_type = inst.capabilities_lookup()['repo_mngt_tool']
>>>> -        if repo_type == 'yum':
>>>> -            repo = yum_repo
>>>> -        elif repo_type == 'deb':
>>>> -            repo = deb_repo
>>>> -        else:
>>>> -            # repository management tool was not recognized by
>>>> Kimchi
>>>> -            # skip test case
>>>> -            return
>>>> -
>>>> -        system_host_repos = len(inst.repositories_get_list())
>>>> -
>>>> -        repo_id = inst.repositories_create(repo)
>>>> -
>>>> -        host_repos = inst.repositories_get_list()
>>>> -        self.assertEquals(system_host_repos + 1, len(host_repos))
>>>> -
>>>> -        repo_info = inst.repository_lookup(repo_id)
>>>> -        self.assertEquals(True, repo_info['enabled'])
>>>> -
>>>> -        inst.repository_disable(repo_id)
>>>> -        repo_info = inst.repository_lookup(repo_id)
>>>> -        self.assertEquals(False, repo_info['enabled'])
>>>> -
>>>> -        inst.repository_enable(repo_id)
>>>> -        repo_info = inst.repository_lookup(repo_id)
>>>> -        self.assertEquals(True, repo_info['enabled'])
>>>> -
>>>> -        # remove files creates
>>>> -        inst.repository_delete(repo_id)
>>>> -
>>>>
>>>>   class BaseModelTests(unittest.TestCase):
>>>>       class FoosModel(object):
>>>> @@ -1359,4 +1122,4 @@ class BaseModelTests(unittest.TestCase):
>>>>       def test_root_model(self):
>>>>           t = BaseModelTests.TestModel()
>>>>           t.foos_create({'item1': 10})
>>>> -        self.assertEquals(t.foos_get_list(), ['item1'])
>>>> +        self.assertEquals(t.foos_get_list(), ['item1'])
>>>> \ No newline at end of file
>>>> diff --git a/src/wok/plugins/kimchi/tests/test_rest.py
>>>> b/src/wok/plugins/kimchi/tests/test_rest.py
>>>> index 8cf4bd3..8f12920 100644
>>>> --- a/src/wok/plugins/kimchi/tests/test_rest.py
>>>> +++ b/src/wok/plugins/kimchi/tests/test_rest.py
>>>> @@ -1266,60 +1266,6 @@ class RestTests(unittest.TestCase):
>>>>               # Distro not found error
>>>>               self.assertIn('KCHDISTRO0001E', distro.get('reason'))
>>>>
>>>> -    def test_debugreports(self):
>>>> -        resp = request(host, ssl_port,
>>>> '/plugins/kimchi/debugreports')
>>>> -        self.assertEquals(200, resp.status)
>>>> -
>>>> -    def _report_delete(self, name):
>>>> -        request(host, ssl_port, '/plugins/kimchi/debugreports/%s'
>>>> % name, '{}',
>>>> -                'DELETE')
>>>> -
>>>> -    def test_create_debugreport(self):
>>>> -        req = json.dumps({'name': 'report1'})
>>>> -        with RollbackContext() as rollback:
>>>> -            resp = request(host, ssl_port,
>>>> '/plugins/kimchi/debugreports', req,
>>>> -                           'POST')
>>>> -            self.assertEquals(202, resp.status)
>>>> -            task = json.loads(resp.read())
>>>> -            # make sure the debugreport doesn't exist until the
>>>> -            # the task is finished
>>>> -            wait_task(self._task_lookup, task['id'])
>>>> -            rollback.prependDefer(self._report_delete, 'report2')
>>>> -            resp = request(host, ssl_port,
>>>> - '/plugins/kimchi/debugreports/report1')
>>>> -            debugreport = json.loads(resp.read())
>>>> -            self.assertEquals("report1", debugreport['name'])
>>>> -            self.assertEquals(200, resp.status)
>>>> -            req = json.dumps({'name': 'report2'})
>>>> -            resp = request(host, ssl_port,
>>>> - '/plugins/kimchi/debugreports/report1',
>>>> req, 'PUT')
>>>> -            self.assertEquals(303, resp.status)
>>>> -
>>>> -    def test_debugreport_download(self):
>>>> -        req = json.dumps({'name': 'report1'})
>>>> -        with RollbackContext() as rollback:
>>>> -            resp = request(host, ssl_port,
>>>> '/plugins/kimchi/debugreports', req,
>>>> -                           'POST')
>>>> -            self.assertEquals(202, resp.status)
>>>> -            task = json.loads(resp.read())
>>>> -            # make sure the debugreport doesn't exist until the
>>>> -            # the task is finished
>>>> -            wait_task(self._task_lookup, task['id'], 20)
>>>> -            rollback.prependDefer(self._report_delete, 'report1')
>>>> -            resp = request(host, ssl_port,
>>>> - '/plugins/kimchi/debugreports/report1')
>>>> -            debugreport = json.loads(resp.read())
>>>> -            self.assertEquals("report1", debugreport['name'])
>>>> -            self.assertEquals(200, resp.status)
>>>> -            resp = request(host, ssl_port,
>>>> -
>>>>   '/plugins/kimchi/debugreports/report1/content')
>>>> -            self.assertEquals(200, resp.status)
>>>> -            resp = request(host, ssl_port,
>>>> - '/plugins/kimchi/debugreports/report1')
>>>> -            debugre = json.loads(resp.read())
>>>> -            resp = request(host, ssl_port, debugre['uri'])
>>>> -            self.assertEquals(200, resp.status)
>>>> -
>>>>       def test_repositories(self):
>>>>           def verify_repo(t, res):
>>>>               for field in ('repo_id', 'enabled', 'baseurl',
>>>> 'config'):
>>>> diff --git a/src/wok/plugins/kimchi/ui/config/tab-ext.xml
>>>> b/src/wok/plugins/kimchi/ui/config/tab-ext.xml
>>>> index ee88c88..48ec9ec 100644
>>>> --- a/src/wok/plugins/kimchi/ui/config/tab-ext.xml
>>>> +++ b/src/wok/plugins/kimchi/ui/config/tab-ext.xml
>>>> @@ -2,13 +2,6 @@
>>>>   <tabs-ext>
>>>>       <tab>
>>>>           <access role="admin" mode="admin"/>
>>>> -        <access role="user" mode="none"/>
>>>> -
>>>> -        <title>Host</title>
>>>> -        <path>plugins/kimchi/host.html</path>
>>>> -    </tab>
>>>> -    <tab>
>>>> -        <access role="admin" mode="admin"/>
>>>>           <access role="user" mode="byInstance"/>
>>>>
>>>>           <title>Guests</title>
>>> _______________________________________________
>>> Kimchi-devel mailing list
>>> Kimchi-devel at ovirt.org
>>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel




More information about the Kimchi-devel mailing list