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):

Reply via email to