From 0b876b294c29b0a5b260796b560838b22beb4cdca9cfd536b578f0283c228aa6 Mon Sep 17 00:00:00 2001 From: Matej Cepl Date: Mon, 10 Jun 2024 21:15:13 +0000 Subject: [PATCH] Accepting request 1179237 from home:mcalabkova:branches:devel:languages:python - Add rtslib-refactor-to-python3.patch to get rid of six OBS-URL: https://build.opensuse.org/request/show/1179237 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-rtslib-fb?expand=0&rev=77 --- python-rtslib-fb.changes | 5 + python-rtslib-fb.spec | 4 +- rtslib-refactor-to-python3.patch | 1156 ++++++++++++++++++++++++++++++ 3 files changed, 1163 insertions(+), 2 deletions(-) create mode 100644 rtslib-refactor-to-python3.patch diff --git a/python-rtslib-fb.changes b/python-rtslib-fb.changes index 777dbe1..51c61b3 100644 --- a/python-rtslib-fb.changes +++ b/python-rtslib-fb.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Fri Jun 7 13:12:41 UTC 2024 - Markéta Machová + +- Add rtslib-refactor-to-python3.patch to get rid of six + ------------------------------------------------------------------- Thu May 16 15:10:26 UTC 2024 - Dominique Leuenberger diff --git a/python-rtslib-fb.spec b/python-rtslib-fb.spec index ef5eb51..bf40926 100644 --- a/python-rtslib-fb.spec +++ b/python-rtslib-fb.spec @@ -35,16 +35,16 @@ URL: https://github.com/open-iscsi/rtslib-fb.git Source: python-rtslib-fb-v%{version}.tar.xz Patch2: rtslib-Fix-handling-of-sysfs-RW-attrs-that-are-actually-RO.patch Patch3: rtslib-target-service-for-suse.patch +# PATCH-FIX-UPSTREAM picked from https://github.com/open-iscsi/rtslib-fb/pull/197 Refactoring to Python>=3.9 +Patch4: rtslib-refactor-to-python3.patch BuildRequires: %{python_module pip} BuildRequires: %{python_module pyudev} BuildRequires: %{python_module setuptools} -BuildRequires: %{python_module six} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros >= 20210929 Requires: %{cpkg} Requires: python-pyudev -Requires: python-six Provides: python-rtslib = %{version}-%{release} Obsoletes: python-rtslib < %{version} BuildArch: noarch diff --git a/rtslib-refactor-to-python3.patch b/rtslib-refactor-to-python3.patch new file mode 100644 index 0000000..d8a0934 --- /dev/null +++ b/rtslib-refactor-to-python3.patch @@ -0,0 +1,1156 @@ +From dc1bfe302a461daa96515d685abaa8188ec1586b Mon Sep 17 00:00:00 2001 +From: Martin Hoyer +Date: Thu, 16 May 2024 17:24:17 +0200 +Subject: [PATCH] Refactor code to Python>=3.9 to pass pyupgrade + +--- + rtslib/alua.py | 41 ++++++++++++----------- + rtslib/fabric.py | 38 ++++++++++------------ + rtslib/node.py | 2 +- + rtslib/root.py | 45 ++++++++++--------------- + rtslib/target.py | 83 +++++++++++++++++++++++------------------------ + rtslib/tcm.py | 56 +++++++++++++++----------------- + rtslib/utils.py | 12 +++---- + scripts/targetctl | 3 +- + 8 files changed, 130 insertions(+), 150 deletions(-) + +Index: python-rtslib-fb-v2.1.76/rtslib/alua.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/alua.py ++++ python-rtslib-fb-v2.1.76/rtslib/alua.py +@@ -19,7 +19,6 @@ a copy of the License at + + from .node import CFSNode + from .utils import RTSLibError, RTSLibALUANotSupported, fread, fwrite +-import six + + alua_rw_params = ['alua_access_state', 'alua_access_status', + 'alua_write_metadata', 'alua_access_type', 'preferred', +@@ -54,7 +53,7 @@ class ALUATargetPortGroup(CFSNode): + if tag is not None and (tag > 65535 or tag < 1): + raise RTSLibError("The TPG Tag must be between 1 and 65535") + +- super(ALUATargetPortGroup, self).__init__() ++ super().__init__() + self.name = name + self.storage_object = storage_object + +@@ -68,7 +67,7 @@ class ALUATargetPortGroup(CFSNode): + + try: + fwrite("%s/tg_pt_gp_id" % self._path, tag) +- except IOError as msg: ++ except OSError as msg: + self.delete() + raise RTSLibError("Cannot set id to %d: %s" % (tag, str(msg))) + else: +@@ -90,7 +89,7 @@ class ALUATargetPortGroup(CFSNode): + raise RTSLibError("Can not delete default_tg_pt_gp") + + # This will reset the ALUA tpg to default_tg_pt_gp +- super(ALUATargetPortGroup, self).delete() ++ super().delete() + + def _get_alua_access_state(self): + self._check_self() +@@ -102,7 +101,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_access_state" % self.path + try: + fwrite(path, str(int(newstate))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot change ALUA state: %s" % e) + + def _get_alua_access_status(self): +@@ -116,7 +115,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_access_status" % self.path + try: + fwrite(path, str(int(newstatus))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot change ALUA status: %s" % e) + + def _get_alua_access_type(self): +@@ -130,7 +129,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_access_type" % self.path + try: + fwrite(path, str(int(access_type))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot change ALUA access type: %s" % e) + + def _get_preferred(self): +@@ -143,7 +142,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/preferred" % self.path + try: + fwrite(path, str(int(pref))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set preferred: %s" % e) + + def _get_alua_write_metadata(self): +@@ -156,7 +155,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_write_metadata" % self.path + try: + fwrite(path, str(int(pref))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_write_metadata: %s" % e) + + def _get_alua_support_active_nonoptimized(self): +@@ -169,7 +168,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_support_active_nonoptimized" % self.path + try: + fwrite(path, str(int(enabled))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_support_active_nonoptimized: %s" % e) + + def _get_alua_support_active_optimized(self): +@@ -182,7 +181,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_support_active_optimized" % self.path + try: + fwrite(path, str(int(enabled))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_support_active_optimized: %s" % e) + + def _get_alua_support_offline(self): +@@ -195,7 +194,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_support_offline" % self.path + try: + fwrite(path, str(int(enabled))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_support_offline: %s" % e) + + def _get_alua_support_unavailable(self): +@@ -208,7 +207,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_support_unavailable" % self.path + try: + fwrite(path, str(int(enabled))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_support_unavailable: %s" % e) + + def _get_alua_support_standby(self): +@@ -221,7 +220,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_support_standby" % self.path + try: + fwrite(path, str(int(enabled))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_support_standby: %s" % e) + + def _get_alua_support_transitioning(self): +@@ -234,7 +233,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/alua_support_transitioning" % self.path + try: + fwrite(path, str(int(enabled))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set alua_support_transitioning: %s" % e) + + def _get_alua_support_lba_dependent(self): +@@ -272,7 +271,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/trans_delay_msecs" % self.path + try: + fwrite(path, str(int(secs))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set trans_delay_msecs: %s" % e) + + def _get_implicit_trans_secs(self): +@@ -285,7 +284,7 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/implicit_trans_secs" % self.path + try: + fwrite(path, str(int(secs))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set implicit_trans_secs: %s" % e) + + def _get_nonop_delay_msecs(self): +@@ -298,11 +297,11 @@ class ALUATargetPortGroup(CFSNode): + path = "%s/nonop_delay_msecs" % self.path + try: + fwrite(path, str(int(delay))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot set nonop_delay_msecs: %s" % e) + + def dump(self): +- d = super(ALUATargetPortGroup, self).dump() ++ d = super().dump() + d['name'] = self.name + d['tg_pt_gp_id'] = self.tg_pt_gp_id + for param in alua_rw_params: +@@ -394,7 +393,7 @@ class ALUATargetPortGroup(CFSNode): + return + + alua_tpg_obj = cls(storage_obj, name, alua_tpg['tg_pt_gp_id']) +- for param, value in six.iteritems(alua_tpg): ++ for param, value in alua_tpg.items(): + if param != 'name' and param != 'tg_pt_gp_id': + try: + setattr(alua_tpg_obj, param, value) +Index: python-rtslib-fb-v2.1.76/rtslib/fabric.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/fabric.py ++++ python-rtslib-fb-v2.1.76/rtslib/fabric.py +@@ -108,9 +108,7 @@ Example: self._path = "%s/%s" % (self.co + ''' + + from functools import partial +-from glob import iglob as glob +-import os +-import six ++from pathlib import Path + + from .node import CFSNode + from .utils import fread, fwrite, normalize_wwn, colonize +@@ -146,7 +144,7 @@ class _BaseFabricModule(CFSNode): + @param name: the name of the FabricModule object. + @type name: str + ''' +- super(_BaseFabricModule, self).__init__() ++ super().__init__() + self.name = name + self.spec_file = "N/A" + self._path = "%s/%s" % (self.configfs_dir, self.name) +@@ -164,7 +162,7 @@ class _BaseFabricModule(CFSNode): + except RTSLibError: + modprobe(self.kernel_module) + self._create_in_cfs_ine('any') +- super(_BaseFabricModule, self)._check_self() ++ super()._check_self() + + def has_feature(self, feature): + # Handle a renamed feature +@@ -324,7 +322,7 @@ class _BaseFabricModule(CFSNode): + ''' + Setup fabricmodule with settings from fm dict. + ''' +- for name, value in six.iteritems(fm): ++ for name, value in fm.items(): + if name != 'name': + try: + setattr(self, name, value) +@@ -332,7 +330,7 @@ class _BaseFabricModule(CFSNode): + err_func("Could not set fabric %s attribute '%s'" % (fm['name'], name)) + + def dump(self): +- d = super(_BaseFabricModule, self).dump() ++ d = super().dump() + d['name'] = self.name + if self.has_feature("discovery_auth"): + for attr in ("userid", "password", "mutual_userid", "mutual_password"): +@@ -346,13 +344,13 @@ class _BaseFabricModule(CFSNode): + class ISCSIFabricModule(_BaseFabricModule): + + def __init__(self): +- super(ISCSIFabricModule, self).__init__('iscsi') ++ super().__init__('iscsi') + self.wwn_types = ('iqn', 'naa', 'eui') + + + class LoopbackFabricModule(_BaseFabricModule): + def __init__(self): +- super(LoopbackFabricModule, self).__init__('loopback') ++ super().__init__('loopback') + self.features = ("nexus",) + self.wwn_types = ('naa',) + self.kernel_module = "tcm_loop" +@@ -360,7 +358,7 @@ class LoopbackFabricModule(_BaseFabricMo + + class SBPFabricModule(_BaseFabricModule): + def __init__(self): +- super(SBPFabricModule, self).__init__('sbp') ++ super().__init__('sbp') + self.features = () + self.wwn_types = ('eui',) + self.kernel_module = "sbp_target" +@@ -383,7 +381,7 @@ class SBPFabricModule(_BaseFabricModule) + + class Qla2xxxFabricModule(_BaseFabricModule): + def __init__(self): +- super(Qla2xxxFabricModule, self).__init__('qla2xxx') ++ super().__init__('qla2xxx') + self.features = ("acls",) + self.wwn_types = ('naa',) + self.kernel_module = "tcm_qla2xxx" +@@ -408,7 +406,7 @@ class Qla2xxxFabricModule(_BaseFabricMod + + class EfctFabricModule(_BaseFabricModule): + def __init__(self): +- super(EfctFabricModule, self).__init__('efct') ++ super().__init__('efct') + self.features = ("acls",) + self.wwn_types = ('naa',) + self.kernel_module = "efct" +@@ -433,7 +431,7 @@ class EfctFabricModule(_BaseFabricModule + + class SRPTFabricModule(_BaseFabricModule): + def __init__(self): +- super(SRPTFabricModule, self).__init__('srpt') ++ super().__init__('srpt') + self.features = ("acls",) + self.wwn_types = ('ib',) + self.kernel_module = "ib_srpt" +@@ -453,7 +451,7 @@ class SRPTFabricModule(_BaseFabricModule + + class FCoEFabricModule(_BaseFabricModule): + def __init__(self): +- super(FCoEFabricModule, self).__init__('tcm_fc') ++ super().__init__('tcm_fc') + + self.features = ("acls",) + self.kernel_module = "tcm_fc" +@@ -480,7 +478,7 @@ class FCoEFabricModule(_BaseFabricModule + + class USBGadgetFabricModule(_BaseFabricModule): + def __init__(self): +- super(USBGadgetFabricModule, self).__init__('usb_gadget') ++ super().__init__('usb_gadget') + self.features = ("nexus",) + self.wwn_types = ('naa',) + self.kernel_module = "tcm_usb_gadget" +@@ -488,14 +486,14 @@ class USBGadgetFabricModule(_BaseFabricM + + class VhostFabricModule(_BaseFabricModule): + def __init__(self): +- super(VhostFabricModule, self).__init__('vhost') ++ super.__init__('vhost') + self.features = ("nexus", "acls", "tpgts") + self.wwn_types = ('naa',) + self.kernel_module = "tcm_vhost" + + class XenPvScsiFabricModule(_BaseFabricModule): + def __init__(self): +- super(XenPvScsiFabricModule, self).__init__('xen-pvscsi') ++ super.__init__('xen-pvscsi') + self._path = "%s/%s" % (self.configfs_dir, 'xen-pvscsi') + self.features = ("nexus", "tpgts") + self.wwn_types = ('naa',) +@@ -504,7 +502,7 @@ class XenPvScsiFabricModule(_BaseFabricM + + class IbmvscsisFabricModule(_BaseFabricModule): + def __init__(self): +- super(IbmvscsisFabricModule, self).__init__('ibmvscsis') ++ super().__init__('ibmvscsis') + self.features = () + self.kernel_module = "ibmvscsis" + +@@ -533,14 +531,14 @@ fabric_modules = { + # Maintain compatibility with existing FabricModule(fabricname) usage + # e.g. FabricModule('iscsi') returns an ISCSIFabricModule + # +-class FabricModule(object): ++class FabricModule: + + def __new__(cls, name): + return fabric_modules[name]() + + @classmethod + def all(cls): +- for mod in six.itervalues(fabric_modules): ++ for mod in fabric_modules.values(): + yield mod() + + @classmethod +Index: python-rtslib-fb-v2.1.76/rtslib/node.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/node.py ++++ python-rtslib-fb-v2.1.76/rtslib/node.py +@@ -24,7 +24,7 @@ import errno + from .utils import fread, fwrite, RTSLibError, RTSLibNotInCFS + + +-class CFSNode(object): ++class CFSNode: + + # Where is the configfs base LIO directory ? + configfs_dir = '/sys/kernel/config/target' +Index: python-rtslib-fb-v2.1.76/rtslib/root.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/root.py ++++ python-rtslib-fb-v2.1.76/rtslib/root.py +@@ -72,7 +72,7 @@ class RTSRoot(CFSNode): + Instantiate an RTSRoot object. Basically checks for configfs setup and + base kernel modules (tcm) + ''' +- super(RTSRoot, self).__init__() ++ super().__init__() + try: + mount_configfs() + except RTSLibError: +@@ -90,61 +90,51 @@ class RTSRoot(CFSNode): + def _list_targets(self): + self._check_self() + for fabric_module in self.fabric_modules: +- for target in fabric_module.targets: +- yield target ++ yield from fabric_module.targets + + def _list_storage_objects(self): + self._check_self() +- for so in StorageObject.all(): +- yield so ++ yield from StorageObject.all() + + def _list_alua_tpgs(self): + self._check_self() + for so in self.storage_objects: +- for a in so.alua_tpgs: +- yield a ++ yield from so.alua_tpgs + + def _list_tpgs(self): + self._check_self() + for t in self.targets: +- for tpg in t.tpgs: +- yield tpg ++ yield from t.tpgs + + def _list_node_acls(self): + self._check_self() + for t in self.tpgs: +- for node_acl in t.node_acls: +- yield node_acl ++ yield from t.node_acls + + def _list_node_acl_groups(self): + self._check_self() + for t in self.tpgs: +- for nag in t.node_acl_groups: +- yield nag ++ yield from t.node_acl_groups + + def _list_mapped_luns(self): + self._check_self() + for na in self.node_acls: +- for mlun in na.mapped_luns: +- yield mlun ++ yield from na.mapped_luns + + def _list_mapped_lun_groups(self): + self._check_self() + for nag in self.node_acl_groups: +- for mlg in nag.mapped_lun_groups: +- yield mlg ++ yield from nag.mapped_lun_groups + + def _list_network_portals(self): + self._check_self() + for t in self.tpgs: +- for p in t.network_portals: +- yield p ++ yield from t.network_portals + + def _list_luns(self): + self._check_self() + for t in self.tpgs: +- for lun in t.luns: +- yield lun ++ yield from t.luns + + def _list_sessions(self): + self._check_self() +@@ -154,8 +144,7 @@ class RTSRoot(CFSNode): + + def _list_fabric_modules(self): + self._check_self() +- for mod in FabricModule.all(): +- yield mod ++ yield from FabricModule.all() + + def __str__(self): + return "rtslib" +@@ -195,13 +184,13 @@ class RTSRoot(CFSNode): + current = self.dump() + + try: +- with open(save_file, "r") as f: ++ with open(save_file) as f: + saveconf = json.loads(f.read()) +- except IOError as e: ++ except OSError as e: + if e.errno == errno.ENOENT: + saveconf = {'storage_objects': [], 'targets': []} + else: +- raise ExecutionError("Could not open %s" % save_file) ++ raise OSError("Could not open %s" % save_file) + + fetch_cur_so = False + fetch_cur_tg = False +@@ -276,7 +265,7 @@ class RTSRoot(CFSNode): + config, suitable for serialization/deserialization, and then + handing to restore(). + ''' +- d = super(RTSRoot, self).dump() ++ d = super().dump() + d['storage_objects'] = [so.dump() for so in self.storage_objects] + d['targets'] = [t.dump() for t in self.targets] + d['fabric_modules'] = [f.dump() for f in self.fabric_modules +@@ -503,7 +492,7 @@ class RTSRoot(CFSNode): + if not restore_file: + restore_file = default_save_file + +- with open(restore_file, "r") as f: ++ with open(restore_file) as f: + config = json.loads(f.read()) + return self.restore(config, target, storage_object, + clear_existing=clear_existing, +Index: python-rtslib-fb-v2.1.76/rtslib/target.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/target.py ++++ python-rtslib-fb-v2.1.76/rtslib/target.py +@@ -21,7 +21,6 @@ under the License. + import os + from glob import iglob as glob + from functools import partial +-from six.moves import range + import uuid + + from .node import CFSNode +@@ -31,8 +30,6 @@ from .utils import dict_remove, set_attr + from .utils import _get_auth_attr, _set_auth_attr + from . import tcm + +-import six +- + auth_params = ('userid', 'password', 'mutual_userid', 'mutual_password') + + class Target(CFSNode): +@@ -63,7 +60,7 @@ class Target(CFSNode): + @return: A Target object. + ''' + +- super(Target, self).__init__() ++ super().__init__() + self.fabric_module = fabric_module + + fabric_module._check_self() +@@ -107,7 +104,7 @@ class Target(CFSNode): + self._check_self() + for tpg in self.tpgs: + tpg.delete() +- super(Target, self).delete() ++ super().delete() + + tpgs = property(_list_tpgs, doc="Get the list of TPG for the Target.") + +@@ -133,7 +130,7 @@ class Target(CFSNode): + TPG.setup(t_obj, tpg, err_func) + + def dump(self): +- d = super(Target, self).dump() ++ d = super().dump() + d['wwn'] = self.wwn + d['fabric'] = self.fabric_module.name + d['tpgs'] = [tpg.dump() for tpg in self.tpgs] +@@ -169,7 +166,7 @@ class TPG(CFSNode): + @return: A TPG object. + ''' + +- super(TPG, self).__init__() ++ super().__init__() + + if tag is None: + tags = [tpg.tag for tpg in parent_target.tpgs] +@@ -241,7 +238,7 @@ class TPG(CFSNode): + if os.path.isfile(path) and (boolean != self._get_enable()): + try: + fwrite(path, str(int(boolean))) +- except IOError as e: ++ except OSError as e: + raise RTSLibError("Cannot change enable state: %s" % e) + + def _get_nexus(self): +@@ -252,7 +249,7 @@ class TPG(CFSNode): + if self.has_feature('nexus'): + try: + nexus_wwn = fread("%s/nexus" % self.path) +- except IOError: ++ except OSError: + nexus_wwn = '' + return nexus_wwn + else: +@@ -344,7 +341,7 @@ class TPG(CFSNode): + lun.delete() + for portal in self.network_portals: + portal.delete() +- super(TPG, self).delete() ++ super().delete() + + def node_acl(self, node_wwn, mode='any'): + ''' +@@ -435,7 +432,7 @@ class TPG(CFSNode): + tpg_obj.enable = tpg.get('enable', True) + dict_remove(tpg, ('luns', 'portals', 'node_acls', 'tag', + 'attributes', 'parameters', 'enable')) +- for name, value in six.iteritems(tpg): ++ for name, value in tpg.items(): + if value: + try: + setattr(tpg_obj, name, value) +@@ -444,7 +441,7 @@ class TPG(CFSNode): + (tpg_obj.tag, name)) + + def dump(self): +- d = super(TPG, self).dump() ++ d = super().dump() + d['tag'] = self.tag + d['enable'] = self.enable + d['luns'] = [lun.dump() for lun in self.luns] +@@ -495,7 +492,7 @@ class LUN(CFSNode): + @type alias: string + @return: A LUN object. + ''' +- super(LUN, self).__init__() ++ super().__init__() + + if isinstance(parent_tpg, TPG): + self._parent_tpg = parent_tpg +@@ -603,7 +600,7 @@ class LUN(CFSNode): + return None + group_line = info.splitlines()[0] + return group_line.split(':')[1].strip() +- except IOError as e: ++ except OSError as e: + return None + + def _set_alua_tg_pt_gp_name(self, group_name): +@@ -615,7 +612,7 @@ class LUN(CFSNode): + path = "%s/alua_tg_pt_gp" % self.path + try: + fwrite(path, group_name) +- except IOError as e: ++ except OSError as e: + return -1 + + return 0 +@@ -641,7 +638,7 @@ class LUN(CFSNode): + if os.path.islink("%s/%s" % (self.path, link)): + os.unlink("%s/%s" % (self.path, link)) + +- super(LUN, self).delete() ++ super().delete() + + parent_tpg = property(_get_parent_tpg, + doc="Get the parent TPG object.") +@@ -689,7 +686,7 @@ class LUN(CFSNode): + pass + + def dump(self): +- d = super(LUN, self).dump() ++ d = super().dump() + d['storage_object'] = "/backstores/%s/%s" % \ + (self.storage_object.plugin, self.storage_object.name) + d['index'] = self.lun +@@ -729,7 +726,7 @@ class NetworkPortal(CFSNode): + @type mode:string + @return: A NetworkPortal object. + ''' +- super(NetworkPortal, self).__init__() ++ super().__init__() + + self._ip_address = str(ip_address) + +@@ -763,14 +760,14 @@ class NetworkPortal(CFSNode): + def _get_iser(self): + try: + return bool(int(fread("%s/iser" % self.path))) +- except IOError: ++ except OSError: + return False + + def _set_iser(self, boolean): + path = "%s/iser" % self.path + try: + fwrite(path, str(int(boolean))) +- except IOError: ++ except OSError: + # b/w compat: don't complain if iser entry is missing + if os.path.isfile(path): + raise RTSLibError("Cannot change iser") +@@ -779,14 +776,14 @@ class NetworkPortal(CFSNode): + try: + # only offload at the moment is cxgbit + return bool(int(fread("%s/cxgbit" % self.path))) +- except IOError: ++ except OSError: + return False + + def _set_offload(self, boolean): + path = "%s/cxgbit" % self.path + try: + fwrite(path, str(int(boolean))) +- except IOError: ++ except OSError: + # b/w compat: don't complain if cxgbit entry is missing + if os.path.isfile(path): + raise RTSLibError("Cannot change offload") +@@ -796,7 +793,7 @@ class NetworkPortal(CFSNode): + def delete(self): + self.iser = False + self.offload = False +- super(NetworkPortal, self).delete() ++ super().delete() + + parent_tpg = property(_get_parent_tpg, + doc="Get the parent TPG object.") +@@ -829,7 +826,7 @@ class NetworkPortal(CFSNode): + (p['ip_address'], p['port'], e)) + + def dump(self): +- d = super(NetworkPortal, self).dump() ++ d = super().dump() + d['port'] = self.port + d['ip_address'] = self.ip_address + d['iser'] = self.iser +@@ -864,7 +861,7 @@ class NodeACL(CFSNode): + @return: A NodeACL object. + ''' + +- super(NodeACL, self).__init__() ++ super().__init__() + + if isinstance(parent_tpg, TPG): + self._parent_tpg = parent_tpg +@@ -892,7 +889,7 @@ class NodeACL(CFSNode): + path = "%s/cmdsn_depth" % self.path + try: + fwrite(path, "%s" % depth) +- except IOError as msg: ++ except OSError as msg: + msg = msg[1] + raise RTSLibError("Cannot set tcq_depth: %s" % str(msg)) + +@@ -903,11 +900,11 @@ class NodeACL(CFSNode): + if tag: + return tag + return None +- except IOError: ++ except OSError: + return None + + def _set_tag(self, tag_str): +- with ignored(IOError): ++ with ignored(OSError): + if tag_str is None: + fwrite("%s/tag" % self.path, 'NULL') + else: +@@ -922,7 +919,7 @@ class NodeACL(CFSNode): + def _get_session(self): + try: + lines = fread("%s/info" % self.path).splitlines() +- except IOError: ++ except OSError: + return None + + if lines[0].startswith("No active"): +@@ -967,7 +964,7 @@ class NodeACL(CFSNode): + self._check_self() + for mapped_lun in self.mapped_luns: + mapped_lun.delete() +- super(NodeACL, self).delete() ++ super().delete() + + def mapped_lun(self, mapped_lun, tpg_lun=None, write_protect=None): + ''' +@@ -1029,7 +1026,7 @@ class NodeACL(CFSNode): + MappedLUN.setup(tpg_obj, acl_obj, mlun, err_func) + + dict_remove(acl, ('attributes', 'mapped_luns', 'node_wwn')) +- for name, value in six.iteritems(acl): ++ for name, value in acl.items(): + if value: + try: + setattr(acl_obj, name, value) +@@ -1038,7 +1035,7 @@ class NodeACL(CFSNode): + (acl['node_wwn'], name)) + + def dump(self): +- d = super(NodeACL, self).dump() ++ d = super().dump() + d['node_wwn'] = self.node_wwn + d['mapped_luns'] = [lun.dump() for lun in self.mapped_luns] + if self.tag: +@@ -1091,7 +1088,7 @@ class MappedLUN(CFSNode): + @type write_protect: bool + ''' + +- super(MappedLUN, self).__init__() ++ super().__init__() + + if not isinstance(parent_nodeacl, NodeACL): + raise RTSLibError("The parent_nodeacl parameter must be " \ +@@ -1207,7 +1204,7 @@ class MappedLUN(CFSNode): + else: + if os.path.islink(lun_link): + os.unlink(lun_link) +- super(MappedLUN, self).delete() ++ super().delete() + + mapped_lun = property(_get_mapped_lun, + doc="Get the integer MappedLUN mapped_lun index.") +@@ -1251,7 +1248,7 @@ class MappedLUN(CFSNode): + err_func("Creating MappedLUN object %d failed" % mlun['index']) + + def dump(self): +- d = super(MappedLUN, self).dump() ++ d = super().dump() + d['write_protect'] = self.write_protect + d['index'] = self.mapped_lun + d['tpg_lun'] = self.tpg_lun.lun +@@ -1259,7 +1256,7 @@ class MappedLUN(CFSNode): + return d + + +-class Group(object): ++class Group: + ''' + An abstract base class akin to CFSNode, but for classes that + emulate a higher-level group object across the actual NodeACL +@@ -1345,7 +1342,7 @@ class NodeACLGroup(Group): + return "" % self.name + + def __init__(self, parent_tpg, name): +- super(NodeACLGroup, self).__init__(NodeACLGroup._node_acls.fget) ++ super().__init__(NodeACLGroup._node_acls.fget) + _check_group_name(name) + self._name = name + self._parent_tpg = parent_tpg +@@ -1545,7 +1542,7 @@ class MappedLUNGroup(Group): + return "" % (self._nag.name, self._mapped_lun) + + def __init__(self, nodeaclgroup, mapped_lun, *args, **kwargs): +- super(MappedLUNGroup, self).__init__(MappedLUNGroup._mapped_luns.fget) ++ super().__init__(MappedLUNGroup._mapped_luns.fget) + self._nag = nodeaclgroup + self._mapped_lun = mapped_lun + for na in self._nag._node_acls: +Index: python-rtslib-fb-v2.1.76/rtslib/tcm.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/tcm.py ++++ python-rtslib-fb-v2.1.76/rtslib/tcm.py +@@ -24,7 +24,6 @@ import re + import glob + import fcntl + import resource +-from six.moves import range + + from .alua import ALUATargetPortGroup + from .node import CFSNode +@@ -60,7 +59,7 @@ class StorageObject(CFSNode): + return "<%s %s/%s>" % (self.__class__.__name__, self.plugin, self.name) + + def __init__(self, name, mode, index=None): +- super(StorageObject, self).__init__() ++ super().__init__() + if "/" in name or " " in name or "\t" in name or "\n" in name: + raise RTSLibError("A storage object's name cannot contain " + " /, newline or spaces/tabs") +@@ -233,8 +232,7 @@ class StorageObject(CFSNode): + Generates all luns attached to a storage object. + ''' + self._check_self() +- for lun in self._gen_attached_luns(): +- yield lun ++ yield from self._gen_attached_luns() + + def _list_alua_tpgs(self): + ''' +@@ -275,7 +273,7 @@ class StorageObject(CFSNode): + else: + lun.delete() + +- super(StorageObject, self).delete() ++ super().delete() + self._backstore.delete() + if save: + from .root import RTSRoot, default_save_file +@@ -313,7 +311,7 @@ class StorageObject(CFSNode): + doc="Returns true if ALUA can be setup. False if not supported.") + + def dump(self): +- d = super(StorageObject, self).dump() ++ d = super().dump() + d['name'] = self.name + d['plugin'] = self.plugin + d['alua_tpgs'] = [tpg.dump() for tpg in self.alua_tpgs] +@@ -349,14 +347,14 @@ class PSCSIStorageObject(StorageObject): + @return: A PSCSIStorageObject object. + ''' + if dev is not None: +- super(PSCSIStorageObject, self).__init__(name, 'create', index) ++ super().__init__(name, 'create', index) + try: + self._configure(dev) + except: + self.delete() + raise + else: +- super(PSCSIStorageObject, self).__init__(name, 'lookup', index) ++ super().__init__(name, 'lookup', index) + + def _configure(self, dev): + self._check_self() +@@ -402,7 +400,7 @@ class PSCSIStorageObject(StorageObject): + self._set_udev_path(udev_path) + self._enable() + +- super(PSCSIStorageObject, self)._configure() ++ super()._configure() + + def _set_wwn(self, wwn): + # pscsi doesn't support setting wwn +@@ -467,7 +465,7 @@ class PSCSIStorageObject(StorageObject): + doc="Returns true if ALUA can be setup. False if not supported.") + + def dump(self): +- d = super(PSCSIStorageObject, self).dump() ++ d = super().dump() + d['dev'] = self.udev_path + return d + +@@ -504,14 +502,14 @@ class RDMCPStorageObject(StorageObject): + ''' + + if size is not None: +- super(RDMCPStorageObject, self).__init__(name, 'create', index) ++ super().__init__(name, 'create', index) + try: + self._configure(size, wwn, nullio) + except: + self.delete() + raise + else: +- super(RDMCPStorageObject, self).__init__(name, 'lookup', index) ++ super().__init__(name, 'lookup', index) + + def _configure(self, size, wwn, nullio): + self._check_self() +@@ -525,7 +523,7 @@ class RDMCPStorageObject(StorageObject): + self._control("rd_nullio=1") + self._enable() + +- super(RDMCPStorageObject, self)._configure(wwn) ++ super()._configure(wwn) + + def _get_page_size(self): + self._check_self() +@@ -560,7 +558,7 @@ class RDMCPStorageObject(StorageObject): + doc="Get the nullio status.") + + def dump(self): +- d = super(RDMCPStorageObject, self).dump() ++ d = super().dump() + d['wwn'] = self.wwn + d['size'] = self.size + # only dump nullio if enabled +@@ -609,14 +607,14 @@ class FileIOStorageObject(StorageObject) + ''' + + if dev is not None: +- super(FileIOStorageObject, self).__init__(name, 'create', index) ++ super().__init__(name, 'create', index) + try: + self._configure(dev, size, wwn, write_back, aio) + except: + self.delete() + raise + else: +- super(FileIOStorageObject, self).__init__(name, 'lookup', index) ++ super().__init__(name, 'lookup', index) + + def _configure(self, dev, size, wwn, write_back, aio): + self._check_self() +@@ -653,7 +651,7 @@ class FileIOStorageObject(StorageObject) + + self._enable() + +- super(FileIOStorageObject, self)._configure(wwn) ++ super()._configure(wwn) + + def _get_wb_enabled(self): + self._check_self() +@@ -692,7 +690,7 @@ class FileIOStorageObject(StorageObject) + doc="True if asynchronous I/O is enabled") + + def dump(self): +- d = super(FileIOStorageObject, self).dump() ++ d = super().dump() + d['write_back'] = self.write_back + d['wwn'] = self.wwn + d['dev'] = self.udev_path +@@ -735,14 +733,14 @@ class BlockStorageObject(StorageObject): + ''' + + if dev is not None: +- super(BlockStorageObject, self).__init__(name, 'create', index) ++ super().__init__(name, 'create', index) + try: + self._configure(dev, wwn, readonly) + except: + self.delete() + raise + else: +- super(BlockStorageObject, self).__init__(name, 'lookup', index) ++ super().__init__(name, 'lookup', index) + + def _configure(self, dev, wwn, readonly): + self._check_self() +@@ -756,7 +754,7 @@ class BlockStorageObject(StorageObject): + self._control("readonly=%d" % readonly) + self._enable() + +- super(BlockStorageObject, self)._configure(wwn) ++ super()._configure(wwn) + + def _get_major(self): + self._check_self() +@@ -796,7 +794,7 @@ class BlockStorageObject(StorageObject): + doc="True if the device is read-only, False if read/write") + + def dump(self): +- d = super(BlockStorageObject, self).dump() ++ d = super().dump() + d['write_back'] = self.write_back + d['readonly'] = self.readonly + d['wwn'] = self.wwn +@@ -836,14 +834,14 @@ class UserBackedStorageObject(StorageObj + if '/' not in config: + raise RTSLibError("'config' must contain a '/' separating subtype " + "from its configuration string") +- super(UserBackedStorageObject, self).__init__(name, 'create', index) ++ super().__init__(name, 'create', index) + try: + self._configure(config, size, wwn, hw_max_sectors, control) + except: + self.delete() + raise + else: +- super(UserBackedStorageObject, self).__init__(name, 'lookup', index) ++ super().__init__(name, 'lookup', index) + + def _configure(self, config, size, wwn, hw_max_sectors, control): + self._check_self() +@@ -858,7 +856,7 @@ class UserBackedStorageObject(StorageObj + self._control(control) + self._enable() + +- super(UserBackedStorageObject, self)._configure(wwn) ++ super()._configure(wwn) + + def _get_size(self): + self._check_self() +@@ -909,7 +907,7 @@ class UserBackedStorageObject(StorageObj + doc="Returns true if ALUA can be setup. False if not supported.") + + def dump(self): +- d = super(UserBackedStorageObject, self).dump() ++ d = super().dump() + d['wwn'] = self.wwn + d['size'] = self.size + d['config'] = self.config +@@ -919,7 +917,7 @@ class UserBackedStorageObject(StorageObj + return d + + +-class StorageObjectFactory(object): ++class StorageObjectFactory: + """ + Create a storage object based on a given path. + Only works for file & block. +@@ -968,7 +966,7 @@ class _Backstore(CFSNode): + """ + + def __init__(self, name, storage_object_cls, mode, index=None): +- super(_Backstore, self).__init__() ++ super().__init__() + self._so_cls = storage_object_cls + self._plugin = bs_params[self._so_cls]['name'] + +@@ -1025,7 +1023,7 @@ class _Backstore(CFSNode): + raise + + def delete(self): +- super(_Backstore, self).delete() ++ super().delete() + if self._lookup_key in bs_cache: + del bs_cache[self._lookup_key] + +Index: python-rtslib-fb-v2.1.76/rtslib/utils.py +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/rtslib/utils.py ++++ python-rtslib-fb-v2.1.76/rtslib/utils.py +@@ -97,7 +97,7 @@ def fread(path): + @return: A string containing the file's contents. + + ''' +- with open(path, 'r') as file_fd: ++ with open(path) as file_fd: + return file_fd.read().strip() + + def is_dev_in_use(path): +@@ -115,7 +115,7 @@ def is_dev_in_use(path): + path = os.path.realpath(str(path)) + try: + device = pyudev.Device.from_device_file(_CONTEXT, path) +- if device.subsystem == u'scsi_generic': ++ if device.subsystem == 'scsi_generic': + file_fd = os.open(path, os.O_EXCL|os.O_NDELAY|os.O_RDWR) + else: + file_fd = os.open(path, os.O_EXCL|os.O_NDELAY) +@@ -220,10 +220,10 @@ def get_blockdev_type(path): + ''' + try: + device = pyudev.Device.from_device_file(_CONTEXT, path) +- except (pyudev.DeviceNotFoundError, EnvironmentError, ValueError): ++ except (OSError, pyudev.DeviceNotFoundError, ValueError): + return None + +- if device.subsystem != u'block': ++ if device.subsystem != 'block': + return None + + attributes = device.attributes +@@ -505,14 +505,14 @@ def _set_auth_attr(self, value, attribut + raise + + def set_attributes(obj, attr_dict, err_func): +- for name, value in six.iteritems(attr_dict): ++ for name, value in attr_dict.items(): + try: + obj.set_attribute(name, value) + except RTSLibError as e: + err_func(str(e)) + + def set_parameters(obj, param_dict, err_func): +- for name, value in six.iteritems(param_dict): ++ for name, value in param_dict.items(): + try: + obj.set_parameter(name, value) + except RTSLibError as e: +Index: python-rtslib-fb-v2.1.76/scripts/targetctl +=================================================================== +--- python-rtslib-fb-v2.1.76.orig/scripts/targetctl ++++ python-rtslib-fb-v2.1.76/scripts/targetctl +@@ -22,7 +22,6 @@ under the License. + # A script to save/restore LIO configuration to/from a file in json format + # + +-from __future__ import print_function + + from rtslib_fb import RTSRoot + import os +@@ -45,7 +44,7 @@ def restore(from_file): + + try: + errors = RTSRoot().restore_from_file(restore_file=from_file) +- except IOError: ++ except OSError: + # Not an error if the restore file is not present + print("No saved config file at %s, ok, exiting" % from_file) + sys.exit(0)