[spp] [PATCH 3/4] spp: move global functions for refactoring

ogawa.yasufumi at lab.ntt.co.jp ogawa.yasufumi at lab.ntt.co.jp
Fri Dec 8 09:32:54 CET 2017


From: Yasufumi Ogawa <ogawa.yasufumi at lab.ntt.co.jp>

There are several global functions only used for primary or secondary.
It should be moved to each of classes calling them if possible. For
instance, 'command_primary' should be moved to Shell class because
it is only called from member methods of Shell. This update is for
the changes.

Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi at lab.ntt.co.jp>
---
 src/spp.py | 348 ++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 170 insertions(+), 178 deletions(-)

diff --git a/src/spp.py b/src/spp.py
index 212d7ea..a296e67 100755
--- a/src/spp.py
+++ b/src/spp.py
@@ -17,31 +17,35 @@ import threading
 import traceback
 
 # Turn true if activate logger to debug remote command.
-logger = True
-
-if logger is True:
-    from logging import DEBUG
-    from logging import Formatter
-    from logging import getLogger
-    from logging import StreamHandler
-    logger = getLogger(__name__)
-    handler = StreamHandler()
-    handler.setLevel(DEBUG)
-    formatter = Formatter(
-        '%(asctime)s,[%(filename)s][%(name)s][%(levelname)s]%(message)s')
-    handler.setFormatter(formatter)
-    logger.setLevel(DEBUG)
-    logger.addHandler(handler)
-
-
-CMD_OK = "OK"
-CMD_NG = "NG"
-CMD_NOTREADY = "NOTREADY"
-CMD_ERROR = "ERROR"
+logger = None
 
+# Maximum num of sock queues for secondaries
+MAX_SECONDARY = 16
+
+PRIMARY = ''
+SECONDARY_LIST = []
+SECONDARY_COUNT = 0
+
+# Initialize primary comm channel
+MAIN2PRIMARY = Queue()
+PRIMARY2MAIN = Queue()
+
+REMOTE_COMMAND = "RCMD"
 RCMD_EXECUTE_QUEUE = Queue()
 RCMD_RESULT_QUEUE = Queue()
-REMOTE_COMMAND = "RCMD"
+
+
+class GrowingList(list):
+    """GrowingList"""
+
+    def __setitem__(self, index, value):
+        if index >= len(self):
+            self.extend([None]*(index + 1 - len(self)))
+        list.__setitem__(self, index, value)
+
+# init secondary comm channel list
+MAIN2SEC = GrowingList()
+SEC2MAIN = GrowingList()
 
 
 class CmdRequestHandler(SocketServer.BaseRequestHandler):
@@ -73,31 +77,6 @@ class CmdRequestHandler(SocketServer.BaseRequestHandler):
             self.request.send("")
 
 
-class GrowingList(list):
-    """GrowingList"""
-
-    def __setitem__(self, index, value):
-        if index >= len(self):
-            self.extend([None]*(index + 1 - len(self)))
-        list.__setitem__(self, index, value)
-
-# Maximum num of sock queues for secondaries
-MAX_SECONDARY = 16
-
-# init
-PRIMARY = ''
-SECONDARY_LIST = []
-SECONDARY_COUNT = 0
-
-# init primary comm channel
-MAIN2PRIMARY = Queue()
-PRIMARY2MAIN = Queue()
-
-# init secondary comm channel list
-MAIN2SEC = GrowingList()
-SEC2MAIN = GrowingList()
-
-
 class ConnectionThread(threading.Thread):
 
     def __init__(self, client_id, conn, m2s, s2m):
@@ -155,59 +134,6 @@ class ConnectionThread(threading.Thread):
         self.conn.close()
 
 
-def getclientid(conn):
-    """Get client_id from client"""
-
-    try:
-        conn.send("_get_client_id")
-    except KeyError:
-        return -1
-
-    data = conn.recv(1024)
-    if data is None:
-        return -1
-
-    if logger is not None:
-        logger.debug("data: %s" % data)
-    client_id = int(data.strip('\0'))
-
-    if client_id < 0 or client_id > MAX_SECONDARY:
-        logger.debug("Failed to get client_id: %d" % client_id)
-        return -1
-
-    found = 0
-    for i in SECONDARY_LIST:
-        if client_id == i:
-            found = 1
-            break
-
-    if found == 0:
-        return client_id
-
-    # client_id in use, find a free one
-    free_client_id = -1
-    for i in range(MAX_SECONDARY):
-        found = -1
-        for j in SECONDARY_LIST:
-            if i == j:
-                found = i
-                break
-        if found == -1:
-            free_client_id = i
-            break
-
-    if logger is not None:
-        logger.debug("Found free_client_id: %d" % free_client_id)
-
-    if free_client_id < 0:
-        return -1
-
-    conn.send("_set_client_id %u" % free_client_id)
-    data = conn.recv(1024)
-
-    return free_client_id
-
-
 class AcceptThread(threading.Thread):
 
     def __init__(self, host, port, main2sec, sec2main):
