Hello Shu Ming,
I'd like you to do a code review. Please visit
to review the following change.
Change subject: split config file for HSM service standalone ......................................................................
split config file for HSM service standalone
Split config.py of vdsm, irs section was moved to hsm config.py Create a separate python site-packages for hsm config.py Split vdsm.conf, irs section was moved to hsm.conf The hsm.conf was still install in the vdsm config path The hsm.conf.sample was still install in the vdsm doc patch In order to run the locole test, hackVdsmModule of testrunner This is one of step to make HSM service standalone
wiki-page: http://wiki.ovirt.org/wiki/HSM_service_stand_alone
Change-Id: I731f74fff44ac8e75e336d2e41e696aa586c967b Signed-off-by: Shu Ming shuming@linux.vnet.ibm.com Signed-off-by: ShaoHe Feng shaohef@linux.vnet.ibm.com --- M .gitignore M configure.ac M tests/testrunner.py M vdsm.spec.in M vdsm/clientIF.py M vdsm/config.py.in M vdsm/libvirtvm.py M vdsm/storage/Makefile.am M vdsm/storage/blockSD.py M vdsm/storage/blockVolume.py A vdsm/storage/config.py.in M vdsm/storage/dispatcher.py M vdsm/storage/domainMonitor.py M vdsm/storage/fileVolume.py M vdsm/storage/hsm.py M vdsm/storage/image.py M vdsm/storage/iscsi.py M vdsm/storage/lvm.py M vdsm/storage/outOfProcess.py M vdsm/storage/resourceFactories.py M vdsm/storage/safelease.py M vdsm/storage/sd.py M vdsm/storage/sdc.py M vdsm/storage/sp.py M vdsm/storage/storage_mailbox.py M vdsm/storage/task.py M vdsm/storage/taskManager.py M vdsm/supervdsmServer.py M vdsm/utils.py 29 files changed, 217 insertions(+), 120 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/63/10363/1
diff --git a/.gitignore b/.gitignore index d36ed82..618cfdc 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ vdsm/mk_sysprep_floppy vdsm/mom.conf vdsm/sos/vdsm.py +vdsm/storage/config.py vdsm/storage/protect/safelease vdsm/sudoers.vdsm vdsm/vdsm-gencerts.sh diff --git a/configure.ac b/configure.ac index a6265b5..1aee172 100644 --- a/configure.ac +++ b/configure.ac @@ -81,6 +81,9 @@ AC_SUBST([vdsmtestsdir], ['${datarootdir}/vdsm/tests']) AC_SUBST([vdsmapidir], ['${datarootdir}/vdsm_api'])
+# HSM default paths +AC_SUBST([hsmpylibdir], ['${pyexecdir}/hsmd']) + # VDSM registration default paths AC_SUBST([vdsmregdir], ['${datarootdir}/vdsm-reg']) AC_SUBST([vdsmbootstrapdir], ['${datarootdir}/vdsm-bootstrap']) diff --git a/tests/testrunner.py b/tests/testrunner.py index ae562a4..c0bf896 100644 --- a/tests/testrunner.py +++ b/tests/testrunner.py @@ -244,6 +244,10 @@
def hackVdsmModule(): + # this hack should be removed after the hsm service standalone was done + sub = __import__('storage', globals(), locals(), [], -1) + sys.modules['hsmd'] = sub + sys.modules['vdsm'] = mod = vdsm()
for name in ('config', 'constants', 'utils', 'define', 'netinfo', diff --git a/vdsm.spec.in b/vdsm.spec.in index b942b7a..2d2c04d 100644 --- a/vdsm.spec.in +++ b/vdsm.spec.in @@ -1,5 +1,6 @@ # Packages names %global vdsm_name vdsm +%global hsm_name hsmd %global vdsm_bootstrap vdsm-bootstrap %global vdsm_reg vdsm-reg
@@ -454,6 +455,8 @@ # Install the configuration sample install -Dm 0644 vdsm/vdsm.conf.sample \ %{buildroot}%{_sysconfdir}/vdsm/vdsm.conf +install -Dm 0644 vdsm/storage/hsm.conf.sample \ + %{buildroot}%{_sysconfdir}/vdsm/hsm.conf
# Install the systemd scripts install -Dm 0755 vdsm/vdsmd.init %{buildroot}/lib/systemd/systemd-vdsmd @@ -608,6 +611,7 @@ %files %defattr(-, root, root, -) %doc COPYING README vdsm/vdsm.conf.sample vdsm_api/vdsm-api.html +%doc COPYING README vdsm/storage/hsm.conf.sample %if 0%{?rhel} %{_initrddir}/vdsmd %else @@ -780,6 +784,7 @@ %{_bindir}/vdsm-tool %if !0%{?rhel} %config(noreplace) %{_sysconfdir}/%{vdsm_name}/vdsm.conf +%config(noreplace) %{_sysconfdir}/%{vdsm_name}/hsm.conf %endif %{python_sitearch}/%{vdsm_name}/__init__.py* %{python_sitearch}/%{vdsm_name}/config.py* @@ -799,6 +804,8 @@ %{python_sitearch}/%{vdsm_name}/tool/passwd.py* %{python_sitearch}/%{vdsm_name}/tool/seboolsetup.py* %{python_sitearch}/%{vdsm_name}/tool/validate_ovirt_certs.py* +%{python_sitearch}/%{hsm_name}/__init__.py* +%{python_sitearch}/%{hsm_name}/config.py*
%files tests %doc %{_datadir}/%{vdsm_name}/tests/README diff --git a/vdsm/clientIF.py b/vdsm/clientIF.py index 5e034a1..315530b 100644 --- a/vdsm/clientIF.py +++ b/vdsm/clientIF.py @@ -28,6 +28,7 @@ from storage.dispatcher import Dispatcher from storage.hsm import HSM from vdsm.config import config +from hsmd.config import config as hsmconfig import ksm from momIF import MomThread, isMomAvailable from vdsm import netinfo @@ -247,7 +248,7 @@
def _initIRS(self): self.irs = None - if config.getboolean('irs', 'irs_enable'): + if hsmconfig.getboolean('irs', 'irs_enable'): try: self.irs = Dispatcher(HSM()) except: diff --git a/vdsm/config.py.in b/vdsm/config.py.in index a4669b0..744625a 100644 --- a/vdsm/config.py.in +++ b/vdsm/config.py.in @@ -152,98 +152,6 @@
]),
- # Section: [irs] - ('irs', [ - - ('irs_enable', 'true', None), - - ('repository', '@VDSMREPO@', - 'Image repository.'), - - ('hsm_tasks', '%(repository)s/hsm-tasks', None), - - ('images', '/images', None), - - ('irsd', '%(images)s/irsd', None), - - ('images_check_times', '0', - 'Image repository check period (seconds).'), - - ('volume_utilization_percent', '50', None), - - ('volume_utilization_chunk_mb', '1024', None), - - ('vol_size_sample_interval', '60', - 'How often should the volume size be checked (seconds).'), - - ('sd_validate_timeout', '80', - 'Storage domain validate timeout, the maximum number of seconds ' - 'to wait until all the domains will be validated.'), - - ('scsi_rescan_minimal_timeout', '2', - 'The minimum number of seconds to wait for scsi scan to return.'), - - ('scsi_rescan_maximal_timeout', '30', - 'The maximal number of seconds to wait for scsi scan to return.'), - - ('sd_health_check_delay', '10', - 'Storage domain health check delay, the amount of seconds to ' - 'wait between two successive run of the domain health check.'), - - ('nfs_mount_options', 'soft,nosharecache', - 'NFS mount options, comma-separated list (NB: no white space ' - 'allowed!)'), - - ('pools_data_dir', '@POOLSDIR@', None), - - ('vol_extend_policy', 'ON', None), - - ('lock_util_path', '@LIBEXECDIR@', None), - - ('lock_cmd', 'spmprotect.sh', None), - - ('free_lock_cmd', 'spmstop.sh', None), - - ('thread_pool_size', '10', None), - - ('max_tasks', '500', None), - - ('lvm_dev_whitelist', '', None), - - ('md_backup_versions', '30', None), - - ('md_backup_dir', '@BACKUPDIR@', None), - - ('maximum_allowed_pvs', '8', - 'The number of PVs per VG has a hard-coded limit of 10.'), - - ('repo_stats_cache_refresh_timeout', '300', None), - - ('task_resource_default_timeout', '120000', None), - - ('prepare_image_timeout', '600000', None), - - ('gc_blocker_force_collect_interval', '60', None), - - ('maximum_domains_in_pool', '100', - 'Process pool configuration.'), - - ('process_pool_size', '100', None), - - ('process_pool_timeout', '60', None), - - ('process_pool_grace_period', '2', None), - - ('process_pool_max_slots_per_domain', '10', None), - - ('iscsi_default_ifaces', 'default', - 'Comma seperated ifaces to connect with. ' - 'i.e. iser,default'), - - ('use_volume_leases', 'false', - 'Whether to use the volume leases or not.'), - ]), - # Section: [addresses] ('addresses', [
diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py index c089745..2d93a56 100644 --- a/vdsm/libvirtvm.py +++ b/vdsm/libvirtvm.py @@ -33,6 +33,7 @@ import guestIF from vdsm import libvirtconnection from vdsm.config import config +from hsmd.config import config as hsmconfig import hooks import caps from vdsm import netinfo @@ -92,7 +93,7 @@ self.updateVolumes = ( utils.AdvancedStatsFunction( self._updateVolumes, - config.getint('irs', 'vol_size_sample_interval'))) + hsmconfig.getint('irs', 'vol_size_sample_interval')))
self.sampleCpu = ( utils.AdvancedStatsFunction( @@ -1048,8 +1049,9 @@
class Drive(LibvirtVmDevice): - VOLWM_CHUNK_MB = config.getint('irs', 'volume_utilization_chunk_mb') - VOLWM_FREE_PCT = 100 - config.getint('irs', 'volume_utilization_percent') + VOLWM_CHUNK_MB = hsmconfig.getint('irs', 'volume_utilization_chunk_mb') + VOLWM_FREE_PCT = 100 - hsmconfig.getint('irs', + 'volume_utilization_percent') VOLWM_CHUNK_REPLICATE_MULT = 2 # Chunk multiplier during replication
def __init__(self, conf, log, **kwargs): @@ -2492,7 +2494,7 @@ #D. Berrange capacity, alloc, physical = self._dom.blockInfo(d.path, 0) if (physical > - (alloc + config.getint( + (alloc + hsmconfig.getint( 'irs', 'volume_utilization_chunk_mb'))): self.log.warn('%s = %s/%s error %s phys: %s alloc: %s ' 'Ingnoring already managed event.', diff --git a/vdsm/storage/Makefile.am b/vdsm/storage/Makefile.am index cff09be..9af470e 100644 --- a/vdsm/storage/Makefile.am +++ b/vdsm/storage/Makefile.am @@ -20,6 +20,8 @@
SUBDIRS = protect imageRepository
+include $(top_srcdir)/build-aux/Makefile.subs + vdsmstoragedir = $(vdsmdir)/storage dist_vdsmstorage_PYTHON = \ __init__.py \ @@ -64,8 +66,29 @@ threadPool.py \ volume.py
+dist_hsmpylib_PYTHON = \ + __init__.py + +nodist_hsmpylib_PYTHON = \ + config.py + +nodist_noinst_DATA = \ + hsm.conf.sample + +CLEANFILES = \ + $(nodist_noinst_DATA) \ + $(nodist_hsmpylib_PYTHON) + EXTRA_DIST = \ - 12-vdsm-lvm.rules + 12-vdsm-lvm.rules \ + config.py.in + +hsm.conf.sample: Makefile config.py + @echo " CONFIG $@"; $(PYTHON) $(builddir)/config.py > $@ + +all-local: \ + $(nodist_noinst_DATA) \ + $(nodist_hsmpylib_PYTHON)
check-local: PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(srcdir)/storage_exception.py diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py index 22a434b..7fd35fd 100644 --- a/vdsm/storage/blockSD.py +++ b/vdsm/storage/blockSD.py @@ -31,7 +31,7 @@ from collections import namedtuple from operator import itemgetter
-from vdsm.config import config +from hsmd.config import config from vdsm import constants import misc import fileUtils diff --git a/vdsm/storage/blockVolume.py b/vdsm/storage/blockVolume.py index 186ca95..d9be382 100644 --- a/vdsm/storage/blockVolume.py +++ b/vdsm/storage/blockVolume.py @@ -23,7 +23,7 @@ import logging import sanlock
-from vdsm.config import config +from hsmd.config import config import storage_exception as se import volume import image diff --git a/vdsm/storage/config.py.in b/vdsm/storage/config.py.in new file mode 100644 index 0000000..160c022 --- /dev/null +++ b/vdsm/storage/config.py.in @@ -0,0 +1,148 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# 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 os +import textwrap +import ConfigParser + +parameters = [ + # Section: [irs] + ('irs', [ + + ('irs_enable', 'true', None), + + ('repository', '@VDSMREPO@', + 'Image repository.'), + + ('hsm_tasks', '%(repository)s/hsm-tasks', None), + + ('images', '/images', None), + + ('irsd', '%(images)s/irsd', None), + + ('images_check_times', '0', + 'Image repository check period (seconds).'), + + ('volume_utilization_percent', '50', None), + + ('volume_utilization_chunk_mb', '1024', None), + + ('vol_size_sample_interval', '60', + 'How often should the volume size be checked (seconds).'), + + ('sd_validate_timeout', '80', + 'Storage domain validate timeout, the maximum number of seconds ' + 'to wait until all the domains will be validated.'), + + ('scsi_rescan_minimal_timeout', '2', + 'The minimum number of seconds to wait for scsi scan to return.'), + + ('scsi_rescan_maximal_timeout', '30', + 'The maximal number of seconds to wait for scsi scan to return.'), + + ('sd_health_check_delay', '10', + 'Storage domain health check delay, the amount of seconds to ' + 'wait between two successive run of the domain health check.'), + + ('nfs_mount_options', 'soft,nosharecache', + 'NFS mount options, comma-separated list (NB: no white space ' + 'allowed!)'), + + ('pools_data_dir', '@POOLSDIR@', None), + + ('vol_extend_policy', 'ON', None), + + ('lock_util_path', '@LIBEXECDIR@', None), + + ('lock_cmd', 'spmprotect.sh', None), + + ('free_lock_cmd', 'spmstop.sh', None), + + ('thread_pool_size', '10', None), + + ('max_tasks', '500', None), + + ('lvm_dev_whitelist', '', None), + + ('md_backup_versions', '30', None), + + ('md_backup_dir', '@BACKUPDIR@', None), + + ('maximum_allowed_pvs', '8', + 'The number of PVs per VG has a hard-coded limit of 10.'), + + ('repo_stats_cache_refresh_timeout', '300', None), + + ('task_resource_default_timeout', '120000', None), + + ('prepare_image_timeout', '600000', None), + + ('gc_blocker_force_collect_interval', '60', None), + + ('maximum_domains_in_pool', '100', + 'Process pool configuration.'), + + ('process_pool_size', '100', None), + + ('process_pool_timeout', '60', None), + + ('process_pool_grace_period', '2', None), + + ('process_pool_max_slots_per_domain', '10', None), + + ('iscsi_default_ifaces', 'default', + 'Comma seperated ifaces to connect with. ' + 'i.e. iser,default'), + + ('use_volume_leases', 'false', + 'Whether to use the volume leases or not.'), + ]), +] + + +def __prepare_config(): + global config + + for section, keylist in parameters: + config.add_section(section) + for key, value, comment in keylist: + config.set(section, key, value) + +def print_config(): + twp = textwrap.TextWrapper(initial_indent='# ', subsequent_indent='# ') + + print twp.fill("HSM Sample Configuration") + print + + for section, keylist in parameters: + print "[%s]\n" % section + + for key, value, comment in keylist: + if comment: + print twp.fill(comment) + print twp.fill("%s = %s" % (key, value)) + print + +config = ConfigParser.ConfigParser() +__prepare_config() +config.read([os.path.join('@CONFDIR@', 'hsm.conf')]) + +if __name__ == '__main__': + print_config() diff --git a/vdsm/storage/dispatcher.py b/vdsm/storage/dispatcher.py index 7c765a2..9eb7b03 100644 --- a/vdsm/storage/dispatcher.py +++ b/vdsm/storage/dispatcher.py @@ -19,7 +19,7 @@ #
import logging -from vdsm.config import config +from hsmd.config import config
import task import storage_exception as se diff --git a/vdsm/storage/domainMonitor.py b/vdsm/storage/domainMonitor.py index 6f333ee..858a450 100644 --- a/vdsm/storage/domainMonitor.py +++ b/vdsm/storage/domainMonitor.py @@ -24,7 +24,7 @@
import logging import misc -from vdsm.config import config +from hsmd.config import config from sdc import sdCache
diff --git a/vdsm/storage/fileVolume.py b/vdsm/storage/fileVolume.py index 2aab4d4..19405b3 100644 --- a/vdsm/storage/fileVolume.py +++ b/vdsm/storage/fileVolume.py @@ -23,7 +23,7 @@ import sanlock
import storage_exception as se -from vdsm.config import config +from hsmd.config import config from sdc import sdCache import outOfProcess as oop import volume diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py index efb2749..968cdd9 100644 --- a/vdsm/storage/hsm.py +++ b/vdsm/storage/hsm.py @@ -37,7 +37,7 @@ import math import stat
-from vdsm.config import config +from hsmd.config import config import sp import sd import blockSD diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py index 4364c38..cf8a385 100644 --- a/vdsm/storage/image.py +++ b/vdsm/storage/image.py @@ -29,7 +29,7 @@ import sd import misc import fileUtils -from vdsm.config import config +from hsmd.config import config import storage_exception as se import task from threadLocal import vars diff --git a/vdsm/storage/iscsi.py b/vdsm/storage/iscsi.py index dc3e30e..9a11bfd 100644 --- a/vdsm/storage/iscsi.py +++ b/vdsm/storage/iscsi.py @@ -32,7 +32,7 @@
from vdsm import constants import misc -from vdsm.config import config +from hsmd.config import config import devicemapper from threading import RLock
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py index e94f2f3..04730df 100644 --- a/vdsm/storage/lvm.py +++ b/vdsm/storage/lvm.py @@ -41,7 +41,7 @@ import misc import multipath import storage_exception as se -from vdsm.config import config +from hsmd.config import config import devicemapper
log = logging.getLogger("Storage.LVM") diff --git a/vdsm/storage/outOfProcess.py b/vdsm/storage/outOfProcess.py index c0d85d4..71ec11a 100644 --- a/vdsm/storage/outOfProcess.py +++ b/vdsm/storage/outOfProcess.py @@ -19,7 +19,7 @@ # import types
-from vdsm.config import config +from hsmd.config import config import threading from functools import partial
diff --git a/vdsm/storage/resourceFactories.py b/vdsm/storage/resourceFactories.py index f53fa35..9ef2f1c 100644 --- a/vdsm/storage/resourceFactories.py +++ b/vdsm/storage/resourceFactories.py @@ -19,7 +19,7 @@ #
import os -from vdsm.config import config +from hsmd.config import config import logging import lvm import resourceManager as rm diff --git a/vdsm/storage/safelease.py b/vdsm/storage/safelease.py index bff69fc..6662d08 100644 --- a/vdsm/storage/safelease.py +++ b/vdsm/storage/safelease.py @@ -19,7 +19,7 @@ #
import os -from vdsm.config import config +from hsmd.config import config import misc import subprocess import sanlock diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py index cfb46a0..9ccca86 100644 --- a/vdsm/storage/sd.py +++ b/vdsm/storage/sd.py @@ -35,7 +35,7 @@ import outOfProcess as oop from persistentDict import unicodeEncoder, unicodeDecoder
-from vdsm.config import config +from hsmd.config import config
DOMAIN_MNT_POINT = 'mnt' DOMAIN_META_DATA = 'dom_md' diff --git a/vdsm/storage/sdc.py b/vdsm/storage/sdc.py index f2f4534..816f95b 100644 --- a/vdsm/storage/sdc.py +++ b/vdsm/storage/sdc.py @@ -24,7 +24,7 @@ """ import logging import threading -from vdsm.config import config +from hsmd.config import config
import multipath import lvm diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py index 40d15b3..73718b5 100644 --- a/vdsm/storage/sp.py +++ b/vdsm/storage/sp.py @@ -39,7 +39,7 @@ import sd import misc import fileUtils -from vdsm.config import config +from hsmd.config import config from sdc import sdCache import storage_exception as se from persistentDict import DictValidator, unicodeEncoder, unicodeDecoder diff --git a/vdsm/storage/storage_mailbox.py b/vdsm/storage/storage_mailbox.py index 3a3a213..56e6ced 100644 --- a/vdsm/storage/storage_mailbox.py +++ b/vdsm/storage/storage_mailbox.py @@ -27,7 +27,7 @@ import logging
import uuid -from vdsm.config import config +from hsmd.config import config import sd import misc import task diff --git a/vdsm/storage/task.py b/vdsm/storage/task.py index 716c1c0..8c61618 100644 --- a/vdsm/storage/task.py +++ b/vdsm/storage/task.py @@ -56,7 +56,7 @@ import resourceManager from threadLocal import vars from weakref import proxy -from vdsm.config import config +from hsmd.config import config import outOfProcess as oop from logUtils import SimpleLogAdapter
diff --git a/vdsm/storage/taskManager.py b/vdsm/storage/taskManager.py index 3bc12f3..6ce82f2 100644 --- a/vdsm/storage/taskManager.py +++ b/vdsm/storage/taskManager.py @@ -21,7 +21,7 @@ import os import logging
-from vdsm.config import config +from hsmd.config import config import storage_exception as se from task import Task, Job, TaskCleanType from threadPool import ThreadPool diff --git a/vdsm/supervdsmServer.py b/vdsm/supervdsmServer.py index 5effd41..33e827a 100755 --- a/vdsm/supervdsmServer.py +++ b/vdsm/supervdsmServer.py @@ -50,7 +50,7 @@ DISKIMAGE_USER, DISKIMAGE_GROUP, P_LIBVIRT_VMCHANNELS from storage.devicemapper import _removeMapping, _getPathsStatus import configNetwork -from vdsm.config import config +from hsmd.config import config as hsmconfig import tc import ksm import mkimage @@ -63,7 +63,7 @@ _UDEV_RULE_FILE_NAME = _UDEV_RULE_FILE_DIR + _UDEV_RULE_FILE_PREFIX + \ "%s-%s" + _UDEV_RULE_FILE_EXT
-RUN_AS_TIMEOUT = config.getint("irs", "process_pool_timeout") +RUN_AS_TIMEOUT = hsmconfig.getint("irs", "process_pool_timeout")
class Timeout(RuntimeError): diff --git a/vdsm/utils.py b/vdsm/utils.py index 4b6101d..b9d9bf6 100644 --- a/vdsm/utils.py +++ b/vdsm/utils.py @@ -43,7 +43,7 @@ import ethtool
import constants -from config import config +from hsmd.config import config as hsmconfig
_THP_STATE_PATH = '/sys/kernel/mm/transparent_hugepage/enabled' if not os.path.exists(_THP_STATE_PATH): @@ -648,7 +648,7 @@ class ImagePathStatus(threading.Thread): def __init__(self, cif, interval=None): if interval is None: - interval = config.getint('irs', 'images_check_times') + interval = hsmconfig.getint('irs', 'images_check_times') self._interval = interval self._cif = cif self.storageDomains = {}
-- To view, visit http://gerrit.ovirt.org/10363 To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange Gerrit-Change-Id: I731f74fff44ac8e75e336d2e41e696aa586c967b Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: ShaoHe Feng shaohef@linux.vnet.ibm.com Gerrit-Reviewer: Shu Ming shuming@linux.vnet.ibm.com