From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id EB445A04F7 for ; Tue, 17 Dec 2019 03:37:42 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D3609235; Tue, 17 Dec 2019 03:37:42 +0100 (CET) Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by dpdk.org (Postfix) with ESMTP id 82C23235 for ; Tue, 17 Dec 2019 03:37:41 +0100 (CET) Received: by mail-pf1-f195.google.com with SMTP id b19so6691265pfo.2 for ; Mon, 16 Dec 2019 18:37:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=UQhjrxMqFW5vyqFeKSBo196uLE+YKtfmh5kZRgfJqWc=; b=gIAp5o0iiCZ4+s/AQY+ZbAYKWD2fpuLe/RkK0RB6xt4BNdZ62AhuEulSuOisXLT5PB OdizlToyHgVroUVXEW0NPz/Rso9eS6GadPSWL1N1YkL/trJ9J18iLp3544XmigQYf241 Q3GWDKEThnUzfNU7U7GRz0kW6vILxXOTuTOclYTBr76V0OS0B0cU5Z8sKtJJ71tQRic1 59PdNdUfB+cP1y2NnZEYL2MSwWiIxCjq1dUTLQuQHyQJ9OS4de+FWXJEgHIKmSvxb+jm 58q0iYqZlqAb74FzcNd6jg/4dU7LFPmuUAiah1PrbqwxbBnkYhmKsp7czL9CN+7GmkGw o0FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=UQhjrxMqFW5vyqFeKSBo196uLE+YKtfmh5kZRgfJqWc=; b=qwLzZ6upbjTTWeMWxrkgbhPodlxmVX7533oI+++UnfukXlsjrctGNs1r7RVkeQuSDY OD6qdbs6hPiAjTlH8zlDFwS6l8ursf2GQmbkLStXZ8uePzJ998BwTImrtxYGNWWesfg+ BUv1HchxV/3X1VDlfpYVqFDJrDVf3ny3GhqDAxO0UeCHg0qrF1iHnN4Oqz7jKTYwKVo9 is6QcdcNCRhtk9p9nrAJdRXcHaeJkW1A2pCTb9+6/+vcuWlYgZSGfDyuBuu6sPEYpSzO 49sopaQbkyicdumuR1V1DpQ+GDzlU3KPoxXDO87bv2jYqvKMiey4oBufTJmMHEWM8FDF HZ7A== X-Gm-Message-State: APjAAAVtDCzL0RMD4lLkmH99wQHt2a2ulUk0LqozYjg0tp3jhA6jwZX+ MekpYKyr1lnRFFwoiO/CfcsloontJd0= X-Google-Smtp-Source: APXvYqy8Jt2ze7PofNd7RGM/cDDpwiRvGaBv5f9FQprUYeFPAm514sRybiNiKzNU89W0rW7koeHJXA== X-Received: by 2002:a63:1402:: with SMTP id u2mr22225552pgl.224.1576550260391; Mon, 16 Dec 2019 18:37:40 -0800 (PST) Received: from localhost.localdomain ([192.47.164.146]) by smtp.gmail.com with ESMTPSA id d23sm23664402pfo.176.2019.12.16.18.37.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Dec 2019 18:37:39 -0800 (PST) From: yasufum.o@gmail.com To: spp@dpdk.org, ferruh.yigit@intel.com, yasufum.o@gmail.com Date: Tue, 17 Dec 2019 11:37:28 +0900 Message-Id: <20191217023730.30477-2-yasufum.o@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191217023730.30477-1-yasufum.o@gmail.com> References: <20191217023730.30477-1-yasufum.o@gmail.com> Subject: [spp] [PATCH 1/3] test: add test for spp_nfv 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: , Errors-To: spp-bounces@dpdk.org Sender: "spp" From: Yasufumi Ogawa This patch is to add a unit test code for spp_nfv. Test cases are defined by following SPP REST API, such as checking status, adding port or so. Configurations for the tests are defined as `test/config.ini`. Host IP or assignment of resouces can be changed in the config. Unit tests are expected to be run in the `test` dir. $ cd /path/to/spp/test $ python3 -m unittest # or add `-v` for showing details Signed-off-by: Yasufumi Ogawa --- test/config.ini | 12 +++ test/test_spp_nfv.py | 179 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 test/config.ini create mode 100644 test/test_spp_nfv.py diff --git a/test/config.ini b/test/config.ini new file mode 100644 index 0000000..8890413 --- /dev/null +++ b/test/config.ini @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Nippon Telegraph and Telephone Corporation + +[spp-ctl] +host = 127.0.0.1 +ctl_api_port = 7777 +api_version = v1 + +# spp_nfv mainly tested +[spp_nfv] +lcores = 1,2 +mem = 512 diff --git a/test/test_spp_nfv.py b/test/test_spp_nfv.py new file mode 100644 index 0000000..1ebb3d3 --- /dev/null +++ b/test/test_spp_nfv.py @@ -0,0 +1,179 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Nippon Telegraph and Telephone Corporation + +import configparser +import json +import requests +import time +import unittest + + +class TestSppNfv(unittest.TestCase): + """Test spp_nfv. + + Test as following the REST API reference. It does not include terminating + spp_nfv process because it is done as tearDown() task. + """ + + def setUp(self): + """Launch default spp_nfv used for the tests.""" + + self.sec_type = 'nfvs' + self.default_sec_id = 1 + + self.config = configparser.ConfigParser() + self.config.read('config.ini') + + host = self.config['spp-ctl']['host'] + ctl_api_port = self.config['spp-ctl']['ctl_api_port'] + api_version = self.config['spp-ctl']['api_version'] + + self.base_url = 'http://{host}:{port}/{api_ver}'.format( + host=host, port=ctl_api_port, api_ver=api_version) + + # Launch default spp_nfv + sec_port = '6666' + nfv = {'mem': self.config['spp_nfv']['mem'], + 'lcores': self.config['spp_nfv']['lcores']} + params = { + 'proc_name': 'spp_nfv', + 'client_id': str(self.default_sec_id), + 'eal': { + '-m': nfv['mem'], '-l': nfv['lcores'], + '--proc-type': 'secondary'}, + 'app': { + '-s': '{}:{}'.format(host, sec_port), + '-n': str(self.default_sec_id)} + } + url = '{baseurl}/primary/launch'.format(baseurl=self.base_url) + requests.put(url, data=json.dumps(params)) + time.sleep(0.2) # wait until be launched + + def tearDown(self): + """Shutdown default spp_nfv.""" + + url = '{baseurl}/{sec_type}/{sec_id}'.format( + baseurl=self.base_url, + sec_type=self.sec_type, + sec_id=self.default_sec_id) + response = requests.delete(url) + + def _get_status(self): + """Get status of default spp_nfv process.""" + + url = "{baseurl}/{sec_type}/{sec_id}".format( + baseurl=self.base_url, + sec_type=self.sec_type, + sec_id=self.default_sec_id) + response = requests.get(url) + return response.json() + + def _set_forwarding_status(self, action): + """Set forwarding status as start or stop.""" + + if action in ['start', 'stop']: + url = "{baseurl}/{sec_type}/{sec_id}/forward".format( + baseurl=self.base_url, + sec_type=self.sec_type, + sec_id=self.default_sec_id) + params = {'action': action} + response = requests.put(url, data=json.dumps(params)) + return True + else: + return False + + def _add_or_del_port(self, action, res_uid): + if action in ['add', 'del']: + url = "{baseurl}/{sec_type}/{sec_id}/ports".format( + baseurl=self.base_url, + sec_type=self.sec_type, + sec_id=self.default_sec_id) + params = {'action': action, 'port': res_uid} + requests.put(url, data=json.dumps(params)) + return True + else: + return False + + def _add_port(self, res_uid): + self._add_or_del_port('add', res_uid) + + def _del_port(self, res_uid): + self._add_or_del_port('del', res_uid) + + def _assert_add_del_port(self, port): + self._add_port(port) + nfv = self._get_status() + self.assertTrue(port in nfv['ports']) + + self._del_port(port) + nfv = self._get_status() + self.assertFalse(port in nfv['ports']) + + def _patch(self, src, dst): + """Set patch between given ports.""" + + url = "{baseurl}/{sec_type}/{sec_id}/patches".format( + baseurl=self.base_url, + sec_type=self.sec_type, + sec_id=self.default_sec_id) + params = {'src': src, 'dst': dst} + requests.put(url, data=json.dumps(params)) + + def _reset_patches(self): + url = "{baseurl}/{sec_type}/{sec_id}/patches".format( + baseurl=self.base_url, + sec_type=self.sec_type, + sec_id=self.default_sec_id) + requests.delete(url) + + # Test methods for testing spp_nfv from here. + def test_sec_id(self): + """Confirm sec ID is expected value.""" + + nfv = self._get_status() + self.assertEqual(nfv['client-id'], 1) + + def test_forward_stop(self): + """Confirm forwarding is started and stopped.""" + + self._set_forwarding_status('start') + nfv = self._get_status() + self.assertEqual(nfv['status'], 'running') + + self._set_forwarding_status('stop') + nfv = self._get_status() + self.assertEqual(nfv['status'], 'idling') + + def test_add_del_ring(self): + """Check if ring PMD is added.""" + + port = 'ring:0' + self._assert_add_del_port(port) + + def test_add_del_vhost(self): + """Check if vhost PMD is added.""" + + port = 'vhost:1' + self._assert_add_del_port(port) + + def test_add_del_pcap(self): + """Check if pcap PMD is added.""" + + # TODO(yasufum): pcap cannot be adde because I do not know why... + port = 'pcap:1' + pass + + def test_make_patch(self): + """Check if patch between ports is created and reseted.""" + + ports = ['ring:1', 'ring:2'] + + for port in ports: + self._add_port(port) + self._patch(ports[0], ports[1]) + nfv = self._get_status() + self.assertTrue({'src': ports[0], 'dst': ports[1]} in nfv['patches']) + + self._reset_patches() + nfv = self._get_status() + self.assertEqual(nfv['patches'], []) -- 2.17.1