@@ -230,6 +156,58 @@ class AcceptThread(threading.Thread):
         self.stop_event = threading.Event()
         self.sock_opened = False
 
+    def getclientid(self, conn):
+        """Get client_id from client"""
+
+        try:
+            conn.send("_get_client_id")
+        except KeyError:
+            return -1
+
+        data = conn.recv(1024)
+        if data is None:
+            return -1
+
+        if logger is not None:
+            logger.debug("data: %s" % data)
+        client_id = int(data.strip('\0'))
+
+        if client_id < 0 or client_id > MAX_SECONDARY:
+            logger.debug("Failed to get client_id: %d" % client_id)
+            return -1
+
+        found = 0
+        for i in SECONDARY_LIST:
+            if client_id == i:
+                found = 1
+                break
+
+        if found == 0:
+            return client_id
+
+        # client_id in use, find a free one
+        free_client_id = -1
+        for i in range(MAX_SECONDARY):
+            found = -1
+            for j in SECONDARY_LIST:
+                if i == j:
+                    found = i
+                    break
+            if found == -1:
+                free_client_id = i
+                break
+
+        if logger is not None:
+            logger.debug("Found free_client_id: %d" % free_client_id)
+
+        if free_client_id < 0:
+            return -1
+
+        conn.send("_set_client_id %u" % free_client_id)
+        data = conn.recv(1024)
+
+        return free_client_id
+
     def stop(self):
         if self.sock_opened is True:
             try:
@@ -248,7 +226,7 @@ class AcceptThread(threading.Thread):
                 # Accepting incoming connections
                 conn, _ = self.sock.accept()
 
-                client_id = getclientid(conn)
+                client_id = self.getclientid(conn)
                 if client_id < 0:
                     break
 
@@ -273,55 +251,6 @@ class AcceptThread(threading.Thread):
             self.sock.close()
 
 
-def command_primary(command):
-    """Send command to primary process"""
-
-    if PRIMARY:
-        MAIN2PRIMARY.put(command)
-        recv = PRIMARY2MAIN.get(True)
-        print (recv)
-        return CMD_OK, recv
-    else:
-        recv = "primary not started"
-        print (recv)
-        return CMD_NOTREADY, recv
-
-
-def command_secondary(sec_id, command):
-    """Send command to secondary process with sec_id"""
-
-    if sec_id in SECONDARY_LIST:
-        MAIN2SEC[sec_id].put(command)
-        recv = SEC2MAIN[sec_id].get(True)
-        print (recv)
-        return CMD_OK, recv
-    else:
-        message = "secondary id %d not exist" % sec_id
-        print(message)
-        return CMD_NOTREADY, message
-
-
-def get_status():
-    secondary = []
-    for i in SECONDARY_LIST:
-        secondary.append("%d" % i)
-    stat = {
-        "primary": "%d" % PRIMARY,
-        "secondary": secondary
-        }
-    return stat
-
-
-def print_status():
-    """Display information about connected clients"""
-
-    print ("Soft Patch Panel Status :")
-    print ("primary: %d" % PRIMARY)  # "primary: 1" if PRIMA == True
-    print ("secondary count: %d" % len(SECONDARY_LIST))
-    for i in SECONDARY_LIST:
-        print ("Connected secondary id: %d" % i)
-
-
 class PrimaryThread(threading.Thread):
 
     def __init__(self, host, port, main2primary, primary2main):
@@ -396,19 +325,6 @@ class PrimaryThread(threading.Thread):
                     break
 
 
-def close_all_secondary():
-    """Exit all secondary processes"""
-
-    global SECONDARY_COUNT
-
-    tmp_list = []
-    for i in SECONDARY_LIST:
-        tmp_list.append(i)
-    for i in tmp_list:
-        command_secondary(i, 'exit')
-    SECONDARY_COUNT = 0
-
-
 def check_sec_cmds(cmds):
     """Validate secondary commands before sending"""
 
@@ -455,11 +371,73 @@ class Shell(cmd.Cmd):
     prompt = 'spp > '
     recorded_file = None
 
+    CMD_OK = "OK"
+    CMD_NG = "NG"
+    CMD_NOTREADY = "NOTREADY"
+    CMD_ERROR = "ERROR"
+
     PRI_CMDS = ['status', 'exit', 'clear']
     SEC_CMDS = ['status', 'exit', 'forward', 'stop', 'add', 'patch', 'del']
     SEC_SUBCMDS = ['vhost', 'ring']
     BYE_CMDS = ['sec', 'all']
 
