Example #1
0
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
Example #2
0
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
Example #3
0
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