From: Gary Lowell Date: Tue, 9 Apr 2013 19:03:49 +0000 (+0000) Subject: ceph-deploy: detect missing lsb_release. X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e226757b64a15b3ed237dda34e212863bbcea85a;p=ceph-deploy.git ceph-deploy: detect missing lsb_release. If the lsb_release command is not available on the remote host, issue an error message and exit. (Bug #4631) Signed-off-by: Gary Lowell --- diff --git a/ceph_deploy/exc.py b/ceph_deploy/exc.py index 47249ac..b4a86bf 100644 --- a/ceph_deploy/exc.py +++ b/ceph_deploy/exc.py @@ -51,6 +51,16 @@ class UnsupportedPlatform(DeployError): codename=self.codename, ) +class MissingPackageError(DeployError): + """ + A required package or command is missing + """ + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + class GenericError(DeployError): def __init__(self, message): diff --git a/ceph_deploy/install.py b/ceph_deploy/install.py index a6b273d..5872450 100644 --- a/ceph_deploy/install.py +++ b/ceph_deploy/install.py @@ -195,8 +195,7 @@ def install(args): # TODO username sudo = args.pushy('ssh+sudo:{hostname}'.format(hostname=hostname)) - lsb_release_r = sudo.compile(lsb.lsb_release) - (distro, release, codename) = lsb_release_r() + (distro, release, codename) = lsb.get_lsb_release(sudo) LOG.debug('Distro %s release %s codename %s', distro, release, codename) if (distro == 'Debian' or distro == 'Ubuntu'): @@ -227,8 +226,7 @@ def uninstall(args): # TODO username sudo = args.pushy('ssh+sudo:{hostname}'.format(hostname=hostname)) - lsb_release_r = sudo.compile(lsb.lsb_release) - (distro, release, codename) = lsb_release_r() + (distro, release, codename) = lsb.get_lsb_release(sudo) LOG.debug('Distro %s codename %s', distro, codename) if (distro == 'Debian' or distro == 'Ubuntu'): @@ -254,8 +252,7 @@ def purge(args): # TODO username sudo = args.pushy('ssh+sudo:{hostname}'.format(hostname=hostname)) - lsb_release_r = sudo.compile(lsb.lsb_release) - (distro, release, codename) = lsb_release_r() + (distro, release, codename) = lsb.get_lsb_release(sudo) LOG.debug('Distro %s codename %s', distro, codename) if (distro == 'Debian' or distro == 'Ubuntu'): diff --git a/ceph_deploy/lsb.py b/ceph_deploy/lsb.py index 9c11770..3965ed5 100644 --- a/ceph_deploy/lsb.py +++ b/ceph_deploy/lsb.py @@ -1,11 +1,8 @@ +from . import exc -def lsb_release(): +def check_lsb_release(): """ - Get LSB release information from lsb_release. - - Returns truple with distro, release and codename. Otherwise - the function raises an error (subprocess.CalledProcessError or - RuntimeError). + Verify if lsb_release command is available """ import subprocess @@ -14,10 +11,20 @@ def lsb_release(): args=args, stdout=subprocess.PIPE, ) - distro, _ = process.communicate() + lsb_release_path, _ = process.communicate() ret = process.wait() if ret != 0: - raise RuntimeError('lsb_release not found on host') + raise RuntimeError('The lsb_release command was not found on remote host. Please install the lsb-release package.') + +def lsb_release(): + """ + Get LSB release information from lsb_release. + + Returns truple with distro, release and codename. Otherwise + the function raises an error (subprocess.CalledProcessError or + RuntimeError). + """ + import subprocess args = [ 'lsb_release', '-s', '-i' ] process = subprocess.Popen( @@ -58,6 +65,27 @@ def lsb_release(): return (str(distro).rstrip(), str(release).rstrip(), str(codename).rstrip()) +def get_lsb_release(sudo): + """ + Get LSB release information from lsb_release. + + Check if lsb_release is installed on the remote host and issue + a message if not. + + Returns truple with distro, release and codename. Otherwise + the function raises an error (subprocess.CalledProcessError or + RuntimeError). + """ + try: + check_lsb_release_r = sudo.compile(check_lsb_release) + status = check_lsb_release_r() + except RuntimeError as e: + raise exc.MissingPackageError(e.message) + + lsb_release_r = sudo.compile(lsb_release) + return lsb_release_r() + + def choose_init(distro, codename): """ Select a init system for a given distribution. diff --git a/ceph_deploy/mds.py b/ceph_deploy/mds.py index 9f6ff41..8005121 100644 --- a/ceph_deploy/mds.py +++ b/ceph_deploy/mds.py @@ -145,8 +145,7 @@ def mds_create(args): # TODO username sudo = args.pushy('ssh+sudo:{hostname}'.format(hostname=hostname)) - lsb_release_r = sudo.compile(lsb.lsb_release) - (distro, release, codename) = lsb_release_r() + (distro, release, codename) = lsb.get_lsb_release(sudo) init = lsb.choose_init(distro, codename) LOG.debug('Distro %s codename %s, will use %s', distro, codename, init) diff --git a/ceph_deploy/mon.py b/ceph_deploy/mon.py index ae9f774..969d17f 100644 --- a/ceph_deploy/mon.py +++ b/ceph_deploy/mon.py @@ -115,8 +115,7 @@ def mon_create(args): # TODO username sudo = args.pushy('ssh+sudo:{hostname}'.format(hostname=hostname)) - lsb_release_r = sudo.compile(lsb.lsb_release) - (distro, release, codename) = lsb_release_r() + (distro, release, codename) = lsb.get_lsb_release(sudo) init = lsb.choose_init(distro, codename) LOG.debug('Distro %s codename %s, will use %s', distro, codename, init) diff --git a/ceph_deploy/osd.py b/ceph_deploy/osd.py index 35983c4..734def5 100644 --- a/ceph_deploy/osd.py +++ b/ceph_deploy/osd.py @@ -199,8 +199,7 @@ def activate(args, cfg): LOG.debug('Activating host %s disk %s', hostname, disk) - lsb_release_r = sudo.compile(lsb.lsb_release) - (distro, release, codename) = lsb_release_r() + (distro, release, codename) = lsb.get_lsb_release(sudo) init = lsb.choose_init(distro, codename) LOG.debug('Distro %s codename %s, will use %s', distro, codename, init)