perf: add TCP Nginx+LDPRELOAD suites
[csit.git] / resources / libraries / python / NginxUtil.py
diff --git a/resources/libraries/python/NginxUtil.py b/resources/libraries/python/NginxUtil.py
new file mode 100644 (file)
index 0000000..a19ac37
--- /dev/null
@@ -0,0 +1,124 @@
+# Copyright (c) 2021 Intel and/or its affiliates.
+# 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.
+
+"""NGINX Utilities Library."""
+
+from resources.libraries.python.OptionString import OptionString
+from resources.libraries.python.ssh import exec_cmd_no_error
+from resources.libraries.python.topology import NodeType
+from resources.libraries.python.DUTSetup import DUTSetup
+
+
+class NginxUtil:
+    """Utilities for NGINX."""
+
+    @staticmethod
+    def get_cmd_options(**kwargs):
+        """Create parameters options.
+
+        :param kwargs: Dict of cmd parameters.
+        :type kwargs: dict
+        :returns: cmd parameters.
+        :rtype: OptionString
+        """
+        cmd_options = OptionString()
+        nginx_path = kwargs.get(u"path", u"/usr/local/nginx")
+        cmd_options.add(nginx_path)
+        options = OptionString(prefix=u"-")
+        # Show Nginx Version
+        options.add(u"v")
+        # Verify Configuration
+        options.add(u"t")
+        # Send signal to a master process: stop, quit, reopen.
+        options.add_with_value_from_dict(
+            u"s", u"signal", kwargs
+        )
+        # Set prefix path (default: /usr/local/nginx/).
+        options.add_with_value_from_dict(
+            u"p", u"prefix", kwargs
+        )
+        # Set configuration file (default: conf/nginx.conf).
+        options.add_with_value_from_dict(
+            u"c", u"filename", kwargs
+        )
+        # Set global directives out of configuration file
+        options.add_with_value_from_dict(
+            u"g", u"directives", kwargs
+        )
+        cmd_options.extend(options)
+        return cmd_options
+
+    @staticmethod
+    def nginx_cmd_stop(node, path):
+        """Stop NGINX cmd app on node.
+        :param node: Topology node.
+        :param path: Nginx install path.
+        :type node: dict
+        :type path: str
+        :returns: nothing
+        """
+        cmd_options = NginxUtil.get_cmd_options(path=path, signal=u"stop")
+
+        exec_cmd_no_error(node, cmd_options, sudo=True, disconnect=True,
+                          message=u"Nginx stop failed!")
+
+    @staticmethod
+    def nginx_cmd_start(node, path, filename):
+        """Start NGINX cmd app on node.
+        :param node: Topology node.
+        :param path: Nginx install path.
+        :param filename: Nginx conf name.
+        :type node: dict
+        :type path: str
+        :type filename: str
+
+        :returns: nothing
+        """
+        cmd_options = NginxUtil.get_cmd_options(path=path,
+                                                filename=filename)
+
+        exec_cmd_no_error(node, cmd_options, sudo=True, disconnect=True,
+                          message=u"Nginx start failed!")
+
+    @staticmethod
+    def nginx_config_verify(node, path):
+        """Start NGINX cmd app on node.
+        :param node: Topology node.
+        :param path: Nginx install path.
+        :type node: dict
+        :type path: str
+        :returns: nothing
+        """
+        cmd_options = NginxUtil.get_cmd_options(path=path)
+        exec_cmd_no_error(node, cmd_options, sudo=True, disconnect=True,
+                          message=u"Nginx Config failed!")
+
+    @staticmethod
+    def taskset_nginx_pid_to_idle_cores(node, cpu_idle_list):
+        """Set idle cpus to NGINX pid on node.
+
+        :param node: Topology node.
+        :param cpu_idle_list: Idle Cpus.
+        :type node: dict
+        :type cpu_idle_list: list
+        :returns: nothing
+        """
+        if node[u"type"] != NodeType.DUT:
+            raise RuntimeError(u'Node type is not a DUT!')
+        pids = DUTSetup.get_pid(node, u"nginx")
+        for index, pid in enumerate(pids):
+            cmd = f"taskset -pc {cpu_idle_list[index]} {pid}"
+            exec_cmd_no_error(
+                node, cmd, sudo=True, timeout=180,
+                message=u"taskset cores to nginx pid failed!"
+            )