Browse Source

AMBARI-3516. Resource management. Centos packages erase/update does not work. (Andrew Onischuk via mahadev)

Mahadev Konar 11 years ago
parent
commit
58a3eac93c

+ 17 - 50
ambari-agent/src/main/python/resource_management/providers/package/__init__.py

@@ -4,66 +4,33 @@ from resource_management.providers import Provider
 
 class PackageProvider(Provider):
   def __init__(self, *args, **kwargs):
-    super(PackageProvider, self).__init__(*args, **kwargs)
-    self.get_current_status()
-
-  def get_current_status(self):
-    raise NotImplementedError()
-
+    super(PackageProvider, self).__init__(*args, **kwargs)   
+  
   def install_package(self, name, version):
     raise NotImplementedError()
-
   def remove_package(self, name):
     raise NotImplementedError()
-
-  def purge_package(self, name):
-    raise NotImplementedError()
-
   def upgrade_package(self, name, version):
     raise NotImplementedError()
 
   def action_install(self):
-    if self.resource.version != None and self.resource.version != self.current_version:
-      install_version = self.resource.version
-    elif self.current_version is None:
-      install_version = self.candidate_version
-    else:
-      return
-
-    if not install_version:
-      raise Fail(
-        "No version specified, and no candidate version available for package %s." % self.resource.package_name)
-
-    self.log.info(
-      "Install %s version %s (resource %s, current %s, candidate %s) location %s",
-      self.resource.package_name, install_version, self.resource.version,
-      self.current_version, self.candidate_version, self.resource.location)
-
-    status = self.install_package(self.resource.location, install_version)
-    if status:
-      self.resource.updated()
+    package_name = self.get_package_name_with_version()
+    self.log.info("Installing package %s", package_name)
+    self.install_package(package_name)
 
   def action_upgrade(self):
-    if self.current_version != self.candidate_version:
-      orig_version = self.current_version or "uninstalled"
-      self.log.info("Upgrading %s from version %s to %s",
-                    str(self.resource), orig_version, self.candidate_version)
-
-      status = self.upgrade_package(self.resource.location,
-                                    self.candidate_version)
-      if status:
-        self.resource.updated()
+    package_name = self.get_package_name_with_version()
+    self.log.info("Upgrading package %s", package_name)
+    self.upgrade_package(package_name)
 
   def action_remove(self):
-    if self.current_version:
-      self.log.info("Remove %s version %s", self.resource.package_name,
-                    self.current_version)
-      self.remove_package(self.resource.package_name)
-      self.resource.updated()
+    package_name = self.get_package_name_with_version()
+    self.log.info("Removing package %s", package_name)
+    self.remove_package(package_name)
 
-  def action_purge(self):
-    if self.current_version:
-      self.log.info("Purging %s version %s", self.resource.package_name,
-                    self.current_version)
-      self.purge_package(self.resource.package_name)
-      self.resource.updated()
+  def get_package_name_with_version(self):
+    if self.resource.version:
+      return self.resource.package_name + '-' + self.resource.version
+    else:
+      return self.resource.package_name
+    

+ 12 - 41
ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py

@@ -1,46 +1,17 @@
 from resource_management.providers.package import PackageProvider
-import yum
-
-
-class DummyCallback(object):
-  def event(self, state, data=None):
-    pass
+from subprocess import STDOUT, PIPE, check_call
 
+INSTALL_CMD = "/usr/bin/yum -d 0 -e 0 -y install %s"
+REMOVE_CMD = "/usr/bin/yum -d 0 -e 0 -y erase %s"
 
 class YumProvider(PackageProvider):
-  def get_current_status(self):
-    self.candidate_version = None
-    self.current_version = None
-    yb = yum.YumBase()
-    yb.doConfigSetup()
-    yb.doTsSetup()
-    yb.doRpmDBSetup()
-    for pkg in yb.rpmdb.returnPackages():
-      if pkg.name == self.resource.package_name:
-        self.current_version = pkg.version
-        self.log.debug("Current version of %s is %s" % (
-        self.resource.package_name, self.current_version))
-    searchlist = ['name', 'version']
-    args = [self.resource.package_name]
-    matching = yb.searchPackages(searchlist, args)
-    for po in matching:
-      if po.name == self.resource.package_name:
-        self.candidate_version = po.version
-        self.log.debug("Candidate version of %s is %s" % (
-        self.resource.package_name, self.current_version))
-
-  def install_package(self, name, version):
-    yb = yum.YumBase()
-    yb.doGenericSetup()
-    yb.doRepoSetup()
-    #TODO: Handle locks not being available
-    yb.doLock()
-    yb.install(pattern=name)
-    yb.buildTransaction()
-    #yb.conf.setattr('assumeyes',True)
-    yb.processTransaction(callback=DummyCallback())
-    yb.closeRpmDB()
-    yb.doUnlock()
+  def install_package(self, name):
+    return 0 == check_call(INSTALL_CMD % (name),
+                      shell=True, stdout=PIPE, stderr=STDOUT)
 
-  def upgrade_package(self, name, version):
-    return self.install_package(name, version)
+  def upgrade_package(self, name):
+    return self.install_package(name)
+  
+  def remove_package(self, name):
+    return 0 == check_call(REMOVE_CMD % (name),
+                           shell=True, stdout=PIPE, stderr=STDOUT)    

+ 1 - 1
ambari-agent/src/main/python/resource_management/resources/packaging.py

@@ -8,5 +8,5 @@ class Package(Resource):
   package_name = ResourceArgument(default=lambda obj: obj.name)
   location = ResourceArgument(default=lambda obj: obj.package_name)
   version = ResourceArgument()
-  actions = ["install", "upgrade", "remove", "purge"]
+  actions = ["install", "upgrade", "remove"]
   build_vars = ForcedListArgument(default=[])