Updated Branches: refs/heads/trunk e9c19145c -> 58a3eac93
AMBARI-3516. Resource management. Centos packages erase/update does not work. (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/58a3eac9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/58a3eac9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/58a3eac9 Branch: refs/heads/trunk Commit: 58a3eac93c74c9ef433c4cb8491666d82e5f6fa3 Parents: e9c1914 Author: Mahadev Konar <[email protected]> Authored: Fri Oct 18 08:41:19 2013 -0700 Committer: Mahadev Konar <[email protected]> Committed: Fri Oct 18 08:41:19 2013 -0700 ---------------------------------------------------------------------- .../providers/package/__init__.py | 67 +++++--------------- .../providers/package/yumrpm.py | 53 ++++------------ .../resource_management/resources/packaging.py | 2 +- 3 files changed, 30 insertions(+), 92 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/58a3eac9/ambari-agent/src/main/python/resource_management/providers/package/__init__.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/package/__init__.py b/ambari-agent/src/main/python/resource_management/providers/package/__init__.py index 5862921..db83c62 100644 --- a/ambari-agent/src/main/python/resource_management/providers/package/__init__.py +++ b/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 + http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/58a3eac9/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py b/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py index 9bea01c..277e308 100644 --- a/ambari-agent/src/main/python/resource_management/providers/package/yumrpm.py +++ b/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) http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/58a3eac9/ambari-agent/src/main/python/resource_management/resources/packaging.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/resources/packaging.py b/ambari-agent/src/main/python/resource_management/resources/packaging.py index c86454c..d615ea5 100644 --- a/ambari-agent/src/main/python/resource_management/resources/packaging.py +++ b/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=[])
