
From: ShaoHe Feng <shaohef@linux.vnet.ibm.com> Touch 4 files when move RollbackContext Fix pep8 on these 4 files Signed-off-by: ShaoHe Feng <shaohef@linux.vnet.ibm.com> --- Makefile.am | 10 +++++-- tests/test_model.py | 83 +++++++++++++++++++++++++++++++++-------------------- tests/test_rest.py | 70 ++++++++++++++++++++++++-------------------- tests/utils.py | 14 ++++++--- 4 files changed, 108 insertions(+), 69 deletions(-) diff --git a/Makefile.am b/Makefile.am index 6122bbf..17c13e9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,19 +38,23 @@ EXTRA_DIST = \ # When fixing a file to conform with pep8, add it to the WL here. # So it will be checked from now on. PEP8_WHITELIST = \ + plugins/__init__.py \ + plugins/sample/__init__.py \ + plugins/sample/model.py \ src/kimchi/asynctask.py \ src/kimchi/auth.py \ src/kimchi/cachebust.py \ src/kimchi/config.py.in \ src/kimchi/disks.py \ src/kimchi/featuretests.py \ + src/kimchi/rollbackcontext.py \ src/kimchi/root.py \ src/kimchi/server.py \ - plugins/__init__.py \ - plugins/sample/__init__.py \ - plugins/sample/model.py \ tests/test_mockmodel.py \ + tests/test_model.py \ tests/test_plugin.py \ + tests/test_rest.py \ + tests/utils.py \ $(NULL) check-local: diff --git a/tests/test_model.py b/tests/test_model.py index 7ecd8c6..c03cc3f 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -19,7 +19,7 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import os import platform @@ -149,12 +149,13 @@ class ModelTests(unittest.TestCase): self.assertEquals('active', poolinfo['state']) autostart = poolinfo['autostart'] - ori_params = {'autostart': True} if autostart else {'autostart': False} + ori_params = {'autostart': + True} if autostart else {'autostart': False} for i in [True, False]: params = {'autostart': i} inst.storagepool_update(name, params) rollback.prependDefer(inst.storagepool_update, name, - ori_params) + ori_params) poolinfo = inst.storagepool_lookup(name) self.assertEquals(i, poolinfo['autostart']) inst.storagepool_update(name, ori_params) @@ -182,7 +183,8 @@ class ModelTests(unittest.TestCase): inst.storagepools_create(args) rollback.prependDefer(inst.storagepool_delete, pool) - self.assertRaises(InvalidOperation, inst.storagevolumes_get_list, pool) + self.assertRaises(InvalidOperation, inst.storagevolumes_get_list, + pool) poolinfo = inst.storagepool_lookup(pool) self.assertEquals(0, poolinfo['nr_volumes']) # Activate the pool before adding any volume @@ -235,7 +237,8 @@ class ModelTests(unittest.TestCase): rollback.prependDefer(inst.template_delete, 'test') params = {'storagepool': '/storagepools/test-pool'} - self.assertRaises(InvalidParameter, inst.template_update, 'test', params) + self.assertRaises(InvalidParameter, inst.template_update, + 'test', params) args = {'name': pool, 'path': path, @@ -258,7 +261,8 @@ class ModelTests(unittest.TestCase): self.assertTrue(os.access(disk_path, os.F_OK)) def test_template_create(self): - inst = kimchi.model.Model('test:///default', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('test:///default', + objstore_loc=self.tmp_store) # Test non-exist path raises InvalidParameter params = {'name': 'test', 'cdrom': '/non-exsitent.iso'} @@ -270,7 +274,8 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_template_update(self): - inst = kimchi.model.Model('qemu:///system', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('qemu:///system', + objstore_loc=self.tmp_store) orig_params = {'name': 'test', 'memory': '1024', 'cpus': '1'} inst.templates_create(orig_params) @@ -291,7 +296,8 @@ class ModelTests(unittest.TestCase): self.assertEquals(params[key], info[key]) def test_vm_edit(self): - inst = kimchi.model.Model('qemu:///system', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('qemu:///system', + objstore_loc=self.tmp_store) orig_params = {'name': 'test', 'memory': '1024', 'cpus': '1'} inst.templates_create(orig_params) @@ -314,11 +320,13 @@ class ModelTests(unittest.TestCase): self.assertEquals('running', info['state']) params = {'name': 'new-vm'} - self.assertRaises(InvalidParameter, inst.vm_update, 'kimchi-vm1', params) + self.assertRaises(InvalidParameter, inst.vm_update, + 'kimchi-vm1', params) inst.vm_stop('kimchi-vm1') params = {'name': 'new-vm'} - self.assertRaises(OperationFailed, inst.vm_update, 'kimchi-vm1', {'name': 'kimchi-vm2'}) + self.assertRaises(OperationFailed, inst.vm_update, + 'kimchi-vm1', {'name': 'kimchi-vm2'}) inst.vm_update('kimchi-vm1', params) self.assertEquals(info['uuid'], inst.vm_lookup('new-vm')['uuid']) rollback.prependDefer(inst.vm_delete, 'new-vm') @@ -427,7 +435,8 @@ class ModelTests(unittest.TestCase): self.assertEquals(10, len(store._connections.keys())) def test_get_interfaces(self): - inst = kimchi.model.Model('test:///default', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('test:///default', + objstore_loc=self.tmp_store) expected_ifaces = netinfo.all_favored_interfaces() ifaces = inst.interfaces_get_list() self.assertEquals(len(expected_ifaces), len(ifaces)) @@ -456,7 +465,8 @@ class ModelTests(unittest.TestCase): except: cb("Exception raised", False) - inst = kimchi.model.Model('test:///default', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('test:///default', + objstore_loc=self.tmp_store) taskid = inst.add_task('', quick_op, 'Hello') self._wait_task(inst, taskid) self.assertEquals(1, taskid) @@ -464,17 +474,19 @@ class ModelTests(unittest.TestCase): self.assertEquals('Hello', inst.task_lookup(taskid)['message']) taskid = inst.add_task('', long_op, - {'delay': 3, 'result': False, - 'message': 'It was not meant to be'}) + {'delay': 3, 'result': False, + 'message': 'It was not meant to be'}) self.assertEquals(2, taskid) self.assertEquals('running', inst.task_lookup(taskid)['status']) self.assertEquals('OK', inst.task_lookup(taskid)['message']) self._wait_task(inst, taskid) self.assertEquals('failed', inst.task_lookup(taskid)['status']) - self.assertEquals('It was not meant to be', inst.task_lookup(taskid)['message']) + self.assertEquals('It was not meant to be', + inst.task_lookup(taskid)['message']) taskid = inst.add_task('', abnormal_op, {}) self._wait_task(inst, taskid) - self.assertEquals('Exception raised', inst.task_lookup(taskid)['message']) + self.assertEquals('Exception raised', + inst.task_lookup(taskid)['message']) self.assertEquals('failed', inst.task_lookup(taskid)['status']) @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') @@ -516,18 +528,20 @@ class ModelTests(unittest.TestCase): self.assertEquals(vms, sorted(vms, key=unicode.lower)) def test_use_test_host(self): - inst = kimchi.model.Model('test:///default', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('test:///default', + objstore_loc=self.tmp_store) with RollbackContext() as rollback: params = {'name': 'test', 'disks': [], - 'storagepool': '/storagepools/default-pool', - 'domain': 'test', - 'arch': 'i686'} + 'storagepool': '/storagepools/default-pool', + 'domain': 'test', + 'arch': 'i686'} inst.templates_create(params) rollback.prependDefer(inst.template_delete, 'test') - params = {'name': 'kimchi-vm', 'template': '/templates/test',} + params = {'name': 'kimchi-vm', + 'template': '/templates/test'} inst.vms_create(params) rollback.prependDefer(inst.vm_delete, 'kimchi-vm') @@ -537,7 +551,8 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_debug_reports(self): - inst = kimchi.model.Model('test:///default', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('test:///default', + objstore_loc=self.tmp_store) namePrefix = 'unitTestReport' # sosreport always deletes unsual letters like '-' and '_' in the # generated report file name. @@ -555,9 +570,11 @@ class ModelTests(unittest.TestCase): rollback.prependDefer(inst.debugreport_delete, reportName) taskid = task['id'] self._wait_task(inst, taskid, 60) - self.assertEquals('finished', inst.task_lookup(taskid)['status'], - "It is not necessary an error. You may need to increase the " - "timeout number in _wait_task()") + self.assertEquals('finished', + inst.task_lookup(taskid)['status'], + "It is not necessary an error. " + "You may need to increase the " + "timeout number in _wait_task()") report_list = inst.debugreports_get_list() self.assertTrue(reportName in report_list) except OperationFailed, e: @@ -570,7 +587,8 @@ class ModelTests(unittest.TestCase): time.sleep(1) def test_get_distros(self): - inst = kimchi.model.Model('test:///default', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('test:///default', + objstore_loc=self.tmp_store) distros = inst._get_distros() for distro in distros.values(): self.assertIn('name', distro) @@ -580,7 +598,8 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_get_hostinfo(self): - inst = kimchi.model.Model('qemu:///system', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('qemu:///system', + objstore_loc=self.tmp_store) info = inst.host_lookup() distro, version, codename = platform.linux_distribution() self.assertIn('cpu', info) @@ -617,15 +636,17 @@ class ModelTests(unittest.TestCase): @unittest.skipUnless(utils.running_as_root(), 'Must be run as root') def test_deep_scan(self): - inst = kimchi.model.Model('qemu:///system', objstore_loc=self.tmp_store) + inst = kimchi.model.Model('qemu:///system', + objstore_loc=self.tmp_store) with RollbackContext() as rollback: path = '/tmp/kimchi-images/tmpdir' if not os.path.exists(path): os.makedirs(path) - iso_gen.construct_fake_iso('/tmp/kimchi-images/tmpdir/ubuntu12.04.iso', - True, '12.04', 'ubuntu') + iso_gen.construct_fake_iso('/tmp/kimchi-images/tmpdir/' + 'ubuntu12.04.iso', True, + '12.04', 'ubuntu') iso_gen.construct_fake_iso('/tmp/kimchi-images/sles10.iso', - True, '10', 'sles') + True, '10', 'sles') args = {'name': 'kimchi-scanning-pool', 'path': '/tmp/kimchi-images', diff --git a/tests/test_rest.py b/tests/test_rest.py index 1b7312f..e626d2f 100644 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -18,7 +18,7 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import base64 import json @@ -32,7 +32,6 @@ from functools import partial import kimchi.mockmodel import kimchi.server -from kimchi.asynctask import AsyncTask from kimchi.rollbackcontext import RollbackContext from utils import fake_user, get_free_port, https_request, patch_auth, request from utils import run_server @@ -134,12 +133,12 @@ class RestTests(unittest.TestCase): resp = self.request("/", headers={'Accept': 'text/html'}) self.assertTrue('<!doctype html>' in resp.read().lower()) - resp = self.request("/", - headers={'Accept': 'application/json, text/html'}) + resp = self.request("/", headers={'Accept': + 'application/json, text/html'}) self.assertValidJSON(resp.read()) - resp = self.request("/", - headers={'Accept': 'text/html, application/json'}) + resp = self.request("/", headers={'Accept': + 'text/html, application/json'}) self.assertValidJSON(resp.read()) h = {'Accept': 'text/plain'} @@ -212,7 +211,7 @@ class RestTests(unittest.TestCase): # Create a Template req = json.dumps({'name': 'test', 'disks': [{'size': 1}], 'icon': 'images/icon-debian.png', - 'cdrom': '/nonexistent.iso'}) + 'cdrom': '/nonexistent.iso'}) resp = self.request('/templates', req, 'POST') self.assertEquals(201, resp.status) @@ -303,7 +302,7 @@ class RestTests(unittest.TestCase): def test_template_customise_storage(self): req = json.dumps({'name': 'test', 'cdrom': '/nonexistent.iso', - 'disks': [{'size': 1}]}) + 'disks': [{'size': 1}]}) resp = self.request('/templates', req, 'POST') self.assertEquals(201, resp.status) @@ -437,7 +436,8 @@ class RestTests(unittest.TestCase): self.assertEquals(201, resp.status) # Verify the storage pool - storagepool = json.loads(self.request('/storagepools/test-pool').read()) + storagepool = json.loads( + self.request('/storagepools/test-pool').read()) self.assertEquals('inactive', storagepool['state']) if storagepool['type'] == 'dir': self.assertEquals(True, storagepool['autostart']) @@ -446,12 +446,14 @@ class RestTests(unittest.TestCase): # activate the storage pool resp = self.request('/storagepools/test-pool/activate', '{}', 'POST') - storagepool = json.loads(self.request('/storagepools/test-pool').read()) + storagepool = json.loads( + self.request('/storagepools/test-pool').read()) self.assertEquals('active', storagepool['state']) # Deactivate the storage pool resp = self.request('/storagepools/test-pool/deactivate', '{}', 'POST') - storagepool = json.loads(self.request('/storagepools/test-pool').read()) + storagepool = json.loads( + self.request('/storagepools/test-pool').read()) self.assertEquals('inactive', storagepool['state']) # Set autostart flag of the storage pool @@ -460,7 +462,7 @@ class RestTests(unittest.TestCase): req = json.dumps(t) resp = self.request('/storagepools/test-pool', req, 'PUT') storagepool = json.loads( - self.request('/storagepools/test-pool').read()) + self.request('/storagepools/test-pool').read()) self.assertEquals(autostart, storagepool['autostart']) # Delete the storage pool @@ -477,7 +479,8 @@ class RestTests(unittest.TestCase): resp = self.request('/storagepools/pool-1/activate', '{}', 'POST') self.assertEquals(200, resp.status) - nr_vols = json.loads(self.request('/storagepools/pool-1').read())['nr_volumes'] + nr_vols = json.loads( + self.request('/storagepools/pool-1').read())['nr_volumes'] self.assertEquals(0, nr_vols) # Now add a couple of storage volumes to the mock model @@ -489,10 +492,11 @@ class RestTests(unittest.TestCase): 'type': 'disk', 'format': 'raw'}) resp = self.request('/storagepools/pool-1/storagevolumes', - req, 'POST') + req, 'POST') self.assertEquals(201, resp.status) - nr_vols = json.loads(self.request('/storagepools/pool-1').read())['nr_volumes'] + nr_vols = json.loads( + self.request('/storagepools/pool-1').read())['nr_volumes'] self.assertEquals(5, nr_vols) resp = self.request('/storagepools/pool-1/storagevolumes') storagevolumes = json.loads(resp.read()) @@ -502,7 +506,8 @@ class RestTests(unittest.TestCase): storagevolume = json.loads(resp.read()) self.assertEquals('volume-1', storagevolume['name']) self.assertEquals('raw', storagevolume['format']) - self.assertEquals('/var/lib/libvirt/images/volume-1', storagevolume['path']) + self.assertEquals('/var/lib/libvirt/images/volume-1', + storagevolume['path']) # Now remove the StoragePool from mock model self._delete_pool('pool-1') @@ -516,11 +521,13 @@ class RestTests(unittest.TestCase): 'allocation': 512, 'type': 'disk', 'format': 'raw'}) - resp = self.request('/storagepools/pool-2/storagevolumes/', req, 'POST') + resp = self.request('/storagepools/pool-2/storagevolumes/', + req, 'POST') self.assertEquals(400, resp.status) resp = self.request('/storagepools/pool-2/activate', '{}', 'POST') self.assertEquals(200, resp.status) - resp = self.request('/storagepools/pool-2/storagevolumes/', req, 'POST') + resp = self.request('/storagepools/pool-2/storagevolumes/', + req, 'POST') self.assertEquals(201, resp.status) # Verify the storage volume @@ -545,7 +552,7 @@ class RestTests(unittest.TestCase): # Delete the storage volume resp = self.request('/storagepools/pool-2/storagevolumes/test-volume', - '{}', 'DELETE') + '{}', 'DELETE') self.assertEquals(204, resp.status) # Now remove the StoragePool from mock model @@ -561,7 +568,8 @@ class RestTests(unittest.TestCase): self.assertEquals(201, resp.status) # Verify the storage pool - storagepool = json.loads(self.request('/storagepools/%s' % name).read()) + storagepool = json.loads(self.request('/storagepools/%s' + % name).read()) self.assertEquals('inactive', storagepool['state']) return name @@ -572,8 +580,8 @@ class RestTests(unittest.TestCase): def test_templates(self): def verify_template(t, res): - for field in ('name', 'os_distro', - 'os_version', 'memory', 'cpus', 'storagepool'): + for field in ('name', 'os_distro', 'os_version', + 'memory', 'cpus', 'storagepool'): self.assertEquals(t[field], res[field]) resp = self.request('/templates') @@ -700,15 +708,17 @@ class RestTests(unittest.TestCase): '/storagepools/kimchi_isos/storagevolumes/').read())[0] self.assertEquals('pool-3-fedora.iso', storagevolume['name']) self.assertEquals('iso', storagevolume['format']) - self.assertEquals('/var/lib/libvirt/images/fedora.iso',storagevolume['path']) + self.assertEquals('/var/lib/libvirt/images/fedora.iso', + storagevolume['path']) self.assertEquals(1024 << 20, storagevolume['capacity']) self.assertEquals(1024 << 20, storagevolume['allocation']) self.assertEquals('17', storagevolume['os_version']) - self.assertEquals('fedora',storagevolume['os_distro']) - self.assertEquals(True,storagevolume['bootable']) + self.assertEquals('fedora', storagevolume['os_distro']) + self.assertEquals(True, storagevolume['bootable']) # Create a template - # In real model os distro/version can be omitted as we will scan the iso + # In real model os distro/version can be omitted + # as we will scan the iso req = json.dumps({'name': 'test', 'cdrom': storagevolume['path'], 'os_distro': storagevolume['os_distro'], @@ -724,8 +734,8 @@ class RestTests(unittest.TestCase): self.assertEquals(1024, t['memory']) # Deactivate or destroy scan pool return 405 - resp = self.request('/storagepools/kimchi_isos/storagevolumes/deactivate', - '{}', 'POST') + resp = self.request('/storagepools/kimchi_isos/storagevolumes' + '/deactivate', '{}', 'POST') self.assertEquals(405, resp.status) resp = self.request('/storagepools/kimchi_isos/storagevolumes', @@ -762,13 +772,11 @@ class RestTests(unittest.TestCase): self.assertEquals('image/png', resp.getheader('content-type')) lastMod1 = resp.getheader('last-modified') - # Take another screenshot instantly and compare the last Modified date resp = self.request('/vms/test-vm/screenshot') lastMod2 = resp.getheader('last-modified') self.assertEquals(lastMod2, lastMod1) - resp = self.request('/vms/test-vm/screenshot', '{}', 'DELETE') self.assertEquals(405, resp.status) @@ -998,7 +1006,7 @@ class RestTests(unittest.TestCase): self.assertEquals(200, resp.status) def _report_delete(self, name): - resp = request(host, port, '/debugreports/%s' % name, '{}', 'DELETE') + request(host, port, '/debugreports/%s' % name, '{}', 'DELETE') def test_create_debugreport(self): req = json.dumps({'name': 'report1'}) diff --git a/tests/utils.py b/tests/utils.py index 960e0be..008f668 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -18,7 +18,7 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # import base64 @@ -28,7 +28,6 @@ import os import socket import sys import threading -import time import unittest @@ -60,7 +59,8 @@ if sys.version_info[:2] == (2, 6): def assertGreaterEqual(self, a, b, msg=None): if not a >= b: - self.fail('%s not greater than or equal to %s' % (repr(a), repr(b))) + self.fail('%s not greater than or equal to %s' + % (repr(a), repr(b))) def assertIsInstance(self, obj, cls, msg=None): if not isinstance(obj, cls): @@ -80,6 +80,7 @@ if sys.version_info[:2] == (2, 6): unittest.TestCase.assertIn = assertIn unittest.TestCase.assertNotIn = assertNotIn + def get_free_port(name='http'): global _ports if _ports.get(name) is not None: @@ -93,7 +94,9 @@ def get_free_port(name='http'): _ports[name] = sock.getsockname()[1] return _ports[name] -def run_server(host, port, ssl_port, test_mode, model=None, environment='development'): + +def run_server(host, port, ssl_port, test_mode, + model=None, environment='development'): args = type('_', (object,), {'host': host, 'port': port, 'ssl_port': ssl_port, 'ssl_cert': '', 'ssl_key': '', @@ -109,12 +112,14 @@ def run_server(host, port, ssl_port, test_mode, model=None, environment='develop cherrypy.engine.wait(cherrypy.engine.states.STARTED) return s + def silence_server(): """ Silence server status messages on stdout """ cherrypy.config.update({"environment": "embedded"}) + def running_as_root(): return os.geteuid() == 0 @@ -130,6 +135,7 @@ def _request(conn, path, data, method, headers): conn.request(method, path, data, headers) return conn.getresponse() + def request(host, port, path, data=None, method='GET', headers=None): conn = httplib.HTTPConnection(host, port) return _request(conn, path, data, method, headers) -- 1.8.4.2