Change in vdsm[master]: trivial: Fix a typo of mom package name on Debian
by wudxw@linux.vnet.ibm.com
Mark Wu has uploaded a new change for review.
Change subject: trivial: Fix a typo of mom package name on Debian
......................................................................
trivial: Fix a typo of mom package name on Debian
Change-Id: Iaf2631a0ac26fc72bdb7f2b79d7ac35b2e8ab8c5
Signed-off-by: Mark Wu <wudxw(a)linux.vnet.ibm.com>
---
M vdsm/caps.py
1 file changed, 1 insertion(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/20/9320/1
diff --git a/vdsm/caps.py b/vdsm/caps.py
index 9fe360f..fdb06b1 100644
--- a/vdsm/caps.py
+++ b/vdsm/caps.py
@@ -353,7 +353,7 @@
elif getos() == OSName.DEBIAN and python_apt:
KEY_PACKAGES = {'qemu-kvm': 'qemu-kvm', 'qemu-img': 'qemu-utils',
'vdsm': 'vdsmd', 'spice-server': 'libspice-server1',
- 'libvirt': 'libvirt0', 'mom': 'nom'}
+ 'libvirt': 'libvirt0', 'mom': 'mom'}
cache = apt.Cache()
--
To view, visit http://gerrit.ovirt.org/9320
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iaf2631a0ac26fc72bdb7f2b79d7ac35b2e8ab8c5
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Mark Wu <wudxw(a)linux.vnet.ibm.com>
11 years, 7 months
Change in vdsm[master]: add VM creation test over localfs storage layout
by zhshzhou@linux.vnet.ibm.com
Zhou Zheng Sheng has uploaded a new change for review.
Change subject: add VM creation test over localfs storage layout
......................................................................
add VM creation test over localfs storage layout
It can be easily extended to use nfs or iscsi storage layout
Change-Id: Ie176b96d56803e46b46f50b9fbee5255ad019578
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
M tests/functional/xmlrpcTests.py
1 file changed, 46 insertions(+), 17 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/83/8183/1
diff --git a/tests/functional/xmlrpcTests.py b/tests/functional/xmlrpcTests.py
index 451a4cc..31ffcd0 100644
--- a/tests/functional/xmlrpcTests.py
+++ b/tests/functional/xmlrpcTests.py
@@ -152,6 +152,16 @@
def testStartSmallVM(self):
self.skipNoKVM()
+ conf = {'display': 'vnc',
+ 'kvmEnable': 'true',
+ 'memSize': '256',
+ 'vmId': '77777777-ffff-3333-bbbb-222222222222',
+ 'vmName': 'vdsm_testSmallVM',
+ 'vmType': 'kvm'}
+
+ self._runVMKernelBoot(conf)
+
+ def _runVMKernelBoot(self, vmDef):
kernelVer = os.uname()[2]
kernelPath = "/boot/vmlinuz-" + kernelVer
initramfsPath = "/boot/initramfs-%s.img" % kernelVer
@@ -164,30 +174,24 @@
raise SkipTest("Can not locate initramfs image for release %s" %
kernelVer)
- VMID = '77777777-ffff-3333-bbbb-222222222222'
- conf = {'display': 'vnc',
- 'kernel': kernelPath,
- 'initrd': initramfsPath,
- # The initramfs is generated by dracut. The following
- # arguments will be interpreted by init scripts created by
- # dracut.
- 'kernelArgs': 'rd.break=cmdline rd.shell rd.skipfsck',
- 'kvmEnable': 'true',
- 'memSize': '256',
- 'vmId': VMID,
- 'vmName': 'vdsm_testSmallVM',
- 'vmType': 'kvm'}
+ vmDef.update({'kernel': kernelPath,
+ 'initrd': initramfsPath,
+ # The initramfs is generated by dracut. The following
+ # arguments will be interpreted by init scripts created
+ # by dracut.
+ 'kernelArgs': 'rd.break=cmdline rd.shell rd.skipfsck'})
+ vmid = vmDef['vmId']
def assertVMAndGuestUp():
- self.assertVmUp(VMID)
- self.assertGuestUp(VMID)
+ self.assertVmUp(vmid)
+ self.assertGuestUp(vmid)
try:
- self.assertVdsOK(self.s.create(conf))
+ self.assertVdsOK(self.s.create(vmDef))
# wait 65 seconds for VM to come up until timeout
self.retryAssert(assertVMAndGuestUp, 65, 1)
finally:
- destroyResult = self.s.destroy(VMID)
+ destroyResult = self.s.destroy(vmid)
self.assertVdsOK(destroyResult)
@@ -196,6 +200,31 @@
with _localfsStore(conf['conn']), self._vdsmStorageLayout(conf):
pass
+ def testSimpleVMoLocalfs(self):
+ self.skipNoKVM()
+
+ localfs = storageLayouts['localfs']
+ drives = []
+ for poolid, domains in localfs['layout'].iteritems():
+ for sdid, imageList in domains.iteritems():
+ for imgid in imageList:
+ volume = localfs['img'][imgid]
+ drives.append({'poolID': poolid,
+ 'domainID': sdid,
+ 'imageID': imgid,
+ 'volumeID': volume['volid'],
+ 'format': volume['format']})
+ vmDef = {'display': 'vnc',
+ 'kvmEnable': 'true',
+ 'memSize': '256',
+ 'vmId': '88888888-eeee-ffff-aaaa-111111111111',
+ 'vmName': 'vdsm_testSmallVM_localfs',
+ 'vmType': 'kvm',
+ 'drives': drives}
+
+ with _localfsStore(localfs['conn']), self._vdsmStorageLayout(localfs):
+ self._runVMKernelBoot(vmDef)
+
@rollbackManager
def _vdsmStorageLayout(self, conf, rollback):
connections = conf['conn']
--
To view, visit http://gerrit.ovirt.org/8183
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie176b96d56803e46b46f50b9fbee5255ad019578
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
11 years, 7 months
Change in vdsm[master]: extract a method for booting a test VM through kernel boot
by zhshzhou@linux.vnet.ibm.com
Zhou Zheng Sheng has uploaded a new change for review.
Change subject: extract a method for booting a test VM through kernel boot
......................................................................
extract a method for booting a test VM through kernel boot
Hide the kernel boot and initramfs details into a method, then just call
the metthod with ordinary VM configurations
Change-Id: I6f2e94651d0279b19b1ce6849fb6f0c1b530a10c
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
M tests/functional/xmlrpcTests.py
1 file changed, 23 insertions(+), 19 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/14/8414/1
diff --git a/tests/functional/xmlrpcTests.py b/tests/functional/xmlrpcTests.py
index 2968061..91376ed 100644
--- a/tests/functional/xmlrpcTests.py
+++ b/tests/functional/xmlrpcTests.py
@@ -190,32 +190,36 @@
def testStartSmallVM(self):
self.skipNoKVM()
- def assertVMAndGuestUp():
- self.assertVmUp(VMID)
- self.assertGuestUp(VMID)
+ conf = {'display': 'vnc',
+ 'kvmEnable': 'true',
+ 'memSize': '256',
+ 'vmId': '77777777-ffff-3333-bbbb-222222222222',
+ 'vmName': 'vdsm_testSmallVM',
+ 'vmType': 'kvm'}
- VMID = '77777777-ffff-3333-bbbb-222222222222'
+ self._runVMKernelBoot(conf)
+
+ def _runVMKernelBoot(self, vmDef):
+ vmid = vmDef['vmId']
+
+ def assertVMAndGuestUp():
+ self.assertVmUp(vmid)
+ self.assertGuestUp(vmid)
with kernelBootImages() as (kernelPath, initramfsPath):
- conf = {'display': 'vnc',
- 'kernel': kernelPath,
- 'initrd': initramfsPath,
- # The initramfs is generated by dracut. The following
- # arguments will be interpreted by init scripts created by
- # dracut.
- 'kernelArgs': 'rd.break=cmdline rd.shell rd.skipfsck',
- 'kvmEnable': 'true',
- 'memSize': '256',
- 'vmId': VMID,
- 'vmName': 'vdsm_testSmallVM',
- 'vmType': 'kvm'}
-
+ vmDef.update(
+ {'kernel': kernelPath,
+ 'initrd': initramfsPath,
+ # The initramfs is generated by dracut. The following
+ # arguments will be interpreted by init scripts created
+ # by dracut.
+ 'kernelArgs': 'rd.break=cmdline rd.shell rd.skipfsck'})
try:
- self.assertVdsOK(self.s.create(conf))
+ self.assertVdsOK(self.s.create(vmDef))
# wait 65 seconds for VM to come up until timeout
self.retryAssert(assertVMAndGuestUp, 65, 1)
finally:
- destroyResult = self.s.destroy(VMID)
+ destroyResult = self.s.destroy(vmid)
self.assertVdsOK(destroyResult)
--
To view, visit http://gerrit.ovirt.org/8414
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6f2e94651d0279b19b1ce6849fb6f0c1b530a10c
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
11 years, 7 months
Change in vdsm[master]: storage functional test with multiple storage domains and im...
by zhshzhou@linux.vnet.ibm.com
Hello Adam Litke, Royce Lv,
I'd like you to do a code review. Please visit
http://gerrit.ovirt.org/8182
to review the following change.
Change subject: storage functional test with multiple storage domains and images
......................................................................
storage functional test with multiple storage domains and images
add xmlrpc functional test for local storage,
it can be extend to nfs and iscsi backends
Change-Id: I8287046046460f399f180d19e0717a91419297f8
Signed-off-by: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
Signed-off-by: Adam Litke <agl(a)us.ibm.com>
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
M tests/functional/xmlrpcTests.py
1 file changed, 213 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/82/8182/1
diff --git a/tests/functional/xmlrpcTests.py b/tests/functional/xmlrpcTests.py
index 661b347..451a4cc 100644
--- a/tests/functional/xmlrpcTests.py
+++ b/tests/functional/xmlrpcTests.py
@@ -19,16 +19,58 @@
#
import os
+import sys
import time
+import pwd
+import grp
+import shutil
+from contextlib import contextmanager
from testrunner import VdsmTestCase as TestCaseBase
from nose.plugins.skip import SkipTest
from vdsm.config import config
+from vdsm.constants import VDSM_USER, VDSM_GROUP
+from storage.sd import BLANK_UUID
+from storage.sd import name2class
+from storage.sd import name2type as sdname2type
+from storage.volume import name2type as volname2type
from vdsm import vdscli
if not config.getboolean('vars', 'xmlrpc_enable'):
raise SkipTest("XML-RPC Bindings are disabled")
+
+
+def rollbackManager(transaction):
+ @contextmanager
+ def wrapper(*args, **kwargs):
+ rollback = []
+ exception = None
+ traceback = None
+ try:
+ yield transaction(rollback=rollback, *args, **kwargs)
+ except Exception, e:
+ # keep the original exception and traceback info
+ exception = e
+ traceback = sys.exc_info()[2]
+ finally:
+ rollback.reverse()
+ _playRollback(rollback, exception, traceback)
+ return wrapper
+
+
+def _playRollback(rollback, exception=None, traceback=None):
+ for undo in rollback:
+ try:
+ undo()
+ except Exception, e:
+ # keep the earliest exception info
+ if not exception:
+ exception = e
+ # keep the original traceback info
+ traceback = sys.exc_info()[2]
+ if exception:
+ raise exception, None, traceback
class XMLRPCTest(TestCaseBase):
@@ -81,7 +123,10 @@
def assertVdsOK(self, vdsResult):
# code == 0 means OK
- self.assertEquals(vdsResult['status']['code'], 0)
+ self.assertEquals(
+ vdsResult['status']['code'], 0,
+ 'error code: %s, message: %s' % (vdsResult['status']['code'],
+ vdsResult['status']['message']))
def skipNoKVM(self):
r = self.s.getVdsCapabilities()
@@ -145,3 +190,170 @@
destroyResult = self.s.destroy(VMID)
self.assertVdsOK(destroyResult)
+
+ def testLocalfs(self):
+ conf = storageLayouts['localfs']
+ with _localfsStore(conf['conn']), self._vdsmStorageLayout(conf):
+ pass
+
+ @rollbackManager
+ def _vdsmStorageLayout(self, conf, rollback):
+ connections = conf['conn']
+ storageDomains = conf['sd']
+ storagePools = conf['sp']
+ images = conf['img']
+ layout = conf['layout']
+
+ # Connect storage backends
+ r = self.s.storageServer_ConnectionRefs_acquire(connections)
+ self.assertVdsOK(r)
+ undo = lambda: self.assertVdsOK(
+ self.s.storageServer_ConnectionRefs_release(
+ connections.keys()))
+ rollback.append(undo)
+ for _refid, status in r['results'].iteritems():
+ self.assertEquals(status, 0)
+
+ # Create storage domains
+ for sdid, domain in storageDomains.iteritems():
+ r = self.s.createStorageDomain(
+ sdname2type(domain['type']), sdid, domain['name'],
+ domain['typeArgs'], name2class(domain['class']), 0)
+ self.assertVdsOK(r)
+ undo = lambda sdid=sdid: \
+ self.assertVdsOK(
+ self.s.formatStorageDomain(sdid, True))
+ rollback.append(undo)
+
+ # Create storage pools
+ # For now we actually just support 1 pool
+ # So there must be only 1 pool definition in the configuration
+ # This code is written to create pools in case we support several pools
+ poolType = 0 # not used
+ for poolid, pool in storagePools.iteritems():
+ r = self.s.createStoragePool(
+ poolType, poolid, pool['name'], pool['master_uuid'],
+ layout[poolid].keys(), pool['master_ver'])
+ self.assertVdsOK(r)
+ # Connect to pool
+ r = self.s.connectStoragePool(
+ poolid, pool['host'], 'scsikey', pool['master_uuid'],
+ pool['master_ver'])
+ self.assertVdsOK(r)
+
+ # If spmstart fails, there is no good rollback because we need to
+ # be spm to tear down the pool
+
+ # Become SPM (there is no undo operation required)
+ r = self.s.spmStart(storagePools.keys()[0], -1, -1, -1, 0)
+ self.assertVdsOK(r)
+ tid = r['uuid']
+ self._waitTask(tid)
+
+ for poolid in storagePools.keys():
+ undo = lambda poolid=poolid: \
+ self.assertVdsOK(self.s.destroyStoragePool(
+ poolid, storagePools[poolid]['host'], 'scsiKey'))
+ rollback.append(undo)
+
+ # Activate storage domains except master ones
+ for poolid, domains in layout.iteritems():
+ for sdid in domains.keys():
+ if sdid != storagePools[poolid]['master_uuid']:
+ r = self.s.activateStorageDomain(sdid, poolid)
+ self.assertVdsOK(r)
+ undo = lambda sdid=sdid, poolid=poolid: \
+ self.assertVdsOK(
+ self.s.detachStorageDomain(
+ sdid, poolid, BLANK_UUID,
+ storagePools[poolid]['master_ver']))
+ rollback.append(undo)
+
+ # Create images and volumes
+ for poolid, domains in layout.iteritems():
+ for sdid, imageList in domains.iteritems():
+ for imgid in imageList:
+ volume = images[imgid]
+ r = self.s.createVolume(
+ sdid, poolid, imgid, volume['size'],
+ volname2type(volume['format']),
+ volname2type(volume['preallocate']),
+ volname2type(volume['type']), volume['volid'],
+ volume['description'])
+ self.assertVdsOK(r)
+ tid = r['uuid']
+ self._waitTask(tid)
+ undo = lambda sdid=sdid, poolid=poolid, imgid=imgid: \
+ self._waitTask(
+ self.s.deleteImage(
+ sdid, poolid, imgid)['uuid'])
+ rollback.append(undo)
+ undo = (lambda sdid=sdid, poolid=poolid,
+ imgid=imgid, volume=volume:
+ self._waitTask(
+ self.s.deleteVolume(
+ sdid, poolid, imgid,
+ [volume['volid']])['uuid']))
+ rollback.append(undo)
+
+ def _waitTask(self, taskId):
+ def assertTaskOK():
+ r = self.s.getTaskStatus(taskId)
+ self.assertVdsOK(r)
+ state = r['taskStatus']['taskState']
+ self.assertEquals(state, 'finished')
+
+ self.retryAssert(assertTaskOK, 20)
+
+
+storageLayouts = \
+ {'localfs':
+ {'conn': {'53acd629-47e6-42d8-ba99-cd0b12ff0e1e':
+ {'type': 'localfs',
+ 'params': {'path': '/tmp/teststorage0'}},
+ '87e618fe-587c-4704-a9f8-9fd9321fd907':
+ {'type': 'localfs',
+ 'params': {'path': '/tmp/teststorage1'}}},
+ 'sd': {"def32ac7-1234-1234-8a8c-1c887333fe65":
+ {"name": "test domain0", "type": "localfs",
+ "class": "Data", "typeArgs": "/tmp/teststorage0"},
+ "9af9bd7f-6167-4ae8-aac6-95a5e5f36f60":
+ {"name": "test domain1", "type": "localfs",
+ "class": "Data", "typeArgs": "/tmp/teststorage1"}},
+ 'sp': {"6e4d6a96-1234-1234-8905-b5eec55c1535":
+ {"name": "local storage pool",
+ "master_uuid": "def32ac7-1234-1234-8a8c-1c887333fe65",
+ "master_ver": 1, "host": 1}},
+ 'img': {"47bd7538-c48b-4b94-ba94-def922151d48":
+ {"description": "Test volume0", "type": "leaf",
+ "volid": "11bd7538-c48b-4b94-ba94-def922151d48",
+ "format": "cow", "preallocate": "sparse",
+ "size": 20971520},
+ "bace8f68-4c5a-43f2-acb4-fa8daf58c0f9":
+ {"description": "test volume1", "type": "leaf",
+ "volid": "bb3cbda6-a711-45a6-a6f2-c32661939e93",
+ "format": "cow", "preallocate": "sparse",
+ "size": 20971520}},
+ 'layout': {"6e4d6a96-1234-1234-8905-b5eec55c1535": # pool
+ {"def32ac7-1234-1234-8a8c-1c887333fe65": # domains
+ ["47bd7538-c48b-4b94-ba94-def922151d48"], # images
+ "9af9bd7f-6167-4ae8-aac6-95a5e5f36f60":
+ ["bace8f68-4c5a-43f2-acb4-fa8daf58c0f9"]}}},
+ 'nfs': {'conn': 'blah', 'sd': 'blah', 'sp': 'blah', 'img': 'blah',
+ 'layout': 'blah'},
+ 'iscsi': {'conn': 'blah', 'sd': 'blah', 'sp': 'blah', 'img': 'blah',
+ 'layout': 'blah'}}
+
+
+@rollbackManager
+def _localfsStore(connDef, rollback):
+ for uuid, args in connDef.iteritems():
+ path = args['params']['path']
+ os.mkdir(path)
+
+ undo = lambda path=path: shutil.rmtree(path, ignore_errors=True)
+ rollback.append(undo)
+
+ uid = pwd.getpwnam(VDSM_USER)[2]
+ gid = grp.getgrnam(VDSM_GROUP)[2]
+ os.chown(path, uid, gid)
--
To view, visit http://gerrit.ovirt.org/8182
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8287046046460f399f180d19e0717a91419297f8
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
Gerrit-Reviewer: Adam Litke <agl(a)us.ibm.com>
Gerrit-Reviewer: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
11 years, 7 months
Change in vdsm[master]: tests: add a rollback manager for easy undoing
by zhshzhou@linux.vnet.ibm.com
Zhou Zheng Sheng has uploaded a new change for review.
Change subject: tests: add a rollback manager for easy undoing
......................................................................
tests: add a rollback manager for easy undoing
Sometimes we need to perform a series of operations:
op[0], op[1], ... op[N]
These operations may allocate files, locks, connections, and op[K] may
depend on op[K-1] 's result
Consider these are contexts, after constructing contexts, we want to
perform some computing using these contexts. Exception may be raised in
the complicated construction stage of the contexts or when we're using
the contexes.
So if op[K] fails, we need to:
undo op[K-1], undo op[K-2], ... undo op[0]
These undo operations release the resources,
or if all the operations succeed, at last we need to:
undo op[N], undo op[N-1], ... undo op[0]
Furthermore, We want to suppress the exceptions occured in "undo op[X]",
and continue the rollback, so that all the resources can be freed.
At last, we want to see the first exception raised so that we can fix
the root cause, so we want to have the oldest exception occured in this
batch of operation reraised.
This patch proposes a concise framework to do this kind of
rollback. It's an upgrade version of contextlib.contextmanager .
Change-Id: Ibc932637dd81c3becf92de34ea647c1cea136111
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
M tests/Makefile.am
A tests/rollbackManagerTests.py
M tests/testrunner.py
3 files changed, 161 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/71/8671/1
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2b61dde..02f48ab 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -45,6 +45,7 @@
persistentDictTests.py \
restTests.py \
restData.py \
+ rollbackManagerTests.py \
tcTests.py \
vdsClientTests.py \
remoteFileHandlerTests.py \
diff --git a/tests/rollbackManagerTests.py b/tests/rollbackManagerTests.py
new file mode 100644
index 0000000..db3a5a0
--- /dev/null
+++ b/tests/rollbackManagerTests.py
@@ -0,0 +1,85 @@
+#
+# Copyright IBM Corp. 2012
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+import glob
+import os
+import tempfile
+import uuid
+
+from testrunner import VdsmTestCase as TestCaseBase
+from testrunner import rollbackManager
+
+
+class ContextError(Exception):
+ pass
+
+
+class ConsumerError(Exception):
+ pass
+
+
+class TestRollbackManager(TestCaseBase):
+ def setUp(self):
+ self.tmpdirPrefix = 'testrollback' + str(uuid.uuid4())
+
+ @rollbackManager
+ def tempfiles(self, fileCount, excClass, rollback):
+ dirPath = tempfile.mkdtemp(prefix=self.tmpdirPrefix)
+ undo = lambda: os.rmdir(dirPath)
+ rollback.append(undo)
+
+ for i in range(0, fileCount):
+ path = os.path.join(dirPath, str(i))
+ with open(path, "wb") as f:
+ undo = \
+ lambda path=path: os.remove(path)
+ rollback.append(undo)
+ f.write(str(i))
+
+ if excClass is not None:
+ raise excClass("context error")
+
+ return dirPath
+
+ def testExceptionInContext(self):
+ def exceptionInContext():
+ with self.tempfiles(10, ContextError):
+ pass
+
+ self.assertRaises(ContextError, exceptionInContext)
+ # Directory and files should be removed
+ self.assertEquals(glob.glob(self.tmpdirPrefix + "*"), [])
+
+ def testExceptionInConsumer(self):
+ def exceptionInConsumer():
+ with self.tempfiles(10, None):
+ raise ConsumerError("consumer error")
+
+ self.assertRaises(ConsumerError, exceptionInConsumer)
+ # Directory and files should be removed
+ self.assertEquals(glob.glob(self.tmpdirPrefix + "*"), [])
+
+ def testNormalConsumer(self):
+ fileCount = 10
+ with self.tempfiles(fileCount, None) as dirPath:
+ for i in range(0, fileCount):
+ with open(os.path.join(dirPath, str(i)), "rb") as f:
+ self.assertEquals(int(f.read()), i)
+ # Directory and files should be removed
+ self.assertEquals(glob.glob(self.tmpdirPrefix + "*"), [])
diff --git a/tests/testrunner.py b/tests/testrunner.py
index cdbc9d3..f9cc323 100644
--- a/tests/testrunner.py
+++ b/tests/testrunner.py
@@ -22,6 +22,7 @@
import os
import unittest
from functools import wraps
+from contextlib import contextmanager
from nose import config
from nose import core
@@ -239,6 +240,80 @@
return False
+def rollbackManager(transaction):
+ '''
+ A contextmanager-like manager for easy undoing. It's an upgraded
+ contextlib.contextmanager and can manage a variable number of contextes.
+
+ It is used as a decorator to a function. There must exist a parameter
+ named "rollback" of the decorated function. Then the function can treat
+ the "rollback" as a list and append undo operations(lambdas, closures, ...)
+ to the list. The function will be put in the "with" statement, the return
+ value of the function will be assigned to the "as" variable. If an
+ exception is raised, whether it's raised in the function or in the block
+ under the "with" statement, the registered undo operations will be played
+ in reverse order. When peforming rollback, exceptions will be swalloweded
+ to let rollback continue, at last, the earliest exception with original
+ line number and stack trace infomation will be raised.
+
+ Simple example:
+ _________________________________________
+ @rollbackManager
+ def foo(a, b, rollback):
+ x = allocate_X(a)
+ rollback.append(lambda: release_X(x))
+
+ # Need not to catch the exception when allocating Y
+ # and release x in a "try..final" block.
+ # The rollback Manager will do that.
+ y = allocate_Y_using(x)
+ rollback.append(lambda: release_Y(y))
+
+ # Need not to catch the exception when computing z
+ # and release x, y. Let rollback Manager do it for you.
+ z = do_something_with(x, y)
+ return z
+
+ with foo(blah1, blah2) as z:
+ visit(z)
+ _________________________________________
+ When the "with" block is exited, resource y will be released first, then
+ resource x. If exception is raised when constructing y, then only the
+ allocated x will be released, and the original exception will be re-raised.
+ '''
+
+ @contextmanager
+ def wrapper(*args, **kwargs):
+ rollback = []
+ exception = None
+ traceback = None
+ try:
+ yield transaction(rollback=rollback, *args, **kwargs)
+ except Exception as e:
+ # keep the original exception and traceback info
+ exception = e
+ traceback = sys.exc_info()[2]
+ finally:
+ rollback.reverse()
+ _playRollback(rollback, exception, traceback)
+ return wrapper
+
+
+def _playRollback(rollback, exception=None, traceback=None):
+ for undo in rollback:
+ try:
+ undo()
+ except Exception as e:
+ # keep the earliest exception info
+ if not exception:
+ exception = e
+ # keep the original traceback info
+ traceback = sys.exc_info()[2]
+ # re-raise the earliest exception
+ if exception:
+ raise exception, None, traceback
+
+
if __name__ == '__main__':
if "--help" in sys.argv:
print("testrunner options:\n"
--
To view, visit http://gerrit.ovirt.org/8671
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibc932637dd81c3becf92de34ea647c1cea136111
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
11 years, 7 months
Change in vdsm[master]: add and use hypervisor autodetection in bootstrap.
by Alon Bar-Lev
Alon Bar-Lev has posted comments on this change.
Change subject: add and use hypervisor autodetection in bootstrap.
......................................................................
Patch Set 5: I would prefer that you didn't submit this
Hello,
I use nested kvm and the hardware detection works just fine, why shouldn't this work with other hypervisors?
plain qemu: add the following at command-line:
-cpu core2duo,+vmx
And even if is not, I don't think that placing a file at host before bootstrap in these debug cases is something that worth the extra complexity.
Alon
--
To view, visit http://gerrit.ovirt.org/7657
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: comment
Gerrit-Change-Id: I79f4ab08b838bd75af5d4c26f98923fca0d65d8e
Gerrit-PatchSet: 5
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Francesco Romani <fromani(a)gmail.com>
Gerrit-Reviewer: Alon Bar-Lev <alonbl(a)redhat.com>
Gerrit-Reviewer: Antoni Segura Puimedon <asegurap(a)redhat.com>
Gerrit-Reviewer: Dan Kenigsberg <danken(a)redhat.com>
Gerrit-Reviewer: Douglas Schilling Landgraf <dougsland(a)redhat.com>
Gerrit-Reviewer: Francesco Romani <fromani(a)gmail.com>
Gerrit-Reviewer: Ryan Harper <ryanh(a)us.ibm.com>
Gerrit-Reviewer: Shu Ming <shuming(a)linux.vnet.ibm.com>
Gerrit-Reviewer: oVirt Jenkins CI Server
11 years, 7 months
Change in vdsm[master]: [wip] pool: refresh multipath on connectStoragePool
by Federico Simoncelli
Federico Simoncelli has uploaded a new change for review.
Change subject: [wip] pool: refresh multipath on connectStoragePool
......................................................................
[wip] pool: refresh multipath on connectStoragePool
On connectStoragePool we should rescan the iscsi connections to
reactivate them in case they were previously interrupted.
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=870768
Change-Id: Ie26a7a2577b65d3fb70586a849e0245e64344e3b
Signed-off-by: Federico Simoncelli <fsimonce(a)redhat.com>
---
M vdsm/storage/sp.py
1 file changed, 1 insertion(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/75/9275/1
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index fdd146c..ffe1b92 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -639,7 +639,7 @@
self.id = hostID
self.scsiKey = scsiKey
# Make sure SDCache doesn't have stale data (it can be in case of FC)
- sdCache.refresh()
+ sdCache.invalidateStorage()
# Rebuild whole Pool
self.__rebuild(msdUUID=msdUUID, masterVersion=masterVersion)
self.__createMailboxMonitor()
--
To view, visit http://gerrit.ovirt.org/9275
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie26a7a2577b65d3fb70586a849e0245e64344e3b
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce(a)redhat.com>
11 years, 7 months
Change in vdsm[master]: mom: Add mom package version to vdsCapabilities
by agl@us.ibm.com
Adam Litke has uploaded a new change for review.
Change subject: mom: Add mom package version to vdsCapabilities
......................................................................
mom: Add mom package version to vdsCapabilities
Change-Id: I764e48f6df33d6e46f89ca8b7324b0e5e8d146f6
Signed-off-by: Adam Litke <agl(a)us.ibm.com>
---
M vdsm/caps.py
M vdsm_api/vdsmapi-schema.json
2 files changed, 6 insertions(+), 3 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/86/9286/1
diff --git a/vdsm/caps.py b/vdsm/caps.py
index cfe4caf..9fe360f 100644
--- a/vdsm/caps.py
+++ b/vdsm/caps.py
@@ -331,7 +331,7 @@
if getos() in (OSName.RHEVH, OSName.OVIRT, OSName.FEDORA, OSName.RHEL):
KEY_PACKAGES = ['qemu-kvm', 'qemu-img',
- 'vdsm', 'spice-server', 'libvirt']
+ 'vdsm', 'spice-server', 'libvirt', 'mom']
try:
ts = rpm.TransactionSet()
@@ -353,7 +353,7 @@
elif getos() == OSName.DEBIAN and python_apt:
KEY_PACKAGES = {'qemu-kvm': 'qemu-kvm', 'qemu-img': 'qemu-utils',
'vdsm': 'vdsmd', 'spice-server': 'libspice-server1',
- 'libvirt': 'libvirt0'}
+ 'libvirt': 'libvirt0', 'mom': 'nom'}
cache = apt.Cache()
diff --git a/vdsm_api/vdsmapi-schema.json b/vdsm_api/vdsmapi-schema.json
index cf6ca1f..6591410 100644
--- a/vdsm_api/vdsmapi-schema.json
+++ b/vdsm_api/vdsmapi-schema.json
@@ -706,10 +706,13 @@
#
# @libvirt: Low level virtualization API
#
+# @mom: Dynamically manage system resources on virtualization hosts
+#
# Since: 4.10.0
##
{'enum': 'SoftwarePackage',
- 'data': ['kernel', 'qemu-kvm', 'qemu-img', 'vdsm', 'spice-server', 'libvirt']}
+ 'data': ['kernel', 'qemu-kvm', 'qemu-img', 'vdsm', 'spice-server', 'libvirt',
+ 'mom']}
##
# @SoftwarePackageInfo:
--
To view, visit http://gerrit.ovirt.org/9286
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I764e48f6df33d6e46f89ca8b7324b0e5e8d146f6
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Adam Litke <agl(a)us.ibm.com>
11 years, 7 months
Change in vdsm[master]: GERRIT JENKINS TEST, DON'T REVIEW
by smizrahi@redhat.com
Saggi Mizrahi has uploaded a new change for review.
Change subject: GERRIT JENKINS TEST, DON'T REVIEW
......................................................................
GERRIT JENKINS TEST, DON'T REVIEW
Change-Id: I3a0043dd14ed35dcb4c5edcf1c22425e521bee39
Signed-off-by: Saggi Mizrahi <smizrahi(a)redhat.com>
---
M vdsm/mkimage.py
1 file changed, 1 insertion(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/47/9247/1
diff --git a/vdsm/mkimage.py b/vdsm/mkimage.py
index 4eb46e5..0ae4fee 100644
--- a/vdsm/mkimage.py
+++ b/vdsm/mkimage.py
@@ -46,7 +46,7 @@
for name, content in files.iteritems():
filename = os.path.join(dirname, name)
- with file(filename, 'w') as f: f.write(base64.b64decode(content))
+ with file(filename, 'wb') as f: f.write(base64.b64decode(content))
def _commonCleanFs(dirname, media):
if media is not None:
--
To view, visit http://gerrit.ovirt.org/9247
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3a0043dd14ed35dcb4c5edcf1c22425e521bee39
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Saggi Mizrahi <smizrahi(a)redhat.com>
11 years, 7 months
Change in vdsm[master]: Adding support for force extend block domains
by derez@redhat.com
Daniel Erez has uploaded a new change for review.
Change subject: Adding support for force extend block domains
......................................................................
Adding support for force extend block domains
Passing 'force' flag through extendStorageDomain
to enable block storage domain extend enforcement
(_initipvs already accepts the 'force' flag).
Change-Id: I33ad4ee65d7303705d2cc8370502553125000ca0
Signed-off-by: Daniel Erez <derez(a)redhat.com>
---
M vdsm/API.py
M vdsm/BindingXMLRPC.py
M vdsm/storage/blockSD.py
M vdsm/storage/hsm.py
M vdsm/storage/lvm.py
M vdsm/storage/sd.py
M vdsm/storage/sp.py
7 files changed, 13 insertions(+), 13 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/92/9192/1
diff --git a/vdsm/API.py b/vdsm/API.py
index e3909e9..202afc8 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -847,9 +847,9 @@
return self._irs.detachStorageDomain(self._UUID,
self._spUUID, masterSdUUID, masterVersion)
- def extend(self, devlist):
+ def extend(self, devlist, force=False):
return self._irs.extendStorageDomain(self._UUID,
- self._spUUID, devlist)
+ self._spUUID, devlist, force)
def format(self, autoDetach):
return self._irs.formatStorageDomain(self._UUID, autoDetach)
diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index b833cf3..d460910 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -409,9 +409,9 @@
domain = API.StorageDomain(sdUUID, spUUID)
return domain.detach(None, None, force=True)
- def domainExtend(self, sdUUID, spUUID, devlist, options=None):
+ def domainExtend(self, sdUUID, spUUID, devlist, force=False, options=None):
domain = API.StorageDomain(sdUUID, spUUID)
- return domain.extend(devlist)
+ return domain.extend(devlist, force)
def domainFormat(self, sdUUID,
autoDetach=False, options=None):
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index 26d4380..e042d4d 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -676,7 +676,7 @@
else:
del self._metadata[key]
- def extend(self, devlist):
+ def extend(self, devlist, force=False):
mapping = self.readMetadataMapping().values()
if self.getVersion() in VERS_METADATA_LV:
if len(mapping) + len(devlist) > MAX_PVS:
@@ -694,7 +694,7 @@
else:
raise se.InvalidPhysDev(dev)
- lvm.extendVG(self.sdUUID, devices)
+ lvm.extendVG(self.sdUUID, devices, force)
self.updateMapping()
newsize = self.metaSize(self.sdUUID)
lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index 4d696bf..9052e68 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -620,7 +620,7 @@
pool.extendVolume(sdUUID, volumeUUID, size, isShuttingDown)
@public
- def extendStorageDomain(self, sdUUID, spUUID, devlist, options = None):
+ def extendStorageDomain(self, sdUUID, spUUID, devlist, force=False, options = None):
"""
Extends a VG. ?
@@ -641,7 +641,7 @@
vars.task.getExclusiveLock(STORAGE, sdUUID)
# We need to let the domain to extend itself
pool = self.getPool(spUUID)
- pool.extendSD(sdUUID, devlist)
+ pool.extendSD(sdUUID, devlist, force)
@public
def forcedDetachStorageDomain(self, sdUUID, spUUID, options = None):
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index b3abc2c..49ded26 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -901,12 +901,12 @@
removeVG(vg.name)
-def extendVG(vgName, devices):
+def extendVG(vgName, devices, force=False):
pvs = [_fqpvname(pdev) for pdev in _normalizeargs(devices)]
_checkpvsblksize(pvs, getVGBlockSizes(vgName))
vg = _lvminfo.getVg(vgName)
#Format extension PVs as all the other already in the VG
- _initpvs(pvs, int(vg.vg_mda_size) / 2 ** 20)
+ _initpvs(pvs, int(vg.vg_mda_size) / 2 ** 20, force)
cmd = ["vgextend", vgName] + pvs
rc, out, err = _lvminfo.cmd(cmd)
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index 17b6ada..cbd2d30 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -742,7 +742,7 @@
def refresh(self):
pass
- def extend(self, devlist):
+ def extend(self, devlist, force=False):
pass
def isMaster(self):
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index c9489b8..93fbe10 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -2078,6 +2078,6 @@
repoPath = os.path.join(self.storage_repository, self.spUUID)
image.Image(repoPath).validateVolumeChain(sdUUID, imgUUID)
- def extendSD(self, sdUUID, devlist):
- sdCache.produce(sdUUID).extend(devlist)
+ def extendSD(self, sdUUID, devlist, force=False):
+ sdCache.produce(sdUUID).extend(devlist, force)
--
To view, visit http://gerrit.ovirt.org/9192
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I33ad4ee65d7303705d2cc8370502553125000ca0
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <derez(a)redhat.com>
11 years, 7 months