Soft Patch Panel
 help / color / mirror / Atom feed
From: ogawa.yasufumi@lab.ntt.co.jp
To: spp@dpdk.org, ferruh.yigit@intel.com, ogawa.yasufumi@lab.ntt.co.jp
Subject: [spp] [PATCH 4/4] spp_vf: remove spp_vf controller
Date: Thu, 18 Oct 2018 20:28:49 +0900	[thread overview]
Message-ID: <20181018112849.77691-5-ogawa.yasufumi@lab.ntt.co.jp> (raw)
In-Reply-To: <20181018112849.77691-1-ogawa.yasufumi@lab.ntt.co.jp>

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

Remove 'spp_vf.py' because features of requesting to spp_vf are moved
to 'spp.py'.

Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
---
 src/spp_vf.py | 507 ----------------------------------------------------------
 1 file changed, 507 deletions(-)
 delete mode 100755 src/spp_vf.py

diff --git a/src/spp_vf.py b/src/spp_vf.py
deleted file mode 100755
index 124c714..0000000
--- a/src/spp_vf.py
+++ /dev/null
@@ -1,507 +0,0 @@
-#!/usr/bin/env python
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017-2018 Nippon Telegraph and Telephone Corporation
-
-from __future__ import print_function
-from Queue import Queue
-from thread import start_new_thread
-from threading import Thread
-import cmd
-import getopt
-import select
-import socket
-import sys
-
-import json
-
-
-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)
-
-
-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()
-
-
-def connectionthread(name, client_id, conn, m2s, s2m):
-    """Manage secondary process connections"""
-
-    cmd_str = 'hello'
-    recv_str = 'recv'
-    recv_json = None
-
-    # infinite loop so that function do not terminate and thread do not end.
-    while True:
-        try:
-            _, _, _ = select.select([conn, ], [conn, ], [], 5)
-        except select.error:
-            break
-
-        # Sending message to connected secondary
-        try:
-            cmd_str = m2s.get(True)
-            conn.send(cmd_str)  # send only takes string
-        except KeyError:
-            break
-        except Exception, excep:
-            print(str(excep))
-            break
-
-        # Receiving from secondary
-        try:
-            recv_str = ""
-            while True:
-                # 1024 stands for bytes of data to be received
-                data = conn.recv(1024)
-                if data:
-                    recv_str = recv_str + data
-                    if len(data) < 1024:
-                        break
-                else:
-                    break
-            if len(recv_str) > 0:
-                recv_json = json.loads(recv_str)
-                recv_str = "recv:%d:len:%d:\n%s\n" % (
-                    conn.fileno(), len(recv_str),
-                    json.dumps(recv_json, indent=4))
-
-            if not data:
-                s2m.put(recv_str + "closing:" + str(conn))
-                break
-
-            # s2m.put("recv:" + str(conn.fileno()) + ":{" + recv_str + "}")
-            s2m.put(recv_str)
-        except Exception, excep:
-            print(str(excep))
-            break
-
-    SECONDARY_LIST.remove(client_id)
-    conn.close()
-
-
-def getclientid(conn):
-    """Get client_id from client"""
-
-    try:
-        conn.send("_get_client_id")
-        # conn.send("{\"commands\":[{\"command\":\"process\"}]}")
-    except KeyError:
-        return -1
-
-    data = conn.recv(1024)
-    if data is None:
-        return -1
-
-    # client_id = int(data.strip('\0'))
-    json_dict = json.loads(data)
-    client_id = int(json_dict['client_id'])
-
-    if client_id < 0 or client_id > MAX_SECONDARY:
-        return -1
-
-    print("secondary id %d" % client_id)
-    return client_id
-
-    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 free_client_id < 0:
-        return -1
-
-    conn.send("_set_client_id %u" % free_client_id)
-    data = conn.recv(1024)
-
-    return free_client_id
-
-
-def acceptthread(sock, main2sec, sec2main):
-    """Listen for secondary processes"""
-
-    global SECONDARY_COUNT
-
-    try:
-        while True:
-            # Accepting incoming connections
-            conn, _ = sock.accept()
-
-            client_id = getclientid(conn)
-            if client_id < 0:
-                break
-
-            # Creating new thread.
-            # Calling secondarythread function for this function and passing
-            # conn as argument.
-
-            SECONDARY_LIST.append(client_id)
-            main2sec[client_id] = Queue()
-            sec2main[client_id] = Queue()
-            start_new_thread(connectionthread,
-                             ('secondary', client_id, conn,
-                              main2sec[client_id],
-                              sec2main[client_id], ))
-            SECONDARY_COUNT += 1
-    except Exception, excep:
-        print(str(excep))
-        sock.close()
-
-
-def command_primary(command):
-    """Send command to primary process"""
-
-    if PRIMARY:
-        MAIN2PRIMARY.put(command)
-        print(PRIMARY2MAIN.get(True))
-    else:
-        print("primary not started")
-
-
-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)
-        print(SEC2MAIN[sec_id].get(True))
-    else:
-        print("secondary id %d not exist" % sec_id)
-
-
-def print_status():
-    """Display information about connected clients"""
-
-    print("Soft Patch Panel Status :")
-    print("primary: %d" % PRIMARY)
-    print("secondary count: %d" % len(SECONDARY_LIST))
-    for i in SECONDARY_LIST:
-        print("Connected secondary id: %d" % i)
-
-
-def primarythread(sock, main2primary, primary2main):
-    """Manage primary process connection"""
-
-    global PRIMARY
-    cmd_str = ''
-
-    while True:
-        # waiting for connection
-        PRIMARY = False
-        conn, addr = sock.accept()
-        PRIMARY = True
-
-        while conn:
-            try:
-                _, _, _ = select.select([conn, ], [conn, ], [], 5)
-            except select.error:
-                break
-
-            # Sending message to connected primary
-            try:
-                cmd_str = main2primary.get(True)
-                conn.send(cmd_str)  # send only takes string
-            except KeyError:
-                break
-            except Exception, excep:
-                print(str(excep))
-                break
-
-            # Receiving from primary
-            try:
-                # 1024 stands for bytes of data to be received
-                data = conn.recv(1024)
-                if data:
-                    primary2main.put("recv:%s:{%s}" % (str(addr), data))
-                else:
-                    primary2main.put("closing:%s" % str(addr))
-                    conn.close()
-                    break
-            except Exception, excep:
-                print(str(excep))
-                break
-
-    print("primary communication thread end")
-
-
-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"""
-
-    return 1
-
-    level1 = ['status', 'exit', 'forward', 'stop']
-    level2 = ['add', 'patch', 'del']
-    patch_args = ['reset']
-    add_del_args = ['ring', 'vhost']
-    cmdlist = cmds.split(' ')
-    valid = 0
-
-    length = len(cmdlist)
-    if length == 1:
-        if cmdlist[0] in level1:
-            valid = 1
-    elif length == 2:
-        if cmdlist[0] == 'patch':
-            if cmdlist[1] in patch_args:
-                valid = 1
-    elif length == 3:
-        if cmdlist[0] in level2:
-            if cmdlist[0] == 'add' or cmdlist[0] == 'del':
-                if cmdlist[1] in add_del_args:
-                    if str.isdigit(cmdlist[2]):
-                        valid = 1
-            elif cmdlist[0] == 'patch':
-                if str.isdigit(cmdlist[1]) and str.isdigit(cmdlist[2]):
-                    valid = 1
-
-    return valid
-
-
-class Shell(cmd.Cmd, object):
-    """SPP command prompt"""
-
-    intro = 'Welcome to the spp.   Type help or ? to list commands.\n'
-    prompt = 'spp > '
-    recorded_file = None
-
-    COMMANDS = ['status', 'add', 'patch', 'ring', 'vhost',
-                'reset', 'exit', 'forward', 'stop', 'clear']
-
-    def is_comment_line(self, line):
-        input_line = line.strip()
-        if len(input_line) > 0:
-            if (input_line[0] == '#') or (input_line[0:2] == '//'):
-                return True
-            else:
-                return False
-
-    def default(self, line):
-        """Define defualt behaviour
-
-        If user input is commend styled, controller simply echo as a comment.
-        Supported styles are
-          - python ('#')
-          - C ('//')
-        """
-
-        if self.is_comment_line(line):
-            print("%s" % line.strip())
-        else:
-            super(Shell, self).default(line)
-
-    def emptyline(self):
-        """Do nothin for empty input
-
-        It override Cmd.emptyline() which runs previous input as default
-        to do nothing.
-        """
-        pass
-
-    def complete_pri(self, text, line, begidx, endidx):
-        """Completion for primary process commands"""
-
-        if not text:
-            completions = self.COMMANDS[:]
-        else:
-            completions = [p
-                           for p in self.COMMANDS
-                           if p.startswith(text)]
-
-        return completions
-
-    def complete_sec(self, text, line, begidx, endidx):
-        """Completion for secondary process commands"""
-
-        if not text:
-            completions = self.COMMANDS[:]
-        else:
-            completions = [p
-                           for p in self.COMMANDS
-                           if p.startswith(text)]
-
-        return completions
-
-    def do_status(self, _):
-        """Display Soft Patch Panel Status"""
-
-        print_status()
-
-    def do_pri(self, command):
-        """Send command to primary process"""
-
-        if command and command in self.COMMANDS:
-            command_primary(command)
-        else:
-            print("primary invalid command")
-
-    def do_sec(self, arg):
-        """Send command to secondary process"""
-
-        cmds = arg.split(';')
-        if len(cmds) < 2:
-            print("error")
-        elif str.isdigit(cmds[0]):
-            sec_id = int(cmds[0])
-            if check_sec_cmds(cmds[1]):
-                command_secondary(sec_id, cmds[1])
-            else:
-                print("invalid cmd")
-        else:
-            print(cmds[0])
-            print("first %s" % cmds[1])
-
-    def do_record(self, arg):
-        """Save future commands to filename:  RECORD filename.cmd"""
-
-        self.recorded_file = open(arg, 'w')
-
-    def do_playback(self, arg):
-        """Playback commands from a file:  PLAYBACK filename.cmd"""
-
-        self.close()
-        try:
-            with open(arg) as recorded_file:
-                lines = []
-                for line in recorded_file:
-                    if not self.is_comment_line(line):
-                        lines.append("# %s" % line)
-                    lines.append(line)
-                self.cmdqueue.extend(lines)
-        except IOError:
-            print("Error: File does not exist.")
-
-    def precmd(self, line):
-        if self.recorded_file and 'playback' not in line:
-            print(line, file=self.recorded_file)
-        return line
-
-    def close(self):
-        """Close record file"""
-
-        if self.recorded_file:
-            print("closing file")
-            self.recorded_file.close()
-            self.recorded_file = None
-
-    def do_bye(self, arg):
-        """Stop recording, close SPP, and exit: BYE"""
-
-        cmds = arg.split(' ')
-        if cmds[0] == 'sec':
-            close_all_secondary()
-        elif cmds[0] == 'all':
-            close_all_secondary()
-            command_primary('exit')
-        elif cmds[0] == '':
-            print('Thank you for using Soft Patch Panel')
-            self.close()
-            return True
-
-
-def main(argv):
-    """main"""
-
-    # Defining server address and port
-    host = ''  # 'localhost' or '127.0.0.1' or '' are all same
-
-    try:
-        opts, _ = getopt.getopt(
-            argv, "p:s:h", ["help", "primary = ", "secondary"])
-    except getopt.GetoptError:
-        print('spp.py -p <primary__port_number> -s <secondary_port_number>')
-        sys.exit(2)
-    for opt, arg in opts:
-        if opt in ("-h", "--help"):
-            print(
-                'spp.py -p <primary__port_number> -s <secondary_port_number>')
-            sys.exit()
-        elif opt in ("-p", "--primary"):
-            primary_port = int(arg)
-            print("primary port : %d" % primary_port)
-        elif opt in ("-s", "--secondary"):
-            secondary_port = int(arg)
-            print('secondary port : %d' % secondary_port)
-
-    # Creating primary socket object
-    primary_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
-    # Binding primary socket to a address. bind() takes tuple of host and port.
-    primary_sock.bind((host, primary_port))
-
-    # Listening primary at the address
-    primary_sock.listen(1)  # 5 denotes the number of clients can queue
-
-    primary_thread = Thread(target=primarythread,
-                            args=(primary_sock, MAIN2PRIMARY, PRIMARY2MAIN,))
-    primary_thread.daemon = True
-    primary_thread.start()
-
-    # Creating secondary socket object
-    secondary_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
-    # Binding secondary socket to a address. bind() takes tuple of host
-    # and port.
-    secondary_sock.bind((host, secondary_port))
-
-    # Listening secondary at the address
-    secondary_sock.listen(MAX_SECONDARY)
-
-    # secondary process handling thread
-    start_new_thread(acceptthread, (secondary_sock, MAIN2SEC, SEC2MAIN))
-
-    shell = Shell()
-    shell.cmdloop()
-    shell = None
-
-    primary_sock.shutdown(socket.SHUT_RDWR)
-    primary_sock.close()
-    secondary_sock.shutdown(socket.SHUT_RDWR)
-    secondary_sock.close()
-
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
-- 
2.13.1

      parent reply	other threads:[~2018-10-18 11:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-18 11:28 [spp] [PATCH 0/4] Add commands of spp_vf to SPP controller ogawa.yasufumi
2018-10-18 11:28 ` [spp] [PATCH 1/4] controller: add POST method for spp-ctl ogawa.yasufumi
2018-10-18 11:28 ` [spp] [PATCH 2/4] controller: add SppVf class ogawa.yasufumi
2018-10-18 11:28 ` [spp] [PATCH 3/4] controller: add vf command to SPP controller ogawa.yasufumi
2018-10-18 11:28 ` ogawa.yasufumi [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181018112849.77691-5-ogawa.yasufumi@lab.ntt.co.jp \
    --to=ogawa.yasufumi@lab.ntt.co.jp \
    --cc=ferruh.yigit@intel.com \
    --cc=spp@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).