Implement the support for installing flows that will be monitored
by ONOS itself.
Those flows are installed with the "-m onos" command-line option.

NOTE: The path monitoring itself was implemented in
commit 5a341b2b681c5c4bf2f192db1562f1e37c80b84d, but
currently it is commented-out.
diff --git a/web/add_flow.py b/web/add_flow.py
index 0ab6847..5a248eb 100755
--- a/web/add_flow.py
+++ b/web/add_flow.py
@@ -21,6 +21,7 @@
 ControllerIP = "127.0.0.1"
 ControllerPort = 8080
 MonitoringEnabled = False
+MonitoringByOnos = False
 ReadFromFile = ""
 
 DEBUG=0
@@ -91,6 +92,20 @@
     log_error("Controller IF has issue")
     exit(1)
 
+def add_shortest_path_flow(flow_path):
+  flow_path_json = json.dumps(flow_path)
+
+  try:
+    command = "curl -s -H 'Content-Type: application/json' -d '%s' http://%s:%s/wm/flow/add-shortest-path/json" % (flow_path_json, ControllerIP, ControllerPort)
+    debug("add_shortest_path_flow %s" % command)
+    result = os.popen(command).read()
+    debug("result %s" % result)
+    # parsedResult = json.loads(result)
+    # debug("parsed %s" % parsedResult)
+  except:
+    log_error("Controller IF has issue")
+    exit(1)
+
 def delete_flow_path(flow_id):
   command = "curl -s \"http://%s:%s/wm/flow/delete/%s/json\"" % (ControllerIP, ControllerPort, flow_id)
   debug("delete_flow_path %s" % command)
@@ -366,17 +381,97 @@
 
   flow_path['dataPath'] = my_data_path
   debug("Flow Path: %s" % flow_path)
+  return flow_path
 
-  add_flow_path(flow_path)
+def exec_monitoring_by_onos(parsed_args):
+  idx = 0
+  while idx < len(parsed_args):
+    data_path = {}
+    src_dpid = {}
+    src_port = {}
+    dst_dpid = {}
+    dst_port = {}
+    src_switch_port = {}
+    dst_switch_port = {}
+    flow_entry = {}
+    flow_entries = []
+
+    src_dpid['value'] = parsed_args[idx]['my_src_dpid']
+    src_port['value'] = parsed_args[idx]['my_src_port']
+    dst_dpid['value'] = parsed_args[idx]['my_dst_dpid']
+    dst_port['value'] = parsed_args[idx]['my_dst_port']
+    src_switch_port['dpid'] = src_dpid
+    src_switch_port['port'] = src_port
+    dst_switch_port['dpid'] = dst_dpid
+    dst_switch_port['port'] = dst_port
+    match = parsed_args[idx]['match']
+    flow_entry['flowEntryMatch'] = match
+    flow_entries.append(flow_entry)
+
+    data_path['srcPort'] = copy.deepcopy(src_switch_port)
+    data_path['dstPort'] = copy.deepcopy(dst_switch_port)
+    data_path['flowEntries'] = copy.deepcopy(flow_entries)
+
+    #
+    # XXX: Explicitly disable the InPort matching, and
+    # the Output action, because they get in the way
+    # during the compute_flow_path() processing.
+    #
+    parsed_args[idx]['matchInPortEnabled'] = False
+    parsed_args[idx]['actionOutputEnabled'] = False
+
+    flow_path = compute_flow_path(parsed_args[idx], data_path)
+    add_shortest_path_flow(flow_path)
+
+    idx = idx + 1
+
+
+def exec_processing_by_script(parsed_args):
+  #
+  # Initialization
+  #
+  last_data_paths = []
+  idx = 0
+  while idx < len(parsed_args):
+    last_data_path = []
+    last_data_paths.append(copy.deepcopy(last_data_path))
+    idx = idx + 1
+
+  #
+  # Do the work: install and/or periodically monitor each flow
+  #
+  while True:
+    idx = 0
+    while idx < len(parsed_args):
+      last_data_path = last_data_paths[idx]
+      my_flow_id = parsed_args[idx]['my_flow_id']
+      data_path = compute_data_path(parsed_args[idx])
+      if data_path != last_data_path:
+	print_data_path(data_path)
+	if len(last_data_path) > 0:
+	  delete_flow_path(my_flow_id)
+	if len(data_path) > 0:
+	  flow_path = compute_flow_path(parsed_args[idx], data_path)
+	  add_flow_path(flow_path)
+	last_data_paths[idx] = copy.deepcopy(data_path)
+      idx = idx + 1
+
+    if MonitoringEnabled != True:
+      break
+    time.sleep(1)
 
 
 if __name__ == "__main__":
   usage_msg = "Usage: %s [Flags] <flow-id> <installer-id> <src-dpid> <src-port> <dest-dpid> <dest-port> [Match Conditions] [Actions]\n" % (sys.argv[0])
   usage_msg = usage_msg + "\n"
   usage_msg = usage_msg + "    Flags:\n"
-  usage_msg = usage_msg + "        -m              Monitor and maintain the installed shortest path(s)\n"
-  usage_msg = usage_msg + "        -f <filename>   Read the flow(s) to install from a file\n"
-  usage_msg = usage_msg + "                        File format: one line per flow starting with <flow-id>\n"
+  usage_msg = usage_msg + "        -m [monitorname]  Monitor and maintain the installed shortest path(s)\n"
+  usage_msg = usage_msg + "                          If 'monitorname' is specified and is set to 'ONOS'\n"
+  usage_msg = usage_msg + "                          ((case insensitive), then the flow generation and\n"
+  usage_msg = usage_msg + "                          maintanenance is done by ONOS itself.\n"
+  usage_msg = usage_msg + "                          Otherwise, it is done by this script.\n"
+  usage_msg = usage_msg + "        -f <filename>     Read the flow(s) to install from a file\n"
+  usage_msg = usage_msg + "                          File format: one line per flow starting with <flow-id>\n"
   usage_msg = usage_msg + "\n"
   usage_msg = usage_msg + "    Match Conditions:\n"
   usage_msg = usage_msg + "        matchInPort <True|False> (default to True)\n"
@@ -427,6 +522,11 @@
     idx = idx + 1
     if arg1 == "-m":
       MonitoringEnabled = True
+      if idx < len(sys.argv):
+	arg2 = sys.argv[idx]
+	if arg2.lower() == "onos":
+	  MonitoringByOnos = True
+	  idx = idx + 1
       start_argv_index = idx
     elif arg1 == "-f":
       if idx >= len(sys.argv):
@@ -476,24 +576,8 @@
     idx = idx + 1
 
   #
-  # Do the work: install and/or periodically monitor each flow
-  #
-  while True:
-    idx = 0
-    while idx < len(parsed_args):
-      last_data_path = last_data_paths[idx]
-      my_flow_id = parsed_args[idx]['my_flow_id']
-      data_path = compute_data_path(parsed_args[idx])
-      if data_path != last_data_path:
-	print_data_path(data_path)
-	if len(last_data_path) > 0:
-	  delete_flow_path(my_flow_id)
-	if len(data_path) > 0:
-	  flow_path = compute_flow_path(parsed_args[idx], data_path)
-	  add_flow_path(flow_path)
-	last_data_paths[idx] = copy.deepcopy(data_path)
-      idx = idx + 1
+  if MonitoringByOnos == True:
+    exec_monitoring_by_onos(parsed_args)
+  else:
+    exec_processing_by_script(parsed_args)
 
-    if MonitoringEnabled != True:
-      break
-    time.sleep(1)