You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ma...@apache.org on 2013/10/18 17:38:06 UTC
git commit: AMBARI-3515. Resource management. Package and service
resources fail, due to incorrect os detection. (Andrew Onischuk via mahadev)
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 <ma...@apache.org>
Authored: Fri Oct 18 08:39:35 2013 -0700
Committer: Mahadev Konar <ma...@apache.org>
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):