def verify_networks_resp(cls, **kwargs): logger.info("RPC method verify_networks_resp received: %s" % jsonutils.dumps(kwargs)) task_uuid = kwargs.get("task_uuid") nodes = kwargs.get("nodes") error_msg = kwargs.get("error") status = kwargs.get("status") progress = kwargs.get("progress") # We simply check that each node received all vlans for cluster task = objects.Task.get_by_uuid(task_uuid, fail_if_not_found=True) result = [] # We expect that 'nodes' contains all nodes which we test. # Situation when some nodes not answered must be processed # in orchestrator early. if nodes is None: # If no nodes in kwargs then we update progress or status only. pass elif isinstance(nodes, list): cached_nodes = task.cache["args"]["nodes"] node_uids = [str(n["uid"]) for n in nodes] cached_node_uids = [str(n["uid"]) for n in cached_nodes] forgotten_uids = set(cached_node_uids) - set(node_uids) if forgotten_uids: absent_nodes = db().query(Node).filter(Node.id.in_(forgotten_uids)).all() absent_node_names = [] for n in absent_nodes: if n.name: absent_node_names.append(n.name) else: absent_node_names.append("id: %s" % n.id) if not error_msg: error_msg = "Node(s) {0} didn't return data.".format(", ".join(absent_node_names)) status = "error" else: error_nodes = [] node_excluded_networks = [] for node in nodes: cached_nodes_filtered = filter(lambda n: str(n["uid"]) == str(node["uid"]), cached_nodes) if not cached_nodes_filtered: logger.warning( "verify_networks_resp: arguments contain node " "data which is not in the task cache: %r", node, ) continue cached_node = cached_nodes_filtered[0] # Check if we have excluded interfaces for LACP bonds excluded_networks = cached_node.get("excluded_networks", []) if excluded_networks: interfaces = ", ".join([net.get("iface") for net in excluded_networks]) node_excluded_networks.append({"node_name": cached_node["name"], "interfaces": interfaces}) errors = connectivity_check.check_received_data(cached_node, node) error_nodes.extend(errors) if error_nodes: result = error_nodes status = "error" else: # notices must not rewrite error messages if node_excluded_networks: interfaces_list = ", ".join( [ "node {0} [{1}]".format(item["node_name"], item["interfaces"]) for item in node_excluded_networks ] ) error_msg = connectivity_check.append_message( error_msg, "Notice: some interfaces were skipped from " "connectivity checking because this version of " "Fuel cannot establish LACP on Bootstrap nodes. " "Only interfaces of successfully deployed nodes " "may be checked with LACP enabled. The list of " "skipped interfaces: {0}.".format(interfaces_list), ) if task.cache["args"]["offline"] > 0: error_msg = connectivity_check.append_message( error_msg, "Notice: {0} node(s) were offline during " "connectivity check so they were skipped from the " "check.".format(task.cache["args"]["offline"]), ) else: error_msg = error_msg or 'verify_networks_resp: argument "nodes"' " have incorrect type" status = "error" logger.error(error_msg) if status not in ("ready", "error"): data = {"status": status, "progress": progress, "message": error_msg, "result": result} objects.Task.update(task, data) else: objects.Task.update_verify_networks(task, status, progress, error_msg, result) cls._update_action_log_entry(status, task.name, task_uuid, nodes)
def verify_networks_resp(cls, **kwargs): logger.info( "RPC method verify_networks_resp received: %s" % jsonutils.dumps(kwargs) ) task_uuid = kwargs.get('task_uuid') nodes = kwargs.get('nodes') error_msg = kwargs.get('error') status = kwargs.get('status') progress = kwargs.get('progress') # We simply check that each node received all vlans for cluster task = objects.Task.get_by_uuid(task_uuid, fail_if_not_found=True) result = [] # We expect that 'nodes' contains all nodes which we test. # Situation when some nodes not answered must be processed # in orchestrator early. if nodes is None: # If no nodes in kwargs then we update progress or status only. pass elif isinstance(nodes, list): cached_nodes = task.cache['args']['nodes'] node_uids = [str(n['uid']) for n in nodes] cached_node_uids = [str(n['uid']) for n in cached_nodes] forgotten_uids = set(cached_node_uids) - set(node_uids) if forgotten_uids: absent_nodes = db().query(Node).filter( Node.id.in_(forgotten_uids) ).all() absent_node_names = [] for n in absent_nodes: if n.name: absent_node_names.append(n.name) else: absent_node_names.append('id: %s' % n.id) if not error_msg: error_msg = 'Node(s) {0} didn\'t return data.'.format( ', '.join(absent_node_names) ) status = 'error' else: error_nodes = [] node_excluded_networks = [] for node in nodes: cached_nodes_filtered = filter( lambda n: str(n['uid']) == str(node['uid']), cached_nodes ) if not cached_nodes_filtered: logger.warning( "verify_networks_resp: arguments contain node " "data which is not in the task cache: %r", node ) continue cached_node = cached_nodes_filtered[0] # Check if we have excluded interfaces for LACP bonds excluded_networks = cached_node.get( 'excluded_networks', []) if excluded_networks: interfaces = ', '.join( [net.get('iface') for net in excluded_networks]) node_excluded_networks.append({ 'node_name': cached_node['name'], 'interfaces': interfaces }) errors = connectivity_check.check_received_data( cached_node, node) error_nodes.extend(errors) if error_nodes: result = error_nodes status = 'error' elif node_excluded_networks: interfaces_list = ', '.join( ['node {0} [{1}]'.format( item['node_name'], item['interfaces']) for item in node_excluded_networks]) error_msg = 'Notice: some interfaces were skipped from' \ ' connectivity checking because this version' \ ' of Fuel cannot establish LACP on Bootstrap' \ ' nodes. Only interfaces of successfully' \ ' deployed nodes may be checked with LACP' \ ' enabled. The list of skipped interfaces:' \ ' {0}.'.format(interfaces_list) else: error_msg = (error_msg or 'verify_networks_resp: argument "nodes"' ' have incorrect type') status = 'error' logger.error(error_msg) if status not in ('ready', 'error'): data = { 'status': status, 'progress': progress, 'message': error_msg, 'result': result } objects.Task.update(task, data) else: objects.Task.update_verify_networks( task, status, progress, error_msg, result) cls._update_action_log_entry(status, task.name, task_uuid, nodes)
def verify_networks_resp(cls, **kwargs): logger.info( "RPC method verify_networks_resp received: %s" % jsonutils.dumps(kwargs) ) task_uuid = kwargs.get('task_uuid') nodes = kwargs.get('nodes') error_msg = kwargs.get('error') status = kwargs.get('status') progress = kwargs.get('progress') # We simply check that each node received all vlans for cluster task = objects.Task.get_by_uuid(task_uuid, fail_if_not_found=True) result = [] # We expect that 'nodes' contains all nodes which we test. # Situation when some nodes not answered must be processed # in orchestrator early. if nodes is None: # If no nodes in kwargs then we update progress or status only. pass elif isinstance(nodes, list): cached_nodes = task.cache['args']['nodes'] node_uids = [str(n['uid']) for n in nodes] cached_node_uids = [str(n['uid']) for n in cached_nodes] forgotten_uids = set(cached_node_uids) - set(node_uids) if forgotten_uids: absent_nodes = db().query(Node).filter( Node.id.in_(forgotten_uids) ).all() absent_node_names = [] for n in absent_nodes: if n.name: absent_node_names.append(n.name) else: absent_node_names.append('id: %s' % n.id) if not error_msg: error_msg = 'Node(s) {0} didn\'t return data.'.format( ', '.join(absent_node_names) ) status = 'error' else: error_nodes = [] node_excluded_networks = [] for node in nodes: cached_nodes_filtered = filter( lambda n: str(n['uid']) == str(node['uid']), cached_nodes ) if not cached_nodes_filtered: logger.warning( "verify_networks_resp: arguments contain node " "data which is not in the task cache: %r", node ) continue cached_node = cached_nodes_filtered[0] # Check if we have excluded interfaces for LACP bonds excluded_networks = cached_node.get( 'excluded_networks', []) if excluded_networks: interfaces = ', '.join( [net.get('iface') for net in excluded_networks]) node_excluded_networks.append({ 'node_name': cached_node['name'], 'interfaces': interfaces }) errors = connectivity_check.check_received_data( cached_node, node) error_nodes.extend(errors) if error_nodes: result = error_nodes status = 'error' else: # notices must not rewrite error messages if node_excluded_networks: interfaces_list = ', '.join( ['node {0} [{1}]'.format( item['node_name'], item['interfaces']) for item in node_excluded_networks]) error_msg = connectivity_check.append_message( error_msg, 'Notice: some interfaces were skipped from ' 'connectivity checking because this version of ' 'Fuel cannot establish LACP on Bootstrap nodes. ' 'Only interfaces of successfully deployed nodes ' 'may be checked with LACP enabled. The list of ' 'skipped interfaces: {0}.'.format(interfaces_list) ) if task.cache['args']['offline'] > 0: error_msg = connectivity_check.append_message( error_msg, 'Notice: {0} node(s) were offline during ' 'connectivity check so they were skipped from the ' 'check.'.format(task.cache['args']['offline']) ) else: error_msg = (error_msg or 'verify_networks_resp: argument "nodes"' ' have incorrect type') status = 'error' logger.error(error_msg) if status not in ('ready', 'error'): data = { 'status': status, 'progress': progress, 'message': error_msg, 'result': result } objects.Task.update(task, data) else: objects.Task.update_verify_networks( task, status, progress, error_msg, result) cls._update_action_log_entry(status, task.name, task_uuid, nodes)