From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from tama50.ecl.ntt.co.jp (tama50.ecl.ntt.co.jp [129.60.39.147]) by dpdk.org (Postfix) with ESMTP id 607221B137 for ; Tue, 29 Jan 2019 13:24:21 +0100 (CET) Received: from vc1.ecl.ntt.co.jp (vc1.ecl.ntt.co.jp [129.60.86.153]) by tama50.ecl.ntt.co.jp (8.13.8/8.13.8) with ESMTP id x0TCOKcx025111; Tue, 29 Jan 2019 21:24:20 +0900 Received: from vc1.ecl.ntt.co.jp (localhost [127.0.0.1]) by vc1.ecl.ntt.co.jp (Postfix) with ESMTP id 18AC6EA85CF; Tue, 29 Jan 2019 21:24:20 +0900 (JST) Received: from localhost.localdomain (lobster.nslab.ecl.ntt.co.jp [129.60.13.95]) by vc1.ecl.ntt.co.jp (Postfix) with ESMTP id 025B0EA8589; Tue, 29 Jan 2019 21:24:20 +0900 (JST) From: ogawa.yasufumi@lab.ntt.co.jp To: ferruh.yigit@intel.com, spp@dpdk.org, ogawa.yasufumi@lab.ntt.co.jp Date: Tue, 29 Jan 2019 21:21:56 +0900 Message-Id: <1548764521-2827-4-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1548764521-2827-1-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> References: <1548764521-2827-1-git-send-email-ogawa.yasufumi@lab.ntt.co.jp> X-TM-AS-MML: disable Subject: [spp] [PATCH 3/8] spp-ctl: add launch command support for REST API X-BeenThere: spp@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Soft Patch Panel List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Jan 2019 12:24:21 -0000 From: Yasufumi Ogawa This update is to add REST API support of launch command for spp_primary. This launch API of PUT accepts a name of secondary process, secondary ID and all args of the application. Here is an example. $ curl -X PUT -d '{"client_id":1,"proc_name":"spp_nfv","eal":...}' \ http://127.0.0.1:7777/v1/primary/launch This launch API supports only spp_nfv currently. Other secondaries can be launched, but have no components and do not work correctly. Signed-off-by: Yasufumi Ogawa --- src/spp-ctl/spp_proc.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++ src/spp-ctl/spp_webapi.py | 11 +++++ 2 files changed, 124 insertions(+) diff --git a/src/spp-ctl/spp_proc.py b/src/spp-ctl/spp_proc.py index 19a5e53..a2d2adf 100644 --- a/src/spp-ctl/spp_proc.py +++ b/src/spp-ctl/spp_proc.py @@ -18,6 +18,76 @@ TYPE_NFV = "nfv" TYPE_MIRROR = "mirror" TYPE_PCAP = "pcap" +EAL_OPTS = [ + # Lcore-related options + '-c', # core mask + '-l', # core list + '--lcores', # core map + '--master-lcore', # is used as master + '-s', # Hex bitmask of cores used as service cores + # Device-related options + '-b', '--pci-blacklist', # Blacklist of PCI devs + '-w', '--pci-whitelist', # Blacklist of PCI devs + '--vdev', # Add a virtual device + '-d', # Load external drivers + '--no-pci', # Disable PCI bus. + # Multiprocessing-related options + '--proc-type', # primamry, secondary or auto + # Memory-related options + '-n', # number of memory channels + '-r', # number of memory ranks + '-m', # Amount of memory to preallocate at startup + '--in-memory', # not create shared data and run entirely in memory + '--iova-mode', # Force IOVA mode to a specific value + # Debugging options + '--no-shconf', # No shared files created (no sec) + '--no-huge', # Use anonymous memory instead of hugepages (no sec) + '--log-level', # Specify log level, e.g. '--log-level eal:8' + '--file-prefix', # Use different shared file prefix for a DPDK process + # Linux-specific EAL parameters + '--create-uio-dev', # Create /dev/uioX bound to igb_uio + '--vmware-tsc-map', # Use VMware TSC map instead of native RDTSC + '--no-hpet', # Do not use the HPET timer + '--vfio-intr', # Use specified interrupt mode for devs bound to VFIO + '--base-virtaddr', # use different addr for all memmaps of primary + '--legacy-mem', # Use legacy DPDK memory allocation mode + '--socket-mem', # Preallocate memory per socket + '--socket-limit', # Place a per-socket upper limit on memory + '--single-file-segments', # Create fewer files in hugetlbfs + '--huge-dir', # Use specified hugetlbfs instead of autodetected + '--huge-unlink', # Unlink hugepage files after creating + '--match-allocations', # Free hugepages back as original + '--syslog' # syslog facility + ] + +APP_OPTS = { + 'spp_nfv': + [ + '-n', # sec ID + '-s', # address and port + '--vhost-client' # enable client mode + ], + 'spp_vf': + [ + '--client-id', # sec ID + '-s', # address nd port + '--vhost-client' # enable client mode + ], + 'spp_mirror': + [ + '--client-id', # sec ID + '-s', # address nd port + '--vhost-client' # enable client mode + ], + 'spp_pcap': + [ + '--client-id', # sec ID + '-s', # address nd port + '-i', + '--output', + '--limit_file_size' + ]} + def exec_command(func): """Decorator for Sending command and receiving reply. @@ -227,6 +297,49 @@ class PrimaryProc(SppProc): return "clear" @exec_command + def do_launch_sec_proc(self, args): + proc_name = args['proc_name'] + sec_id = args['client_id'] + + eal_opts = [] + app_opts = [] + + # EAL options + # Check mandatory options + mandatory = False + for key in ['-c', '-l', '--lcores']: + if key in args['eal'].keys(): + mandatory = True + break + if mandatory is False: + return None + + if '--proc-type' not in args['eal'].keys(): + return None + + for opt in EAL_OPTS: + if opt in args['eal'].keys(): + eal_opts.append(opt) + val = args['eal'][opt] + if (val is not None) and (val != ''): + eal_opts.append(str(val)) + + if proc_name in APP_OPTS.keys(): + for opt in APP_OPTS[proc_name]: + if opt in args['app'].keys(): + app_opts.append(opt) + val = args['app'][opt] + if (val is not None) and (val != ''): + app_opts.append(str(val)) + + query = "launch {} {} {} -- {}".format( + sec_id, proc_name, ' '.join(eal_opts), ' '.join(app_opts)) + + LOG.info("Query: {}".format(query)) + + return query + + @exec_command def do_exit(self): return "exit" diff --git a/src/spp-ctl/spp_webapi.py b/src/spp-ctl/spp_webapi.py index 0fd2f2a..10b4098 100644 --- a/src/spp-ctl/spp_webapi.py +++ b/src/spp-ctl/spp_webapi.py @@ -436,10 +436,13 @@ class V1PrimaryHandler(BaseHandler): self.set_route() self.install(self.make_response) + self.install(self.get_body) def set_route(self): self.route('/status', 'GET', callback=self.get_status) self.route('/status', 'DELETE', callback=self.clear_status) + self.route('/launch', 'PUT', + callback=self.launch_sec_proc) self.route('/', 'DELETE', callback=self.pri_exit) def _get_proc(self): @@ -464,6 +467,14 @@ class V1PrimaryHandler(BaseHandler): proc = self._get_proc() proc.clear() + def launch_sec_proc(self, body): # the arg should be "body" + for key in ['client_id', 'proc_name', 'eal', 'app']: + if key not in body: + raise KeyRequired(key) + + proc = self._get_proc() + proc.do_launch_sec_proc(body) + def pri_exit(self): proc = self._get_proc() self.ctrl.do_exit(proc.type, proc.id) -- 2.7.4