From 1618b022c09ab9541f67e1badf3b4636ac4176f6 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Mon, 11 Dec 2023 14:26:18 +0100 Subject: [PATCH] - nvme: Retrieve HostNQN from a first active fabrics connection - tests: Add a simple unit test for the NVMe module Resolves: RHEL-11541 --- 0018-nvme-TP4126-fixes-1.patch | 2 +- ...stnqn_from_active_fabrics_connection.patch | 58 ++++++++++++++++ 0020-nvme-add_unit_tests.patch | 67 +++++++++++++++++++ python-blivet.spec | 8 ++- 4 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 0019-nvme-hostnqn_from_active_fabrics_connection.patch create mode 100644 0020-nvme-add_unit_tests.patch diff --git a/0018-nvme-TP4126-fixes-1.patch b/0018-nvme-TP4126-fixes-1.patch index 1614696..f0cde69 100644 --- a/0018-nvme-TP4126-fixes-1.patch +++ b/0018-nvme-TP4126-fixes-1.patch @@ -23,7 +23,7 @@ index 17bead15e..5ac41cffa 100644 -from . import util + +import gi -+gi.require_version("BlockDev", "3.0") ++gi.require_version("BlockDev", "2.0") + +from gi.repository import BlockDev as blockdev diff --git a/0019-nvme-hostnqn_from_active_fabrics_connection.patch b/0019-nvme-hostnqn_from_active_fabrics_connection.patch new file mode 100644 index 0000000..6115340 --- /dev/null +++ b/0019-nvme-hostnqn_from_active_fabrics_connection.patch @@ -0,0 +1,58 @@ +From 63da3cb8a40500c889c8faa4326f81d16997a3c8 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Mon, 27 Nov 2023 18:55:55 +0100 +Subject: [PATCH] nvme: Retrieve HostNQN from a first active fabrics connection + +When no /etc/hostnqn exists, look for any active NVMe over Fabrics +connections and take the values from a first one, rather than +generating new ones. +--- + blivet/nvme.py | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/blivet/nvme.py b/blivet/nvme.py +index 5ac41cffa..2e4686e68 100644 +--- a/blivet/nvme.py ++++ b/blivet/nvme.py +@@ -18,6 +18,7 @@ + # + + import os ++import glob + + from . import errors + +@@ -54,6 +55,22 @@ def __call__(self): + def __deepcopy__(self, memo_dict): # pylint: disable=unused-argument + return self + ++ def _retrieve_fabrics_hostnqn(self): ++ for d in glob.glob('/sys/class/nvme-fabrics/ctl/nvme*/'): ++ try: ++ # invalidate old values ++ self._hostnqn = None ++ self._hostid = None ++ # read from sysfs ++ with open(os.path.join(d, 'hostnqn')) as f: ++ self._hostnqn = f.readline().strip() ++ with open(os.path.join(d, 'hostid')) as f: ++ self._hostid = f.readline().strip() ++ if self._hostnqn: ++ break ++ except Exception: # pylint: disable=broad-except ++ pass ++ + def startup(self): + if self.started: + return +@@ -61,6 +78,10 @@ def startup(self): + self._hostnqn = blockdev.nvme_get_host_nqn() + self._hostid = blockdev.nvme_get_host_id() + if not self._hostnqn: ++ # see if there are any active fabrics connections and take their values over ++ self._retrieve_fabrics_hostnqn() ++ if not self._hostnqn: ++ # generate new values + self._hostnqn = blockdev.nvme_generate_host_nqn() + if not self._hostnqn: + raise errors.NVMeError("Failed to generate HostNQN") diff --git a/0020-nvme-add_unit_tests.patch b/0020-nvme-add_unit_tests.patch new file mode 100644 index 0000000..aaf9df2 --- /dev/null +++ b/0020-nvme-add_unit_tests.patch @@ -0,0 +1,67 @@ +From c807e234dfd07f3d0005c71501f0300284cd580b Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Wed, 6 Dec 2023 11:47:31 +0100 +Subject: [PATCH] tests: Add a simple unit test for the NVMe module + +--- + tests/unit_tests/__init__.py | 1 + + tests/unit_tests/nvme_test.py | 38 +++++++++++++++++++++++++++++++++++ + 2 files changed, 39 insertions(+) + create mode 100644 tests/unit_tests/nvme_test.py + +diff --git a/tests/unit_tests/__init__.py b/tests/unit_tests/__init__.py +index 589366e0f..62bef67f5 100644 +--- a/tests/unit_tests/__init__.py ++++ b/tests/unit_tests/__init__.py +@@ -9,6 +9,7 @@ + from .devicetree_test import * + from .events_test import * + from .misc_test import * ++from .nvme_test import * + from .parentlist_test import * + from .populator_test import * + from .size_test import * +diff --git a/tests/unit_tests/nvme_test.py b/tests/unit_tests/nvme_test.py +new file mode 100644 +index 000000000..cb948687f +--- /dev/null ++++ b/tests/unit_tests/nvme_test.py +@@ -0,0 +1,38 @@ ++import unittest ++ ++try: ++ from unittest.mock import patch ++except ImportError: ++ from mock import patch ++ ++from blivet.nvme import nvme ++ ++ ++class NVMeModuleTestCase(unittest.TestCase): ++ ++ host_nqn = "nqn.2014-08.org.nvmexpress:uuid:01234567-8900-abcd-efff-abcdabcdabcd" ++ ++ @patch("blivet.nvme.os") ++ @patch("blivet.nvme.blockdev") ++ def test_nvme_module(self, bd, os): ++ self.assertIsNotNone(nvme) ++ bd.nvme_get_host_nqn.return_value = self.host_nqn ++ bd.nvme_get_host_id.return_value = None # None = generate from host_nqn ++ os.path.isdir.return_value = False ++ ++ # startup ++ with patch.object(nvme, "write") as write: ++ nvme.startup() ++ write.assert_called_once_with("/", overwrite=False) ++ ++ self.assertTrue(nvme.started) ++ self.assertEqual(nvme._hostnqn, self.host_nqn) ++ self.assertEqual(nvme._hostid, "01234567-8900-abcd-efff-abcdabcdabcd") ++ ++ # write ++ with patch("blivet.nvme.open") as op: ++ nvme.write("/test") ++ ++ os.makedirs.assert_called_with("/test/etc/nvme/", 0o755) ++ op.assert_any_call("/test/etc/nvme/hostnqn", "w") ++ op.assert_any_call("/test/etc/nvme/hostid", "w") diff --git a/python-blivet.spec b/python-blivet.spec index 93dbee0..de6a0fe 100644 --- a/python-blivet.spec +++ b/python-blivet.spec @@ -23,7 +23,7 @@ Version: 3.6.0 #%%global prerelease .b2 # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2 -Release: 10%{?prerelease}%{?dist} +Release: 11%{?prerelease}%{?dist} Epoch: 1 License: LGPLv2+ %global realname blivet @@ -48,6 +48,8 @@ Patch14: 0015-Add-support-for-filesystem-online-resize.patch Patch15: 0016-Backport-iSCSI-initiator-name-related-fixes.patch Patch16: 0017-nvme-additional-rpms-for-dracut.patch Patch17: 0018-nvme-TP4126-fixes-1.patch +Patch18: 0019-nvme-hostnqn_from_active_fabrics_connection.patch +Patch19: 0020-nvme-add_unit_tests.patch # Versions of required components (done so we make sure the buildrequires # match the requires versions of things). @@ -211,6 +213,10 @@ configuration. %endif %changelog +* Mon Dec 11 2023 Tomas Bzatek - 3.6.0-11 +- nvme: Retrieve HostNQN from a first active fabrics connection +- tests: Add a simple unit test for the NVMe module + Resolves: RHEL-11541 * Tue Sep 26 2023 Tomas Bzatek - 3.6.0-10 - nvme: Require additional rpms for dracut