def test_write_to_pickle_file_with_merge(self): with TempDirectory() as temp_dir: pickle_file = temp_dir.path + '/test.pkl' on_disk_wfr = setup_test() on_disk_wfr.write_to_pickle_file(pickle_file) in_mem_wfr1 = WorkflowResult.load_from_pickle_file(pickle_file) in_mem_wfr2 = WorkflowResult.load_from_pickle_file(pickle_file) sr1 = StepResult('compliance-scan', 'scan with stackrox', 'stackrox', 'prod') sr1.add_artifact('compliance-scan-result', 'pass') sr2 = StepResult('vulnerability-scan', 'scan with stackrox', 'stackrox', 'prod') sr2.add_artifact('vulnerability-scan-result', 'fail') in_mem_wfr1.add_step_result(sr1) in_mem_wfr2.add_step_result(sr2) in_mem_wfr1.merge_with_pickle_file(pickle_file) in_mem_wfr1.write_to_pickle_file(pickle_file) in_mem_wfr2.merge_with_pickle_file(pickle_file) in_mem_wfr2.write_to_pickle_file(pickle_file) resulting_wfr = WorkflowResult.load_from_pickle_file(pickle_file) # ensure: # - both our new StepResults are present # - all StepResults from the original pickle file are present self.assertIn(sr1, resulting_wfr.workflow_list) self.assertIn(sr2, resulting_wfr.workflow_list) for sr in on_disk_wfr.workflow_list: self.assertIn(sr, resulting_wfr.workflow_list)
def test_load_from_pickle_file_exception(self): with TempDirectory() as temp_dir: pickle_file_name = temp_dir.path + '/test.pkl' pickle_file = open(pickle_file_name, 'w+') pickle_file.write("This is not a Workflow Result.") pickle_file.close() with self.assertRaises(StepRunnerException): WorkflowResult.load_from_pickle_file(pickle_file)
def test_load_from_pickle_file_no_workflowresult(self): with TempDirectory() as temp_dir: pickle_file = temp_dir.path + '/test.pkl' not_wfr = {"step1": "value1", "step2": "value2"} with open(pickle_file, 'wb') as file: pickle.dump(not_wfr, file) with self.assertRaisesRegex( StepRunnerException, f'error {pickle_file} has invalid data'): WorkflowResult.load_from_pickle_file(pickle_file)
def test_load_from_pickle_file_no_file(self): pickle_wfr = WorkflowResult.load_from_pickle_file('test.pkl') expected_wfr = WorkflowResult() self.assertEqual( pickle_wfr._WorkflowResult__get_all_step_results_dict(), expected_wfr._WorkflowResult__get_all_step_results_dict() )
def _run_step_implementer_test( self, config, step, expected_step_results, test_dir, environment=None ): working_dir_path = os.path.join(test_dir.path, 'step-runner-working') factory = StepRunner( config=config, results_file_name='step-runner-results.yml', work_dir_path=working_dir_path ) factory.run_step( step_name=step, environment=environment ) pickle = f'{working_dir_path}/step-runner-results.pkl' workflow_result = WorkflowResult.load_from_pickle_file(pickle) step_result = workflow_result.get_step_result( step_name=step ) self.assertEqual(step_result, expected_step_results)
def test_load_from_pickle_file_empty_file(self): with TempDirectory() as temp_dir: pickle_file = temp_dir.path + '/test.pkl' open(pickle_file, 'a').close() pickle_wfr = WorkflowResult.load_from_pickle_file(pickle_file) expected_wfr = WorkflowResult() self.assertEqual( pickle_wfr._WorkflowResult__get_all_step_results_dict(), expected_wfr._WorkflowResult__get_all_step_results_dict())
def test_merge_matching_stepresults_on_pickle(self): """When we pickle to disk, make sure we merge the artifacts and evidence from in-memory StepResult instances with those on disk. Whatever is in memory wins. """ with TempDirectory() as temp_dir: pickle_file = temp_dir.path + '/test.pkl' expected_wfr = setup_test() expected_wfr.write_to_pickle_file(pickle_file) # now adjust our expected WorkflowResult to include the # amended evidence/artifacts we expect to see. All other # StepResults and their artifacts/evidence are left the same. expected_sr_no_env = expected_wfr.get_step_result('step1', 'sub1') expected_sr_no_env.add_artifact('artifact1', 'changed-value1', 'description1') expected_sr_no_env.add_evidence('evidence1', 'changed-value1', 'description1') expected_sr_env = expected_wfr.get_step_result( 'deploy', 'deploy-sub', 'dev') expected_sr_env.add_artifact('artifact1', 'changed-value1') expected_sr_env.add_evidence('evidence1', 'changed-value1', 'description1') # now build our 'in memory' WFR that we're going to write # to disk. this has the amended evidence/artifacts. # one StepResult with environment, one without. in_mem_wfr = WorkflowResult() sr_no_env = StepResult('step1', 'sub1', 'implementer1') sr_no_env.add_artifact('artifact1', 'changed-value1', 'description1') sr_no_env.add_evidence('evidence1', 'changed-value1', 'description1') sr_env = StepResult('deploy', 'deploy-sub', 'helm', 'dev') sr_env.add_artifact('artifact1', 'changed-value1') sr_env.add_evidence('evidence1', 'changed-value1', 'description1') in_mem_wfr.add_step_result(sr_no_env) in_mem_wfr.add_step_result(sr_env) # write in-memory to disk post-merging in_mem_wfr.merge_with_pickle_file(pickle_file) in_mem_wfr.write_to_pickle_file(pickle_file) resulting_wfr = WorkflowResult.load_from_pickle_file(pickle_file) resulting_workflow_list = resulting_wfr.workflow_list for expected_result in expected_wfr.workflow_list: merged_result = resulting_wfr.get_step_result( step_name=expected_result.step_name, sub_step_name=expected_result.sub_step_name, environment=expected_result.environment) self.assertEqual(expected_result, merged_result) resulting_workflow_list.remove(expected_result) # nothing duplicate or extra should be in the result self.assertEqual(len(resulting_workflow_list), 0)
def test_load_from_pickle_file_yes_workflow_result(self): with TempDirectory() as temp_dir: pickle_file = temp_dir.path + '/test.pkl' expected_wfr = setup_test() expected_wfr.write_to_pickle_file(pickle_file) pickle_wfr = WorkflowResult.load_from_pickle_file(pickle_file)