# Copyright (c) 2018 VMware, Inc. 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. 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. from __future__ import print_function from __future__ import division from __future__ import absolute_import import mock import sys sys.modules['mistralclient.api.v2.client'] = mock.Mock() sys.modules['mistralclient.api.v2'] = mock.Mock() from congress.datasources import mistral_driver from congress.tests import base from congress.tests.datasources import util from congress.tests import helper ResponseObj = util.ResponseObj class TestMistralDriver(base.TestCase): def setUp(self): super(TestMistralDriver, self).setUp() args = helper.datasource_openstack_args() args['poll_time'] = 0 args['client'] = mock.MagicMock() self.driver = mistral_driver.MistralDriver( name='testmistral', args=args) def test_list_workflows(self): raw_data = [ ResponseObj({u'created_at': u'2017-10-12 20:06:58', u'definition': u'---\nversion: \'2.0\'\n\nstd.create_instance:\n' u'...', u'id': u'31c429eb-c439-43ec-a633-45c4e8749261', u'input': u'name, image_id, flavor_id, ' u'ssh_username=None, ssh_password=None, ' u'key_name=None, security_groups=None, ' u'nics=None', u'name': u'std.create_instance', u'namespace': u'', u'project_id': u'', u'scope': u'public', u'tags': ['tag1', 'tag2'], u'updated_at': None}), ResponseObj({u'created_at': u'2017-10-12 20:06:58', u'definition': u'---\nversion: "2.0"\n\nstd.delete_instance:\n' u'...', u'id': u'55f43e39-89aa-43e6-9eec-526b5aa932b9', u'input': u'instance_id', u'name': u'std.delete_instance', u'namespace': u'', u'project_id': u'', u'scope': u'public', u'tags': [], u'updated_at': None})] translated_data = self.driver._translate_workflows(raw_data) self.assertIsNotNone(translated_data) self.assertEqual(2, len(translated_data)) self.assertEqual({ (u'std.create_instance', u'31c429eb-c439-43ec-a633-45c4e8749261', u'public', u'name, image_id, flavor_id, ssh_username=None, ssh_password=' u'None, key_name=None, security_groups=None, nics=None', u'', u'', u'2017-10-12 20:06:58', u'None', u"---\nversion: '2.0'\n\nstd.create_instance:\n...", u'None'), (u'std.delete_instance', u'55f43e39-89aa-43e6-9eec-526b5aa932b9', u'public', u'instance_id', u'', u'', u'2017-10-12 20:06:58', u'None', u'---\nversion: "2.0"\n\nstd.delete_instance:\n...', u'None')}, self.driver.state['workflows']) def test_list_actions(self): raw_data = [ ResponseObj({ u'created_at': u'2017-10-12 20:06:56', u'definition': None, u'description': u'Updates a load balancer health monitor.', u'id': u'f794925d-ed65-41d4-a68d-076412d6ce9d', u'input': u'health_monitor, action_region="", body=null', u'is_system': True, u'name': u'neutron.update_health_monitor', u'scope': u'public', u'tags': None, u'updated_at': None}), ResponseObj({ u'created_at': u'2017-10-13 20:06:56', u'definition': u'action definition', u'description': u'Updates a load balancer health monitor.', u'id': u'a794925d-ed65-41d4-a68d-076412d6ce9d', u'input': u'health_monitor, action_region="", body=null', u'is_system': False, u'name': u'neutron.custom_action', u'scope': u'public', u'tags': ['tag1', 'tag2'], u'updated_at': u'2017-10-13 23:06:56'})] translated_data = self.driver._translate_actions(raw_data) self.assertIsNotNone(translated_data) self.assertEqual(2, len(translated_data)) self.assertEqual({(u'a794925d-ed65-41d4-a68d-076412d6ce9d', u'neutron.custom_action', u'health_monitor, action_region="", body=null', u'2017-10-13 20:06:56', u'2017-10-13 23:06:56', u'False', u'action definition', u'Updates a load balancer health monitor.', u'public'), (u'f794925d-ed65-41d4-a68d-076412d6ce9d', u'neutron.update_health_monitor', u'health_monitor, action_region="", body=null', u'2017-10-12 20:06:56', u'None', u'True', u'None', u'Updates a load balancer health monitor.', u'public')}, self.driver.state['actions']) def test_list_workflow_executions(self): raw_data = [ ResponseObj({u'created_at': u'2017-12-19 22:56:50', u'description': u'', u'id': u'46bbba4b-8a2e-4281-be61-1e92ebfdd6b6', u'input': u'{"instance_id": 1}', u'params': u'{"namespace": "", "task_name": ""}', u'state': u'ERROR', u'state_info': u"Failure caused by error ...", u'task_execution_id': None, u'updated_at': u'2017-12-19 22:57:00', u'workflow_id': u'55f43e39-89aa-43e6-9eec-526b5aa932b9', u'workflow_name': u'std.delete_instance', u'workflow_namespace': u''})] translated_data = self.driver._translate_workflow_executions(raw_data) self.assertIsNotNone(translated_data) self.assertEqual(1, len(translated_data)) self.assertEqual({(u'46bbba4b-8a2e-4281-be61-1e92ebfdd6b6', u'std.delete_instance', u'{"instance_id": 1}', u'2017-12-19 22:56:50', u'2017-12-19 22:57:00', u'ERROR', u'Failure caused by error ...', u'', u'55f43e39-89aa-43e6-9eec-526b5aa932b9', u'', u'{"namespace": "", "task_name": ""}')}, self.driver.state['workflow_executions']) def test_list_action_executions(self): raw_data = [ ResponseObj({u'accepted': True, u'created_at': u'2017-12-19 22:56:50', u'description': u'', u'id': u'5c377055-5590-479a-beec-3d4a47a2dfb6', u'input': u'{"server": 1}', u'name': u'nova.servers_delete', u'state': u'ERROR', u'state_info': None, u'tags': None, u'task_execution_id': u'f40a0a20-958d-4948-b0c0-e1961649f2e2', u'task_name': u'delete_vm', u'updated_at': u'2017-12-19 22:56:50', u'workflow_name': u'std.delete_instance', u'workflow_namespace': u''})] translated_data = self.driver._translate_action_executions(raw_data) self.assertIsNotNone(translated_data) self.assertEqual(1, len(translated_data)) self.assertEqual({(u'5c377055-5590-479a-beec-3d4a47a2dfb6', u'nova.servers_delete', u'None', u'std.delete_instance', u'f40a0a20-958d-4948-b0c0-e1961649f2e2', u'delete_vm', u'', u'{"server": 1}', u'2017-12-19 22:56:50', u'2017-12-19 22:56:50', u'True', u'ERROR', u'')}, self.driver.state['action_executions']) def test_execute(self): class MockClient(object): def __init__(self): self.testkey = None def mock_action(self, arg1): self.testkey = 'arg1=%s' % arg1 mock_client = MockClient() self.driver.mistral_client = mock_client api_args = { 'positional': ['1'] } expected_ans = 'arg1=1' self.driver.execute('mock_action', api_args) self.assertEqual(expected_ans, mock_client.testkey)