You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2018/05/01 19:03:04 UTC

[ambari] branch branch-feature-AMBARI-14714 updated: [AMBARI-23726] Mpack Installation Response is not Updating State

This is an automated email from the ASF dual-hosted git repository.

ncole pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by this push:
     new 6389ecf  [AMBARI-23726] Mpack Installation Response is not Updating State
6389ecf is described below

commit 6389ecf05d7e0130bcf91ff0273452891dc2d302
Author: Nate Cole <nc...@hortonworks.com>
AuthorDate: Tue May 1 14:15:18 2018 -0400

    [AMBARI-23726] Mpack Installation Response is not Updating State
---
 .../main/java/org/apache/ambari/server/Role.java   |   1 -
 .../actionmanager/ExecutionCommandWrapper.java     |  10 +-
 .../UpgradePlanInstallResourceProvider.java        |   2 +-
 .../upgrade/MpackInstallStateListener.java         |   4 +-
 .../publishers/CommandReportEventPublisher.java    |   9 +-
 .../custom_actions/scripts/mpack_packages.py       |   5 +-
 .../topology/ClusterDeployWithStartOnlyTest.java   |   2 -
 .../custom_actions/configs/mpack_packages.json     | 227 +++++++++++++++++++++
 .../python/custom_actions/test_mpack_install.py    | 191 +++++++++++++++++
 9 files changed, 432 insertions(+), 19 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/Role.java b/ambari-server/src/main/java/org/apache/ambari/server/Role.java
