diff options
-rw-r--r-- | lib/top_block_query.cpp | 28 | ||||
-rw-r--r-- | query/CMakeLists.txt | 1 | ||||
-rw-r--r-- | query/__init__.py | 9 | ||||
-rw-r--r-- | query/chart_factory.js | 1 | ||||
-rw-r--r-- | query/chart_global_counters.js | 2 | ||||
-rw-r--r-- | query/chart_topology_display.js | 19 | ||||
-rw-r--r-- | query/main.html | 1 |
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']}); |