Federico Simoncelli has uploaded a new change for review.
Change subject: Revert "Introducing configurator package in vdsm-tool"
......................................................................
Revert "Introducing configurator package in vdsm-tool"
This reverts commit 89d70a90288ba233eb760e78e2e59a96bdfb985f.
Change-Id: I8bd71a1e9a62ce5e76b2131a9cec55f02bfa8de1
Signed-off-by: Federico Simoncelli <fsimonce(a)redhat.com>
---
M debian/vdsm-python.install
M init/systemd/systemd-vdsmd.in
M init/sysvinit/vdsmd.init.in
M init/vdsmd_init_common.sh.in
M lib/vdsm/tool/Makefile.am
D lib/vdsm/tool/configurator.py
A lib/vdsm/tool/libvirt_configure.py
M lib/vdsm/tool/libvirt_configure.sh.in
A lib/vdsm/tool/sanlock.py
M vdsm.spec.in
10 files changed, 218 insertions(+), 316 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/49/21849/1
diff --git a/debian/vdsm-python.install b/debian/vdsm-python.install
index 5901152..7b695f3 100644
--- a/debian/vdsm-python.install
+++ b/debian/vdsm-python.install
@@ -13,11 +13,12 @@
./usr/lib/python2.7/dist-packages/vdsm/qemuImg.py
./usr/lib/python2.7/dist-packages/vdsm/tool/__init__.py
./usr/lib/python2.7/dist-packages/vdsm/tool/dummybr.py
-./usr/lib/python2.7/dist-packages/vdsm/tool/configurator.py
+./usr/lib/python2.7/dist-packages/vdsm/tool/libvirt_configure.py
./usr/lib/python2.7/dist-packages/vdsm/tool/load_needed_modules.py
./usr/lib/python2.7/dist-packages/vdsm/tool/nwfilter.py
./usr/lib/python2.7/dist-packages/vdsm/tool/passwd.py
./usr/lib/python2.7/dist-packages/vdsm/tool/restore_nets.py
+./usr/lib/python2.7/dist-packages/vdsm/tool/sanlock.py
./usr/lib/python2.7/dist-packages/vdsm/tool/seboolsetup.py
./usr/lib/python2.7/dist-packages/vdsm/tool/service.py
./usr/lib/python2.7/dist-packages/vdsm/tool/transient.py
diff --git a/init/systemd/systemd-vdsmd.in b/init/systemd/systemd-vdsmd.in
index a502b62..692e5eb 100644
--- a/init/systemd/systemd-vdsmd.in
+++ b/init/systemd/systemd-vdsmd.in
@@ -26,6 +26,5 @@
[ "$1" != "reconfigure" ] && usage_exit
[ -n "$2" -a "$2" != "force" ] && usage_exit
-if [ "$2" = "force" ] || ! "@BINDIR@/vdsm-tool"
is-configured; then
- "@BINDIR@/vdsm-tool" configure --force
-fi
+"@BINDIR@/vdsm-tool" libvirt-configure ${2:+--force} &&
+ "@BINDIR@/vdsm-tool" libvirt-configure-services-restart
diff --git a/init/sysvinit/vdsmd.init.in b/init/sysvinit/vdsmd.init.in
index ea1ea85..4a4fc7d 100755
--- a/init/sysvinit/vdsmd.init.in
+++ b/init/sysvinit/vdsmd.init.in
@@ -108,10 +108,11 @@
return 1
}
-reconfigure() {
- if [ "${1}" = "force" ] || ! "$VDSM_TOOL"
is-configured; then
- "$VDSM_TOOL" configure "--force"
- fi
+reconfigure_libvirt() {
+ local force
+ [ "${1}" = "force" ] && force="--force"
+ "$VDSM_TOOL" libvirt-configure ${force} &&
+ "$VDSM_TOOL" libvirt-configure-services-restart
}
start() {
@@ -205,11 +206,11 @@
reconfigure)
# Jump over 'reconfigure'
shift 1
- reconfigure "$@"
+ reconfigure_libvirt "$@"
RETVAL=$?
;;
*)
- echo "Usage: $0
{start|stop|status|restart|force-reload|try-restart|condrestart}"
+ echo "Usage: $0 {start|stop|status|restart|force-reload|try-restart}"
RETVAL=2
esac
diff --git a/init/vdsmd_init_common.sh.in b/init/vdsmd_init_common.sh.in
index dde9a71..9d9a5ba 100644
--- a/init/vdsmd_init_common.sh.in
+++ b/init/vdsmd_init_common.sh.in
@@ -46,8 +46,29 @@
}
-task_check_is_configured() {
- "$VDSM_TOOL" is-configured
+task_reconfigure_sanlock() {
+ _reconfigure_sanlock
+}
+
+_reconfigure_sanlock() {
+ # If sanlock was started before the *first* installation of vdsm
+ # then it is probably missing the supplementary groups.
+ # Here we attempt to restart the service (when needed) to refresh
+ # the groups.
+ "$VDSM_TOOL" sanlock-check-service
+ if [ $? != 0 ]; then
+ echo -n "Attempting to restart sanlock service:"
+ "$VDSM_TOOL" service-restart sanlock || return 1
+ fi
+}
+
+
+task_check_libvirt_configure() {
+ if ! "$VDSM_TOOL" libvirt-is-configured; then
+ echo "Perform 'vdsm-tool libvirt-configure' before starting
vdsmd"
+ return 1
+ fi
+ return 0
}
@@ -166,8 +187,8 @@
}
-task_validate_configuration(){
- "$VDSM_TOOL" validate-config
+task_test_conflicting_conf(){
+ "$VDSM_TOOL" libvirt-test-conflicts
}
task_restore_nets(){
@@ -213,9 +234,9 @@
configure_coredump \
run_init_hooks \
gencerts \
- check_is_configured \
- validate_configuration \
+ check_libvirt_configure \
prepare_transient_repository \
+ reconfigure_sanlock \
syslog_available \
nwfilter \
dummybr \
@@ -223,6 +244,7 @@
tune_system \
test_space \
test_lo \
+ test_conflicting_conf \
restore_nets \
"
;;
diff --git a/lib/vdsm/tool/Makefile.am b/lib/vdsm/tool/Makefile.am
index f448a67..5112141 100644
--- a/lib/vdsm/tool/Makefile.am
+++ b/lib/vdsm/tool/Makefile.am
@@ -38,9 +38,10 @@
__init__.py \
dummybr.py \
nwfilter.py \
- configurator.py \
+ libvirt_configure.py \
passwd.py \
restore_nets.py \
+ sanlock.py \
seboolsetup.py \
service.py \
transient.py \
diff --git a/lib/vdsm/tool/configurator.py b/lib/vdsm/tool/configurator.py
deleted file mode 100644
index 9e866b4..0000000
--- a/lib/vdsm/tool/configurator.py
+++ /dev/null
@@ -1,287 +0,0 @@
-# Copyright 2013 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 sys
-import grp
-import argparse
-
-from .. import utils
-from . import service, expose
-from ..constants import P_VDSM_EXEC, DISKIMAGE_GROUP
-
-
-class _ModuleConfigure(object):
- def __init__(self):
- pass
-
- def getName(self):
- return None
-
- def getServices(self):
- return []
-
- def validate(self):
- return True
-
- def configure(self):
- pass
-
- def isconfigured(self):
- return True
-
-
-class LibvirtModuleConfigure(_ModuleConfigure):
- def __init__(self):
- super(LibvirtModuleConfigure, self).__init__()
-
- def getName(self):
- return 'libvirt'
-
- def getServices(self):
- return ["supervdsmd", "vdsmd", "libvirtd"]
-
- def _exec_libvirt_configure(self, action):
- """
- Invoke libvirt_configure.sh script
- """
- if os.getuid() != 0:
- raise UserWarning("Must run as root")
-
- rc, out, err = utils.execCmd(
- (
- os.path.join(
- P_VDSM_EXEC,
- 'libvirt_configure.sh'
- ),
- action,
- ),
- raw=True,
- )
- sys.stdout.write(out)
- sys.stderr.write(err)
- if rc != 0:
- raise RuntimeError("Failed to perform libvirt action.")
-
- def configure(self):
- self._exec_libvirt_configure("reconfigure")
-
- def validate(self):
- """
- Validate conflict in configured files
- """
- try:
- self._exec_libvirt_configure("test_conflict_configurations")
- return True
- except RuntimeError:
- return False
-
- def isconfigured(self):
- """
- Check if libvirt is already configured for vdsm
- """
- try:
- self._exec_libvirt_configure("check_if_configured")
- return True
- except RuntimeError:
- return False
-
-
-class SanlockModuleConfigure(_ModuleConfigure):
- def __init__(self):
- super(SanlockModuleConfigure, self).__init__()
-
- def getName(self):
- return 'sanlock'
-
- def getServices(self):
- return ['sanlock']
-
- def configure(self):
- """
- Configure sanlock process groups
- """
- if os.getuid() != 0:
- raise UserWarning("Must run as root")
-
- rc, out, err = utils.execCmd(
- (
- '/usr/sbin/usermod',
- '-a',
- '-G',
- 'qemu,kvm',
- 'sanlock'
- ),
- raw=True,
- )
- sys.stdout.write(out)
- sys.stderr.write(err)
- if rc != 0:
- raise RuntimeError("Failed to perform sanlock config.")
-
- def isconfigured(self, *args):
- """
- Return 0 if sanlock service requires a restart to reload the relevant
- supplementary groups.
- """
- proc_status_group_prefix = "Groups:\t"
- try:
- with open("/var/run/sanlock/sanlock.pid", "r") as f:
- sanlock_pid = f.readline().strip()
- with open(os.path.join('/proc', sanlock_pid, 'status'),
- "r") as sanlock_status:
- for status_line in sanlock_status:
- if status_line.startswith(proc_status_group_prefix):
- groups = [int(x) for x in
- status_line[len(proc_status_group_prefix):].
- strip().split(" ")]
- break
- else:
- raise RuntimeError("Unable to find sanlock service
groups")
-
- except IOError as e:
- if e.errno == os.errno.ENOENT:
- raise RuntimeError("sanlock service is not running")
- raise
-
- diskimage_gid = grp.getgrnam(DISKIMAGE_GROUP)[2]
- if diskimage_gid not in groups:
- raise RuntimeError("sanlock service requires restart")
-
- sys.stdout.write("sanlock service is already configured\n")
- return True
-
-
-__configurers = (
- LibvirtModuleConfigure(),
- SanlockModuleConfigure(),
-)
-
-
-@expose("configure")
-def configure(*args):
- """
- Configure external services for vdsm
- """
- args = _parse_args("configure")
- configurer_to_trigger = []
- for c in __configurers:
- if c.getName() in args.modules:
- if not c.validate():
- raise RuntimeError(
- "Configuration of %s is invalid" % c.getName()
- )
- if args.force or not c.isconfigured():
- configurer_to_trigger.append(c)
-
- services = []
- for c in configurer_to_trigger:
- for s in c.getServices():
- if service.service_status(s) == 0:
- if not args.force:
- raise RuntimeError(
- "Cannot configure while %s is running" % s
- )
- services.append(s)
-
- for s in services:
- service.service_stop(s)
-
- for c in configurer_to_trigger:
- c.configure()
-
- for s in reversed(services):
- service.service_start(s)
-
-
-@expose("is-configured")
-def isconfigured(*args):
- """
- Determine if module is configured
- """
- ret = True
- args = _parse_args('is-configured')
-
- m = [
- c.getName() for c in __configurers
- if c.getName() in args.modules and not c.isconfigured()
- ]
-
- if m:
- sys.stdout.write(
- "Modules %s are not configured\n " % ','.join(m),
- )
- ret = False
-
- if not ret:
- raise RuntimeError("Not configured. Try 'vdsm-tool
configure'")
-
-
-@expose("validate-config")
-def validate_config(*args):
- """
- Determine if configuration is valid
- """
- ret = True
- args = _parse_args('validate-config')
-
- m = [
- c.getName() for c in __configurers
- if c.getName() in args.modules and not c.validate()
- ]
-
- if m:
- sys.stdout.write(
- "Modules %s contains invalid configuration\n " %
','.join(m),
- )
- ret = False
-
- if not ret:
- raise RuntimeError("Config is not valid. Check conf files")
-
-
-def _parse_args(action):
- parser = argparse.ArgumentParser('vdsm-tool %s' % (action))
- allModules = [n.getName() for n in __configurers]
- parser.add_argument(
- '--module',
- dest='modules',
- choices=allModules,
- default=[],
- metavar='STRING',
- action='append',
- help=(
- 'Specify the module to run the action on '
- '(e.g %(choices)s).\n'
- 'If non is specified, operation will run for '
- 'all related modules.'
- ),
- )
- if action == "configure":
- parser.add_argument(
- '--force',
- dest='force',
- default=False,
- action='store_true',
- help='Force configuration, trigger services restart',
- )
- args = parser.parse_args(sys.argv[2:])
- if not args.modules:
- args.modules = allModules
- return args
diff --git a/lib/vdsm/tool/libvirt_configure.py b/lib/vdsm/tool/libvirt_configure.py
new file mode 100644
index 0000000..0ecaa55
--- /dev/null
+++ b/lib/vdsm/tool/libvirt_configure.py
@@ -0,0 +1,84 @@
+# Copyright 2013 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 sys
+
+from .. import utils
+from . import expose
+from . import service
+from ..constants import P_VDSM_EXEC
+
+
+def exec_libvirt_configure(action, *args):
+ """
+ Invoke libvirt_configure.sh script
+ """
+ if os.getuid() != 0:
+ raise RuntimeError("Must run as root")
+
+ rc, out, err = utils.execCmd([os.path.join(
+ P_VDSM_EXEC,
+ 'libvirt_configure.sh'), action] +
+ list(args),
+ raw=True)
+
+ sys.stdout.write(out)
+ sys.stderr.write(err)
+ return rc
+
+
+@expose("libvirt-configure")
+def configure_libvirt(*args):
+ """
+ libvirt configuration (--force for reconfigure)
+ """
+ rc = exec_libvirt_configure("reconfigure", *args)
+ if rc != 0:
+ raise RuntimeError("Failed to configure libvirt")
+
+ return 0
+
+
+@expose("libvirt-test-conflicts")
+def test_conflict_configurations(*args):
+ """
+ Validate conflict in configured files
+ """
+ return exec_libvirt_configure("test_conflict_configurations", *args)
+
+
+@expose("libvirt-configure-services-restart")
+def libvirt_configure_services_restart(*args):
+ """
+ Managing restart of related services
+ """
+ service.service_stop("supervdsmd")
+ service.service_stop("libvirtd")
+ service.service_start("libvirtd")
+ service.service_start("supervdsmd")
+ return 0
+
+
+@expose("libvirt-is-configured")
+def libvirt_is_configured(*args):
+ """
+ Check if libvirt is already configured for vdsm
+ """
+ return exec_libvirt_configure("check_if_configured", *args)
diff --git a/lib/vdsm/tool/libvirt_configure.sh.in
b/lib/vdsm/tool/libvirt_configure.sh.in
index 950c11f..b6fc2e7 100755
--- a/lib/vdsm/tool/libvirt_configure.sh.in
+++ b/lib/vdsm/tool/libvirt_configure.sh.in
@@ -104,12 +104,14 @@
return 0
fi
- # Shutoff libvirt SysV service before configure upstart
+ # Stop libvirt SysV service before configure upstart
if [ ! -f "${target}" ]; then
"@CHKCONFIG_PATH@" libvirtd off
+ "@SERVICE_PATH@" libvirtd stop
fi
- if ! diff -q "${packaged}" "${target}" >/dev/null 2>&1;
then
+ if ! diff -q "${packaged}" "${target}" >/dev/null
2>&1;
+ then
/bin/cp -p "${packaged}" "${target}" || return 1
/sbin/initctl reload-configuration
fi
@@ -173,6 +175,7 @@
local qconf="$2"
local ldconf="$3"
local qlconf="$4"
+ local force_reconfigure="$5"
local by_vdsm="by vdsm"
local start_conf_section="## beginning of configuration section
${by_vdsm}"
local end_conf_section="## end of configuration section ${by_vdsm}"
@@ -191,6 +194,20 @@
return 6
fi
/usr/bin/vdsm-tool validate-ovirt-certs
+ fi
+
+ #
+ # reconfigure if:
+ # - force specified or
+ # - we have the FORCE_RECONFIGURE trigger file
+ # - not configured
+ #
+ if [ "${force_reconfigure}" != "--force" ] && \
+ ! [ -f "${FORCE_RECONFIGURE}" ] && \
+ is_already_configured "${lconf}" "${qconf}"
"${ldconf}" "${qlconf}";
+ then
+ echo "Not forcing reconfigure"
+ return 0
fi
# Remove a previous configuration (if present)
@@ -297,6 +314,14 @@
fi
echo "Reconfiguration of libvirt is done."
+ echo
+ cat << __EOF__
+To start working with the new configuration, execute:
+'vdsm-tool libvirt-configure-services-restart'
+This will manage restarting of the following services:
+libvirtd, supervdsmd
+__EOF__
+ echo
#
# finished reconfiguration, do not trigger
@@ -321,7 +346,7 @@
RETVAL=$?
;;
*)
- echo "Usage: $0
{reconfigure|test_conflict_configurations|check_if_configured}"
+ echo "Usage: $0 {reconfigure *conf-files [--force] |
test_conflict_configurations *conf-files | check_if_configured}"
RETVAL=2
esac
diff --git a/lib/vdsm/tool/sanlock.py b/lib/vdsm/tool/sanlock.py
new file mode 100644
index 0000000..ba59a73
--- /dev/null
+++ b/lib/vdsm/tool/sanlock.py
@@ -0,0 +1,58 @@
+# Copyright 2013 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 grp
+
+from .. import constants
+from . import expose
+
+
+SANLOCK_PID = "/var/run/sanlock/sanlock.pid"
+
+PROC_STATUS_PATH = "/proc/%s/status"
+PROC_STATUS_GROUPS = "Groups:\t"
+PROC_STATUS_GROUPS_LEN = len(PROC_STATUS_GROUPS)
+
+
+@expose("sanlock-check-service")
+def sanlock_check_service(*args):
+ """
+ Check if sanlock service requires a restart to reload the relevant
+ supplementary groups.
+ """
+
+ try:
+ sanlock_pid = open(SANLOCK_PID, "r").readline().strip()
+ sanlock_status = open(PROC_STATUS_PATH % sanlock_pid, "r")
+ except IOError as e:
+ if e.errno == os.errno.ENOENT:
+ return 0 # service is not running, returning
+ raise
+
+ for status_line in sanlock_status:
+ if status_line.startswith(PROC_STATUS_GROUPS):
+ groups = [int(x) for x in
+ status_line[PROC_STATUS_GROUPS_LEN:].strip().split(" ")]
+ break
+ else:
+ raise RuntimeError("Unable to find sanlock service groups")
+
+ diskimage_gid = grp.getgrnam(constants.DISKIMAGE_GROUP)[2]
+ return 0 if diskimage_gid in groups else 1
diff --git a/vdsm.spec.in b/vdsm.spec.in
index 43e47ea..b72e1da 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -641,6 +641,7 @@
/usr/sbin/useradd -r -u 36 -g %{vdsm_group} -d /var/lib/vdsm \
-s /sbin/nologin -c "Node Virtualization Manager" %{vdsm_user}
/usr/sbin/usermod -a -G %{qemu_group},%{snlk_group} %{vdsm_user}
+/usr/sbin/usermod -a -G %{qemu_group},%{vdsm_group} %{snlk_user}
%post
%{_bindir}/vdsm-tool sebool-config || :
@@ -736,9 +737,6 @@
if [ "$1" -ge 1 ]; then
supervdsmd_start_required='no'
vdsmd_start_required='no'
-
- # Both vdsm and supervdsm should be managed here and must be restarted if
- # ran before (code might changed)
if %{_bindir}/vdsm-tool service-status vdsmd >/dev/null 2>&1; then
%{_bindir}/vdsm-tool service-stop vdsmd >/dev/null 2>&1
vdsmd_start_required='yes'
@@ -747,12 +745,11 @@
%{_bindir}/vdsm-tool service-stop supervdsmd >/dev/null 2>&1
supervdsmd_start_required='yes'
fi
-
- if ! %{_bindir}/vdsm-tool is-configured --module libvirt >/dev/null 2>&1;
- then
- %{_bindir}/vdsm-tool configure --module libvirt --force >/dev/null
2>&1
+ if %{_bindir}/vdsm-tool libvirt-configure | grep -q 'is done.'; then
+ if %{_bindir}/vdsm-tool service-status libvirtd >/dev/null 2>&1; then
+ %{_bindir}/vdsm-tool service-restart libvirtd >/dev/null 2>&1
+ fi
fi
-
if [ "${supervdsmd_start_required}" = 'yes' ]; then
%{_bindir}/vdsm-tool service-start supervdsmd >/dev/null 2>&1
fi
@@ -1065,10 +1062,11 @@
%endif
%{python_sitearch}/%{vdsm_name}/tool/dummybr.py*
%{python_sitearch}/%{vdsm_name}/tool/nwfilter.py*
-%{python_sitearch}/%{vdsm_name}/tool/configurator.py*
+%{python_sitearch}/%{vdsm_name}/tool/libvirt_configure.py*
%{_libexecdir}/%{vdsm_name}/libvirt_configure.sh
%{python_sitearch}/%{vdsm_name}/tool/passwd.py*
%{python_sitearch}/%{vdsm_name}/tool/restore_nets.py*
+%{python_sitearch}/%{vdsm_name}/tool/sanlock.py*
%{python_sitearch}/%{vdsm_name}/tool/seboolsetup.py*
%{python_sitearch}/%{vdsm_name}/tool/service.py*
%{python_sitearch}/%{vdsm_name}/tool/transient.py*
--
To view, visit
http://gerrit.ovirt.org/21849
To unsubscribe, visit
http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8bd71a1e9a62ce5e76b2131a9cec55f02bfa8de1
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce(a)redhat.com>