Repository: ambari Updated Branches: refs/heads/trunk 58347de3d -> c84c7a14e
AMBARI-6666. Ambari deployment, Ganglia installation failed in Ubuntu12 (aonishuk) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c84c7a14 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c84c7a14 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c84c7a14 Branch: refs/heads/trunk Commit: c84c7a14e1d4df417524574cbe23b8cb95824290 Parents: 58347de Author: Andrew Onishuk <aonis...@hortonworks.com> Authored: Wed Jul 30 01:10:04 2014 +0300 Committer: Andrew Onishuk <aonis...@hortonworks.com> Committed: Wed Jul 30 01:10:04 2014 +0300 ---------------------------------------------------------------------- .../core/providers/package/apt.py | 12 ++++++-- .../resource_management/TestPackageResource.py | 31 ++++++++++++++++---- 2 files changed, 36 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/c84c7a14/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py b/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py index 03d27df..4c6e2dd 100644 --- a/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py +++ b/ambari-agent/src/main/python/resource_management/core/providers/package/apt.py @@ -23,7 +23,8 @@ from resource_management.core.providers.package import PackageProvider from resource_management.core import shell from resource_management.core.logger import Logger -INSTALL_CMD = "env DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef' --allow-unauthenticated --assume-yes install %s" +INSTALL_CMD = "DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef' --allow-unauthenticated --assume-yes install %s" +REPO_UPDATE_CMD = "apt-get update -qq" REMOVE_CMD = "/usr/bin/apt-get -y -q remove %s" CHECK_CMD = "dpkg --get-selections %s | grep -v deinstall" @@ -32,7 +33,14 @@ class AptProvider(PackageProvider): if not self._check_existence(name): cmd = INSTALL_CMD % (name) Logger.info("Installing package %s ('%s')" % (name, cmd)) - shell.checked_call(cmd) + code = shell.call(cmd)[0] + + # apt-get update wasn't done too long + if code: + Logger.info("Failed to install package %s. Executing `apt-get update`" % (name)) + shell.checked_call(REPO_UPDATE_CMD) + Logger.info("Retrying to install package %s" % (name)) + shell.checked_call(cmd) else: Logger.info("Skipping installing existent package %s" % (name)) http://git-wip-us.apache.org/repos/asf/ambari/blob/c84c7a14/ambari-agent/src/test/python/resource_management/TestPackageResource.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/test/python/resource_management/TestPackageResource.py b/ambari-agent/src/test/python/resource_management/TestPackageResource.py index 08c7ac3..d36c543 100644 --- a/ambari-agent/src/test/python/resource_management/TestPackageResource.py +++ b/ambari-agent/src/test/python/resource_management/TestPackageResource.py @@ -17,7 +17,7 @@ limitations under the License. ''' from unittest import TestCase -from mock.mock import patch, MagicMock +from mock.mock import patch, MagicMock, call from resource_management.core import Environment, Fail from resource_management.core.system import System @@ -26,17 +26,38 @@ from resource_management.core.resources import Package from resource_management.core import shell class TestPackageResource(TestCase): - @patch.object(shell, "call") @patch.object(shell, "checked_call") @patch.object(System, "os_family", new = 'debian') - def test_action_install_debian(self, shell_mock, call_mock): + def test_action_install_debian_update(self, shell_mock, call_mock): call_mock.return_value= (1, None) with Environment('/') as env: Package("some_package", ) - call_mock.assert_called_with('dpkg --get-selections some_package | grep -v deinstall') - shell_mock.assert_called_with("env DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef' --allow-unauthenticated --assume-yes install some_package") + call_mock.assert_has_calls([call("dpkg --get-selections some_package | grep -v deinstall"), + call("DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef'" + " --allow-unauthenticated --assume-yes install some_package") + ]) + + shell_mock.assert_has_calls([call("apt-get update -qq"), + call("DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef' --allow-unauthenticated --assume-yes install some_package") + ]) + + @patch.object(shell, "call") + @patch.object(shell, "checked_call") + @patch.object(System, "os_family", new = 'debian') + def test_action_install_debian(self, shell_mock, call_mock): + call_mock.side_effect = [(1, None), (0, None)] + with Environment('/') as env: + Package("some_package", + ) + call_mock.assert_has_calls([call("dpkg --get-selections some_package | grep -v deinstall"), + call("DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -q -o Dpkg::Options::='--force-confdef'" + " --allow-unauthenticated --assume-yes install some_package") + ]) + + self.assertEqual(shell_mock.call_count, 0, "shell.checked_call shouldn't be called") + @patch.object(shell, "call")