Update to version 0.7
(commit id 297f40aef117875d98303b0535fb076626b91a19) Resolves: #1876135 Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
This commit is contained in:
parent
2b78601a55
commit
fa7438ace3
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
/nvmetcli-0.3.tar.gz
|
||||
/nvmetcli-0.4.tar.gz
|
||||
/nvmetcli-0.7.tar.gz
|
||||
|
33
0001-nvmetcli-don-t-remove-ANA-Group-1-on-clear.patch
Normal file
33
0001-nvmetcli-don-t-remove-ANA-Group-1-on-clear.patch
Normal file
@ -0,0 +1,33 @@
|
||||
From 0827df8deb5304854d9efc58e9df5971aa66f490 Mon Sep 17 00:00:00 2001
|
||||
From: Hannes Reinecke <hare@suse.de>
|
||||
Date: Fri, 27 Mar 2020 08:01:34 +0100
|
||||
Subject: [PATCH 01/12] nvmetcli: don't remove ANA Group 1 on clear
|
||||
|
||||
The first ANA group is maintained by the kernel so it cannot
|
||||
be deleted.
|
||||
|
||||
Signed-off-by: Hannes Reinecke <hare@suse.de>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/nvme.py | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/nvmet/nvme.py b/nvmet/nvme.py
|
||||
index 0647ddc..fdec4ff 100644
|
||||
--- a/nvmet/nvme.py
|
||||
+++ b/nvmet/nvme.py
|
||||
@@ -845,6 +845,11 @@ class ANAGroup(CFSNode):
|
||||
|
||||
a._setup_attrs(n, err_func)
|
||||
|
||||
+ def delete(self):
|
||||
+ # ANA Group 1 is automatically created/deleted
|
||||
+ if self.grpid != 1:
|
||||
+ super(ANAGroup, self).delete()
|
||||
+
|
||||
def dump(self):
|
||||
d = super(ANAGroup, self).dump()
|
||||
d['grpid'] = self.grpid
|
||||
--
|
||||
2.29.2
|
||||
|
30
0002-README-Update-URL-for-configshell-fb.patch
Normal file
30
0002-README-Update-URL-for-configshell-fb.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From a481736441b4c811f57fa84a8e3609b084f93835 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:44 -0500
|
||||
Subject: [PATCH 02/12] README: Update URL for configshell-fb
|
||||
|
||||
The github repository was moved. There is a github redirect,
|
||||
so this change is not strictly required.
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
README | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/README b/README
|
||||
index c8717e8..5a4ecd1 100644
|
||||
--- a/README
|
||||
+++ b/README
|
||||
@@ -7,7 +7,7 @@ to save, restore or clear the current NVMe target configuration.
|
||||
Installation
|
||||
------------
|
||||
Please install the configshell-fb package from
|
||||
-https://github.com/agrover/configshell-fb first.
|
||||
+https://github.com/open-iscsi/configshell-fb first.
|
||||
|
||||
nvmetcli can be run directly from the source directory or installed
|
||||
using setup.py.
|
||||
--
|
||||
2.29.2
|
||||
|
61
0003-nvmetcli-Improve-IOError-handling-on-restore.patch
Normal file
61
0003-nvmetcli-Improve-IOError-handling-on-restore.patch
Normal file
@ -0,0 +1,61 @@
|
||||
From 48b8f318e0594d7adfec290ae47d9308eb0f65af Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:45 -0500
|
||||
Subject: [PATCH 03/12] nvmetcli: Improve IOError handling on restore
|
||||
|
||||
Not all IOErrors are caused by specifying a missing configuration
|
||||
file. When the file is present, dump the error exception text too,
|
||||
so the user has a better idea what is wrong.
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmetcli | 19 +++++++++++++++----
|
||||
1 file changed, 15 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/nvmetcli b/nvmetcli
|
||||
index 3d8c16e..a646232 100755
|
||||
--- a/nvmetcli
|
||||
+++ b/nvmetcli
|
||||
@@ -24,6 +24,7 @@ import os
|
||||
import sys
|
||||
import configshell_fb as configshell
|
||||
import nvmet as nvme
|
||||
+import errno
|
||||
from string import hexdigits
|
||||
import uuid
|
||||
|
||||
@@ -674,16 +675,26 @@ def save(to_file):
|
||||
|
||||
|
||||
def restore(from_file):
|
||||
+ errors = None
|
||||
+
|
||||
try:
|
||||
errors = nvme.Root().restore_from_file(from_file)
|
||||
- except IOError:
|
||||
- # Not an error if the restore file is not present
|
||||
- print("No saved config file at %s, ok, exiting" % from_file)
|
||||
- sys.exit(0)
|
||||
+ except IOError as e:
|
||||
+ if e.errno == errno.ENOENT:
|
||||
+ # Not an error if the restore file is not present
|
||||
+ print("No saved config file at %s, ok, exiting" % from_file)
|
||||
+ sys.exit(0)
|
||||
+ else:
|
||||
+ print("Error processing config file at %s, error %s, exiting" %
|
||||
+ (from_file, str(e)))
|
||||
+ sys.exit(1)
|
||||
|
||||
+ # These errors are non-fatal
|
||||
for error in errors:
|
||||
print(error)
|
||||
|
||||
+ sys.exit(0)
|
||||
+
|
||||
|
||||
def clear(unused):
|
||||
nvme.Root().clear_existing()
|
||||
--
|
||||
2.29.2
|
||||
|
29
0004-nvme.py-Explicit-close-is-redundant.patch
Normal file
29
0004-nvme.py-Explicit-close-is-redundant.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 226b73a4ae317c6aa3c7b00da2adbd1ec769ce34 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:46 -0500
|
||||
Subject: [PATCH 04/12] nvme.py: Explicit close is redundant
|
||||
|
||||
One of the benefits of using 'with' statement for open files is the
|
||||
close is going to be called regardless of what happens.
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/nvme.py | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/nvmet/nvme.py b/nvmet/nvme.py
|
||||
index fdec4ff..687a45a 100644
|
||||
--- a/nvmet/nvme.py
|
||||
+++ b/nvmet/nvme.py
|
||||
@@ -302,7 +302,6 @@ class Root(CFSNode):
|
||||
f.write("\n")
|
||||
f.flush()
|
||||
os.fsync(f.fileno())
|
||||
- f.close()
|
||||
|
||||
os.rename(savefile + ".temp", savefile)
|
||||
|
||||
--
|
||||
2.29.2
|
||||
|
40
0005-nvme.py-Sync-the-containing-directory.patch
Normal file
40
0005-nvme.py-Sync-the-containing-directory.patch
Normal file
@ -0,0 +1,40 @@
|
||||
From 12a8764c6113887c5691cab6a92bb1c13414395c Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:47 -0500
|
||||
Subject: [PATCH 05/12] nvme.py: Sync the containing directory
|
||||
|
||||
It's apparent that some thought went into making sure the config
|
||||
file makes it atomically to the fs. However, one thing is missing
|
||||
which is doing a fsync on the containing directory of the config file.
|
||||
|
||||
See: https://lwn.net/Articles/457667/
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/nvme.py | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/nvmet/nvme.py b/nvmet/nvme.py
|
||||
index 687a45a..04659de 100644
|
||||
--- a/nvmet/nvme.py
|
||||
+++ b/nvmet/nvme.py
|
||||
@@ -305,6 +305,15 @@ class Root(CFSNode):
|
||||
|
||||
os.rename(savefile + ".temp", savefile)
|
||||
|
||||
+ # Sync the containing directory too
|
||||
+ dir_fd = None
|
||||
+ try:
|
||||
+ dir_fd = os.open(savefile_dir, os.O_RDONLY)
|
||||
+ os.fsync(dir_fd)
|
||||
+ finally:
|
||||
+ if dir_fd:
|
||||
+ os.close(dir_fd)
|
||||
+
|
||||
def clear_existing(self):
|
||||
'''
|
||||
Remove entire current configuration.
|
||||
--
|
||||
2.29.2
|
||||
|
35
0006-nvme.py-Make-modprobe-work-for-kmod-lib-too.patch
Normal file
35
0006-nvme.py-Make-modprobe-work-for-kmod-lib-too.patch
Normal file
@ -0,0 +1,35 @@
|
||||
From 75c178f6c2943490ef2c13df5863d6ac308f6ef1 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:48 -0500
|
||||
Subject: [PATCH 06/12] nvme.py: Make modprobe work for kmod lib too
|
||||
|
||||
The python library 'kmod' is included with libkmod, lets try to use that
|
||||
if the user isn't utilizing kmodpy.
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/nvme.py | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/nvmet/nvme.py b/nvmet/nvme.py
|
||||
index 04659de..db8a03c 100644
|
||||
--- a/nvmet/nvme.py
|
||||
+++ b/nvmet/nvme.py
|
||||
@@ -253,7 +253,12 @@ class Root(CFSNode):
|
||||
except kmod.KmodError:
|
||||
pass
|
||||
except ImportError:
|
||||
- pass
|
||||
+ # Try the ctypes library included with the libkmod itself.
|
||||
+ try:
|
||||
+ import kmod
|
||||
+ kmod.Kmod().modprobe(modname)
|
||||
+ except Exception as e:
|
||||
+ pass
|
||||
|
||||
def _list_subsystems(self):
|
||||
self._check_self()
|
||||
--
|
||||
2.29.2
|
||||
|
48
0007-test_nvmet.py-test_invalid_input-fails-for-py3.patch
Normal file
48
0007-test_nvmet.py-test_invalid_input-fails-for-py3.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From 477a04b18e8754dc3f75110f0e7e6cdac70217aa Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:49 -0500
|
||||
Subject: [PATCH 07/12] test_nvmet.py: test_invalid_input fails for py3
|
||||
|
||||
When you run 'make test' using python 3 the unit test
|
||||
test_invalid_input fails with:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "/someuser/projects/nvmetcli/nvmet/test_nvmet.py", line 395, in
|
||||
test_invalid_input
|
||||
for i in range(l))
|
||||
File "/someuser/projects/nvmetcli/nvmet/test_nvmet.py", line 395, in
|
||||
<genexpr>
|
||||
for i in range(l))
|
||||
AttributeError: module 'string' has no attribute 'lowercase'
|
||||
|
||||
Python 3 does not have 'string.lowercase' ref.
|
||||
https://docs.python.org/3/library/string.html
|
||||
|
||||
Python 2 does ref.
|
||||
https://docs.python.org/2/library/string.html
|
||||
|
||||
Both have "string.ascii_lowercase" so lets leverage that to
|
||||
support both.
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/test_nvmet.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/nvmet/test_nvmet.py b/nvmet/test_nvmet.py
|
||||
index 5caa546..aae4a86 100644
|
||||
--- a/nvmet/test_nvmet.py
|
||||
+++ b/nvmet/test_nvmet.py
|
||||
@@ -391,7 +391,7 @@ class TestNvmet(unittest.TestCase):
|
||||
nqn='/', mode='create')
|
||||
|
||||
for l in [ 257, 512, 1024, 2048 ]:
|
||||
- toolong = ''.join(random.choice(string.lowercase)
|
||||
+ toolong = ''.join(random.choice(string.ascii_lowercase)
|
||||
for i in range(l))
|
||||
self.assertRaises(nvme.CFSError, nvme.Subsystem,
|
||||
nqn=toolong, mode='create')
|
||||
--
|
||||
2.29.2
|
||||
|
50
0008-nvmetcli-Report-save-name-correctly.patch
Normal file
50
0008-nvmetcli-Report-save-name-correctly.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From fd09200bba73011b4b7086c96e394ce875fdd38f Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 26 Mar 2020 13:07:50 -0500
|
||||
Subject: [PATCH 08/12] nvmetcli: Report save name correctly
|
||||
|
||||
When a user simply does 'nvmetcli restore' without
|
||||
specifying a file name the default is used. However, if the
|
||||
restore fails you end up with the error message:
|
||||
|
||||
Error processing config file at None, error [Errno 1] Operation not
|
||||
permitted: '/sys/kernel/config/nvmet/ports/0/ana_groups/1', exiting
|
||||
|
||||
Correct file name if None in error path.
|
||||
|
||||
Error processing config file at /etc/nvmet/config.json, error \
|
||||
[Errno 1] Operation not permitted: \
|
||||
'/sys/kernel/config/nvmet/ports/1/ana_groups/1', exiting
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/__init__.py | 3 ++-
|
||||
nvmetcli | 3 +++
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/nvmet/__init__.py b/nvmet/__init__.py
|
||||
index ca05de4..cf172bd 100644
|
||||
--- a/nvmet/__init__.py
|
||||
+++ b/nvmet/__init__.py
|
||||
@@ -1 +1,2 @@
|
||||
-from .nvme import Root, Subsystem, Namespace, Port, Host, Referral, ANAGroup
|
||||
+from .nvme import Root, Subsystem, Namespace, Port, Host, Referral, ANAGroup,\
|
||||
+ DEFAULT_SAVE_FILE
|
||||
diff --git a/nvmetcli b/nvmetcli
|
||||
index a646232..8ee8590 100755
|
||||
--- a/nvmetcli
|
||||
+++ b/nvmetcli
|
||||
@@ -680,6 +680,9 @@ def restore(from_file):
|
||||
try:
|
||||
errors = nvme.Root().restore_from_file(from_file)
|
||||
except IOError as e:
|
||||
+ if not from_file:
|
||||
+ from_file = nvme.DEFAULT_SAVE_FILE
|
||||
+
|
||||
if e.errno == errno.ENOENT:
|
||||
# Not an error if the restore file is not present
|
||||
print("No saved config file at %s, ok, exiting" % from_file)
|
||||
--
|
||||
2.29.2
|
||||
|
146
0009-nvmetcli-Allow-different-devices-for-make-test.patch
Normal file
146
0009-nvmetcli-Allow-different-devices-for-make-test.patch
Normal file
@ -0,0 +1,146 @@
|
||||
From 35e92a1bfedf28868112165892b3eb2cd7f750ce Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Thu, 2 Apr 2020 10:54:43 -0500
|
||||
Subject: [PATCH 09/12] nvmetcli: Allow different devices for make test
|
||||
|
||||
The test_nvmet.py by default uses /dev/ram0 and /dev/ram1 for 2 of the
|
||||
unit tests. Add env. variable to allow user to specify different devices
|
||||
or files. Additionally, skip these unit tests that require devices/files
|
||||
if they are not present. Update README too.
|
||||
|
||||
$ sudo make test
|
||||
......s...s.
|
||||
----------------------------------------------------------------------
|
||||
Ran 12 tests in 0.043s
|
||||
|
||||
OK (skipped=2)
|
||||
Name Stmts Miss Cover
|
||||
-----------------------------------------
|
||||
nvmet/__init__.py 1 0 100%
|
||||
nvmet/nvme.py 517 237 54%
|
||||
nvmet/test_nvmet.py 276 63 77%
|
||||
-----------------------------------------
|
||||
TOTAL 794 300 62%
|
||||
|
||||
$ sudo NVMET_TEST_DEVICES="/dev/sdc,/dev/sdd" make test
|
||||
............
|
||||
----------------------------------------------------------------------
|
||||
Ran 12 tests in 0.124s
|
||||
|
||||
OK
|
||||
Name Stmts Miss Cover
|
||||
-----------------------------------------
|
||||
nvmet/__init__.py 1 0 100%
|
||||
nvmet/nvme.py 517 100 81%
|
||||
nvmet/test_nvmet.py 276 4 99%
|
||||
-----------------------------------------
|
||||
TOTAL 794 104 87%
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
README | 5 ++++-
|
||||
nvmet/test_nvmet.py | 26 ++++++++++++++++++++++----
|
||||
2 files changed, 26 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/README b/README
|
||||
index 5a4ecd1..44f1c33 100644
|
||||
--- a/README
|
||||
+++ b/README
|
||||
@@ -47,7 +47,10 @@ Testing
|
||||
-------
|
||||
nvmetcli comes with a testsuite that tests itself and the kernel configfs
|
||||
interface for the NVMe target. To run it make sure you have nose2 and
|
||||
-the coverage plugin for it installed and simple run 'make test'.
|
||||
+the coverage plugin for it installed and simple run 'make test'. To run all
|
||||
+the tests you also need some test block devices or files. Default is to
|
||||
+use /dev/ram0 and /dev/ram1. You can override default with environmental
|
||||
+variable eg. NVMET_TEST_DEVICES="/dev/sdk,/dev/sdj" make test .
|
||||
|
||||
Development
|
||||
-----------------
|
||||
diff --git a/nvmet/test_nvmet.py b/nvmet/test_nvmet.py
|
||||
index aae4a86..f8ec232 100644
|
||||
--- a/nvmet/test_nvmet.py
|
||||
+++ b/nvmet/test_nvmet.py
|
||||
@@ -1,9 +1,22 @@
|
||||
|
||||
+import os
|
||||
import random
|
||||
+import stat
|
||||
import string
|
||||
import unittest
|
||||
import nvmet.nvme as nvme
|
||||
|
||||
+# Default test devices are ram disks, but allow user to specify different
|
||||
+# block devices or files.
|
||||
+NVMET_TEST_DEVICES = os.getenv("NVMET_TEST_DEVICES",
|
||||
+ "/dev/ram0,/dev/ram1").split(',')
|
||||
+
|
||||
+
|
||||
+def test_devices_present():
|
||||
+ return len([x for x in NVMET_TEST_DEVICES
|
||||
+ if os.path.exists(x) and
|
||||
+ (stat.S_ISBLK(os.stat(x).st_mode) or os.path.isfile(x))]) >= 2
|
||||
+
|
||||
|
||||
class TestNvmet(unittest.TestCase):
|
||||
def test_subsystem(self):
|
||||
@@ -101,6 +114,8 @@ class TestNvmet(unittest.TestCase):
|
||||
n.delete()
|
||||
self.assertEqual(len(list(s.namespaces)), 0)
|
||||
|
||||
+ @unittest.skipUnless(test_devices_present(),
|
||||
+ "Devices %s not available or suitable" % ','.join(NVMET_TEST_DEVICES))
|
||||
def test_namespace_attrs(self):
|
||||
root = nvme.Root()
|
||||
root.clear_existing()
|
||||
@@ -116,7 +131,7 @@ class TestNvmet(unittest.TestCase):
|
||||
self.assertRaises(nvme.CFSError, n.set_enable, 1)
|
||||
|
||||
# now set a path and enable
|
||||
- n.set_attr('device', 'path', '/dev/ram0')
|
||||
+ n.set_attr('device', 'path', NVMET_TEST_DEVICES[0])
|
||||
n.set_enable(1)
|
||||
self.assertTrue(n.get_enable())
|
||||
|
||||
@@ -125,7 +140,7 @@ class TestNvmet(unittest.TestCase):
|
||||
|
||||
# test that we can't write to attrs while enabled
|
||||
self.assertRaises(nvme.CFSError, n.set_attr, 'device', 'path',
|
||||
- '/dev/ram1')
|
||||
+ NVMET_TEST_DEVICES[1])
|
||||
self.assertRaises(nvme.CFSError, n.set_attr, 'device', 'nguid',
|
||||
'15f7767b-50e7-4441-949c-75b99153dea7')
|
||||
|
||||
@@ -403,6 +418,9 @@ class TestNvmet(unittest.TestCase):
|
||||
self.assertRaises(nvme.CFSError, nvme.Port,
|
||||
portid=1 << 17, mode='create')
|
||||
|
||||
+ @unittest.skipUnless(test_devices_present(),
|
||||
+ "Devices %s not available or suitable" % ','.join(
|
||||
+ NVMET_TEST_DEVICES))
|
||||
def test_save_restore(self):
|
||||
root = nvme.Root()
|
||||
root.clear_existing()
|
||||
@@ -416,7 +434,7 @@ class TestNvmet(unittest.TestCase):
|
||||
s2.set_attr('attr', 'allow_any_host', 1)
|
||||
|
||||
n = nvme.Namespace(s, nsid=42, mode='create')
|
||||
- n.set_attr('device', 'path', '/dev/ram0')
|
||||
+ n.set_attr('device', 'path', NVMET_TEST_DEVICES[0])
|
||||
n.set_enable(1)
|
||||
|
||||
nguid = n.get_attr('device', 'nguid')
|
||||
@@ -454,7 +472,7 @@ class TestNvmet(unittest.TestCase):
|
||||
|
||||
# and check everything is still the same
|
||||
self.assertTrue(n.get_enable())
|
||||
- self.assertEqual(n.get_attr('device', 'path'), '/dev/ram0')
|
||||
+ self.assertEqual(n.get_attr('device', 'path'), NVMET_TEST_DEVICES[0])
|
||||
self.assertEqual(n.get_attr('device', 'nguid'), nguid)
|
||||
|
||||
self.assertEqual(p.get_attr('addr', 'trtype'), 'loop')
|
||||
--
|
||||
2.29.2
|
||||
|
57
0010-nvmetcli-Correct-xrange-usage-for-py3.patch
Normal file
57
0010-nvmetcli-Correct-xrange-usage-for-py3.patch
Normal file
@ -0,0 +1,57 @@
|
||||
From 9da40b0433b8338f82c2c910b1057e1e1061b9a0 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Asleson <tasleson@redhat.com>
|
||||
Date: Wed, 1 Apr 2020 14:13:16 -0500
|
||||
Subject: [PATCH 10/12] nvmetcli: Correct xrange usage for py3
|
||||
|
||||
If you are in a namespace and simply do a 'create' without specifying
|
||||
a value you will get:
|
||||
|
||||
/subsystems/n...f8/namespaces> create
|
||||
name 'xrange' is not defined
|
||||
subsystems/n...f8/namespaces>
|
||||
|
||||
This is because xrange is not defined in python3 as python3 changed
|
||||
it to range. As the code is already using six use six.move.xrange
|
||||
which works for both python2 & python3.
|
||||
|
||||
Signed-off-by: Tony Asleson <tasleson@redhat.com>
|
||||
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
nvmet/nvme.py | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/nvmet/nvme.py b/nvmet/nvme.py
|
||||
index db8a03c..83fd75b 100644
|
||||
--- a/nvmet/nvme.py
|
||||
+++ b/nvmet/nvme.py
|
||||
@@ -23,7 +23,7 @@ import stat
|
||||
import uuid
|
||||
import json
|
||||
from glob import iglob as glob
|
||||
-from six import iteritems
|
||||
+from six import iteritems, moves
|
||||
|
||||
DEFAULT_SAVE_FILE = '/etc/nvmet/config.json'
|
||||
|
||||
@@ -556,7 +556,7 @@ class Namespace(CFSNode):
|
||||
raise CFSError("Need NSID for lookup")
|
||||
|
||||
nsids = [n.nsid for n in subsystem.namespaces]
|
||||
- for index in xrange(1, self.MAX_NSID + 1):
|
||||
+ for index in moves.xrange(1, self.MAX_NSID + 1):
|
||||
if index not in nsids:
|
||||
nsid = index
|
||||
break
|
||||
@@ -816,7 +816,7 @@ class ANAGroup(CFSNode):
|
||||
raise CFSError("Need grpid for lookup")
|
||||
|
||||
grpids = [n.grpid for n in port.ana_groups]
|
||||
- for index in xrange(2, self.MAX_GRPID + 1):
|
||||
+ for index in moves.xrange(2, self.MAX_GRPID + 1):
|
||||
if index not in grpids:
|
||||
grpid = index
|
||||
break
|
||||
--
|
||||
2.29.2
|
||||
|
99
0011-nvmetcli-add-a-tcp-example-json.patch
Normal file
99
0011-nvmetcli-add-a-tcp-example-json.patch
Normal file
@ -0,0 +1,99 @@
|
||||
From 73dcf7ef6b6aa80c87c61f08583cba97ad1c626a Mon Sep 17 00:00:00 2001
|
||||
From: zhenwei pi <pizhenwei@bytedance.com>
|
||||
Date: Thu, 10 Dec 2020 17:06:56 +0800
|
||||
Subject: [PATCH 11/12] nvmetcli: add a tcp example json
|
||||
|
||||
Run a tcp nvme target on linux-5.10-rc version, and save the config
|
||||
as an example.
|
||||
|
||||
Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
README | 5 +++++
|
||||
tcp.json | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 63 insertions(+)
|
||||
create mode 100644 tcp.json
|
||||
|
||||
diff --git a/README b/README
|
||||
index 44f1c33..6ebe666 100644
|
||||
--- a/README
|
||||
+++ b/README
|
||||
@@ -41,6 +41,11 @@ fc.json fits your setup:
|
||||
|
||||
./nvmetcli restore fc.json
|
||||
|
||||
+Or to load the tcp + no host authentication version do the following
|
||||
+after you've ensured that the IP address in tcp.json fits your setup:
|
||||
+
|
||||
+ ./nvmetcli restore tcp.json
|
||||
+
|
||||
These files can also be edited directly using your favorite editor.
|
||||
|
||||
Testing
|
||||
diff --git a/tcp.json b/tcp.json
|
||||
new file mode 100644
|
||||
index 0000000..e6ff029
|
||||
--- /dev/null
|
||||
+++ b/tcp.json
|
||||
@@ -0,0 +1,58 @@
|
||||
+{
|
||||
+ "hosts": [],
|
||||
+ "ports": [
|
||||
+ {
|
||||
+ "addr": {
|
||||
+ "adrfam": "ipv4",
|
||||
+ "traddr": "192.168.122.33",
|
||||
+ "treq": "not specified",
|
||||
+ "trsvcid": "4420",
|
||||
+ "trtype": "tcp"
|
||||
+ },
|
||||
+ "ana_groups": [
|
||||
+ {
|
||||
+ "ana": {
|
||||
+ "state": "optimized"
|
||||
+ },
|
||||
+ "grpid": 1
|
||||
+ }
|
||||
+ ],
|
||||
+ "param": {
|
||||
+ "inline_data_size": "16384",
|
||||
+ "pi_enable": "0"
|
||||
+ },
|
||||
+ "portid": 1,
|
||||
+ "referrals": [],
|
||||
+ "subsystems": [
|
||||
+ "nvmet-always"
|
||||
+ ]
|
||||
+ }
|
||||
+ ],
|
||||
+ "subsystems": [
|
||||
+ {
|
||||
+ "allowed_hosts": [],
|
||||
+ "attr": {
|
||||
+ "allow_any_host": "1",
|
||||
+ "cntlid_max": "65519",
|
||||
+ "cntlid_min": "1",
|
||||
+ "model": "Linux",
|
||||
+ "pi_enable": "0",
|
||||
+ "serial": "123456789abcdef",
|
||||
+ "version": "1.3"
|
||||
+ },
|
||||
+ "namespaces": [
|
||||
+ {
|
||||
+ "ana_grpid": 1,
|
||||
+ "device": {
|
||||
+ "nguid": "00000000-0000-0000-0000-000000000000",
|
||||
+ "path": "/dev/nvme0n1",
|
||||
+ "uuid": "d592cdf3-5d1c-44e0-8412-3fcf7d99df27"
|
||||
+ },
|
||||
+ "enable": 1,
|
||||
+ "nsid": 1
|
||||
+ }
|
||||
+ ],
|
||||
+ "nqn": "nvmet-always"
|
||||
+ }
|
||||
+ ]
|
||||
+}
|
||||
--
|
||||
2.29.2
|
||||
|
28
0012-Documentation-fix-typo.patch
Normal file
28
0012-Documentation-fix-typo.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 297f40aef117875d98303b0535fb076626b91a19 Mon Sep 17 00:00:00 2001
|
||||
From: Maurizio Lombardi <mlombard@redhat.com>
|
||||
Date: Mon, 1 Feb 2021 15:47:56 +0100
|
||||
Subject: [PATCH 12/12] Documentation: fix typo
|
||||
|
||||
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
|
||||
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
Documentation/nvmetcli.txt | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/nvmetcli.txt b/Documentation/nvmetcli.txt
|
||||
index 05a0344..7d6ffda 100644
|
||||
--- a/Documentation/nvmetcli.txt
|
||||
+++ b/Documentation/nvmetcli.txt
|
||||
@@ -116,7 +116,7 @@ your devices and all dependent modules are loaded,
|
||||
and configfs is mounted on /sys/kernel/config
|
||||
using:
|
||||
|
||||
- mount -t configs none /sys/kernel/config
|
||||
+ mount -t configfs none /sys/kernel/config
|
||||
|
||||
The following section walks through a configuration example.
|
||||
|
||||
--
|
||||
2.29.2
|
||||
|
@ -1,10 +1,22 @@
|
||||
Name: nvmetcli
|
||||
License: ASL 2.0
|
||||
Summary: An adminstration shell for NVMe storage targets
|
||||
Version: 0.4
|
||||
Release: 13%{?dist}
|
||||
Version: 0.7
|
||||
Release: 2%{?dist}
|
||||
URL: ftp://ftp.infradead.org/pub/nvmetcli/
|
||||
Source: ftp://ftp.infradead.org/pub/nvmetcli/%{name}-%{version}.tar.gz
|
||||
Patch00: 0001-nvmetcli-don-t-remove-ANA-Group-1-on-clear.patch
|
||||
Patch01: 0002-README-Update-URL-for-configshell-fb.patch
|
||||
Patch02: 0003-nvmetcli-Improve-IOError-handling-on-restore.patch
|
||||
Patch03: 0004-nvme.py-Explicit-close-is-redundant.patch
|
||||
Patch04: 0005-nvme.py-Sync-the-containing-directory.patch
|
||||
Patch05: 0006-nvme.py-Make-modprobe-work-for-kmod-lib-too.patch
|
||||
Patch06: 0007-test_nvmet.py-test_invalid_input-fails-for-py3.patch
|
||||
Patch07: 0008-nvmetcli-Report-save-name-correctly.patch
|
||||
Patch08: 0009-nvmetcli-Allow-different-devices-for-make-test.patch
|
||||
Patch09: 0010-nvmetcli-Correct-xrange-usage-for-py3.patch
|
||||
Patch10: 0011-nvmetcli-add-a-tcp-example-json.patch
|
||||
Patch11: 0012-Documentation-fix-typo.patch
|
||||
BuildArch: noarch
|
||||
BuildRequires: make
|
||||
BuildRequires: python3-devel python3-setuptools systemd-units asciidoc xmlto
|
||||
@ -20,6 +32,18 @@ as well as saving / restoring the configuration to / from a json file.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch9 -p1
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
|
||||
%build
|
||||
%{__python3} setup.py build
|
||||
@ -54,6 +78,9 @@ install -m 644 Documentation/nvmetcli.8.gz %{buildroot}%{_mandir}/man8/
|
||||
%{_mandir}/man8/nvmetcli.8.gz
|
||||
|
||||
%changelog
|
||||
* Thu Feb 11 2021 Maurizio Lombardi <mlombard@redhat.com> - 0.7-2
|
||||
- Rebase to the latest version (git commit id 297f40aef117875d98303b0535fb076626b91a19)
|
||||
|
||||
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-13
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (nvmetcli-0.4.tar.gz) = a6619052295200b3d8fb4b075426f1bdffc809cb11a38fe0e3d70c7f01d3dbdc0be4c7fd7c507d279584024647b2cea3ea4f67e41379804deb45f55009796f06
|
||||
SHA512 (nvmetcli-0.7.tar.gz) = 03781aba13b71d91777bf246550206a7d868ac3efc117a21d57b4d011e6e6fc7647c114875b851c7de41f2513889fa1cfdf02d95e71adefe98797ce1a64b6241
|
||||
|
Loading…
Reference in New Issue
Block a user