def test_get(self): self.requests_mock.get(self.TEST_URL + URL_TEMPLATE_NAME % 'wb', json=WORKBOOK) wb = self.workbooks.get('wb') self.assertIsNotNone(wb) self.assertEqual( workbooks.Workbook(self.workbooks, WORKBOOK).to_dict(), wb.to_dict())
def test_get(self): mock = self.mock_http_get(content=WORKBOOK) wb = self.workbooks.get('wb') self.assertIsNotNone(wb) self.assertEqual( workbooks.Workbook(self.workbooks, WORKBOOK).to_dict(), wb.to_dict()) mock.assert_called_once_with(URL_TEMPLATE_NAME % 'wb')
def test_update_public(self, mock_open): wb_public_dict = WORKBOOK_DICT.copy() wb_public_dict['scope'] = 'public' workbook_public = workbooks.Workbook(mock, wb_public_dict) self.client.workbooks.update.return_value = workbook_public result = self.call(workbook_cmd.Update, app_args=['definition', '--public']) self.assertEqual(('a', '', 'a, b', 'public', '1', '1'), result[1]) self.assertEqual('public', self.client.workbooks.update.call_args[1]['scope'])
def test_list(self): self.requests_mock.get(self.TEST_URL + URL_TEMPLATE, json={'workbooks': [WORKBOOK]}) workbook_list = self.workbooks.list() self.assertEqual(1, len(workbook_list)) wb = workbook_list[0] self.assertEqual( workbooks.Workbook(self.workbooks, WORKBOOK).to_dict(), wb.to_dict())
def test_list(self): mock = self.mock_http_get(content={'workbooks': [WORKBOOK]}) workbook_list = self.workbooks.list() self.assertEqual(1, len(workbook_list)) wb = workbook_list[0] self.assertEqual( workbooks.Workbook(self.workbooks, WORKBOOK).to_dict(), wb.to_dict()) mock.assert_called_once_with(URL_TEMPLATE)
} ACTION_PARAMS = {'friend': 'Rocky'} NON_EMPTY_RESULT = 'non-empty' # Workbook with a single workflow (direct) WB1_META_FILE_NAME = TEST_FIXTURES['workflows'][0] WB1_META_FILE_PATH = TEST_PACK_PATH + '/actions/' + WB1_META_FILE_NAME WB1_META_CONTENT = loader.load_meta_file(WB1_META_FILE_PATH) WB1_NAME = WB1_META_CONTENT['pack'] + '.' + WB1_META_CONTENT['name'] WB1_ENTRY_POINT = TEST_PACK_PATH + '/actions/' + WB1_META_CONTENT['entry_point'] WB1_ENTRY_POINT_X = WB1_ENTRY_POINT.replace(WB1_META_FILE_NAME, 'xformed_' + WB1_META_FILE_NAME) WB1_SPEC = yaml.safe_load( MistralRunner.get_workflow_definition(WB1_ENTRY_POINT_X)) WB1_YAML = yaml.safe_dump(WB1_SPEC, default_flow_style=False) WB1 = workbooks.Workbook(None, {'name': WB1_NAME, 'definition': WB1_YAML}) WB1_OLD = workbooks.Workbook(None, {'name': WB1_NAME, 'definition': ''}) WB1_EXEC = copy.deepcopy(MISTRAL_EXECUTION) WB1_EXEC['workflow_name'] = WB1_NAME # Workbook with many workflows (direct) WB2_META_FILE_NAME = TEST_FIXTURES['workflows'][1] WB2_META_FILE_PATH = TEST_PACK_PATH + '/actions/' + WB2_META_FILE_NAME WB2_META_CONTENT = loader.load_meta_file(WB2_META_FILE_PATH) WB2_NAME = WB2_META_CONTENT['pack'] + '.' + WB2_META_CONTENT['name'] WB2_ENTRY_POINT = TEST_PACK_PATH + '/actions/' + WB2_META_CONTENT['entry_point'] WB2_ENTRY_POINT_X = WB2_ENTRY_POINT.replace(WB2_META_FILE_NAME, 'xformed_' + WB2_META_FILE_NAME) WB2_SPEC = yaml.safe_load( MistralRunner.get_workflow_definition(WB2_ENTRY_POINT_X)) WB2_YAML = yaml.safe_dump(WB2_SPEC, default_flow_style=False)
from st2actions import worker from st2actions.runners.mistral.v2 import MistralRunner from st2actions.runners.fabricrunner import FabricRunner from st2common.transport.publishers import CUDPublisher from st2common.services import action as action_service from st2common.models.db.action import ActionExecutionDB from st2common.constants.action import ACTIONEXEC_STATUS_SUCCEEDED, ACTIONEXEC_STATUS_RUNNING from st2common.models.api.action import ActionAPI from st2common.persistence.action import Action, ActionExecution CHAMPION = worker.Worker(None) WORKFLOW_YAML = [f for f in fixture.WORKFLOW_YAMLS if 'workflow-v2.yaml' in f][0] WORKBOOK_SPEC = fixture.ARTIFACTS['workflows']['workflow-v2'] WORKBOOK = workbooks.Workbook(None, { 'name': 'workflow-v2', 'definition': WORKBOOK_SPEC }) WORKBOOK_OLD = workbooks.Workbook(None, { 'name': 'workflow-v2', 'definition': '' }) EXECUTION = executions.Execution(None, { 'id': str(uuid.uuid4()), 'state': 'RUNNING' }) def process_create(payload): if isinstance(payload, ActionExecutionDB): CHAMPION.execute_action(payload)
# Action executions requirements ACTION_PARAMS = {'friend': 'Rocky'} NON_EMPTY_RESULT = 'non-empty' # Workbook with multiple workflows WB1_META_FILE_NAME = TEST_FIXTURES['workflows'][1] WB1_META_FILE_PATH = TEST_PACK_PATH + '/actions/' + WB1_META_FILE_NAME WB1_META_CONTENT = loader.load_meta_file(WB1_META_FILE_PATH) WB1_NAME = WB1_META_CONTENT['pack'] + '.' + WB1_META_CONTENT['name'] WB1_ENTRY_POINT = TEST_PACK_PATH + '/actions/' + WB1_META_CONTENT['entry_point'] WB1_ENTRY_POINT_X = WB1_ENTRY_POINT.replace(WB1_META_FILE_NAME, 'xformed_' + WB1_META_FILE_NAME) WB1_SPEC = yaml.safe_load( MistralRunner.get_workflow_definition(WB1_ENTRY_POINT_X)) WB1_YAML = yaml.safe_dump(WB1_SPEC, default_flow_style=False) WB1 = workbooks.Workbook(None, {'name': WB1_NAME, 'definition': WB1_YAML}) WB1_MAIN_EXEC = {'id': str(uuid.uuid4()), 'state': 'RUNNING'} WB1_MAIN_EXEC['workflow_name'] = WB1_NAME + '.main' WB1_MAIN_EXEC_ERRORED = copy.deepcopy(WB1_MAIN_EXEC) WB1_MAIN_EXEC_ERRORED['state'] = 'ERROR' WB1_MAIN_TASK1 = {'id': str(uuid.uuid4()), 'name': 'greet', 'state': 'ERROR'} WB1_MAIN_TASKS = [tasks.Task(None, WB1_MAIN_TASK1)] WB1_MAIN_TASK_ID = WB1_MAIN_TASK1['id'] WB1_SUB1_EXEC = { 'id': str(uuid.uuid4()), 'state': 'RUNNING', 'task_execution_id': WB1_MAIN_TASK_ID } WB1_SUB1_EXEC['workflow_name'] = WB1_NAME + '.subflow1' WB1_SUB1_EXEC_ERRORED = copy.deepcopy(WB1_SUB1_EXEC) WB1_SUB1_EXEC_ERRORED['state'] = 'ERROR'
def data(TEST): # MistralActions TEST.mistralclient_actions = test_data_utils.TestDataContainer() action_1 = actions.Action( actions.ActionManager(None), {'name': 'a', 'is_system': True, 'input': 'param1', 'description': 'my cool action', 'tags': ['test'], 'created_at': '1', 'updated_at': '1' } ) TEST.mistralclient_actions.add(action_1) # MistralExecutions TEST.mistralclient_executions = test_data_utils.TestDataContainer() execution_1 = executions.Execution( executions.ExecutionManager(None), {'id': '123', 'workflow_name': 'my_wf', 'description': '', 'state': 'RUNNING', 'input': { 'person': { 'first_name': 'John', 'last_name': 'Doe' } }} ) TEST.mistralclient_executions.add(execution_1) # Tasks TEST.mistralclient_tasks = test_data_utils.TestDataContainer() task_1 = tasks.Task( tasks.TaskManager(None), {'id': '1', 'workflow_execution_id': '123', 'name': 'my_task', 'workflow_name': 'my_wf', 'state': 'RUNNING', 'type': 'ACTION', 'tags': ['deployment', 'demo'], 'result': {'some': 'result'}}) TEST.mistralclient_tasks.add(task_1) # Workbooks TEST.mistralclient_workbooks = test_data_utils.TestDataContainer() workbook_1 = workbooks.Workbook( workbooks.WorkbookManager(None), {'name': 'a', 'tags': ['a', 'b'], 'created_at': '1', 'updated_at': '1', 'definition': WB_DEF} ) TEST.mistralclient_workbooks.add(workbook_1) # Workflows TEST.mistralclient_workflows = test_data_utils.TestDataContainer() workflow_1 = workflows.Workflow( workflows.WorkflowManager(None), {'name': 'a', 'tags': ['a', 'b'], 'input': 'param', 'created_at': '1', 'updated_at': '1', 'definition': WF_DEF} ) TEST.mistralclient_workflows.add(workflow_1) # MistralActionsExecutions TEST.mistralclient_action_executions = test_data_utils.TestDataContainer() action_executions_1 = action_executions.ActionExecution( action_executions.ActionExecutionManager(None), {'id': '1', 'name': 'a', 'tags': ['a', 'b'], 'workflow_name': 'my work flow', 'task_execution_id': '1', 'task_name': 'b', 'description': '', 'created_at': '1', 'updated_at': '1', 'accepted': True, 'state': 'RUNNING' } ) TEST.mistralclient_action_executions.add(action_executions_1) # MistralCronTriggers TEST.mistralclient_cron_triggers = test_data_utils.TestDataContainer() cron_triggers_1 = cron_triggers.CronTrigger( cron_triggers.CronTriggerManager(None), {'id': '1', 'name': 'a', 'workflow_name': 'my work flow', 'pattern': '', 'next_execution_time': '', 'remaining_executions': '', 'first_execution_time': '', 'created_at': '1', 'updated_at': '1' }) TEST.mistralclient_cron_triggers.add(cron_triggers_1)
WB_DEF = """ --- version: '2.0 name: wb workflows: wf1: tasks: task1: action: nova.servers_get server="1" """ WB_WITH_DEF_DICT = WORKBOOK_DICT.copy() WB_WITH_DEF_DICT.update({'definition': WB_DEF}) WORKBOOK = workbooks.Workbook(mock, WORKBOOK_DICT) WORKBOOK_WITH_DEF = workbooks.Workbook(mock, WB_WITH_DEF_DICT) class TestCLIWorkbooksV2(base.BaseCommandTest): @mock.patch('argparse.open', create=True) def test_create(self, mock_open): self.client.workbooks.create.return_value = WORKBOOK result = self.call(workbook_cmd.Create, app_args=['wb.yaml']) self.assertEqual(('a', '', 'a, b', 'private', '1', '1'), result[1]) @mock.patch('argparse.open', create=True) def test_create_public(self, mock_open): wb_public_dict = WORKBOOK_DICT.copy()