summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2015-08-19 13:12:10 +0300
committerimarom <imarom@cisco.com>2015-08-19 13:12:10 +0300
commit2acb002ded9dd522af059f3d80f3f26a4e70c1d4 (patch)
tree904880542ff5e8ae452aa2ff0524eb36318e259c
parent6ec401381b4b3e6facce5c9a749bc08b8c30f1a7 (diff)
draft
-rw-r--r--.gitignore1
-rwxr-xr-xlinux/ws_main.py67
-rwxr-xr-xsrc/console/trex_console.py36
-rw-r--r--src/console/trex_rpc_client.py4
-rwxr-xr-xsrc/console/trex_status.py183
-rwxr-xr-xsrc/main.cpp4
-rw-r--r--src/rpc-server/src/trex_rpc_server_mock.cpp60
7 files changed, 192 insertions, 163 deletions
diff --git a/.gitignore b/.gitignore
index 26668730..71cce64e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,7 @@ linux_dpdk*
linux*
scripts/_t-rex-*
scripts/bp-sim-*
+scripts/mock-*
*.pyc
diff --git a/linux/ws_main.py b/linux/ws_main.py
index b6e4fcc2..37051ebe 100755
--- a/linux/ws_main.py
+++ b/linux/ws_main.py
@@ -111,6 +111,7 @@ main_src = SrcGroup(dir='src',
'msg_manager.cpp',
'gtest/tuple_gen_test.cpp',
'gtest/nat_test.cpp',
+ 'gtest/rpc_test.cpp',
'pal/linux/pal_utl.cpp',
'pal/linux/mbuf.cpp'
@@ -138,11 +139,35 @@ net_src = SrcGroup(dir='src/common/Network/Packet',
'MacAddress.cpp',
'VLANHeader.cpp']);
+# RPC code
+rpc_server_src = SrcGroup(dir='src/rpc-server/src',
+ src_list=[
+ 'trex_rpc_server.cpp',
+ 'trex_rpc_req_resp_server.cpp',
+ 'trex_rpc_jsonrpc_v2_parser.cpp',
+ 'trex_rpc_cmds_table.cpp',
+
+ 'commands/trex_rpc_cmd_test.cpp',
+ 'commands/trex_rpc_cmd_general.cpp',
+
+ ])
+
+# RPC mock server (test)
+rpc_server_mock_src = SrcGroup(dir='src/rpc-server/src',
+ src_list=[
+ 'trex_rpc_server_mock.cpp'
+ ])
+
# JSON package
json_src = SrcGroup(dir='external_libs/json',
- src_list=[
- 'jsoncpp.cpp'
- ])
+ src_list=[
+ 'jsoncpp.cpp'
+ ])
+
+rpc_server_mock = SrcGroups([rpc_server_src,
+ rpc_server_mock_src,
+ json_src
+ ])
yaml_src = SrcGroup(dir='yaml-cpp/src/',
src_list=[
@@ -178,6 +203,7 @@ bp =SrcGroups([
main_src,
cmn_src ,
net_src ,
+ rpc_server_src,
yaml_src,
json_src
]);
@@ -196,7 +222,10 @@ cxxflags_base =['-DWIN_UCODE_SIM',
includes_path =''' ../src/pal/linux/
+ ../src/zmq/include/
../src/
+ ../src/rpc-server/include
+ ../external_libs/json/
../yaml-cpp/include/
''';
@@ -212,10 +241,12 @@ PLATFORM_32 = "32"
class build_option:
- def __init__(self,platform,debug_mode,is_pie):
+ def __init__(self, name, src, platform, debug_mode, is_pie):
self.mode = debug_mode; ##debug,release
self.platform = platform; #['32','64']
self.is_pie = is_pie
+ self.name = name
+ self.src = src
def __str__(self):
s=self.mode+","+self.platform;
@@ -283,11 +314,14 @@ class build_option:
return result;
def get_target (self):
- return self.update_executable_name("bp-sim");
+ return self.update_executable_name(self.name);
def get_flags (self):
return self.cxxcomp_flags(cxxflags_base);
+ def get_src (self):
+ return self.src.file_list(top)
+
def get_link_flags(self):
# add here basic flags
base_flags = ['-lpthread'];
@@ -307,25 +341,28 @@ class build_option:
return base_flags;
- def get_exe (self,full_path = True):
- return self.toExe(self.get_target(),full_path);
-
build_types = [
- build_option(debug_mode= DEBUG_, platform = PLATFORM_32, is_pie = False),
- build_option(debug_mode= DEBUG_, platform = PLATFORM_64, is_pie = False),
- build_option(debug_mode= RELEASE_,platform = PLATFORM_32, is_pie = False),
- build_option(debug_mode= RELEASE_,platform = PLATFORM_64, is_pie = False),
+ build_option(name = "bp-sim", src = bp, debug_mode= DEBUG_, platform = PLATFORM_32, is_pie = False),
+ build_option(name = "bp-sim", src = bp, debug_mode= DEBUG_, platform = PLATFORM_64, is_pie = False),
+ build_option(name = "bp-sim", src = bp, debug_mode= RELEASE_,platform = PLATFORM_32, is_pie = False),
+ build_option(name = "bp-sim", src = bp, debug_mode= RELEASE_,platform = PLATFORM_64, is_pie = False),
+
+ build_option(name = "mock-rpc-server", src = rpc_server_mock, debug_mode= DEBUG_,platform = PLATFORM_64, is_pie = False),
]
def build_prog (bld, build_obj):
+ zmq_lib_path='src/zmq/'
+ bld.read_shlib( name='zmq' , paths=[top + zmq_lib_path] )
+
bld.program(features='cxx cxxprogram',
includes =includes_path,
cxxflags =build_obj.get_flags(),
linkflags = build_obj.get_link_flags(),
- source = bp.file_list(top),
+ source = build_obj.get_src(),
+ use = ['zmq'],
rpath = bld.env.RPATH,
target = build_obj.get_target())
@@ -336,15 +373,19 @@ def build_type(bld,build_obj):
def post_build(bld):
print "copy objects"
+
exec_p ="../scripts/"
+
for obj in build_types:
install_single_system(bld, exec_p, obj);
def build(bld):
+
bld.add_post_fun(post_build);
for obj in build_types:
build_type(bld,obj);
+
def build_info(bld):
pass;
diff --git a/src/console/trex_console.py b/src/console/trex_console.py
index 15022e06..584089ae 100755
--- a/src/console/trex_console.py
+++ b/src/console/trex_console.py
@@ -12,10 +12,14 @@ class TrexConsole(cmd.Cmd):
def __init__(self, rpc_client):
cmd.Cmd.__init__(self)
self.prompt = "TRex > "
- self.intro = "\n-=TRex Console V1.0=-\n"
+
+ self.intro = "\n-=TRex Console V1.0=-\n"
+ self.intro += "\nType 'help' or '?' for supported actions\n"
+
self.rpc_client = rpc_client
self.verbose = False
+ # before starting query the RPC server and add the methods
rc, msg = self.rpc_client.query_rpc_server()
if rc:
@@ -29,20 +33,22 @@ class TrexConsole(cmd.Cmd):
# set verbose on / off
def do_verbose (self, line):
- '''shows or set verbose mode\nusage: verbose [on/off]\n'''
+ '''\nshows or set verbose mode\nusage: verbose [on/off]\n'''
if line == "":
- print "verbose is " + ("on" if self.verbose else "off")
+ print "\nverbose is " + ("on\n" if self.verbose else "off\n")
+
elif line == "on":
self.verbose = True
self.rpc_client.set_verbose(True)
- print "verbose set to on\n"
+ print "\nverbose set to on\n"
elif line == "off":
self.verbose = False
self.rpc_client.set_verbose(False)
- print "verbose set to off\n"
+ print "\nverbose set to off\n"
+
else:
- print "please specify 'on' or 'off'\n"
+ print "\nplease specify 'on' or 'off'\n"
# query the server for registered commands
def do_query_server(self, line):
@@ -51,11 +57,11 @@ class TrexConsole(cmd.Cmd):
if not rc:
print "\n*** Failed to query RPC server: " + str(msg)
- print "RPC server supports the following commands: \n\n" + msg
+ print "\nRPC server supports the following commands: \n\n" + msg
def do_ping (self, line):
- '''pings the RPC server\n'''
- print "Pinging RPC server"
+ '''\npings the RPC server\n'''
+ print "\n-> Pinging RPC server"
rc, msg = self.rpc_client.ping_rpc_server()
if rc:
@@ -64,9 +70,9 @@ class TrexConsole(cmd.Cmd):
print "[FAILED]\n"
def do_rpc (self, line):
- '''Launches a RPC on the server\n'''
+ '''\nLaunches a RPC on the server\n'''
if line == "":
- print "Please provide method name\n"
+ print "\nUsage: [method name] [param 1] ...\n"
return
rc, msg = self.rpc_client.invoke_rpc_method(line)
@@ -81,7 +87,9 @@ class TrexConsole(cmd.Cmd):
return [x for x in self.supported_rpc if x.startswith(text)]
def do_status (self, line):
- '''Shows a graphical console\n'''
+ '''\nShows a graphical console\n'''
+
+ self.do_verbose('off')
trex_status.show_trex_status(self.rpc_client)
def do_quit(self, line):
@@ -89,10 +97,10 @@ class TrexConsole(cmd.Cmd):
return True
def default(self, line):
- print "'{0}' is an unrecognized command\n".format(line)
+ print "'{0}' is an unrecognized command. type 'help' or '?' for a list\n".format(line)
# aliasing
- do_EOF = do_q = do_quit
+ do_exit = do_EOF = do_q = do_quit
def main ():
# RPC client
diff --git a/src/console/trex_rpc_client.py b/src/console/trex_rpc_client.py
index 4562cf23..fe8f69a2 100644
--- a/src/console/trex_rpc_client.py
+++ b/src/console/trex_rpc_client.py
@@ -39,7 +39,7 @@ class RpcClient():
msg = self.create_jsonrpc_v2(method_name, params, id = 1)
if self.verbose:
- print "\nSending Request To Server: " + str(msg) + "\n"
+ print "\n[verbose] Sending Request To Server: " + str(msg) + "\n"
if block:
self.socket.send(msg)
@@ -67,7 +67,7 @@ class RpcClient():
return False, "Failed To Get Server Response"
if self.verbose:
- print "Server Response: " + str(response) + "\n"
+ print "[verbose] Server Response: " + str(response)
# decode
response_json = json.loads(response)
diff --git a/src/console/trex_status.py b/src/console/trex_status.py
index 20d70534..8ee669b5 100755
--- a/src/console/trex_status.py
+++ b/src/console/trex_status.py
@@ -85,6 +85,7 @@ class TrexStatus():
return win, panel1
+ # static info panel
def update_info (self):
if self.server_status == None:
return
@@ -99,106 +100,12 @@ class TrexStatus():
self.server_status["general"]["build_date"] + " @ " + self.server_status["general"]["build_time"] + " by " + self.server_status["general"]["version_user"]))
self.info_panel.getwin().addstr(6, 2, "{:<30} {:30}".format("Server Uptime:", self.server_status["general"]["uptime"]))
- #self.ft_panel.clear()
-
- #ft_section_y = 3
- #self.ft_panel.getwin().addstr(ft_section_y, 2,"General Info:", curses.A_UNDERLINE)
-
- #self.ft_panel.getwin().addstr(ft_section_y, 2, "{:<30} {:<30,}".format("Total Flows Opened:", ft_stats["total-opened-flows"]))
- #ft_section_y = ft_section_y + 1
- #self.ft_panel.getwin().addstr(ft_section_y, 2, "{:<30} {:<30,}".format("Total Flows Closed:", ft_stats["total-closed-flows"]))
- #ft_section_y = ft_section_y + 1
- #self.ft_panel.getwin().addstr(ft_section_y, 2, "{:<30} {:<30,}".format("Current Active Flows:", ft_stats["active-flows"]))
- #ft_section_y = ft_section_y + 1
- #self.ft_panel.getwin().addstr(ft_section_y, 2, "{:<30} {:<30,}".format("Flow Allocation Errors:", ft_stats["allocation_err"]))
+ # general stats
def update_general (self, gen_stats):
+ pass
- if not gen_stats:
- return
-
- transport_info_section_y = 3
- general_info_section_y = int(self.cls_panel.h * 0.5)
-
- self.general_panel.clear()
-
- # transport layer info
- self.general_panel.getwin().addstr(transport_info_section_y, 2, "{:<30} {:^10} {:^5} {:^10}".format("Total Tx Rate:",
- float_to_human_readable(gen_stats["total-rx-bps"]),
- "/",
- float_to_human_readable(gen_stats["total-rx-pps"], suffix = "pps")))
- transport_info_section_y += 2
-
-
- self.general_panel.getwin().addstr(transport_info_section_y, 2, "{:<30} {:^6.2f} %".format("DP Core Util.:", gen_stats["cpu-util"]));
-
- transport_info_section_y += 2
-
- for i in range(1, 3):
- self.general_panel.getwin().addstr(transport_info_section_y, 2, "{:<30} {:^10} {:^5} {:^10}".format("Port {0} Rx:".format(i),
- float_to_human_readable(gen_stats["port " + str(i)]["total-rx-bps"]),
- "/",
- float_to_human_readable(gen_stats["port " + str(i)]["total-rx-pps"], suffix = "pps")))
- transport_info_section_y += 1
-
-
- self.general_panel.getwin().addstr(general_info_section_y, 2,"General Info:", curses.A_UNDERLINE)
- general_info_section_y = general_info_section_y + 2
-
- self.general_panel.getwin().addstr(general_info_section_y, 2, "{:<30} {:<30}".format("VNBAR Main Process PID:", os.getppid()))
- general_info_section_y = general_info_section_y + 1
- self.general_panel.getwin().addstr(general_info_section_y, 2, "{:<30} {:<30}".format("ZMQ client online at:", vnbar_ipc.VnbarIpc.get_zmq_transport_name()))
-
-
- # v2
- def update_cls (self, pd_stats):
- if not pd_stats:
- return
-
- self.cls_panel.clear()
-
- section_start = 3
- section_size = (self.cls_panel.h / 2) - 5
-
- for port_name, pd in sorted(pd_stats.iteritems()):
- if pd == None:
- continue
-
- # sort by bandwidth
- pd = collections.OrderedDict(sorted(pd.items(), key=operator.itemgetter(1), reverse = True))
-
- # restart the line index
- line_index = 0
-
- # headline
- self.cls_panel.getwin().addstr(section_start + line_index, 2, "{0}:".format(port_name), curses.A_BOLD | curses.A_UNDERLINE)
- line_index += 1
-
- cls_str = "{:^45} {:^20} {:^20} {:^20}".format("Protocol Name", "Byte Count", "Packet Count", "B/W Perc.")
- self.cls_panel.getwin().addstr(section_start + line_index, 2, cls_str)
- line_index += 2
-
- # protocols
- proto_index = 0
- proto_count = len(pd)
-
- total_bandwidth = sum([i['bytes'] for i in pd.values()])
-
- for proto_name, cnts in pd.iteritems():
- proto_str = "{:<45} {:^20,} {:^20,} {:^20}".format(proto_name, cnts['bytes'], cnts['pkts'], percentage(cnts['bytes'], total_bandwidth) )
- proto_index = proto_index + 1
-
- if line_index > section_size:
- self.cls_panel.getwin().addstr(section_start + line_index, 2, "<...{0} More...>".format(proto_count - proto_index), (curses.A_DIM if ((line_index % 2) == 0) else curses.A_BOLD))
- break
-
- self.cls_panel.getwin().addstr(section_start + line_index, 2, proto_str, (curses.A_DIM if ((line_index % 2) == 0) else curses.A_BOLD))
-
- line_index += 1
-
- section_start = section_start + section_size + 3
-
-
+ # control panel
def update_control (self):
self.control_panel.clear()
@@ -214,17 +121,7 @@ class TrexStatus():
self.control_panel.getwin().addstr(index, 2, l)
index += 1
- def run (self):
- try:
- curses.curs_set(0)
- except:
- pass
-
- curses.use_default_colors()
- self.stdscr.nodelay(1)
- curses.nonl()
- curses.noecho()
-
+ def generate_layout (self):
self.max_y = self.stdscr.getmaxyx()[0]
self.max_x = self.stdscr.getmaxyx()[1]
@@ -239,32 +136,54 @@ class TrexStatus():
panel.update_panels(); self.stdscr.refresh()
+ def wait_for_key_input (self):
+ ch = self.stdscr.getch()
+
+ if (ch != curses.ERR):
+ # stop/start status
+ if (ch == ord('f')):
+ self.update_active = not self.update_active
+ self.add_log_event("Update continued" if self.update_active else "Update stopped")
+
+ elif (ch == ord('p')):
+ self.add_log_event("Pinging RPC server")
+ rc, msg = self.rpc_client.ping_rpc_server()
+ if rc:
+ self.add_log_event("Server replied: '{0}'".format(msg))
+ else:
+ self.add_log_event("Failed to get reply")
+
+ # c - clear stats
+ elif (ch == ord('c')):
+ self.add_log_event("Statistics cleared")
+
+ elif (ch == ord('q')):
+ return False
+ else:
+ self.add_log_event("Unknown key pressed {0}".format("'" + chr(ch) + "'" if chr(ch).isalpha() else ""))
+
+ return True
+
+ # main run entry point
+ def run (self):
+ try:
+ curses.curs_set(0)
+ except:
+ pass
+
+ curses.use_default_colors()
+ self.stdscr.nodelay(1)
+ curses.nonl()
+ curses.noecho()
+
+ self.generate_layout()
+
self.update_active = True
while (True):
- ch = self.stdscr.getch()
-
- if (ch != curses.ERR):
- # stop/start status
- if (ch == ord('f')):
- self.update_active = not self.update_active
- self.add_log_event("Update continued" if self.update_active else "Update stopped")
-
- elif (ch == ord('p')):
- self.add_log_event("Pinging RPC server")
- rc, msg = self.rpc_client.ping_rpc_server()
- if rc:
- self.add_log_event("Server replied: '{0}'".format(msg))
- else:
- self.add_log_event("Failed to get reply")
-
- # c - clear stats
- elif (ch == ord('c')):
- self.add_log_event("Statistics cleared")
-
- elif (ch == ord('q')):
- break
- else:
- self.add_log_event("Unknown key pressed {0}".format("'" + chr(ch) + "'" if chr(ch).isalpha() else ""))
+
+ rc = self.wait_for_key_input()
+ if not rc:
+ break
self.update_control()
self.update_info()
diff --git a/src/main.cpp b/src/main.cpp
index e3176be3..ddcf81e2 100755
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -32,11 +32,11 @@ limitations under the License.
* (improved stub)
*
*/
-extern "C" char * get_build_date(void){
+extern "C" const char * get_build_date(void){
return (__DATE__);
}
-extern "C" char * get_build_time(void){
+extern "C" const char * get_build_time(void){
return (__TIME__ );
}
diff --git a/src/rpc-server/src/trex_rpc_server_mock.cpp b/src/rpc-server/src/trex_rpc_server_mock.cpp
new file mode 100644
index 00000000..3c63f74a
--- /dev/null
+++ b/src/rpc-server/src/trex_rpc_server_mock.cpp
@@ -0,0 +1,60 @@
+/*
+ Itay Marom
+ Cisco Systems, Inc.
+*/
+
+/*
+Copyright (c) 2015-2015 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+#include <trex_rpc_server_api.h>
+#include <iostream>
+#include <unistd.h>
+
+using namespace std;
+
+/**
+ * on simulation this is not rebuild every version
+ * (improved stub)
+ *
+ */
+extern "C" const char * get_build_date(void){
+ return (__DATE__);
+}
+
+extern "C" const char * get_build_time(void){
+ return (__TIME__ );
+}
+
+int main() {
+ cout << "\n-= Starting RPC Server Mock =-\n\n";
+ cout << "Listening on tcp://localhost:5050 [ZMQ]\n\n";
+
+ TrexRpcServerConfig rpc_cfg(TrexRpcServerConfig::RPC_PROT_TCP, 5050);
+ TrexRpcServer rpc(rpc_cfg);
+
+ /* init the RPC server */
+ rpc.start();
+
+ cout << "Server Started\n\n";
+
+ while (true) {
+ sleep(1);
+ }
+
+ rpc.stop();
+
+
+}