예제 #1
0
 def test_get_all_workflows_as_limited_json(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     workflow_jsons = playbook.get_all_workflows_as_limited_json()
     expected = [{'name': i + 1, 'uid': i} for i in range(3)]
     for workflow_json in workflow_jsons:
         self.assertIn(workflow_json, expected)
예제 #2
0
class MockPlaybookLoader(object):
    def __init__(self):
        self.playbook1 = Playbook(
            'play1', workflows=[Workflow('work1'),
                                Workflow('work2')])
        self.playbook2 = Playbook(
            'play2', workflows=[Workflow('work1'),
                                Workflow('work3')])

    def load_workflow(self, resource, workflow_name):
        if resource == 'play1' and self.playbook1.has_workflow_name(
                workflow_name):
            return resource, self.playbook1.get_workflow_by_name(workflow_name)
        elif resource == 'play2' and self.playbook2.has_workflow_name(
                workflow_name):
            return resource, self.playbook2.get_workflow_by_name(workflow_name)
        else:
            return None

    def load_playbook(self, resource):
        if resource == 'test1':
            return self.playbook1
        elif resource == 'play2':
            return self.playbook2
        else:
            return None

    def load_playbooks(self, resource_collection):
        return [self.playbook1, self.playbook2]
예제 #3
0
 def __init__(self):
     self.playbook1 = Playbook(
         'play1', workflows=[Workflow('work1'),
                             Workflow('work2')])
     self.playbook2 = Playbook(
         'play2', workflows=[Workflow('work1'),
                             Workflow('work3')])
예제 #4
0
 def test_get_all_workflows_as_json(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     workflow_jsons = playbook.get_all_workflow_representations()
     expected = [{'name': i + 1, 'uid': i, 'other': 'other'} for i in range(3)]
     for workflow_json in workflow_jsons:
         self.assertIn(workflow_json, expected)
예제 #5
0
 def test_load_playbook(self):
     workflows = [Workflow('something'), Workflow('something2')]
     playbook = Playbook('test', workflows=workflows)
     filepath = os.path.join(test_data_path, 'test.json')
     with open(filepath, 'w') as file_out:
         file_out.write(json.dumps(playbook.read()))
     loaded = Loader.load_playbook(filepath)
     self.assertIsInstance(loaded, Playbook)
     self.assertEqual(loaded.name, 'test')
예제 #6
0
 def test_load_playbooks_some_invalid_playbooks_in_directory(self):
     workflows = [Workflow('something'), Workflow('something2')]
     playbook = Playbook('test', workflows=workflows)
     filepath = os.path.join(test_data_path, 'test.playbook')
     with open(filepath, 'w') as file_out:
         file_out.write(json.dumps(playbook.read()))
     test_invalid_json = 'something not json'
     filepath = os.path.join(test_data_path, 'test2.playbook')
     with open(filepath, 'w') as file_out:
         file_out.write(test_invalid_json)
     loaded = Loader.load_playbooks(test_data_path)
     self.assertEqual(len(loaded), 1)
     self.assertEqual(loaded[0].name, 'test')
예제 #7
0
    def load_playbook(resource):
        """Loads a playbook from a file.

        Args:
            resource (str): Path to the workflow.
        """
        try:
            playbook_file = open(resource, 'r')
        except (IOError, OSError) as e:
            logger.error(
                'Could not load workflow from {0}. Reason: {1}'.format(
                    resource, format_exception_message(e)))
            return None
        else:
            with playbook_file:
                workflow_loaded = playbook_file.read()
                try:
                    playbook_json = json.loads(workflow_loaded)
                    return Playbook.create(playbook_json)
                except ValueError:
                    logger.error('Cannot parse {}'.format(resource))
                except (InvalidInput, UnknownApp, UnknownAppAction,
                        UnknownFilter, UnknownFlag) as e:
                    logger.error('Error constructing playbook from {0}. '
                                 'Reason: {1}'.format(
                                     resource, format_exception_message(e)))
                    return None
예제 #8
0
    def copy_workflow(self, old_playbook_name, new_playbook_name, old_workflow_name, new_workflow_name):
        """Duplicates a workflow into its current playbook, or a different playbook.

        Args:
            old_playbook_name (str): Playbook name under which the workflow is located.
            new_playbook_name (str): The new playbook name for the duplicated workflow.
            old_workflow_name (str): The name of the workflow to be copied.
            new_workflow_name (str): The new name of the duplicated workflow.
        """
        workflow = self.get_workflow(old_playbook_name, old_workflow_name)
        if workflow is not None:
            steps = workflow.strip_async_result()

            workflow_copy = deepcopy(workflow)
            workflow_copy.name = new_workflow_name
            workflow_copy.regenerate_uids()
            workflow_copy.reset_async_result()

            workflow.reload_async_result(steps)

            if new_playbook_name in self.playbooks:
                self.playbooks[new_playbook_name].add_workflow(workflow_copy)
            else:
                self.playbooks[new_playbook_name] = Playbook(new_playbook_name, [workflow_copy])
            logger.info('Workflow copied from {0}-{1} to {2}-{3}'.format(old_playbook_name, old_workflow_name,
                                                                         new_playbook_name, new_workflow_name))
예제 #9
0
    def load_workflow(self,
                      resource,
                      workflow_name,
                      loader=JsonPlaybookLoader):
        """Loads a workflow from a file.

        Args:
            resource (str): Path to the workflow.
            workflow_name (str): Name of the workflow to load.
            loader (cls): Class used to load the workflow
        Returns:
            True on success, False otherwise.
        """
        loaded = loader.load_workflow(resource, workflow_name)
        if loaded is None:
            return None
        else:
            playbook_name, workflow = loaded
        if playbook_name not in self.playbooks:
            logger.debug(
                'Playbook name {0} not found while loading workflow {1}. Adding to storage.'
                .format(playbook_name, workflow.uid))
            self.playbooks[playbook_name] = Playbook(playbook_name, [workflow])
        else:
            self.playbooks[playbook_name].add_workflow(workflow)
        logger.info('Loaded workflow {} into storage'.format(workflow.uid))
예제 #10
0
    def create_playbook(self, playbook_name, workflows=None):
        """Creates a playbook from a playbook template.

        Args:
            playbook_name (str): The name of the new playbook.
            workflows (list[Workflow], optional): The list of workflows to be associated with the playbook. Defaults to
                None
        """
        workflows = workflows if workflows is not None else []
        self.add_playbook(Playbook(playbook_name, workflows))
예제 #11
0
 def test_rename_workflow_not_found(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     playbook.rename_workflow('invalid', 'new_name')
     self.assertTrue(all(
         playbook.has_workflow_uid(uid) for uid in range(3)))
     self.assertFalse(playbook.has_workflow_name('invalid'))
예제 #12
0
    def add_workflow(self, playbook_name, workflow):
        """
        Adds a workflow to the store

        Args:
            playbook_name (str): Playbook to add the workflow to
            workflow (Workflow): Workflow to add
        """
        if playbook_name in self.playbooks:
            self.playbooks[playbook_name].add_workflow(workflow)
        else:
            logger.warning('Playbook wih name {} does not exist storage. Creating.'.format(playbook_name))
            self.playbooks[playbook_name] = Playbook(playbook_name, workflows=[workflow])
        logger.info('Loaded workflow {0} into playbook {1} in storage'.format(workflow.name, playbook_name))
예제 #13
0
 def test_load_multiple_workflows(self):
     workflows = [Workflow('something'), Workflow('something2')]
     playbook = Playbook('test', workflows=workflows)
     filepath = os.path.join(test_data_path, 'test.playbook')
     with open(filepath, 'w') as file_out:
         file_out.write(json.dumps(playbook.read()))
     workflows = [Workflow('something'), Workflow('something2')]
     playbook = Playbook('test2', workflows=workflows)
     filepath = os.path.join(test_data_path, 'test2.playbook')
     with open(filepath, 'w') as file_out:
         file_out.write(json.dumps(playbook.read()))
     loaded = Loader.load_playbooks(test_data_path)
     self.assertEqual(len(loaded), 2)
     self.assertSetEqual({playbook.name
                          for playbook in loaded}, {'test', 'test2'})
예제 #14
0
 def test_init_with_uid(self):
     playbook = Playbook('test', uid='uuu')
     self.assertEqual(playbook.name, 'test')
     self.assertEqual(playbook.uid, 'uuu')
     self.assertDictEqual(playbook.workflows, {})
     self.assertEqual(playbook.walkoff_version, walkoff_version)
예제 #15
0
 def test_remove_workflow_by_name(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     playbook.remove_workflow_by_name(2)
     self.assertEqual(len(playbook.workflows), 2)
     self.assertFalse(playbook.has_workflow_name(2))
예제 #16
0
 def test_remove_workflow_by_name_workflow_not_found(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     playbook.remove_workflow_by_name('invalid')
     self.assertEqual(len(playbook.workflows), 3)
예제 #17
0
 def test_remove_workflow_by_name_no_workflows(self):
     playbook = Playbook('test', [])
     playbook.remove_workflow_by_name('something')
     self.assertDictEqual(playbook.workflows, {})
예제 #18
0
 def test_get_workflow_by_uid(self):
     workflow = MockWorkflow('uid', 'wf_name')
     playbook = Playbook('test', [workflow])
     self.assertEqual(playbook.get_workflow_by_uid('uid'), workflow)
예제 #19
0
 def test_add_workflow_name_already_exists(self):
     workflow = MockWorkflow('uid', 'wf_name')
     playbook = Playbook('test', [workflow])
     playbook.add_workflow(MockWorkflow('uid2', 'wf_name'))
     self.assertEqual(playbook.workflows['wf_name'].uid, 'uid2')
예제 #20
0
 def test_init_with_walkoff_version_number(self):
     playbook = Playbook('test', walkoff_version='0.4.0')
     self.assertEqual(playbook.name, 'test')
     self.assertDictEqual(playbook.workflows, {})
     self.assertEqual(playbook.walkoff_version, '0.4.0')
예제 #21
0
 def test_add_workflow(self):
     workflow = MockWorkflow('uid', 'wf_name')
     playbook = Playbook('test', [workflow])
     playbook.add_workflow(MockWorkflow('uid2', 'test2'))
     orderless_list_compare(self, list(playbook.workflows.keys()), ['wf_name', 'test2'])
예제 #22
0
 def test_has_workflow_uid_no_workflows(self):
     playbook = Playbook('test', [])
     self.assertFalse(playbook.has_workflow_uid('anything'))
예제 #23
0
 def test_has_workflow_name(self):
     workflow = MockWorkflow('uid', 'wf_name')
     playbook = Playbook('test', [workflow])
     self.assertTrue(playbook.has_workflow_name('wf_name'))
예제 #24
0
 def test_init(self):
     playbook = Playbook('test')
     self.assertEqual(playbook.name, 'test')
     self.assertIsNotNone(playbook.uid)
     self.assertDictEqual(playbook.workflows, {})
     self.assertEqual(playbook.walkoff_version, walkoff_version)
예제 #25
0
 def test_has_workflow_uid_no_uid(self):
     workflow = MockWorkflow('uid', 'wf_name')
     playbook = Playbook('test', [workflow])
     self.assertFalse(playbook.has_workflow_uid('invalid'))
예제 #26
0
 def test_rename_workflow_no_workflows(self):
     playbook = Playbook('test', [])
     playbook.rename_workflow('anything', 'renamed')
     self.assertDictEqual(playbook.workflows, {})
예제 #27
0
 def test_get_workflow_by_uid_no_workflows(self):
     playbook = Playbook('test', [])
     self.assertIsNone(playbook.get_workflow_by_uid('anything'))
예제 #28
0
 def test_rename_workflow(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     playbook.rename_workflow(3, 'new_name')
     self.assertTrue(playbook.has_workflow_name('new_name'))
     self.assertFalse(playbook.has_workflow_name(3))
예제 #29
0
 def test_get_workflow_by_uid_no_name(self):
     workflow = MockWorkflow('uid', 'wf_name')
     playbook = Playbook('test', [workflow])
     self.assertIsNone(playbook.get_workflow_by_uid('invalid'))
예제 #30
0
 def test_init_with_workflows(self):
     workflows = [MockWorkflow(i, i + 1) for i in range(3)]
     playbook = Playbook('test', workflows)
     self.assertEqual(playbook.name, 'test')
     self.assertEqual(playbook.walkoff_version, walkoff_version)
     orderless_list_compare(self, list(playbook.workflows.keys()), [workflow.name for workflow in workflows])