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)