# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You # may not use this file except in compliance with the License. A copy of # the License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file 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 from awscli.testutils import mock from tests.unit.customizations.emr import EMRBaseAWSCommandParamsTest as \ BaseAWSCommandParamsTest INSTALL_HIVE_STEP = { 'HadoopJarStep': { 'Args': ['s3://us-east-1.elasticmapreduce/libs/hive/hive-script', '--install-hive', '--base-path', 's3://us-east-1.elasticmapreduce/libs/hive', '--hive-versions', 'latest'], 'Jar': ('s3://us-east-1.elasticmapreduce/libs/' 'script-runner/script-runner.jar') }, 'Name': 'Install Hive', 'ActionOnFailure': 'TERMINATE_CLUSTER' } INSTALL_HIVE_SITE_STEP = { 'HadoopJarStep': { 'Args': ['s3://us-east-1.elasticmapreduce/libs/hive/hive-script', '--base-path', 's3://us-east-1.elasticmapreduce/libs/hive', '--install-hive-site', '--hive-site=s3://test/hive-conf/hive-site.xml', '--hive-versions', 'latest'], 'Jar': ('s3://us-east-1.elasticmapreduce/libs/' 'script-runner/script-runner.jar') }, 'Name': 'Install Hive Site Configuration', 'ActionOnFailure': 'CANCEL_AND_WAIT' } INSTALL_PIG_STEP = { 'HadoopJarStep': { 'Args': ['s3://us-east-1.elasticmapreduce/libs/pig/pig-script', '--install-pig', '--base-path', 's3://us-east-1.elasticmapreduce/libs/pig', '--pig-versions', 'latest'], 'Jar': ('s3://us-east-1.elasticmapreduce/libs/' 'script-runner/script-runner.jar') }, 'Name': 'Install Pig', 'ActionOnFailure': 'TERMINATE_CLUSTER' } class TestInstallApplications(BaseAWSCommandParamsTest): prefix = ('emr install-applications --cluster-id ' 'j-ABC123456 --applications ') def test_install_hive_site(self): cmdline = (self.prefix + 'Name=Hive,' 'Args=[--hive-site=s3://test/hive-conf/hive-site.xml]') result = {'JobFlowId': 'j-ABC123456', 'Steps': [INSTALL_HIVE_STEP, INSTALL_HIVE_SITE_STEP] } self.assert_params_for_cmd(cmdline, result) cmdline = (self.prefix + 'Name=Hive,' 'Args=[--hive-site=s3://test/hive-conf/hive-site.xml,k1]') self.assert_params_for_cmd(cmdline, result) def test_install_hive_and_pig(self): cmdline = self.prefix + 'Name=Hive Name=Pig' result = {'JobFlowId': 'j-ABC123456', 'Steps': [INSTALL_HIVE_STEP, INSTALL_PIG_STEP]} self.assert_params_for_cmd(cmdline, result) def test_install_pig_with_profile_region(self): self.driver.session.set_config_variable('region', 'cn-north-1') cmdline = self.prefix + 'Name=Pig' PIG_STEP = json.dumps(INSTALL_PIG_STEP).\ replace('us-east-1', 'cn-north-1') result = {'JobFlowId': 'j-ABC123456', 'Steps': [json.loads(PIG_STEP)]} self.assert_params_for_cmd(cmdline, result) def test_install_impala_error(self): cmdline = self.prefix + ' Name=Impala' expected_error_msg = "\naws: error: Impala cannot be installed on" +\ " a running cluster. 'Name' should be one of the following:" +\ " HIVE, PIG\n" result = self.run_cmd(cmdline, 255) self.assertEqual(result[1], expected_error_msg) def test_install_unknown_app_error(self): cmdline = self.prefix + 'Name=unknown' expected_error_msg = "\naws: error: Unknown application: unknown." +\ " 'Name' should be one of the following: HIVE, PIG, HBASE," +\ " GANGLIA, IMPALA, SPARK, MAPR, MAPR_M3, MAPR_M5, MAPR_M7\n" result = self.run_cmd(cmdline, 255) self.assertEqual(result[1], expected_error_msg) @mock.patch('awscli.customizations.emr.' 'emrutils.get_release_label') def test_unsupported_command_on_release_based_cluster_error( self, grl_patch): grl_patch.return_value = 'emr-4.0' cmdline = (self.prefix + 'Name=Hive,' 'Args=[--hive-site=s3://test/hive-conf/hive-site.xml]') expected_error_msg = ("\naws: error: install-applications" " is not supported with 'emr-4.0' release.\n") result = self.run_cmd(cmdline, 255) self.assertEqual(result[1], expected_error_msg) if __name__ == "__main__": unittest.main()