def _get_data(request, env, roles, virt, group_by_host=False): """Returns processed repository data, filtering nodes based on given args """ roles = [role for role in roles.split(',') if role] data = { 'filter_env': env, 'filter_roles': roles, 'filter_virt': virt, 'show_list': SHOW_LIST_VIEW, 'show_virt': SHOW_VIRT_VIEW, 'show_graph': SHOW_GRAPH_VIEW, 'show_links': SHOW_LINKS, 'query_string': request.META['QUERY_STRING'] } data['roles'] = get_roles() roles_groups = get_role_groups(data['roles']) data['roles_groups'] = roles_groups data['virt_roles'] = ['host', 'guest'] # Get environments before we filter nodes data['nodes'] = get_nodes() data['nodes_extended'] = get_nodes_extended(data['nodes']) data['environments'] = get_environments(data['nodes_extended']) if group_by_host: data['nodes_extended'] = group_nodes_by_host(data['nodes_extended'], roles=data['filter_roles'], env=data['filter_env']) elif data['filter_env'] or data['filter_roles'] or data['filter_virt']: data['nodes_extended'] = filter_nodes(data['nodes_extended'], data['filter_env'], data['filter_roles'], data['filter_virt']) inject_plugin_data(data['nodes_extended']) if not data['nodes_extended']: add_message(request, WARNING, "There are no nodes that fit the supplied criteria.") return data
def _get_data(request, env, roles, virt, group_by_host=False): """Returns processed repository data, filtering nodes based on given args """ data = {'filter_env': env, 'filter_roles': roles, 'filter_virt': virt} data['roles'] = get_roles() roles_groups = get_role_groups(data['roles']) data['roles_groups'] = roles_groups data['virt_roles'] = ['host', 'guest'] # Get environments before we filter nodes data['nodes'] = get_nodes() data['nodes_extended'] = get_nodes_extended(data['nodes']) data['environments'] = get_environments(data['nodes_extended']) roles_to_filter = '' if group_by_host else data['filter_roles'] if data['filter_env'] or roles_to_filter or data['filter_virt']: data['nodes_extended'] = filter_nodes(data['nodes_extended'], data['filter_env'], roles_to_filter, data['filter_virt']) if group_by_host: data['nodes_extended'] = group_nodes_by_host( data['nodes_extended'], roles=data['filter_roles']) inject_plugin_data(data['nodes_extended']) if not data['nodes_extended']: add_message(request, WARNING, "There are no nodes that fit the supplied criteria.") return data
def generate_node_map(nodes, roles, show_hostnames=True): """Generates a graphviz node map""" graph = KitchenDot(graph_type='digraph') clusters = {} graph_nodes = {} role_colors = {} color_index = 0 role_groups = get_role_groups(roles) + ['none'] for role in role_groups: clusters[role] = pydot.Cluster( role, label=role, color=COLORS[color_index], fontsize="12") graph.add_subgraph(clusters[role]) role_colors[role] = COLORS[color_index] color_index += 1 if color_index >= len(COLORS): color_index = 0 # Create nodes node_labels = {} # Only used when show_hostnames = False for node in nodes: color = "lightyellow" try: role_prefix = node['role'][0].split("_")[0] if role_prefix == REPO['EXCLUDE_ROLE_PREFIX']: role_prefix = 'none' role_prefix = node['role'][1].split("_")[0] if role_prefix == REPO['EXCLUDE_ROLE_PREFIX']: role_prefix = 'none' color = role_colors[role_prefix] except (IndexError, KeyError): role_prefix = 'none' label = "\n".join([role for role in node['role'] if not role.startswith(REPO['EXCLUDE_ROLE_PREFIX'])]) if show_hostnames: label = node['name'] + "\n" + label else: if not label: label = "norole" if label in node_labels: if node_labels[label] == 1: first_node = clusters[role_prefix].get_node(label)[0] first_node.set_name(label + " (1)") node_labels[label] += 1 label += " ({0})".format(node_labels[label]) else: node_labels[label] = 1 node_el = pydot.Node(label, shape="box", style="filled", fillcolor=color, fontsize="9") graph_nodes[node['name']] = node_el clusters[role_prefix].add_node(node_el) links = _build_links(nodes) for node in links: for client in links[node].get('client_nodes', []): edge = pydot.Edge( graph_nodes[client[0]], graph_nodes[node], fontsize="8", arrowsize=.6, ) edge.set_label(client[1]) graph.add_edge(edge) for client in links[node].get('needs_nodes', []): edge = pydot.Edge( graph_nodes[node], graph_nodes[client[0]], fontsize="7", style="dashed", arrowsize=.6, ) edge.set_label(client[1]) graph.add_edge(edge) # Generate graph filename = os.path.join(STATIC_ROOT, 'img', 'node_map.svg') timeout = 10.0 # Seconds graph_thread = GraphThread(filename, graph) graph_thread.start() result = graph_thread.join(timeout) if graph_thread.isAlive(): # Kill the pydot graphviz's subprocess graph_thread.kill() timeout = int(timeout) log.error("pydot timeout: {0} seconds".format(timeout)) return False, ("Unable to draw graph, timeout exceeded " "({0} seconds)").format(timeout) else: return result