def _process_response(self, response): report = self._get_response_report(response) if report is not None: self._report(report) return target = response.request.target try: parsed_data = json.loads(response.data) self._report( reports_booth.booth_config_accepted_by_node( target.label, list(parsed_data["saved"]))) for filename in list(parsed_data["existing"]): self._report( reports.file_already_exists( "", # TODO specify file type; this will be overhauled to # a generic file transport framework anyway filename, severity=(ReportItemSeverity.WARNING if self._rewrite_existing else ReportItemSeverity.ERROR), forceable=(None if self._rewrite_existing else report_codes.FORCE_FILE_OVERWRITE), node=target.label, )) for file, reason in dict(parsed_data["failed"]).items(): self._report( reports_booth.booth_config_distribution_node_error( target.label, reason, file)) except (KeyError, TypeError, ValueError): self._report(reports.invalid_response_format(target.label))
def assert_no_conflict_with_existing( self, report_processor, can_overwrite_existing=False ): if os.path.exists(self.__file_path): report_processor.process(reports.file_already_exists( self.__file_role, self.__file_path, ReportItemSeverity.WARNING if can_overwrite_existing else ReportItemSeverity.ERROR, forceable=None if can_overwrite_existing else self.__overwrite_code, ))
def assert_no_conflict_with_existing( self, report_processor, can_overwrite_existing=False ): if self.exists: report_processor.process(reports.file_already_exists( self.__file_role, self.__file_path, ReportItemSeverity.WARNING if can_overwrite_existing else ReportItemSeverity.ERROR, forceable=None if can_overwrite_existing else report_codes.FORCE_FILE_OVERWRITE, ))
def assert_no_conflict_with_existing(self, report_processor, can_overwrite_existing=False): if os.path.exists(self.__file_path): report_processor.process( reports.file_already_exists( self.__file_role, self.__file_path, ReportItemSeverity.WARNING if can_overwrite_existing else ReportItemSeverity.ERROR, forceable=None if can_overwrite_existing else self.__overwrite_code, ))
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))