index c384e2e..377b7de 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/Role.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/Role.java
@@ -122,7 +122,6 @@ public class Role {
   public static final Role LOGSEARCH_SERVER = valueOf("LOGSEARCH_SERVER");
   public static final Role INFRA_SOLR = valueOf("INFRA_SOLR");
   public static final Role LOGSEARCH_LOGFEEDER = valueOf("LOGSEARCH_LOGFEEDER");
-  public static final Role INSTALL_PACKAGES = valueOf("install_packages");
   public static final Role UPDATE_REPO = valueOf("update_repo");
 
   private String name = null;
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
index 3bf8583..cc021c3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
@@ -311,10 +311,12 @@ public class ExecutionCommandWrapper {
       executionCommand.setComponentVersions(cluster);
     } catch (ServiceNotFoundException serviceNotFoundException) {
       // it's possible that there are commands specified for a service where
-      // the service doesn't exist yet
-      LOG.warn(
-        "The service {} is not installed in the cluster. No repository version will be sent for this command.",
-        serviceName);
+      // the service doesn't exist yet.  Ignore nulls to avoid flooding the log.
+      if (null != serviceName) {
+        LOG.warn(
+          "The service {} is not installed in the cluster. No repository version will be sent for this command.",
+          serviceName);
+      }
     } catch (AmbariException e) {
       throw new RuntimeException(e);
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradePlanInstallResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradePlanInstallResourceProvider.java
index 370cb82..8a5addf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradePlanInstallResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradePlanInstallResourceProvider.java
@@ -110,7 +110,7 @@ public class UpgradePlanInstallResourceProvider extends AbstractControllerResour
       UPGRADE_PLAN_INSTALL_ID,
       UPGRADE_PLAN_INSTALL_CLUSTER_NAME);
 
-  protected static final String MPACK_PACKAGES_ACTION = "mpack_packages";
+  public static final String MPACK_PACKAGES_ACTION = "mpack_packages";
   protected static final String INSTALL_PACKAGES = "Install Version";
 
   /**
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/MpackInstallStateListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/MpackInstallStateListener.java
index 8175796..4e4de67 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/MpackInstallStateListener.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/MpackInstallStateListener.java
@@ -25,10 +25,10 @@ import javax.annotation.Nullable;
 import org.apache.ambari.annotations.Experimental;
 import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.EagerSingleton;
-import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.controller.internal.UpgradePlanInstallResourceProvider;
 import org.apache.ambari.server.events.CommandReportReceivedEvent;
 import org.apache.ambari.server.events.HostsAddedEvent;
 import org.apache.ambari.server.events.HostsRemovedEvent;
@@ -215,7 +215,7 @@ public class MpackInstallStateListener {
     String role = event.getRole();
     String roleCommand = commandReport.getRoleCommand();
 
-    if (!StringUtils.equals(role, Role.INSTALL_PACKAGES.name())
+    if (!StringUtils.equals(role, UpgradePlanInstallResourceProvider.MPACK_PACKAGES_ACTION)
         && !StringUtils.equals(roleCommand, RoleCommand.INSTALL.name())) {
       return;
     }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/CommandReportEventPublisher.java b/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/CommandReportEventPublisher.java
index 68e7f1f..b3e80ac 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/CommandReportEventPublisher.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/CommandReportEventPublisher.java
@@ -19,9 +19,9 @@ package org.apache.ambari.server.events.publishers;
 
 import java.util.concurrent.Executors;
 
-import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.controller.internal.UpgradePlanInstallResourceProvider;
 import org.apache.ambari.server.events.CommandReportReceivedEvent;
 import org.apache.commons.lang.StringUtils;
 
@@ -44,11 +44,6 @@ public class CommandReportEventPublisher {
   private final EventBus m_eventBus;
 
   /**
-   * The string representation of {@link Role#INSTALL_PACKAGES}
-   */
-  private final String ROLE_INSTALL_PACKAGES = Role.INSTALL_PACKAGES.name();
-
-  /**
    * The string representation of {@code RoleCommand#INSTALL}
    */
   private final String ROLE_COMMAND_INSTALL = RoleCommand.INSTALL.name();
@@ -72,7 +67,7 @@ public class CommandReportEventPublisher {
    */
   public void publish(CommandReportReceivedEvent event) {
     CommandReport commandReport = event.getCommandReport();
-    if (!StringUtils.equals(event.getRole(), ROLE_INSTALL_PACKAGES)
+    if (!StringUtils.equals(event.getRole(), UpgradePlanInstallResourceProvider.MPACK_PACKAGES_ACTION)
         && !StringUtils.equals(commandReport.getRoleCommand(), ROLE_COMMAND_INSTALL)) {
       return;
     }
diff --git a/ambari-server/src/main/resources/custom_actions/scripts/mpack_packages.py b/ambari-server/src/main/resources/custom_actions/scripts/mpack_packages.py
index 79a24ea..f956075 100644
--- a/ambari-server/src/main/resources/custom_actions/scripts/mpack_packages.py
+++ b/ambari-server/src/main/resources/custom_actions/scripts/mpack_packages.py
@@ -86,7 +86,7 @@ class MpackPackages(Script):
     # Build structured output with initial values
     self.structured_output = {
       'package_installation_result': 'FAIL',
-      'mpack_id': command_repository.mpack_id
+      'mpackId': command_repository.mpack_id
     }
 
     self.put_structured_out(self.structured_output)
@@ -106,6 +106,7 @@ class MpackPackages(Script):
 
     try:
       ret_code = self.install_packages(package_list)
+
       if ret_code == 0:
         self.structured_output['package_installation_result'] = 'SUCCESS'
         self.put_structured_out(self.structured_output)
@@ -134,7 +135,6 @@ class MpackPackages(Script):
     # Install packages
     packages_were_checked = False
     packages_installed_before = []
-#    stack_selector_package = stack_tools.get_stack_tool_package(stack_tools.STACK_SELECTOR_NAME)
 
     try:
       repositories = config['repositoryFile']['repositories']
@@ -153,6 +153,7 @@ class MpackPackages(Script):
         available_packages_in_repos = self.repo_mgr.get_available_packages_in_repos(command_repos)
       except Exception:
         available_packages_in_repos = []
+
       for package in filtered_package_list:
         name = self.get_package_from_available(package['name'], available_packages_in_repos)
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
index 791e3ac..a49f6d2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterDeployWithStartOnlyTest.java
@@ -383,12 +383,10 @@ public class ClusterDeployWithStartOnlyTest extends EasyMockSupport {
 
     expect(hostRoleCommandInstallComponent3.getTaskId()).andReturn(1L).atLeastOnce();
     expect(hostRoleCommandInstallComponent3.getRoleCommand()).andReturn(RoleCommand.INSTALL).atLeastOnce();
-    expect(hostRoleCommandInstallComponent3.getRole()).andReturn(Role.INSTALL_PACKAGES).atLeastOnce();
     expect(hostRoleCommandInstallComponent3.getStatus()).andReturn(HostRoleStatus.COMPLETED).atLeastOnce();
 
     expect(hostRoleCommandInstallComponent4.getTaskId()).andReturn(2L).atLeastOnce();
     expect(hostRoleCommandInstallComponent4.getRoleCommand()).andReturn(RoleCommand.INSTALL).atLeastOnce();
-    expect(hostRoleCommandInstallComponent4.getRole()).andReturn(Role.INSTALL_PACKAGES).atLeastOnce();
     expect(hostRoleCommandInstallComponent4.getStatus()).andReturn(HostRoleStatus.COMPLETED).atLeastOnce();
 
     expect(ambariContext.createAmbariTask(anyLong(), anyLong(), eq("component1"),
diff --git a/ambari-server/src/test/python/custom_actions/configs/mpack_packages.json b/ambari-server/src/test/python/custom_actions/configs/mpack_packages.json
new file mode 100644
index 0000000..9332f46
--- /dev/null
+++ b/ambari-server/src/test/python/custom_actions/configs/mpack_packages.json
@@ -0,0 +1,227 @@
+{
+    "commandParams": {
+        "ambari_java_version": "8", 
+        "script": "mpack_packages.py", 
+        "ambari_jdk_name": "jdk-8u60-linux-x64.tar.gz", 
+        "ambari_java_home": "/usr/jdk64/jdk1.8.0_60", 
+        "command_timeout": "1800", 
+        "ambari_jce_name": "jce_policy-8.zip", 
+        "script_type": "PYTHON"
+    }, 
+    "localComponents": [
+        "ZOOKEEPER_CLIENT", 
+        "ZOOKEEPER_SERVER"
+    ], 
+    "clusterId": "2", 
+    "mpackId": 1, 
+    "agentLevelParams": {
+        "public_hostname": null, 
+        "hostname": "c7401.ambari.apache.org", 
+        "agentConfigParams": {
+            "agent": {
+                "parallel_execution": 0, 
+                "use_system_proxy_settings": true
+            }
+        }, 
+        "agentCacheDir": "/var/lib/ambari-agent/cache"
+    }, 
+    "commandId": "15-1", 
+    "repositoryFile": {
+        "repositories": [
+            {
+                "mirrorsList": null, 
+                "ambariManaged": true, 
+                "baseUrl": "http://repos.ambari.apache.org/hdp/HDP-UTILS-1.1.0.21", 
+                "repoName": "HDP-UTILS", 
+                "components": null, 
+                "distribution": null, 
+                "repoId": "HDP-UTILS-1.1.0.21-repo-hdpcore"
+            }, 
+            {
+                "mirrorsList": null, 
+                "ambariManaged": true, 
+                "baseUrl": "http://repos.ambari.apache.org/hdp/HDPCORE-1.0.0-b251", 
+                "repoName": "HDPCORE", 
+                "components": null, 
+                "distribution": null, 
+                "repoId": "HDPCORE-1.0.0-b251-repo-hdpcore"
+            }
+        ], 
+        "feature": {
+            "preInstalled": false, 
+            "scoped": true
+        }, 
+        "mpackId": 2, 
+        "mpackVersion": "1.0.0-b251", 
+        "repoFileName": "ambari-hdpcore-2", 
+        "mpackName": "HDPCORE"
+    }, 
+    "clusterLevelParams": {
+        "not_managed_hdfs_path_list": "[]", 
+        "hooks_folder": "stack-hooks", 
+        "stack_name": "HDPCORE", 
+        "group_list": "[\"hadoop\"]", 
+        "user_groups": "{\"zookeeper\":[\"hadoop\"],\"ambari-qa\":[\"hadoop\"]}", 
+        "stack_version": "1.0.0-b250", 
+        "user_list": "[\"zookeeper\",\"ambari-qa\"]"
+    }, 
+    "serviceName": "null", 
+    "role": "mpack_packages", 
+    "requestId": 15, 
+    "clusterHostInfo": {
+        "zookeeper_server_hosts": [
+            "c7401.ambari.apache.org", 
+            "c7402.ambari.apache.org", 
+            "c7403.ambari.apache.org"
+        ], 
+        "zookeeper_client_hosts": [
+            "c7401.ambari.apache.org", 
+            "c7402.ambari.apache.org", 
+            "c7403.ambari.apache.org"
+        ]
+    }, 
+    "clusterSettings": {
+        "security_enabled": "false", 
+        "hide_yarn_memory_widget": "false", 
+        "enable_external_ranger": "false", 
+        "override_uid": "true", 
+        "fetch_nonlocal_groups": "true", 
+        "one_dir_per_partition": "false", 
+        "recovery_max_count": "6", 
+        "repo_ubuntu_template": "{{package_type}} {{base_url}} {{components}}", 
+        "ignore_groupsusers_create": "false", 
+        "alerts_repeat_tolerance": "1", 
+        "namenode_rolling_restart_timeout": "4200", 
+        "kerberos_domain": "EXAMPLE.COM", 
+        "manage_dirs_on_root": "true", 
+        "recovery_lifetime_max_count": "1024", 
+        "recovery_type": "AUTO_START", 
+        "smokeuser": "ambari-qa", 
+        "ignore_bad_mounts": "false", 
+        "recovery_window_in_minutes": "60", 
+        "sysprep_skip_setup_jce": "false", 
+        "user_group": "hadoop", 
+        "namenode_rolling_restart_safemode_exit_timeout": "3600", 
+        "recovery_retry_interval": "5", 
+        "sysprep_skip_copy_oozie_share_lib_to_hdfs": "false", 
+        "sysprep_skip_copy_tarballs_hdfs": "false", 
+        "manage_hive_fsroot": "true", 
+        "service_check_type": "full", 
+        "agent_mounts_ignore_list": "", 
+        "sysprep_skip_create_users_and_groups": "false", 
+        "repo_suse_rhel_template": "[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0\n", 
+        "smokeuser_keytab": "/etc/security/keytabs/smokeuser.headless.keytab", 
+        "managed_hdfs_resource_property_names": "", 
+        "recovery_enabled": "true", 
+        "sysprep_skip_copy_fast_jar_hdfs": "false"
+    }, 
+    "clusterName": "c1", 
+    "commandType": "EXECUTION_COMMAND", 
+    "taskId": 105, 
+    "requiredConfigTimestamp": 1524850781664, 
+    "ambariLevelParams": {
+        "jdk_location": "http://hw10553.home:8080/resources/", 
+        "agent_stack_retry_count": "5", 
+        "db_driver_filename": "mysql-connector-java.jar", 
+        "agent_stack_retry_on_unavailability": "false", 
+        "jce_name": "jce_policy-8.zip", 
+        "java_version": "8", 
+        "oracle_jdbc_url": "http://hw10553.home:8080/resources//ojdbc6.jar", 
+        "ambari_server_host": "hw10553.home", 
+        "ambari_server_port": "8080", 
+        "host_sys_prepped": "false", 
+        "db_name": "ambari", 
+        "ambari_server_use_ssl": "false", 
+        "gpl_license_accepted": "true", 
+        "jdk_name": "jdk-8u60-linux-x64.tar.gz", 
+        "java_home": "/usr/jdk64/jdk1.8.0_60", 
+        "mysql_jdbc_url": "http://hw10553.home:8080/resources//mysql-connector-java.jar"
+    }, 
+    "roleCommand": "ACTIONEXECUTE", 
+    "configurationAttributes": {
+        "zoo.cfg": {}, 
+        "zookeeper-env": {}, 
+        "zookeeper-log4j": {}, 
+        "cluster-env": {}
+    }, 
+    "serviceGroupName": "HDPCORE", 
+    "hostLevelParams": {
+        "recoveryConfig": {
+            "retryGap": "5", 
+            "windowInMinutes": "60", 
+            "maxLifetimeCount": "12", 
+            "components": null, 
+            "maxCount": "6", 
+            "type": "AUTO_START"
+        }, 
+        "hostRepositories": {
+            "componentRepos": {
+                "ZOOKEEPER_SERVER": "HDP-UTILS", 
+                "ZOOKEEPER_CLIENT": "HDP-UTILS"
+            }, 
+            "commandRepos": {
+                "HDP-UTILS": {
+                    "repositories": [
+                        {
+                            "mirrorsList": null, 
+                            "ambariManaged": true, 
+                            "baseUrl": "http://repos.ambari.apache.org/hdp/HDP-UTILS-1.1.0.21", 
+                            "repoName": "HDP-UTILS", 
+                            "components": null, 
+                            "distribution": null, 
+                            "repoId": "HDP-UTILS-1.1.0.21-repo-hdpcore"
+                        }, 
+                        {
+                            "mirrorsList": null, 
+                            "ambariManaged": true, 
+                            "baseUrl": "http://repos.ambari.apache.org/hdp/HDPCORE-1.0.0-b250", 
+                            "repoName": "HDPCORE", 
+                            "components": null, 
+                            "distribution": null, 
+                            "repoId": "HDPCORE-1.0.0-b250-repo-hdpcore"
+                        }
+                    ], 
+                    "feature": {
+                        "preInstalled": false, 
+                        "scoped": true
+                    }, 
+                    "mpackId": 1, 
+                    "mpackVersion": "1.0.0-b250", 
+                    "repoFileName": "ambari-hdpcore-1", 
+                    "mpackName": "HDPCORE"
+                }
+            }
+        }
+    }, 
+    "roleParams": {
+        "package_list": "[{\"name\":\"hdpcore_1_0_0_b251\",\"condition\":\"\",\"skipUpgrade\":false}]"
+    }, 
+    "configurations": {
+        "zoo.cfg": {
+            "clientPort": "2181", 
+            "autopurge.purgeInterval": "24", 
+            "syncLimit": "5", 
+            "dataDir": "/hadoop/zookeeper", 
+            "initLimit": "10", 
+            "tickTime": "3000", 
+            "autopurge.snapRetainCount": "30"
+        }, 
+        "zookeeper-env": {
+            "content": "\nexport JAVA_HOME={{java64_home}}\nexport ZOOKEEPER_HOME={{zk_home}}\nexport ZOO_LOG_DIR={{zk_log_dir}}\nexport ZOOPIDFILE={{zk_pid_file}}\nexport SERVER_JVMFLAGS={{zk_server_heapsize}}\nexport JAVA=$JAVA_HOME/bin/java\nexport CLASSPATH=$CLASSPATH:/usr/share/zookeeper/*\n\n{% if security_enabled %}\nexport SERVER_JVMFLAGS=\"$SERVER_JVMFLAGS -Djava.security.auth.login.config={{zk_server_jaas_file}}\"\nexport CLIENT_JVMFLAGS=\"$CLIENT_JVMFLAGS -Djava.security.auth. [...]
+            "zk_log_dir": "/var/log/zookeeper", 
+            "zk_server_heapsize": "1024m", 
+            "zk_pid_dir": "/var/run/zookeeper", 
+            "zk_user": "zookeeper"
+        }, 
+        "zookeeper-log4j": {
+            "content": "\n#\n#\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership.  The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License.  You may obtain a copy of the License at\n#\n#   http://www.apache.org/license [...]
+            "zookeeper_log_max_backup_size": "10", 
+            "zookeeper_log_number_of_backup_files": "10"
+        }, 
+        "cluster-env": {
+            "commands_to_retry": "INSTALL,START", 
+            "command_retry_max_time_in_sec": "600", 
+            "command_retry_enabled": "true"
+        }
+    }
+}
\ No newline at end of file
diff --git a/ambari-server/src/test/python/custom_actions/test_mpack_install.py b/ambari-server/src/test/python/custom_actions/test_mpack_install.py
new file mode 100644
index 0000000..2ec7095
--- /dev/null
+++ b/ambari-server/src/test/python/custom_actions/test_mpack_install.py
@@ -0,0 +1,191 @@
+#!/usr/bin/env python
+
+'''
+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.
+'''
+import json
+import os
+from ambari_commons import subprocess32
+import select
+
+from stacks.utils.RMFTestCase import *
+from mock.mock import patch, MagicMock
+from resource_management.core.base import Resource
+from resource_management.core.exceptions import Fail
+from resource_management.libraries.script import Script
+
+OLD_VERSION_STUB = '2.1.0.0-400'
+VERSION_STUB_WITHOUT_BUILD_NUMBER = '2.2.0.1'
+VERSION_STUB = '2.2.0.1-885'
+
+subproc_mock = MagicMock()
+subproc_mock.return_value = MagicMock()
+subproc_stdout = MagicMock()
+subproc_mock.return_value.stdout = subproc_stdout
+
+@patch.object(os, "read", new=MagicMock(return_value=None))
+@patch.object(select, "select", new=MagicMock(return_value=([subproc_stdout], None, None)))
+@patch("pty.openpty", new = MagicMock(return_value=(1,5)))
+@patch.object(os, "close", new=MagicMock())
+@patch.object(subprocess32, "Popen", new=subproc_mock)
+class TestMpackPackages(RMFTestCase):
+  _install_failed = False
+  def setUp(self):
+    self.maxDiff = None
+
+  @staticmethod
+  def _add_packages(*args):
+    return [
+      ["pkg1", "1.0", "repo"],
+      ["pkg2", "2.0", "repo2"]
+    ]
+
+  @staticmethod
+  def _add_packages_available(*args):
+    return [
+      ["hadoop_2_2_0_1_885", "1.0", "HDP-2.2"],
+      ["hadooplzo_2_2_0_1_885", "1.0", "HDP-2.2"],
+      ["hadoop_2_2_0_1_885-libhdfs", "1.0", "HDP-2.2"]
+    ]
+
+  @staticmethod
+  def _add_packages_lookUpYum(*args):
+    return TestMpackPackages._add_packages_available(*args)
+
+
+  @staticmethod
+  def _add_packages_with_fail():
+    arg = []
+    arg.append(["pkg1_2_2_0_1_885_pack", "1.0", "repo"])
+    arg.append(["pkg2_2_2_0_1_885_pack2", "2.0", "repo2"])
+    if TestMpackPackages._install_failed:
+      arg.append(["should_not_be_removed_pkg1", "1.0", "repo"])
+      arg.append(["hadoop_2_2_0_1_885fake_pkg", "1.0", "repo"])
+      arg.append(["snappy__2_2_0_1_885_fake_pkg", "3.0", "repo2"])
+      arg.append(["ubuntu-like-2-2-0-1-885-fake-pkg", "3.0", "repo2"])
+      arg.append(["should_not_be_removed_pkg2", "3.0", "repo2"])
+
+    return arg
+
+  @staticmethod
+  def _new_with_exception(cls, name, env=None, provider=None, **kwargs):
+    if (name != "snappy-devel"):
+      return Resource.__new__(cls, name, env, provider, **kwargs)
+    else:
+      TestMpackPackages._install_failed = True
+      raise Exception()
+
+  @staticmethod
+  def side_effect(*args):
+    TestMpackPackages._install_failed = True
+    raise Exception()
+
+  @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
+  @patch("ambari_commons.os_check.OSCheck.is_redhat_family")
+  @patch("ambari_commons.repo_manager.ManagerFactory.get")
+  @patch("resource_management.core.resources.packaging.Package.__new__")
+  @patch("resource_management.libraries.script.Script.put_structured_out")
+  @patch("ambari_commons.shell.launch_subprocess")
+  def test_fail(self, subprocess_with_timeout, put_structured_out_mock, Package__mock, get_provider,
+                is_redhat_family_mock, list_ambari_managed_repos_mock):
+    from ambari_commons.os_check import OSConst
+    from ambari_commons.repo_manager import ManagerFactory
+
+    pkg_manager = ManagerFactory.get_new_instance(OSConst.REDHAT_FAMILY)
+
+    with patch.object(pkg_manager, "all_packages") as all_packages, \
+      patch.object(pkg_manager, "available_packages") as available_packages, \
+      patch.object(pkg_manager, "installed_packages") as installed_packages, \
+      patch.object(pkg_manager, "check_uncompleted_transactions") as check_uncompleted_transactions, \
+      patch.object(pkg_manager, "upgrade_package") as upgrade_package:
+      all_packages.side_effect = TestMpackPackages._add_packages_with_fail
+      available_packages.side_effect = TestMpackPackages._add_packages_with_fail
+      installed_packages.side_effect = TestMpackPackages._add_packages_with_fail
+      upgrade_package.side_effect = TestMpackPackages.side_effect
+      check_uncompleted_transactions.return_value = False
+
+      get_provider.return_value = pkg_manager
+
+      is_redhat_family_mock.return_value = True
+      list_ambari_managed_repos_mock.return_value = []
+
+      Package__mock.side_effect = TestMpackPackages.side_effect
+      self.assertRaises(Fail, self.executeScript, "scripts/mpack_packages.py",
+                         classname="MpackPackages",
+                         command="actionexecute",
+                         config_file="mpack_packages.json",
+                         target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
+                         os_type=('Redhat', '6.4', 'Final'),
+      )
+      self.assertTrue(put_structured_out_mock.called)
+      self.assertEquals(put_structured_out_mock.call_args[0][0],
+                        {'mpackId': 2,
+                        'package_installation_result': 'FAIL'})
+
+      self.assertNoMoreResources()
+
+      TestMpackPackages._install_failed = False
+
+  @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
+  @patch("ambari_commons.repo_manager.ManagerFactory.get")
+  @patch("resource_management.libraries.script.Script.put_structured_out")
+  @patch("resource_management.libraries.functions.stack_select.get_stack_versions")
+  @patch("ambari_commons.shell.launch_subprocess")
+  def test_normal_flow_rhel(self,
+                                    subprocess_with_timeout,
+                                    stack_versions_mock,
+                                    put_structured_out_mock,
+                                    get_provider,
+                                    list_ambari_managed_repos_mock):
+    stack_versions_mock.side_effect = [
+      [],  # before installation attempt
+      [VERSION_STUB]
+    ]
+
+    from ambari_commons.os_check import OSConst
+    from ambari_commons.repo_manager import ManagerFactory
+
+    pkg_manager = ManagerFactory.get_new_instance(OSConst.REDHAT_FAMILY)
+
+    with patch.object(pkg_manager, "all_packages") as all_packages, \
+      patch.object(pkg_manager, "available_packages") as available_packages, \
+      patch.object(pkg_manager, "installed_packages") as installed_packages, \
+      patch.object(pkg_manager, "check_uncompleted_transactions") as check_uncompleted_transactions:
+      all_packages.side_effect = TestMpackPackages._add_packages_available
+      available_packages.side_effect = TestMpackPackages._add_packages_available
+      installed_packages.side_effect = TestMpackPackages._add_packages_available
+      check_uncompleted_transactions.return_value = False
+
+      get_provider.return_value = pkg_manager
+      list_ambari_managed_repos_mock.return_value=[]
+      repo_file_name = 'ambari-hdp-4'
+
+      self.executeScript("scripts/mpack_packages.py",
+                         classname="MpackPackages",
+                         command="actionexecute",
+                         config_file="mpack_packages.json",
+                         target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
+                         os_type=('Redhat', '6.4', 'Final'),
+      )
+      self.assertTrue(put_structured_out_mock.called)
+      self.assertEquals(put_structured_out_mock.call_args[0][0],
+                        {'package_installation_result': 'SUCCESS',
+                         'mpackId': 2
+                        })
+
+      self.assertNoMoreResources()
+

-- 
To stop receiving notification emails like this one, please contact
ncole@apache.org.