From 0de3ab60e293d8de90942ec71884f61b82da0539b3acf36fa464bd2e31e4d2cc Mon Sep 17 00:00:00 2001 From: Lee Duncan Date: Mon, 19 Aug 2019 15:35:35 +0000 Subject: [PATCH] Update to close to the latest upstream. OBS-URL: https://build.opensuse.org/package/show/Base:System/targetcli-fb?expand=0&rev=30 --- add-emulate_pr-backstore-attribute | 28 +++++ ...rst-digit-when-auto-completing-the-tpg-tag | 31 +++++ ...overy_auth-enable-is-a-number-not-a-string | 78 ++++++++++++ saveconfig-compress-the-backup-config-files | 116 ++++++++++++++++++ ...-fix-raise-exception-error-in-save_backups | 25 ++++ targetcli-fb.changes | 10 ++ targetcli-fb.spec | 10 +- 7 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 add-emulate_pr-backstore-attribute create mode 100644 do-not-remove-the-first-digit-when-auto-completing-the-tpg-tag create mode 100644 iscsi-discovery_auth-enable-is-a-number-not-a-string create mode 100644 saveconfig-compress-the-backup-config-files create mode 100644 targetcli-fb-fix-raise-exception-error-in-save_backups diff --git a/add-emulate_pr-backstore-attribute b/add-emulate_pr-backstore-attribute new file mode 100644 index 0000000..56d139f --- /dev/null +++ b/add-emulate_pr-backstore-attribute @@ -0,0 +1,28 @@ +From: David Disseldorp +Date: Tue, 15 Jan 2019 12:04:49 +0100 +Subject: Add emulate_pr backstore attribute +Git-commit: fa71860b0d819a691683c1fdcb70c255653b5851 + +Added to the kernel via b49d6f7885306ee636d5c1af52170f3069ccf5f7, the +emulate_pr attribute can be used to disable support for SCSI-2 +(RESERVE/RELEASE) and Persistent Reservations. + +Signed-off-by: David Disseldorp +Acked-by: Lee Duncan +--- + targetcli/ui_backstore.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/targetcli/ui_backstore.py b/targetcli/ui_backstore.py +index efa532f17034..cc2cf2bb220b 100644 +--- a/targetcli/ui_backstore.py ++++ b/targetcli/ui_backstore.py +@@ -670,6 +670,7 @@ class UIStorageObject(UIRTSLibNode): + 'emulate_tpws': ('number', 'If set to 1, enable Thin Provisioning Write Same.'), + 'emulate_ua_intlck_ctrl': ('number', 'If set to 1, enable Unit Attention Interlock.'), + 'emulate_write_cache': ('number', 'If set to 1, turn on Write Cache Enable.'), ++ 'emulate_pr': ('number', 'If set to 1, enable SCSI Reservations.'), + 'enforce_pr_isids': ('number', 'If set to 1, enforce persistent reservation ISIDs.'), + 'force_pr_aptpl': ('number', 'If set to 1, force SPC-3 PR Activate Persistence across Target Power Loss operation.'), + 'fabric_max_sectors': ('number', 'Maximum number of sectors the fabric can transfer at once.'), + diff --git a/do-not-remove-the-first-digit-when-auto-completing-the-tpg-tag b/do-not-remove-the-first-digit-when-auto-completing-the-tpg-tag new file mode 100644 index 0000000..26f1ae4 --- /dev/null +++ b/do-not-remove-the-first-digit-when-auto-completing-the-tpg-tag @@ -0,0 +1,31 @@ +From: Christophe Vu-Brugier +Date: Sat, 11 May 2019 15:15:16 +0200 +Subject: Do not remove the first digit when auto-completing the TPG tag +Git-commit: 311ae0fc49174316c991dd3800c12549632e2c64 + +Instead of removing the first three characters of the "tpg" prefix to +get matches for the TPG tag number, the code removes four characters, +thus erasing the first digit of the TPG tag number. + +This patches fixes issue #134. + +Signed-off-by: Christophe Vu-Brugier +Acked-by: Lee Duncan +--- + targetcli/ui_target.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/targetcli/ui_target.py b/targetcli/ui_target.py +index 6895b38e62b8..0c3fe1b708db 100644 +--- a/targetcli/ui_target.py ++++ b/targetcli/ui_target.py +@@ -384,7 +384,7 @@ class UIMultiTPGTarget(UIRTSLibNode): + @rtype: list of str + ''' + if current_param == 'tag': +- tags = [child.name[4:] for child in self.children] ++ tags = [child.name[3:] for child in self.children] + completions = [tag for tag in tags if tag.startswith(text)] + else: + completions = [] + diff --git a/iscsi-discovery_auth-enable-is-a-number-not-a-string b/iscsi-discovery_auth-enable-is-a-number-not-a-string new file mode 100644 index 0000000..3b5386d --- /dev/null +++ b/iscsi-discovery_auth-enable-is-a-number-not-a-string @@ -0,0 +1,78 @@ +From: Lee Duncan +Date: Thu, 15 Aug 2019 08:38:35 -0700 +Subject: iscsi discovery_auth enable is a number not a string +Git-commit: dc8d9d83cef8489f3b6aec1609299cdba70eda34 + +The discovery_auth attribute group in the /iscsi node +has several attributes, and all area treated like strings, +even though "enable" is a number in sysfs, accepting either +zero or one. It would break backwards compatability to +convert this attribute to be a boolean, so at least +treat it like a proper number instead of a string. + +This avoids stack dumps like the following when trying +to set this attribute to 'true' or 'false': + +> /iscsi> set discovery_auth enable=false +> Traceback (most recent call last): +> File "/usr/bin/targetcli", line 122, in +> main() +> File "/usr/bin/targetcli", line 112, in main +> shell.run_interactive() +> File "/usr/lib/python3.6/site-packages/configshell_fb/shell.py", line 905, in run_interactive +> self._cli_loop() +> File "/usr/lib/python3.6/site-packages/configshell_fb/shell.py", line 734, in _cli_loop +> self.run_cmdline(cmdline) +> File "/usr/lib/python3.6/site-packages/configshell_fb/shell.py", line 848, in run_cmdline +> self._execute_command(path, command, pparams, kparams) +> File "/usr/lib/python3.6/site-packages/configshell_fb/shell.py", line 823, in _execute_command +> result = target.execute_command(command, pparams, kparams) +> File "/usr/lib/python3.6/site-packages/configshell_fb/node.py", line 1406, in execute_command +> return method(*pparams, **kparams) +> File "/usr/lib/python3.6/site-packages/configshell_fb/node.py", line 522, in ui_command_set +> group_setter(param, value) +> File "/usr/lib/python3.6/site-packages/targetcli/ui_target.py", line 134, in ui_setgroup_discovery_auth +> self.rtsnode.discovery_enable_auth = value +> File "/usr/lib/python3.6/site-packages/rtslib_fb/fabric.py", line 243, in _set_discovery_enable_auth +> if int(enable): +> ValueError: invalid literal for int() with base 10: 'false' + +Now the output will be: + +> Not setting enable! Syntax error, 'false' is not a NUMBER. + +Acked-by: Lee Duncan +--- + targetcli/ui_target.py | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/targetcli/ui_target.py b/targetcli/ui_target.py +index 0c3fe1b708db..16ccae715688 100644 +--- a/targetcli/ui_target.py ++++ b/targetcli/ui_target.py +@@ -34,7 +34,8 @@ from .ui_backstore import complete_path + from .ui_node import UINode, UIRTSLibNode + + auth_params = ('userid', 'password', 'mutual_userid', 'mutual_password') +-discovery_params = auth_params + ("enable",) ++int_params = ('enable',) ++discovery_params = auth_params + int_params + + class UIFabricModule(UIRTSLibNode): + ''' +@@ -47,8 +48,12 @@ class UIFabricModule(UIRTSLibNode): + self.refresh() + if self.rtsnode.has_feature('discovery_auth'): + for param in discovery_params: +- self.define_config_group_param('discovery_auth', +- param, 'string') ++ if param in int_params: ++ self.define_config_group_param('discovery_auth', ++ param, 'number') ++ else: ++ self.define_config_group_param('discovery_auth', ++ param, 'string') + self.refresh() + + # Support late params + diff --git a/saveconfig-compress-the-backup-config-files b/saveconfig-compress-the-backup-config-files new file mode 100644 index 0000000..718109a --- /dev/null +++ b/saveconfig-compress-the-backup-config-files @@ -0,0 +1,116 @@ +From: Prasanna Kumar Kalever +Date: Wed, 28 Nov 2018 16:55:38 +0530 +Subject: saveconfig: compress the backup config files +Git-commit: 3d9e6c616ca7789d281843caf2d3dfb99dbf78a0 + +We have noticed saveconfig.json with 100 storage objects and 100 targets +(each holding a single tpg and a portal) consumes disk space around ~500K. + +Which is very expensive, and backing-up such 100 saveconfig.json files will +take ~50M of disk space under /etc/target/backup/ + +And at scale like 1000 storage objects and targets, this will become worst. + +Hence this patch attempts to compress(gzip) and store saveconfig.json while +backing-up. + +Saved space example: + +[root@localhost ~]# targetcli ls | grep -e "user:glfs" -e "iscsi" + | o- user:glfs ......................... [Storage Objects: 100] + o- iscsi ............................... [Targets: 100] + +[root@localhost ~]# du -sh /etc/target/saveconfig.json +448K /etc/target/saveconfig.json + +[root@localhost ~]# du -sh /etc/target/backup/saveconfig-20181128-18\:20\:43-json.gz +12K /etc/target/backup/saveconfig-20181128-18:20:43-json.gz + +Reducing disk usage per backup file from 448K to 12K is very efficient right. + +Signed-off-by: Prasanna Kumar Kalever +Acked-by: Lee Duncan +--- + targetcli/ui_root.py | 44 +++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 39 insertions(+), 5 deletions(-) + +diff --git a/targetcli/ui_root.py b/targetcli/ui_root.py +index 38118bd582f6..6f3a79bf4f66 100644 +--- a/targetcli/ui_root.py ++++ b/targetcli/ui_root.py +@@ -24,6 +24,7 @@ import re + import shutil + import stat + import filecmp ++import gzip + + from configshell_fb import ExecutionError + from rtslib_fb import RTSRoot +@@ -62,6 +63,38 @@ class UIRoot(UINode): + if fm.wwns == None or any(fm.wwns): + UIFabricModule(fm, self) + ++ def _compare_files(self, backupfile, savefile): ++ ''' ++ Compare backfile and saveconfig file ++ ''' ++ if (os.path.splitext(backupfile)[1] == '.gz'): ++ try: ++ with gzip.open(backupfile, 'rb') as fbkp: ++ fdata_bkp = fbkp.read() ++ except IOError as e: ++ self.shell.log.warning("Could not gzip open backupfile %s: %s" ++ % (backupfile, e.strerror)) ++ ++ else: ++ try: ++ with open(backupfile, 'rb') as fbkp: ++ fdata_bkp = fbkp.read() ++ except IOError as e: ++ self.shell.log.warning("Could not open backupfile %s: %s" ++ % (backupfile, e.strerror)) ++ ++ try: ++ with open(savefile, 'rb') as f: ++ fdata = f.read() ++ except IOError as e: ++ self.shell.log.warning("Could not open saveconfig file %s: %s" ++ % (savefile, e.strerror)) ++ ++ if fdata_bkp == fdata: ++ return True ++ else: ++ return False ++ + def _save_backups(self, savefile): + ''' + Take backup of config-file if needed. +@@ -72,7 +105,7 @@ class UIRoot(UINode): + + backup_dir = os.path.dirname(savefile) + "/backup/" + backup_name = "saveconfig-" + \ +- datetime.now().strftime("%Y%m%d-%H:%M:%S") + ".json" ++ datetime.now().strftime("%Y%m%d-%H:%M:%S") + "-json.gz" + backupfile = backup_dir + backup_name + backup_error = None + +@@ -88,13 +121,14 @@ class UIRoot(UINode): + return + + backed_files_list = sorted(glob(os.path.dirname(savefile) + \ +- "/backup/*.json")) ++ "/backup/saveconfig-*json*")) + + # Save backup if backup dir is empty, or savefile is differnt from recent backup copy +- if not backed_files_list or not filecmp.cmp(backed_files_list[-1], savefile): ++ if not backed_files_list or not self._compare_files(backed_files_list[-1], savefile): + try: +- shutil.copy(savefile, backupfile) +- ++ with open(savefile, 'rb') as f_in, gzip.open(backupfile, 'wb') as f_out: ++ shutil.copyfileobj(f_in, f_out) ++ f_out.flush() + except IOError as ioe: + backup_error = ioe.strerror or "Unknown error" + + diff --git a/targetcli-fb-fix-raise-exception-error-in-save_backups b/targetcli-fb-fix-raise-exception-error-in-save_backups new file mode 100644 index 0000000..70623c0 --- /dev/null +++ b/targetcli-fb-fix-raise-exception-error-in-save_backups @@ -0,0 +1,25 @@ +From: Leo Zhang +Date: Wed, 9 Jan 2019 14:20:28 +0800 +Subject: targetcli-fb: Fix raise exception error in _save_backups +Git-commit: f6e813454c18e02222473713f53db5be99b84142 + +Signed-off-by: Leo Zhang +Acked-by: Lee Duncan +--- + targetcli/ui_root.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/targetcli/ui_root.py b/targetcli/ui_root.py +index 6f3a79bf4f66..af5554f2dd76 100644 +--- a/targetcli/ui_root.py ++++ b/targetcli/ui_root.py +@@ -114,7 +114,7 @@ class UIRoot(UINode): + os.makedirs(backup_dir); + except OSError as exe: + raise ExecutionError("Cannot create backup directory [%s] %s." +- % (backup_dir, exc.strerror)) ++ % (backup_dir, exe.strerror)) + + # Only save backups if savefile exits + if not os.path.exists(savefile): + diff --git a/targetcli-fb.changes b/targetcli-fb.changes index 719f644..5f11588 100644 --- a/targetcli-fb.changes +++ b/targetcli-fb.changes @@ -1,3 +1,13 @@ +------------------------------------------------------------------- +Mon Aug 19 15:32:55 UTC 2019 - Lee Duncan + +- Added the following upstream patches: + * targetcli-fb-fix-raise-exception-error-in-save_backups + * iscsi-discovery_auth-enable-is-a-number-not-a-string (bsc#1145685) + * saveconfig-compress-the-backup-config-files + * do-not-remove-the-first-digit-when-auto-completing-the-tpg-tag + * add-emulate_pr-backstore-attribute + ------------------------------------------------------------------- Wed Apr 3 03:14:10 UTC 2019 - ddiss@suse.com diff --git a/targetcli-fb.spec b/targetcli-fb.spec index c5b6fb4..4307c58 100644 --- a/targetcli-fb.spec +++ b/targetcli-fb.spec @@ -56,7 +56,11 @@ Obsoletes: targetcli-rbd < %{version} %{?systemd_requires} Patch1: Split-out-blockdev-readonly-state-detection-helper.patch Patch2: rbd-support.patch -Patch3: Add-emulate_pr-backstore-attribute.patch +Patch3: saveconfig-compress-the-backup-config-files +Patch4: targetcli-fb-fix-raise-exception-error-in-save_backups +Patch5: Add-emulate_pr-backstore-attribute.patch +Patch6: do-not-remove-the-first-digit-when-auto-completing-the-tpg-tag +Patch7: iscsi-discovery_auth-enable-is-a-number-not-a-string %python_subpackages @@ -87,6 +91,10 @@ python2-targetcli-fb and python3-targetcli-fb. %patch2 -p1 %endif %patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 %build %python_build