[spp] [PATCH 8/9] controller: update topo command
ogawa.yasufumi at lab.ntt.co.jp
ogawa.yasufumi at lab.ntt.co.jp
Mon Mar 12 06:35:23 CET 2018
From: Yasufumi Ogawa <ogawa.yasufumi at lab.ntt.co.jp>
Update topo and topo_subgraph commands for parsing port status which
is changed for 18.02.
Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi at lab.ntt.co.jp>
---
src/controller/shell.py | 50 +++++++++++++++++++++++++++++++++++++------------
src/controller/topo.py | 9 +++++++++
2 files changed, 47 insertions(+), 12 deletions(-)
diff --git a/src/controller/shell.py b/src/controller/shell.py
index c379c2a..ea5e8a9 100644
--- a/src/controller/shell.py
+++ b/src/controller/shell.py
@@ -89,20 +89,46 @@ class Shell(cmd.Cmd, object):
print ("Connected secondary id: %d" % i)
def print_sec_status(self, msg):
- msg = msg.replace("\x00", "") # remove null chars in msg from sec
- status, ports = msg.split("\n")
- res = "%s\nports:\n" % status
+ """Parse and print message from SPP secondary
+
+ The format of sent message is expected as YAML like format as
+
+ status: idling\nports: 'phy:0-phy:1,phy:1-null'\x00\x00..
+
+ 'ports' is a set of combinations of patches. The value is
+ encapsulated with "'" and ended series of null character "\x00".
+ If the destination is not defined, null is assigned.
+ """
+
+ msg = msg.replace("\x00", "").replace("'", "") # clean sec's msg
+ sec_attr = msg.split("\n")
+
+ # Do nothing if returned msg is not valid format.
+ if len(sec_attr) < 2:
+ return None
+
+ status = sec_attr[0]
+ ports = sec_attr[1]
+
+ # Printed result to which port info is appended.
+ res = status
+
port_list = ports.split(' ')[1].split(',')
+ if port_list[0] == '': # port_list is [''] if there are no ports
+ res = '%s\nports: "no ports"' % res
+ else:
+ res = "%s\nports:\n" % res
+ tmp_list = []
+ for port_ent in port_list:
+ if '-' in port_ent:
+ p1, p2 = port_ent.split('-')
+ if p2 == 'null':
+ tmp_list.append(" - '%s'" % p1)
+ else:
+ tmp_list.append(" - '%s -> %s'" % (p1, p2))
+ tmp_list.sort()
+ res += "\n".join(tmp_list)
- tmp = []
- for p in port_list:
- p1, p2 = p.split('-')
- if p2 == 'null':
- tmp.append(" - '%s'" % p1)
- else:
- tmp.append(" - '%s -> %s'" % (p1, p2))
- tmp.sort()
- res += "\n".join(tmp)
print(res)
def command_primary(self, command):
diff --git a/src/controller/topo.py b/src/controller/topo.py
index 0fc529b..76dd54f 100644
--- a/src/controller/topo.py
+++ b/src/controller/topo.py
@@ -96,6 +96,8 @@ class Topo(object):
# parse status message from sec.
for sec in sec_list:
+ if sec is None:
+ continue
for port in sec["ports"]:
if port["iface"]["type"] == "phy":
phys.append(port)
@@ -313,6 +315,10 @@ class Topo(object):
}
"""
+ # Clean sec stat message
+ stat = stat.replace("\x00", "")
+ stat = stat.replace("'", "")
+
stat_obj = yaml.load(stat)
res = {}
res['sec_id'] = sec_id
@@ -320,6 +326,9 @@ class Topo(object):
port_list = []
try:
+ if stat_obj['ports'] is None:
+ return None
+
ports = stat_obj['ports'].split(',')
for port_info in ports:
rid, outport = port_info.split('-')
--
2.7.4
More information about the spp
mailing list