summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/top_block_query.cpp28
-rw-r--r--query/CMakeLists.txt1
-rw-r--r--query/__init__.py9
-rw-r--r--query/chart_factory.js1
-rw-r--r--query/chart_global_counters.js2
-rw-r--r--query/chart_topology_display.js19
-rw-r--r--query/main.html1
7 files changed, 55 insertions, 6 deletions
diff --git a/lib/top_block_query.cpp b/lib/top_block_query.cpp
index 68a56ef..56b39ae 100644
--- a/lib/top_block_query.cpp
+++ b/lib/top_block_query.cpp
@@ -184,14 +184,31 @@ static ptree query_calls(ElementImpl *self, const ptree &query)
static std::string query_topology(ElementImpl *self, const ptree &query)
{
+ //parse list of block ids needed in this query
+ std::vector<std::string> block_ids;
+ if (query.count("blocks") != 0)
+ {
+ BOOST_FOREACH(const ptree::value_type &v, query.get_child("blocks"))
+ {
+ block_ids.push_back(v.second.get_value<std::string>());
+ }
+ }
+
std::string buff;
buff += "digraph flat_flows {\n";
buff += "rankdir=LR;\n";
buff += "node [shape=record, fontsize=10];\n";
+ std::vector<long long> worker_ids_mentioned;
BOOST_FOREACH(Apology::Worker *w, self->topology->get_workers())
{
BlockActor *actor = dynamic_cast<BlockActor *>(w->get_actor());
+
+ //filter workers not needed in query, empty block list means all blocks
+ const std::string id = actor->data->block->get_uid();
+ if (not block_ids.empty() and std::find(block_ids.begin(), block_ids.end(), id) == block_ids.end()) continue;
+ worker_ids_mentioned.push_back(actor->GetAddress().AsInteger());
+
std::string in_ports_str, out_ports_str;
const bool done = actor->data->block_state == BLOCK_STATE_DONE;
for (size_t i = 0; i < w->get_num_inputs(); i++)
@@ -224,10 +241,17 @@ static std::string query_topology(ElementImpl *self, const ptree &query)
BOOST_FOREACH(const Apology::Flow &flow, self->topology->get_flat_flows())
{
+ //filter out flows that do not have mentioned workers
+ const long long src_id = dynamic_cast<const Apology::Worker *>(flow.src.elem)->get_actor()->GetAddress().AsInteger();
+ const long long dst_id = dynamic_cast<const Apology::Worker *>(flow.dst.elem)->get_actor()->GetAddress().AsInteger();
+ if (std::find(worker_ids_mentioned.begin(), worker_ids_mentioned.end(), src_id) == worker_ids_mentioned.end()) continue;
+ if (std::find(worker_ids_mentioned.begin(), worker_ids_mentioned.end(), dst_id) == worker_ids_mentioned.end()) continue;
+
+ //create a dot connection for the flow
buff += str(boost::format("%u:out%u -> %u:in%u;\n")
- % dynamic_cast<const Apology::Worker *>(flow.src.elem)->get_actor()->GetAddress().AsInteger()
+ % src_id
% flow.src.index
- % dynamic_cast<const Apology::Worker *>(flow.dst.elem)->get_actor()->GetAddress().AsInteger()
+ % dst_id
% flow.dst.index
);
}
diff --git a/query/CMakeLists.txt b/query/CMakeLists.txt
index f9a855e..4e66e33 100644
--- a/query/CMakeLists.txt
+++ b/query/CMakeLists.txt
@@ -22,6 +22,7 @@ INSTALL(
chart_port_counters.js
chart_global_counters.js
chart_port_downtime.js
+ chart_topology_display.js
main.css
DESTINATION ${GR_PYTHON_DIR}/gras/query
COMPONENT ${GRAS_COMP_PYTHON}
diff --git a/query/__init__.py b/query/__init__.py
index 403e68c..2b82a4b 100644
--- a/query/__init__.py
+++ b/query/__init__.py
@@ -26,12 +26,16 @@ class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
args = server_registry[s.server]
path = o.path
+ query_args = dict([(k,v) for k,v in urlparse.parse_qs(o.query).iteritems()])
+
#generate the topology png
- if path == "/topology.png":
+ if path.endswith('dot.png'):
s.send_response(200)
s.send_header("Content-type", "image/png")
s.end_headers()
- dot_markup = args['top_block'].query(json.dumps(dict(path='/topology.dot')))
+ query_args['path'] = os.path.splitext(path)[0]
+ json_args = json.dumps(query_args)
+ dot_markup = args['top_block'].query(json_args)
import subprocess
dot_exe = os.environ.get("DOT_EXECUTABLE", "dot")
p = subprocess.Popen(args=[dot_exe, "-T", "png"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -48,7 +52,6 @@ class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
arg_strs = dict((str(k), str(v)) for k, v in args.iteritems())
s.wfile.write(json.dumps(arg_strs))
else:
- query_args = dict([(k,v) for k,v in urlparse.parse_qs(o.query).iteritems()])
query_args['path'] = path
json_args = json.dumps(query_args)
s.wfile.write(args['top_block'].query(json_args))
diff --git a/query/chart_factory.js b/query/chart_factory.js
index f3e02a7..7e4dc50 100644
--- a/query/chart_factory.js
+++ b/query/chart_factory.js
@@ -15,6 +15,7 @@ var gras_chart_get_registry = function()
{key:'port_counters', name:'Port Counters', factory:GrasChartPortCounts},
{key:'global_counters', name:'Global Counters', factory:GrasChartGlobalCounts},
{key:'port_downtime', name:'Port downtime', factory:GrasChartPortDowntime},
+ {key:'topology_display', name:'Topology Display', factory:GrasChartTopologyDisplay},
];
}
diff --git a/query/chart_global_counters.js b/query/chart_global_counters.js
index 500de32..0c4c683 100644
--- a/query/chart_global_counters.js
+++ b/query/chart_global_counters.js
@@ -10,7 +10,7 @@ function GrasChartGlobalCounts(args, panel)
//settings
this.div = $('<div />').attr({class:'chart_total_counts'});
$(panel).append(this.div);
- this.title = "Global Counters"
+ this.title = "Global Counters";
this.counts_ul = $('<ul />');
this.div.append(this.counts_ul);
diff --git a/query/chart_topology_display.js b/query/chart_topology_display.js
new file mode 100644
index 0000000..a07e053
--- /dev/null
+++ b/query/chart_topology_display.js
@@ -0,0 +1,19 @@
+function GrasChartTopologyDisplay(args, panel)
+{
+ //input checking
+
+ //settings
+ this.div = $('<div />');
+ $(panel).append(this.div);
+ this.title = "Topology Display";
+
+ //fetch the topology image given the blocks
+ var img = new Image();
+ img.src = "/topology.dot.png?" + jQuery.param({blocks:args.block_ids}, true /*needed to parse data*/);
+ this.div.append($(img));
+}
+
+GrasChartTopologyDisplay.prototype.update = function(point)
+{
+ var self = this;
+}
diff --git a/query/main.html b/query/main.html
index 78f9227..ebad14a 100644
--- a/query/main.html
+++ b/query/main.html
@@ -17,6 +17,7 @@
<script type="text/javascript" src="/chart_port_counters.js"></script>
<script type="text/javascript" src="/chart_global_counters.js"></script>
<script type="text/javascript" src="/chart_port_downtime.js"></script>
+ <script type="text/javascript" src="/chart_topology_display.js"></script>
<script type="text/javascript" src="/main.js"></script>
<script type="text/javascript">
google.load('visualization', '1.0', {'packages':['corechart']});