Explorar el Código

AMBARI-5180. Add/Use support for apt get in resource management library. (aonishuk)

Andrew Onischuk hace 11 años
padre
commit
02e5e04540

+ 3 - 0
ambari-agent/src/main/python/resource_management/core/providers/__init__.py

@@ -47,6 +47,9 @@ PROVIDERS = dict(
   suse=dict(
     Package="resource_management.core.providers.package.zypper.ZypperProvider",
   ),
+  debian=dict(
+    Package="resource_management.core.providers.package.apt.AptProvider",
+  ),
   default=dict(
     File="resource_management.core.providers.system.FileProvider",
     Directory="resource_management.core.providers.system.DirectoryProvider",

+ 52 - 0
ambari-agent/src/main/python/resource_management/core/providers/package/apt.py

@@ -0,0 +1,52 @@
+"""
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Ambari Agent
+
+"""
+
+from resource_management.core.providers.package import PackageProvider
+from resource_management.core import shell
+from resource_management.core.logger import Logger
+
+INSTALL_CMD = "/usr/bin/apt-get --assume-yes install %s"
+REMOVE_CMD = "/usr/bin/apt-get -y -q remove %s"
+CHECK_CMD = "dpkg --get-selections %s | grep -v deinstall"
+
+class AptProvider(PackageProvider):
+  def install_package(self, name):
+    if not self._check_existence(name):
+      cmd = INSTALL_CMD % (name)
+      Logger.info("Installing package %s ('%s')" % (name, cmd))
+      shell.checked_call(cmd)
+    else:
+      Logger.info("Skipping installing existent package %s" % (name))
+
+  def upgrade_package(self, name):
+    return self.install_package(name)
+
+  def remove_package(self, name):
+    if self._check_existence(name):
+      cmd = REMOVE_CMD % (name)
+      Logger.info("Removing package %s ('%s')" % (name, cmd))
+      shell.checked_call(cmd)
+    else:
+      Logger.info("Skipping removing non-existent package %s" % (name))
+
+  def _check_existence(self, name):
+    code, out = shell.call(CHECK_CMD % name)
+    return not bool(code)

+ 2 - 0
ambari-agent/src/main/python/resource_management/libraries/providers/__init__.py

@@ -25,6 +25,8 @@ PROVIDERS = dict(
   ),
   suse=dict(
   ),
+  debian=dict(
+  ),
   default=dict(
     ExecuteHadoop="resource_management.libraries.providers.execute_hadoop.ExecuteHadoopProvider",
     TemplateConfig="resource_management.libraries.providers.template_config.TemplateConfigProvider",

+ 22 - 6
ambari-agent/src/test/python/resource_management/TestPackageResource.py

@@ -26,23 +26,39 @@ 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):
+    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("/usr/bin/apt-get --assume-yes install some_package")
 
-  @patch.object(shell, "call", new = MagicMock(return_value=(1, None)))
+
+  @patch.object(shell, "call")
   @patch.object(shell, "checked_call")
   @patch.object(System, "os_family", new = 'redhat')
-  def test_action_install_rhel(self, shell_mock):
+  def test_action_install_rhel(self, shell_mock, call_mock):
+    call_mock.return_value= (1, None)
     with Environment('/') as env:
       Package("some_package",
-      )    
+      )
+    call_mock.assert_called_with('rpm -q --quiet some_package')    
     shell_mock.assert_called_with("/usr/bin/yum -d 0 -e 0 -y install some_package")
 
-  @patch.object(shell, "call", new = MagicMock(return_value=(1, None)))
+  @patch.object(shell, "call")
   @patch.object(shell, "checked_call")
   @patch.object(System, "os_family", new = 'suse')
-  def test_action_install_suse(self, shell_mock):
+  def test_action_install_suse(self, shell_mock, call_mock):
+    call_mock.return_value= (1, None)
     with Environment('/') as env:
       Package("some_package",
-      )    
+      )
+    call_mock.assert_called_with('rpm -q --quiet some_package')    
     shell_mock.assert_called_with("/usr/bin/zypper --quiet install --auto-agree-with-licenses --no-confirm some_package")
 
   @patch.object(shell, "call", new = MagicMock(return_value=(0, None)))