+    def close_all_secondary(self):
+        """Exit all secondary processes"""
+
+        global SECONDARY_COUNT
+
+        tmp_list = []
+        for i in SECONDARY_LIST:
+            tmp_list.append(i)
+        for i in tmp_list:
+            self.command_secondary(i, 'exit')
+        SECONDARY_COUNT = 0
+
+    def get_status(self):
+        secondary = []
+        for i in SECONDARY_LIST:
+            secondary.append("%d" % i)
+        stat = {
+            "primary": "%d" % PRIMARY,
+            "secondary": secondary
+            }
+        return stat
+
+    def print_status(self):
+        """Display information about connected clients"""
+
+        print ("Soft Patch Panel Status :")
+        print ("primary: %d" % PRIMARY)  # "primary: 1" if PRIMA == True
+        print ("secondary count: %d" % len(SECONDARY_LIST))
+        for i in SECONDARY_LIST:
+            print ("Connected secondary id: %d" % i)
+
+    def command_primary(self, command):
+        """Send command to primary process"""
+
+        if PRIMARY:
+            MAIN2PRIMARY.put(command)
+            recv = PRIMARY2MAIN.get(True)
+            print (recv)
+            return self.CMD_OK, recv
+        else:
+            recv = "primary not started"
+            print (recv)
+            return self.CMD_NOTREADY, recv
+
+    def command_secondary(self, sec_id, command):
+        """Send command to secondary process with sec_id"""
+
+        if sec_id in SECONDARY_LIST:
+            MAIN2SEC[sec_id].put(command)
+            recv = SEC2MAIN[sec_id].get(True)
+            print (recv)
+            return self.CMD_OK, recv
+        else:
+            message = "secondary id %d not exist" % sec_id
+            print(message)
+            return self.CMD_NOTREADY, message
+
     def complete_pri(self, text, line, begidx, endidx):
         """Completion for primary process commands"""
 
@@ -547,20 +525,20 @@ class Shell(cmd.Cmd):
     def do_status(self, _):
         """Display Soft Patch Panel Status"""
 
-        print_status()
-        stat = get_status()
-        self.response(CMD_OK, json.dumps(stat))
+        self.print_status()
+        stat = self.get_status()
+        self.response(self.CMD_OK, json.dumps(stat))
 
     def do_pri(self, command):
         """Send command to primary process"""
 
         if command and command in self.PRI_CMDS:
-            result, message = command_primary(command)
+            result, message = self.command_primary(command)
             self.response(result, message)
         else:
             message = "primary invalid command"
             print(message)
-            self.response(CMD_ERROR, message)
+            self.response(self.CMD_ERROR, message)
 
     def do_sec(self, arg):
         """Send command to secondary process"""
@@ -571,20 +549,20 @@ class Shell(cmd.Cmd):
         if len(cmds) < 2:
             message = "error"
             print(message)
-            self.response(CMD_ERROR, message)
+            self.response(self.CMD_ERROR, message)
         elif str.isdigit(cmds[0]):
             sec_id = int(cmds[0])
             if check_sec_cmds(cmds[1]):
-                result, message = command_secondary(sec_id, cmds[1])
+                result, message = self.command_secondary(sec_id, cmds[1])
                 self.response(result, message)
             else:
                 message = "invalid cmd"
                 print(message)
-                self.response(CMD_ERROR, message)
+                self.response(self.CMD_ERROR, message)
         else:
             print (cmds[0])
             print ("first %s" % cmds[1])
-            self.response(CMD_ERROR, "invalid format")
+            self.response(self.CMD_ERROR, "invalid format")
 
     def do_record(self, fname):
         """Save future commands to filename:  RECORD filename.cmd"""
@@ -593,7 +571,7 @@ class Shell(cmd.Cmd):
             print("Record file is required!")
         else:
             self.recorded_file = open(fname, 'w')
-            self.response(CMD_OK, "record")
+            self.response(self.CMD_OK, "record")
 
     def do_playback(self, fname):
         """Playback commands from a file:  PLAYBACK filename.cmd"""
@@ -610,11 +588,11 @@ class Shell(cmd.Cmd):
                             continue
                         lines.append(line)
                     self.cmdqueue.extend(lines)
-                    self.response(CMD_OK, "playback")
+                    self.response(self.CMD_OK, "playback")
             except IOError:
                 message = "Error: File does not exist."
                 print(message)
-                self.response(CMD_NG, message)
+                self.response(self.CMD_NG, message)
 
     def precmd(self, line):
         line = line.lower()
@@ -636,10 +614,10 @@ class Shell(cmd.Cmd):
 
         cmds = arg.split(' ')
         if cmds[0] == 'sec':
-            close_all_secondary()
+            self.close_all_secondary()
         elif cmds[0] == 'all':
-            close_all_secondary()
-            command_primary('exit')
+            self.close_all_secondary()
+            self.command_primary('exit')
         elif cmds[0] == '':
             print('Thank you for using Soft Patch Panel')
             self.close()
@@ -709,4 +687,18 @@ def main(argv):
 
 
 if __name__ == "__main__":
+    if logger is True:
+        from logging import DEBUG
+        from logging import Formatter
+        from logging import getLogger
+        from logging import StreamHandler
+        logger = getLogger(__name__)
+        handler = StreamHandler()
+        handler.setLevel(DEBUG)
+        formatter = Formatter(
+            '%(asctime)s,[%(filename)s][%(name)s][%(levelname)s]%(message)s')
+        handler.setFormatter(formatter)
+        logger.setLevel(DEBUG)
+        logger.addHandler(handler)
+
     main(sys.argv[1:])
-- 
2.13.1



More information about the spp mailing list