From: ogawa.yasufumi@lab.ntt.co.jp
To: ferruh.yigit@intel.com, spp@dpdk.org, ogawa.yasufumi@lab.ntt.co.jp
Subject: [spp] [PATCH 5/5] controller: update SppBye class
Date: Wed, 12 Dec 2018 11:03:15 +0900 [thread overview]
Message-ID: <1544580195-9242-6-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> (raw)
In-Reply-To: <1544580195-9242-1-git-send-email-ogawa.yasufumi@lab.ntt.co.jp>
From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
This update is to support `bye` command other than spp_nfv. Although
spp_vf and spp_mirror do not support this command currently, SPP CLI
is updadted first. SPP CLI does not send `exit` command to spp_vf and
spp_mirror because it is not supported currently, so still need to be
upadated after implementation of the command.
Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
---
src/controller/commands/bye.py | 27 ++++++------
src/controller/shell.py | 97 +++++++++++++++++++++++++-----------------
2 files changed, 74 insertions(+), 50 deletions(-)
diff --git a/src/controller/commands/bye.py b/src/controller/commands/bye.py
index dfbd048..af77b08 100644
--- a/src/controller/commands/bye.py
+++ b/src/controller/commands/bye.py
@@ -3,7 +3,7 @@
class SppBye(object):
- """Exec SPP bye command.
+ """Run SPP bye command.
SppBye class is intended to be used in Shell class as a delegator
for running 'bye' command.
@@ -14,21 +14,21 @@ class SppBye(object):
BYE_CMDS = ['sec', 'all']
- def __init__(self, spp_ctl_cli, spp_primary, spp_nfvs):
- self.spp_ctl_cli = spp_ctl_cli
- self.spp_primary = spp_primary
- self.spp_nfvs = spp_nfvs
+ def __init__(self):
+ pass
- def run(self, args, sec_ids):
+ def run(self, args, spp_primary, spp_secondaries):
cmds = args.split(' ')
if cmds[0] == 'sec':
- self.close_all_secondary(sec_ids)
+ print('Closing secondary ...')
+ self.close_all_secondary(spp_secondaries)
+
elif cmds[0] == 'all':
print('Closing secondary ...')
- self.close_all_secondary(sec_ids)
+ self.close_all_secondary(spp_secondaries)
print('Closing primary ...')
- self.spp_primary.do_exit()
+ spp_primary.do_exit()
def complete(self, text, line, begidx, endidx):
@@ -41,8 +41,11 @@ class SppBye(object):
]
return completions
- def close_all_secondary(self, sec_ids):
+ def close_all_secondary(self, spp_secondaries):
"""Terminate all secondary processes."""
- for i, nfv in self.spp_nfvs.items():
- nfv.run(i, 'exit')
+ for sec_type, spp_procs in spp_secondaries.items():
+ # TODO(yasufum) Remove if they support exit command.
+ if not (sec_type in ['vf', 'mirror']):
+ for sec in spp_procs.values():
+ sec.run('exit')
diff --git a/src/controller/shell.py b/src/controller/shell.py
index eafc5de..615b9a1 100644
--- a/src/controller/shell.py
+++ b/src/controller/shell.py
@@ -38,28 +38,39 @@ class Shell(cmd.Cmd, object):
else:
readline.write_history_file(hist_file)
- def __init__(self, spp_ctl_cli):
+ def __init__(self, spp_ctl_cli, use_cache=False):
cmd.Cmd.__init__(self)
self.spp_ctl_cli = spp_ctl_cli
- self.spp_primary = pri.SppPrimary(self.spp_ctl_cli)
+ self.use_cache = use_cache
+ self.init_spp_procs()
+ self.spp_topo = topo.SppTopo(self.spp_ctl_cli, {}, self.topo_size)
+
+ def init_spp_procs(self):
+ """Initialize delegators of SPP processes.
+
+ Delegators accept a command and sent it to SPP proesses. This method
+ is also called from `precmd()` method to update it to the latest
+ status.
+ """
- self.spp_nfvs = {}
+ self.primary = pri.SppPrimary(self.spp_ctl_cli)
+
+ self.secondaries = {}
+ self.secondaries['nfv'] = {}
for sec_id in self.get_sec_ids('nfv'):
- self.spp_nfvs[sec_id] = nfv.SppNfv(self.spp_ctl_cli, sec_id)
+ self.secondaries['nfv'][sec_id] = nfv.SppNfv(
+ self.spp_ctl_cli, sec_id)
- self.spp_vfs = {}
+ self.secondaries['vf'] = {}
for sec_id in self.get_sec_ids('vf'):
- self.spp_vfs[sec_id] = vf.SppVf(self.spp_ctl_cli, sec_id)
+ self.secondaries['vf'][sec_id] = vf.SppVf(
+ self.spp_ctl_cli, sec_id)
- self.spp_mirrors = {}
+ self.secondaries['mirror'] = {}
for sec_id in self.get_sec_ids('mirror'):
- self.spp_mirrors[sec_id] = mirror.SppMirror(
+ self.secondaries['mirror'][sec_id] = mirror.SppMirror(
self.spp_ctl_cli, sec_id)
- self.spp_topo = topo.SppTopo(self.spp_ctl_cli, {}, self.topo_size)
- self.spp_bye = bye.SppBye(self.spp_ctl_cli, self.spp_primary,
- self.spp_nfvs)
-
def default(self, line):
"""Define defualt behaviour.
@@ -222,6 +233,9 @@ class Shell(cmd.Cmd, object):
It is called for checking a contents of command line.
"""
+ if self.use_cache is False:
+ self.init_spp_procs()
+
if self.recorded_file:
if not (
('playback' in line) or
@@ -261,12 +275,12 @@ class Shell(cmd.Cmd, object):
if logger is not None:
logger.info("Receive pri command: '%s'" % command)
- self.spp_primary.run(command)
+ self.primary.run(command)
def complete_pri(self, text, line, begidx, endidx):
"""Completion for primary process commands."""
- return self.spp_primary.complete(text, line, begidx, endidx)
+ return self.primary.complete(text, line, begidx, endidx)
def do_nfv(self, cmd):
"""Send a command to spp_nfv specified with ID.
@@ -290,7 +304,7 @@ class Shell(cmd.Cmd, object):
if len(cmds) < 2:
print("Required an ID and ';' before the command.")
elif str.isdigit(cmds[0]):
- self.spp_nfvs[int(cmds[0])].run(cmds[1])
+ self.secondaries['nfv'][int(cmds[0])].run(cmds[1])
else:
print('Invalid command: %s' % tmparg)
@@ -304,8 +318,9 @@ class Shell(cmd.Cmd, object):
# Add SppNfv of sec_id if it is not exist
sec_ids = self.get_sec_ids('nfv')
for idx in sec_ids:
- if self.spp_nfvs[idx] is None:
- self.spp_nfvs[idx] = nfv.SppNfv(self.spp_ctl_cli, idx)
+ if self.secondaries['nfv'][idx] is None:
+ self.secondaries['nfv'][idx] = nfv.SppNfv(
+ self.spp_ctl_cli, idx)
if len(line.split()) == 1:
res = [str(i)+';' for i in sec_ids]
@@ -321,11 +336,13 @@ class Shell(cmd.Cmd, object):
idx = int(first_tokens[1])
# Add SppVf of sec_id if it is not exist
- if self.spp_nfvs[idx] is None:
- self.spp_nfvs[idx] = nfv.SppNfv(self.spp_ctl_cli, idx)
+ if self.secondaries['nfv'][idx] is None:
+ self.secondaries['nfv'][idx] = nfv.SppNfv(
+ self.spp_ctl_cli, idx)
+
+ res = self.secondaries['nfv'][idx].complete(
+ self.get_sec_ids('nfv'), text, line, begidx, endidx)
- res = self.spp_nfvs[idx].complete(self.get_sec_ids('nfv'),
- text, line, begidx, endidx)
# logger.info(res)
return res
@@ -386,7 +403,7 @@ class Shell(cmd.Cmd, object):
if len(cmds) < 2:
print("Required an ID and ';' before the command.")
elif str.isdigit(cmds[0]):
- self.spp_vfs[int(cmds[0])].run(cmds[1])
+ self.secondaries['vf'][int(cmds[0])].run(cmds[1])
else:
print('Invalid command: %s' % tmparg)
@@ -400,8 +417,9 @@ class Shell(cmd.Cmd, object):
# Add SppVf of sec_id if it is not exist
sec_ids = self.get_sec_ids('vf')
for idx in sec_ids:
- if self.spp_vfs[idx] is None:
- self.spp_vfs[idx] = vf.SppVf(self.spp_ctl_cli, idx)
+ if self.secondaries['vf'][idx] is None:
+ self.secondaries['vf'][idx] = vf.SppVf(
+ self.spp_ctl_cli, idx)
if len(line.split()) == 1:
res = [str(i)+';' for i in sec_ids]
@@ -417,11 +435,12 @@ class Shell(cmd.Cmd, object):
idx = int(first_tokens[1])
# Add SppVf of sec_id if it is not exist
- if self.spp_vfs[idx] is None:
- self.spp_vfs[idx] = vf.SppVf(self.spp_ctl_cli, idx)
+ if self.secondaries['vf'][idx] is None:
+ self.secondaries['vf'][idx] = vf.SppVf(
+ self.spp_ctl_cli, idx)
- return self.spp_vfs[idx].complete(self.get_sec_ids('vf'),
- text, line, begidx, endidx)
+ return self.secondaries['vf'][idx].complete(
+ self.get_sec_ids('vf'), text, line, begidx, endidx)
def do_mirror(self, cmd):
"""Send a command to spp_mirror.
@@ -462,7 +481,7 @@ class Shell(cmd.Cmd, object):
if len(cmds) < 2:
print("Required an ID and ';' before the command.")
elif str.isdigit(cmds[0]):
- self.spp_mirrors[int(cmds[0])].run(cmds[1])
+ self.secondaries['mirror'][int(cmds[0])].run(cmds[1])
else:
print('Invalid command: %s' % tmparg)
@@ -476,8 +495,8 @@ class Shell(cmd.Cmd, object):
# Add SppMirror of sec_id if it is not exist
sec_ids = self.get_sec_ids('mirror')
for idx in sec_ids:
- if self.spp_mirrors[idx] is None:
- self.spp_mirrors[idx] = mirror.SppMirror(
+ if self.secondaries['mirror'][idx] is None:
+ self.secondaries['mirror'][idx] = mirror.SppMirror(
self.spp_ctl_cli, idx)
if len(line.split()) == 1:
@@ -495,11 +514,11 @@ class Shell(cmd.Cmd, object):
idx = int(first_tokens[1])
# Add SppMirror of sec_id if it is not exist
- if self.spp_mirrors[idx] is None:
- self.spp_mirrors[idx] = mirror.SppMirror(
+ if self.secondaries['mirror'][idx] is None:
+ self.secondaries['mirror'][idx] = mirror.SppMirror(
self.spp_ctl_cli, idx)
- return self.spp_mirrors[idx].complete(
+ return self.secondaries['mirror'][idx].complete(
self.get_sec_ids('mirror'), text, line, begidx, endidx)
def do_record(self, fname):
@@ -622,16 +641,18 @@ class Shell(cmd.Cmd, object):
"""
cmds = args.split(' ')
- if cmds[0] == '':
+ if cmds[0] == '': # terminate SPP CLI itself
self.do_exit('')
return True
- else: # 'all' or 'sec'
- self.spp_bye.run(args, self.get_sec_ids('nfv'))
+ else: # terminate other SPP processes
+ spp_bye = bye.SppBye()
+ spp_bye.run(args, self.primary, self.secondaries)
def complete_bye(self, text, line, begidx, endidx):
"""Completion for bye commands"""
- return self.spp_bye.complete(text, line, begidx, endidx)
+ spp_bye = bye.SppBye()
+ return spp_bye.complete(text, line, begidx, endidx)
def do_cat(self, arg):
"""View contents of a file.
--
2.7.4
prev parent reply other threads:[~2018-12-12 2:05 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-12 2:03 [spp] [PATCH 0/5] update SPP CLI ogawa.yasufumi
2018-12-12 2:03 ` [spp] [PATCH 1/5] controller: change sec command to nfv ogawa.yasufumi
2018-12-12 2:03 ` [spp] [PATCH 2/5] controller: change to exclude used port from del ogawa.yasufumi
2018-12-12 2:03 ` [spp] [PATCH 3/5] controller: add checking for add and del cmds ogawa.yasufumi
2018-12-12 2:03 ` [spp] [PATCH 4/5] controller: refactor SppNfv class ogawa.yasufumi
2018-12-12 2:03 ` 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=1544580195-9242-6-git-send-email-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).