Updated Branches: refs/heads/trunk 9cda86be3 -> e9c19145c
AMBARI-3515. Resource management. Package and service resources fail, due to incorrect os detection. (Andrew Onischuk via mahadev) Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/e9c19145 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/e9c19145 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/e9c19145 Branch: refs/heads/trunk Commit: e9c19145cefe9dc103f2179f4d219497ea5268a0 Parents: 9cda86b Author: Mahadev Konar <[email protected]> Authored: Fri Oct 18 08:39:35 2013 -0700 Committer: Mahadev Konar <[email protected]> Committed: Fri Oct 18 08:39:35 2013 -0700 ---------------------------------------------------------------------- .../resource_management/providers/__init__.py | 16 +--- .../providers/package/apt.py | 96 -------------------- .../providers/package/easy_install.py | 61 ------------- .../providers/package/emerge.py | 49 ---------- .../providers/service/debian.py | 8 -- .../providers/service/gentoo.py | 8 -- .../main/python/resource_management/system.py | 37 ++++---- 7 files changed, 22 insertions(+), 253 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/providers/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/__init__.py b/ambari-agent/src/main/python/resource_management/providers/__init__.py index 3a11cfe..220649b 100644 --- a/ambari-agent/src/main/python/resource_management/providers/__init__.py +++ b/ambari-agent/src/main/python/resource_management/providers/__init__.py @@ -20,14 +20,6 @@ class Provider(object): PROVIDERS = dict( - debian=dict( - Package="resource_management.providers.package.apt.DebianAptProvider", - Service="resource_management.providers.service.debian.DebianServiceProvider", - ), - ubuntu=dict( - Package="resource_management.providers.package.apt.DebianAptProvider", - Service="resource_management.providers.service.debian.DebianServiceProvider", - ), redhat=dict( Service="resource_management.providers.service.redhat.RedhatServiceProvider", Package="resource_management.providers.package.yumrpm.YumProvider", @@ -36,6 +28,10 @@ PROVIDERS = dict( Service="resource_management.providers.service.redhat.RedhatServiceProvider", Package="resource_management.providers.package.yumrpm.YumProvider", ), + suse=dict( + Service="resource_management.providers.service.suse.SuseServiceProvider", + Package="resource_management.providers.package.zypper.ZypperProvider", + ), fedora=dict( Service="resource_management.providers.service.redhat.RedhatServiceProvider", Package="resource_management.providers.package.yumrpm.YumProvider", @@ -44,10 +40,6 @@ PROVIDERS = dict( Service="resource_management.providers.service.redhat.RedhatServiceProvider", Package="resource_management.providers.package.yumrpm.YumProvider", ), - gentoo=dict( - Package="resource_management.providers.package.emerge.GentooEmergeProvider", - Service="resource_management.providers.service.gentoo.GentooServiceProvider", - ), default=dict( File="resource_management.providers.system.FileProvider", Directory="resource_management.providers.system.DirectoryProvider", http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/providers/package/apt.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/package/apt.py b/ambari-agent/src/main/python/resource_management/providers/package/apt.py deleted file mode 100644 index b857b7a..0000000 --- a/ambari-agent/src/main/python/resource_management/providers/package/apt.py +++ /dev/null @@ -1,96 +0,0 @@ -import glob -import os -import shutil -import tempfile -from subprocess import Popen, STDOUT, PIPE, check_call, CalledProcessError -from resource_management.base import Fail -from resource_management.providers.package import PackageProvider - - -class DebianAptProvider(PackageProvider): - def get_current_status(self): - self.current_version = None - self.candidate_version = None - - proc = Popen("apt-cache policy %s" % self.resource.package_name, shell=True, - stdout=PIPE) - out = proc.communicate()[0] - for line in out.split("\n"): - line = line.strip().split(':', 1) - if len(line) != 2: - continue - - ver = line[1].strip() - if line[0] == "Installed": - self.current_version = None if ver == '(none)' else ver - self.log.debug("Current version of package %s is %s" % ( - self.resource.package_name, self.current_version)) - elif line[0] == "Candidate": - self.candidate_version = ver - - if self.candidate_version == "(none)": - raise Fail( - "APT does not provide a version of package %s" % self.resource.package_name) - - def install_package(self, name, version): - if self.resource.build_vars: - self._install_package_source(name, version) - else: - self._install_package_default(name, version) - - def _install_package_default(self, name, version): - return 0 == check_call( - "DEBIAN_FRONTEND=noninteractive apt-get -q -y install %s=%s" % ( - name, version), - shell=True, stdout=PIPE, stderr=STDOUT) - - def _install_package_source(self, name, version): - build_vars = " ".join(self.resource.build_vars) - run_check_call = lambda s, **kw: check_call(s, shell=True, stdout=PIPE, - stderr=STDOUT, **kw) - pkgdir = tempfile.mkdtemp(suffix=name) - - try: - run_check_call( - "DEBIAN_FRONTEND=noninteractive apt-get -q -y install fakeroot") - run_check_call( - "DEBIAN_FRONTEND=noninteractive apt-get -q -y build-dep %s=%s" % ( - name, version)) - run_check_call( - "DEBIAN_FRONTEND=noninteractive apt-get -q -y source %s=%s" % ( - name, version), cwd=pkgdir) - - try: - builddir = - [p for p in glob.iglob("%s/%s*" % (pkgdir, name)) if os.path.isdir(p)][ - 0] - except IndexError: - raise Fail( - "Couldn't install %s from source: apt-get source created an unfamiliar directory structure." % name) - - run_check_call("%s fakeroot debian/rules binary > /dev/null" % build_vars, - cwd=builddir) - - # NOTE: I can't figure out why this call returns non-zero sometimes, though everything seems to work. - # Just ignoring checking for now. - try: - run_check_call("dpkg -i *.deb > /dev/null", cwd=pkgdir) - except CalledProcessError: - pass - finally: - shutil.rmtree(pkgdir) - - return True - - def remove_package(self, name): - return 0 == check_call( - "DEBIAN_FRONTEND=noninteractive apt-get -q -y remove %s" % name, - shell=True, stdout=PIPE, stderr=STDOUT) - - def purge_package(self, name): - return 0 == check_call( - "DEBIAN_FRONTEND=noninteractive apt-get -q -y purge %s" % name, - shell=True, stdout=PIPE, stderr=STDOUT) - - def upgrade_package(self, name, version): - return self.install_package(name, version) http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/providers/package/easy_install.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/package/easy_install.py b/ambari-agent/src/main/python/resource_management/providers/package/easy_install.py deleted file mode 100644 index 8bc7d69..0000000 --- a/ambari-agent/src/main/python/resource_management/providers/package/easy_install.py +++ /dev/null @@ -1,61 +0,0 @@ -import re -from subprocess import check_call, Popen, PIPE, STDOUT -from resource_management.providers.package import PackageProvider - -VERSION_RE = re.compile(r'\S\S(.*)\/(.*)-(.*)-py(.*).egg\S') -BEST_MATCH_RE = re.compile(r'Best match: (.*) (.*)\n') - - -class EasyInstallProvider(PackageProvider): - def get_current_status(self): - proc = Popen(["python", "-c", "import %s; print %s.__path__" % ( - self.resource.package_name, self.resource.package_name)], stdout=PIPE, - stderr=STDOUT) - path = proc.communicate()[0] - if proc.wait() != 0: - self.current_version = None - else: - match = VERSION_RE.search(path) - if match: - self.current_version = match.group(3) - else: - self.current_version = "unknown" - - @property - def candidate_version(self): - if not hasattr(self, '_candidate_version'): - proc = Popen( - [self.easy_install_binary_path, "-n", self.resource.package_name], - stdout=PIPE, stderr=STDOUT) - out = proc.communicate()[0] - res = proc.wait() - if res != 0: - self.log.warning( - "easy_install check returned a non-zero result (%d) %s" % ( - res, self.resource)) - # self._candidate_version = None - # else: - match = BEST_MATCH_RE.search(out) - if not match: - self._candidate_version = None - else: - self._candidate_version = match.group(2) - return self._candidate_version - - @property - def easy_install_binary_path(self): - return "easy_install" - - def install_package(self, name, version): - check_call( - [self.easy_install_binary_path, "-U", "%s==%s" % (name, version)], - stdout=PIPE, stderr=STDOUT) - - def upgrade_package(self, name, version): - self.install_package(name, version) - - def remove_package(self, name): - check_call([self.easy_install_binary_path, "-m", name]) - - def purge_package(self, name): - self.remove_package(name) http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/providers/package/emerge.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/package/emerge.py b/ambari-agent/src/main/python/resource_management/providers/package/emerge.py deleted file mode 100644 index 64e2b94..0000000 --- a/ambari-agent/src/main/python/resource_management/providers/package/emerge.py +++ /dev/null @@ -1,49 +0,0 @@ -from subprocess import Popen, STDOUT, PIPE, check_call -from resource_management.base import Fail -from resource_management.providers.package import PackageProvider - - -class GentooEmergeProvider(PackageProvider): - def get_current_status(self): - self.current_version = None - self.candidate_version = None - - proc = Popen("qlist --installed --exact --verbose --nocolor %s" - % self.resource.package_name, shell=True, stdout=PIPE) - out = proc.communicate()[0] - for line in out.split("\n"): - line = line.split('/', 1) - if len(line) != 2: - continue - _category, nameversion = line - _name, version = nameversion.split('-', 1) - self.current_version = version - self.log.debug("Current version of package %s is %s", - self.resource.package_name, self.current_version) - - proc = Popen( - "emerge --pretend --quiet --color n %s" % self.resource.package_name, - shell=True, stdout=PIPE) - out = proc.communicate()[0] - for line in out.split("\n"): - line = line.strip(' [').split(']', 1) - if len(line) != 2: - continue - - # kind, flag = line[0].split() - _category, nameversion = line[1].split('/', 1) - _name, version = nameversion.split('-', 1) - self.candidate_version = version - self.log.debug("Candidate version of package %s is %s", - self.resource.package_name, self.candidate_version) - - if self.candidate_version is None: - raise Fail( - "emerge does not provide a version of package %s" % self.resource.package_name) - - def install_package(self, name, version): - return 0 == check_call("emerge --color n =%s-%s" % (name, version), - shell=True, stdout=PIPE, stderr=STDOUT) - - def upgrade_package(self, name, version): - return self.install_package(name, version) http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/providers/service/debian.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/service/debian.py b/ambari-agent/src/main/python/resource_management/providers/service/debian.py deleted file mode 100644 index 48c31e9..0000000 --- a/ambari-agent/src/main/python/resource_management/providers/service/debian.py +++ /dev/null @@ -1,8 +0,0 @@ -__all__ = ["DebianServiceProvider"] - -from resource_management.providers.service import ServiceProvider - - -class DebianServiceProvider(ServiceProvider): - def enable_runlevel(self, runlevel): - pass http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/providers/service/gentoo.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/service/gentoo.py b/ambari-agent/src/main/python/resource_management/providers/service/gentoo.py deleted file mode 100644 index 5d8fa15..0000000 --- a/ambari-agent/src/main/python/resource_management/providers/service/gentoo.py +++ /dev/null @@ -1,8 +0,0 @@ -__all__ = ["GentooServiceProvider"] - -from resource_management.providers.service import ServiceProvider - - -class GentooServiceProvider(ServiceProvider): - def enable_runlevel(self, runlevel): - pass http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/e9c19145/ambari-agent/src/main/python/resource_management/system.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/system.py b/ambari-agent/src/main/python/resource_management/system.py index 666a90e..c42d931 100644 --- a/ambari-agent/src/main/python/resource_management/system.py +++ b/ambari-agent/src/main/python/resource_management/system.py @@ -52,12 +52,7 @@ class System(object): @lazy_property def lsb(self): - if os.path.exists("/etc/lsb-release"): - with open("/etc/lsb-release", "rb") as fp: - lsb = (x.split('=') for x in fp.read().strip().split('\n')) - return dict( - (k.split('_', 1)[-1].lower(), self.unquote(v)) for k, v in lsb) - elif os.path.exists("/usr/bin/lsb_release"): + if os.path.exists("/usr/bin/lsb_release"): p = Popen(["/usr/bin/lsb_release", "-a"], stdout=PIPE, stderr=PIPE) lsb = {} for l in p.communicate()[0].split('\n'): @@ -65,8 +60,15 @@ class System(object): if len(v) != 2: continue lsb[v[0].strip().lower()] = self.unquote(v[1].strip().lower()) + + # failsafe + if not 'distributor id' in lsb: + return None + lsb['id'] = lsb.pop('distributor id') return lsb + + return None @lazy_property def platform(self): @@ -78,25 +80,22 @@ class System(object): return "redhat" if os.path.exists("/etc/fedora-release"): return "fedora" - if os.path.exists("/etc/debian_version"): - return "debian" - if os.path.exists("/etc/gentoo-release"): - return "gentoo" + if os.path.exists("/etc/centos-release"): + return "centos" + if os.path.exists("/etc/SuSE-release"): + return "suse" if os.path.exists("/etc/system-release"): with open("/etc/system-release", "rb") as fp: release = fp.read() if "Amazon Linux" in release: return "amazon" return "unknown" - return lsb['id'].lower() - elif operatingsystem == "darwin": - out = Popen("/usr/bin/sw_vers", stdout=PIPE).communicate()[0] - sw_vers = dict( - [y.strip() for y in x.split(':', 1)] for x in out.strip().split('\n')) - # ProductName, ProductVersion, BuildVersion - return sw_vers['ProductName'].lower().replace(' ', '_') - else: - return "unknown" + + lsb_id = lsb['id'].lower() + if lsb_id =="suse linux": + return "suse" + return lsb_id + return "unknown" @lazy_property def locales(self):
