# # Licensed 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 mock from heat.common import template_format from heat.engine.clients.os import sahara from heat.engine.resources.openstack.sahara import job from heat.engine import scheduler from heat.tests import common from heat.tests import utils job_template = """ heat_template_version: newton resources: job: type: OS::Sahara::Job properties: name: test_name_job type: MapReduce libs: [ fake-lib-id ] description: test_description is_public: True default_execution_data: cluster: fake-cluster-id input: fake-input-id output: fake-output-id is_public: True configs: mapred.map.class: org.apache.oozie.example.SampleMapper mapred.reduce.class: org.apache.oozie.example.SampleReducer mapreduce.framework.name: yarn """ class SaharaJobTest(common.HeatTestCase): def setUp(self): super(SaharaJobTest, self).setUp() t = template_format.parse(job_template) self.stack = utils.parse_stack(t) resource_defns = self.stack.t.resource_definitions(self.stack) self.rsrc_defn = resource_defns['job'] self.client = mock.Mock() self.patchobject(job.SaharaJob, 'client', return_value=self.client) fake_execution = mock.Mock() fake_execution.job_id = 'fake-resource-id' fake_execution.id = 'fake-execution-id' fake_execution.to_dict.return_value = {'job_id': 'fake-resource-id', 'id': 'fake-execution-id'} self.client.job_executions.find.return_value = [fake_execution] def _create_resource(self, name, snippet, stack): jb = job.SaharaJob(name, snippet, stack) value = mock.MagicMock(id='fake-resource-id') self.client.jobs.create.return_value = value scheduler.TaskRunner(jb.create)() return jb def test_create(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) args = self.client.jobs.create.call_args[1] expected_args = { 'name': 'test_name_job', 'type': 'MapReduce', 'libs': ['fake-lib-id'], 'description': 'test_description', 'is_public': True, 'is_protected': False, 'mains': [] } self.assertEqual(expected_args, args) self.assertEqual('fake-resource-id', jb.resource_id) expected_state = (jb.CREATE, jb.COMPLETE) self.assertEqual(expected_state, jb.state) def test_create_without_name_passed(self): props = self.stack.t.t['resources']['job']['properties'] del props['name'] self.rsrc_defn = self.rsrc_defn.freeze(properties=props) jb = job.SaharaJob('job', self.rsrc_defn, self.stack) value = mock.MagicMock(id='fake-resource-id') self.client.jobs.create.return_value = value jb.physical_resource_name = mock.Mock(return_value='fake_phys_name') scheduler.TaskRunner(jb.create)() args = self.client.jobs.create.call_args[1] expected_args = { 'name': 'fake_phys_name', 'type': 'MapReduce', 'libs': ['fake-lib-id'], 'description': 'test_description', 'is_public': True, 'is_protected': False, 'mains': [] } self.assertEqual(expected_args, args) self.assertEqual('fake-resource-id', jb.resource_id) expected_state = (jb.CREATE, jb.COMPLETE) self.assertEqual(expected_state, jb.state) def test_delete(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) scheduler.TaskRunner(jb.delete)() self.assertEqual((jb.DELETE, jb.COMPLETE), jb.state) self.client.jobs.delete.assert_called_once_with(jb.resource_id) self.client.job_executions.delete.assert_called_once_with( 'fake-execution-id') def test_delete_not_found(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) self.client.jobs.delete.side_effect = ( sahara.sahara_base.APIException(error_code=404)) scheduler.TaskRunner(jb.delete)() self.assertEqual((jb.DELETE, jb.COMPLETE), jb.state) self.client.jobs.delete.assert_called_once_with(jb.resource_id) self.client.job_executions.delete.assert_called_once_with( 'fake-execution-id') def test_delete_job_executions_raises_error(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) self.client.job_executions.find.side_effect = [ sahara.sahara_base.APIException(400)] self.assertRaises(sahara.sahara_base.APIException, jb.handle_delete) def test_update(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) props = self.stack.t.t['resources']['job']['properties'].copy() props['name'] = 'test_name_job_new' props['description'] = 'test_description_new' props['is_public'] = False self.rsrc_defn = self.rsrc_defn.freeze(properties=props) scheduler.TaskRunner(jb.update, self.rsrc_defn)() self.client.jobs.update.assert_called_once_with( 'fake-resource-id', name='test_name_job_new', description='test_description_new', is_public=False) self.assertEqual((jb.UPDATE, jb.COMPLETE), jb.state) def test_handle_signal(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) scheduler.TaskRunner(jb.handle_signal, None)() expected_args = { 'job_id': 'fake-resource-id', 'cluster_id': 'fake-cluster-id', 'input_id': 'fake-input-id', 'output_id': 'fake-output-id', 'is_public': True, 'is_protected': False, 'interface': {}, 'configs': { 'configs': { 'mapred.reduce.class': 'org.apache.oozie.example.SampleReducer', 'mapred.map.class': 'org.apache.oozie.example.SampleMapper', 'mapreduce.framework.name': 'yarn'}, 'args': [], 'params': {} } } self.client.job_executions.create.assert_called_once_with( **expected_args) def test_attributes(self): jb = self._create_resource('job', self.rsrc_defn, self.stack) jb._get_ec2_signed_url = mock.Mock(return_value='fake-url') self.assertEqual('fake-execution-id', jb.FnGetAtt('executions')[0]['id']) self.assertEqual('fake-url', jb.FnGetAtt('default_execution_url'))