def parallel_nodes_communication_helper( func, func_args_kwargs, reporter, skip_offline_nodes=False ): """ Help running node calls in parallel and handle communication exceptions. Raise LibraryError on any failure. function func function to be run, should be a function calling a node iterable func_args_kwargs list of tuples: (*args, **kwargs) bool skip_offline_nodes do not raise LibraryError if a node is unreachable """ failure_severity = ReportItemSeverity.ERROR failure_forceable = report_codes.SKIP_OFFLINE_NODES if skip_offline_nodes: failure_severity = ReportItemSeverity.WARNING failure_forceable = None report_items = [] def _parallel(*args, **kwargs): try: func(*args, **kwargs) except NodeCommunicationException as e: report_items.append( node_communicator_exception_to_report_item( e, failure_severity, failure_forceable ) ) except LibraryError as e: report_items.extend(e.args) tools_run_parallel(_parallel, func_args_kwargs) reporter.process_list(report_items)
def parallel_nodes_communication_helper(func, func_args_kwargs, reporter, skip_offline_nodes=False): """ Help running node calls in parallel and handle communication exceptions. Raise LibraryError on any failure. function func function to be run, should be a function calling a node iterable func_args_kwargs list of tuples: (*args, **kwargs) bool skip_offline_nodes do not raise LibraryError if a node is unreachable """ failure_severity = ReportItemSeverity.ERROR failure_forceable = report_codes.SKIP_OFFLINE_NODES if skip_offline_nodes: failure_severity = ReportItemSeverity.WARNING failure_forceable = None report_items = [] def _parallel(*args, **kwargs): try: func(*args, **kwargs) except NodeCommunicationException as e: report_items.append( node_communicator_exception_to_report_item( e, failure_severity, failure_forceable)) except LibraryError as e: report_items.extend(e.args) tools_run_parallel(_parallel, func_args_kwargs) reporter.process_list(report_items)
def check_corosync_offline_on_nodes( node_communicator, reporter, node_addr_list, skip_offline_nodes=False ): """ Check corosync is not running on cluster nodes node_addr_list nodes to send config to (NodeAddressesList instance) skip_offline_nodes don't raise an error if a node communication error occurs """ failure_severity = ReportItemSeverity.ERROR failure_forceable = report_codes.SKIP_OFFLINE_NODES if skip_offline_nodes: failure_severity = ReportItemSeverity.WARNING failure_forceable = None report_items = [] def _parallel(node): try: status = node_communicator.call_node(node, "remote/status", None) if not json.loads(status)["corosync"]: reporter.process( reports.corosync_not_running_on_node_ok(node.label) ) else: report_items.append( reports.corosync_running_on_node_fail(node.label) ) except NodeCommunicationException as e: report_items.append( node_communicator_exception_to_report_item( e, failure_severity, failure_forceable ) ) report_items.append( reports.corosync_not_running_check_node_error( node.label, failure_severity, failure_forceable ) ) except (ValueError, LookupError): report_items.append( reports.corosync_not_running_check_node_error( node.label, failure_severity, failure_forceable ) ) reporter.process(reports.corosync_not_running_check_started()) tools_run_parallel( _parallel, [((node, ), {}) for node in node_addr_list] ) reporter.process_list(report_items)
def distribute_corosync_conf( node_communicator, reporter, node_addr_list, config_text, skip_offline_nodes=False ): """ Send corosync.conf to several cluster nodes node_addr_list nodes to send config to (NodeAddressesList instance) config_text text of corosync.conf skip_offline_nodes don't raise an error if a node communication error occurs """ failure_severity = ReportItemSeverity.ERROR failure_forceable = report_codes.SKIP_OFFLINE_NODES if skip_offline_nodes: failure_severity = ReportItemSeverity.WARNING failure_forceable = None report_items = [] def _parallel(node): try: corosync_live.set_remote_corosync_conf( node_communicator, node, config_text ) reporter.process( reports.corosync_config_accepted_by_node(node.label) ) except NodeCommunicationException as e: report_items.append( node_communicator_exception_to_report_item( e, failure_severity, failure_forceable ) ) report_items.append( reports.corosync_config_distribution_node_error( node.label, failure_severity, failure_forceable ) ) reporter.process(reports.corosync_config_distribution_started()) tools_run_parallel( _parallel, [((node, ), {}) for node in node_addr_list] ) reporter.process_list(report_items)