瀏覽代碼

AMBARI-6666. Ambari deployment, Ganglia installation failed in Ubuntu12 (aonishuk)

Andrew Onishuk 10 年之前
父節點
當前提交
c84c7a14e1

+ 10 - 2
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))
 

+ 26 - 5
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")