def test_do_not_skip_failed(self, mock_get_configs, mock_read): def _mock_read_cfg(file): if file in ["name1.conf", "name3.conf"]: raise EnvironmentError() elif file == "name2.conf": return "config2" else: raise AssertionError("unexpected input: {0}".format(file)) mock_get_configs.return_value = [ "name1.conf", "name2.conf", "name3.conf" ] mock_read.side_effect = _mock_read_cfg assert_raise_library_error( lambda: config_files.read_configs(self.mock_reporter), (severities.ERROR, report_codes.BOOTH_CONFIG_READ_ERROR, { "name": "name1.conf" }, report_codes.SKIP_UNREADABLE_CONFIG), (severities.ERROR, report_codes.BOOTH_CONFIG_READ_ERROR, { "name": "name3.conf" }, report_codes.SKIP_UNREADABLE_CONFIG)) mock_get_configs.assert_called_once_with() self.assertEqual(3, mock_read.call_count) mock_read.assert_has_calls([ mock.call("name1.conf"), mock.call("name2.conf"), mock.call("name3.conf") ]) self.assertEqual(2, len(self.mock_reporter.report_item_list))
def test_success(self, mock_get_configs, mock_read): def _mock_read_cfg(file): if file == "name1.conf": return "config1" elif file == "name2.conf": return "config2" elif file == "name3.conf": return "config3" else: raise AssertionError("unexpected input: {0}".format(file)) mock_get_configs.return_value = [ "name1.conf", "name2.conf", "name3.conf" ] mock_read.side_effect = _mock_read_cfg self.assertEqual( { "name1.conf": "config1", "name2.conf": "config2", "name3.conf": "config3" }, config_files.read_configs(self.mock_reporter)) mock_get_configs.assert_called_once_with() self.assertEqual(3, mock_read.call_count) mock_read.assert_has_calls([ mock.call("name1.conf"), mock.call("name2.conf"), mock.call("name3.conf") ]) self.assertEqual(0, len(self.mock_reporter.report_item_list))
def test_success(self, mock_get_configs, mock_read): def _mock_read_cfg(file): if file == "name1.conf": return "config1" elif file == "name2.conf": return "config2" elif file == "name3.conf": return "config3" else: raise AssertionError("unexpected input: {0}".format(file)) mock_get_configs.return_value = [ "name1.conf", "name2.conf", "name3.conf" ] mock_read.side_effect = _mock_read_cfg self.assertEqual( { "name1.conf": "config1", "name2.conf": "config2", "name3.conf": "config3" }, config_files.read_configs(self.mock_reporter) ) mock_get_configs.assert_called_once_with() self.assertEqual(3, mock_read.call_count) mock_read.assert_has_calls([ mock.call("name1.conf"), mock.call("name2.conf"), mock.call("name3.conf") ]) self.assertEqual(0, len(self.mock_reporter.report_item_list))
def test_skip_failed(self, mock_get_configs, mock_read): def _mock_read_cfg(file): if file in ["name1.conf", "name3.conf"]: raise EnvironmentError() elif file == "name2.conf": return "config2" else: raise AssertionError("unexpected input: {0}".format(file)) mock_get_configs.return_value = [ "name1.conf", "name2.conf", "name3.conf" ] mock_read.side_effect = _mock_read_cfg self.assertEqual({"name2.conf": "config2"}, config_files.read_configs(self.mock_reporter, True)) mock_get_configs.assert_called_once_with() self.assertEqual(3, mock_read.call_count) mock_read.assert_has_calls([ mock.call("name1.conf"), mock.call("name2.conf"), mock.call("name3.conf") ]) assert_report_item_list_equal( self.mock_reporter.report_item_list, [(severities.WARNING, report_codes.BOOTH_CONFIG_READ_ERROR, { "name": "name1.conf" }), (severities.WARNING, report_codes.BOOTH_CONFIG_READ_ERROR, { "name": "name3.conf" })])
def send_all_config_to_node( communicator, reporter, target_list, rewrite_existing=False, skip_wrong_config=False ): """ Send all booth configs from default booth config directory and theri authfiles to specified node. communicator -- NodeCommunicator reporter -- report processor target_list list -- list of targets to which configs should be delivered rewrite_existing -- if True rewrite existing file skip_wrong_config -- if True skip local configs that are unreadable """ _reporter = SimpleReportProcessor(reporter) config_dict = booth_conf.read_configs(reporter, skip_wrong_config) if not config_dict: return _reporter.report(reports.booth_config_distribution_started()) file_list = [] for config, config_data in sorted(config_dict.items()): try: authfile_path = config_structure.get_authfile( config_parser.parse(config_data) ) file_list.append({ "name": config, "data": config_data, "is_authfile": False }) if authfile_path: content = booth_conf.read_authfile(reporter, authfile_path) if not content: continue file_list.append({ "name": os.path.basename(authfile_path), "data": base64.b64encode(content).decode("utf-8"), "is_authfile": True }) except LibraryError: _reporter.report(reports.booth_skipping_config( config, "unable to parse config" )) com_cmd = BoothSaveFiles( _reporter, file_list, rewrite_existing=rewrite_existing ) com_cmd.set_targets(target_list) run(communicator, com_cmd) if _reporter.has_errors: raise LibraryError()
def send_all_config_to_node(communicator, reporter, target_list, rewrite_existing=False, skip_wrong_config=False): """ Send all booth configs from default booth config directory and theri authfiles to specified node. communicator -- NodeCommunicator reporter -- report processor target_list list -- list of targets to which configs should be delivered rewrite_existing -- if True rewrite existing file skip_wrong_config -- if True skip local configs that are unreadable """ _reporter = SimpleReportProcessor(reporter) config_dict = booth_conf.read_configs(reporter, skip_wrong_config) if not config_dict: return _reporter.report(reports.booth_config_distribution_started()) file_list = [] for config, config_data in sorted(config_dict.items()): try: authfile_path = config_structure.get_authfile( config_parser.parse(config_data)) file_list.append({ "name": config, "data": config_data, "is_authfile": False }) if authfile_path: content = booth_conf.read_authfile(reporter, authfile_path) if not content: continue file_list.append({ "name": os.path.basename(authfile_path), "data": base64.b64encode(content).decode("utf-8"), "is_authfile": True }) except LibraryError: _reporter.report( reports.booth_skipping_config(config, "unable to parse config")) com_cmd = BoothSaveFiles(_reporter, file_list, rewrite_existing=rewrite_existing) com_cmd.set_targets(target_list) run(communicator, com_cmd) if _reporter.has_errors: raise LibraryError()
def test_skip_failed(self, mock_get_configs, mock_read): def _mock_read_cfg(file): if file in ["name1.conf", "name3.conf"]: raise EnvironmentError() elif file == "name2.conf": return "config2" else: raise AssertionError("unexpected input: {0}".format(file)) mock_get_configs.return_value = [ "name1.conf", "name2.conf", "name3.conf" ] mock_read.side_effect = _mock_read_cfg self.assertEqual( {"name2.conf": "config2"}, config_files.read_configs(self.mock_reporter, True) ) mock_get_configs.assert_called_once_with() self.assertEqual(3, mock_read.call_count) mock_read.assert_has_calls([ mock.call("name1.conf"), mock.call("name2.conf"), mock.call("name3.conf") ]) assert_report_item_list_equal( self.mock_reporter.report_item_list, [ ( severities.WARNING, report_codes.BOOTH_CONFIG_READ_ERROR, {"name": "name1.conf"} ), ( severities.WARNING, report_codes.BOOTH_CONFIG_READ_ERROR, {"name": "name3.conf"} ) ] )
def test_do_not_skip_failed(self, mock_get_configs, mock_read): def _mock_read_cfg(file): if file in ["name1.conf", "name3.conf"]: raise EnvironmentError() elif file == "name2.conf": return "config2" else: raise AssertionError("unexpected input: {0}".format(file)) mock_get_configs.return_value = [ "name1.conf", "name2.conf", "name3.conf" ] mock_read.side_effect = _mock_read_cfg assert_raise_library_error( lambda: config_files.read_configs(self.mock_reporter), ( severities.ERROR, report_codes.BOOTH_CONFIG_READ_ERROR, {"name": "name1.conf"}, report_codes.SKIP_UNREADABLE_CONFIG ), ( severities.ERROR, report_codes.BOOTH_CONFIG_READ_ERROR, {"name": "name3.conf"}, report_codes.SKIP_UNREADABLE_CONFIG ) ) mock_get_configs.assert_called_once_with() self.assertEqual(3, mock_read.call_count) mock_read.assert_has_calls([ mock.call("name1.conf"), mock.call("name2.conf"), mock.call("name3.conf") ]) self.assertEqual(2, len(self.mock_reporter.report_item_list))
def send_all_config_to_node( communicator, reporter, target, rewrite_existing=False, skip_wrong_config=False ): """ Send all booth configs from default booth config directory and theri authfiles to specified node. communicator -- NodeCommunicator reporter -- report processor node -- NodeAddress rewrite_existing -- if True rewrite existing file skip_wrong_config -- if True skip local configs that are unreadable """ config_dict = booth_conf.read_configs(reporter, skip_wrong_config) if not config_dict: return reporter.process(reports.booth_config_distribution_started()) file_list = [] for config, config_data in sorted(config_dict.items()): try: authfile_path = config_structure.get_authfile( config_parser.parse(config_data) ) file_list.append({ "name": config, "data": config_data, "is_authfile": False }) if authfile_path: content = booth_conf.read_authfile(reporter, authfile_path) if not content: continue file_list.append({ "name": os.path.basename(authfile_path), "data": base64.b64encode(content).decode("utf-8"), "is_authfile": True }) except LibraryError: reporter.process(reports.booth_skipping_config( config, "unable to parse config" )) com_cmd = BoothSaveFiles( reporter, file_list, rewrite_existing=rewrite_existing ) com_cmd.set_targets([target]) response = run_and_raise(communicator, com_cmd)[0][1] try: report_list = [] for file in response["existing"]: report_list.append(lib_reports.file_already_exists( None, file, Severities.WARNING if rewrite_existing else Severities.ERROR, ( None if rewrite_existing else report_codes.FORCE_FILE_OVERWRITE ), target.label )) for file, reason in response["failed"].items(): report_list.append(reports.booth_config_distribution_node_error( target.label, reason, file )) reporter.process_list(report_list) reporter.process( reports.booth_config_accepted_by_node(target.label, response["saved"]) ) except (KeyError, ValueError): raise LibraryError(lib_reports.invalid_response_format(target.label))
def send_all_config_to_node( communicator, reporter, node, rewrite_existing=False, skip_wrong_config=False ): """ Send all booth configs from default booth config directory and theri authfiles to specified node. communicator -- NodeCommunicator reporter -- report processor node -- NodeAddress rewrite_existing -- if True rewrite existing file skip_wrong_config -- if True skip local configs that are unreadable """ config_dict = booth_conf.read_configs(reporter, skip_wrong_config) if not config_dict: return file_list = [] for config, config_data in sorted(config_dict.items()): try: authfile_path = config_structure.get_authfile( config_parser.parse(config_data) ) file_list.append({ "name": config, "data": config_data, "is_authfile": False }) if authfile_path: content = booth_conf.read_authfile(reporter, authfile_path) if not content: continue file_list.append({ "name": os.path.basename(authfile_path), "data": base64.b64encode(content).decode("utf-8"), "is_authfile": True }) except LibraryError: reporter.process(reports.booth_skipping_config( config, "unable to parse config" )) data = [("data_json", json.dumps(file_list))] if rewrite_existing: data.append(("rewrite_existing", "1")) reporter.process(reports.booth_sending_local_configs_to_node(node.label)) try: response = json.loads(communicator.call_node( node, "remote/booth_save_files", NodeCommunicator.format_data_dict(data) )) report_list = [] for file in response["existing"]: report_list.append(lib_reports.file_already_exists( None, file, Severities.WARNING if rewrite_existing else Severities.ERROR, ( None if rewrite_existing else report_codes.FORCE_FILE_OVERWRITE ), node.label )) for file, reason in response["failed"].items(): report_list.append(reports.booth_config_not_saved( node.label, reason, file )) reporter.process_list(report_list) reporter.process( reports.booth_config_saved(node.label, response["saved"]) ) except NodeCommunicationException as e: raise LibraryError(node_communicator_exception_to_report_item(e)) except (KeyError, ValueError): raise LibraryError(lib_reports.invalid_response_format(node.label))
def send_all_config_to_node( communicator, reporter, node, rewrite_existing=False, skip_wrong_config=False ): """ Send all booth configs from default booth config directory and theri authfiles to specified node. communicator -- NodeCommunicator reporter -- report processor node -- NodeAddress rewrite_existing -- if True rewrite existing file skip_wrong_config -- if True skip local configs that are unreadable """ config_dict = booth_conf.read_configs(reporter, skip_wrong_config) if not config_dict: return reporter.process(reports.booth_config_distribution_started()) file_list = [] for config, config_data in sorted(config_dict.items()): try: authfile_path = config_structure.get_authfile( config_parser.parse(config_data) ) file_list.append({ "name": config, "data": config_data, "is_authfile": False }) if authfile_path: content = booth_conf.read_authfile(reporter, authfile_path) if not content: continue file_list.append({ "name": os.path.basename(authfile_path), "data": base64.b64encode(content).decode("utf-8"), "is_authfile": True }) except LibraryError: reporter.process(reports.booth_skipping_config( config, "unable to parse config" )) data = [("data_json", json.dumps(file_list))] if rewrite_existing: data.append(("rewrite_existing", "1")) try: response = json.loads(communicator.call_node( node, "remote/booth_save_files", NodeCommunicator.format_data_dict(data) )) report_list = [] for file in response["existing"]: report_list.append(lib_reports.file_already_exists( None, file, Severities.WARNING if rewrite_existing else Severities.ERROR, ( None if rewrite_existing else report_codes.FORCE_FILE_OVERWRITE ), node.label )) for file, reason in response["failed"].items(): report_list.append(reports.booth_config_distribution_node_error( node.label, reason, file )) reporter.process_list(report_list) reporter.process( reports.booth_config_accepted_by_node(node.label, response["saved"]) ) except NodeCommunicationException as e: raise LibraryError(node_communicator_exception_to_report_item(e)) except (KeyError, ValueError): raise LibraryError(lib_reports.invalid_response_format(node.label))