)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"dff7ca7a24ab520186124c7dd19d3e51840d9346","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ac2184ba_288b9f90","updated":"2022-04-08 22:00:43.000000000","message":"Someone mentioned Fibre Channel at PTG, but I only found one offender (not counting the lower()):\ncinder/tests/unit/volume/drivers/ibm/test_ds8k_proxy.py:\n                \u0027storage_protocol\u0027: \u0027fibre_channel\u0027\n\nWhat about storpool and lightos? They are not on the list but are used by the in-tree drivers.\n\nAlso, take a look at the \"\u003cin\u003e FC\" syntax that Storwise uses. Is there a problem?\n\nFinally, we have some annoying cases where the protocol is derived or modified:\ncinder/tests/unit/volume/drivers/dell_emc/vnx/test_adapter.py\n        return_value\u003d{\u0027storage_protocol\u0027: self.STORAGE_PROTOCOL}):\ncinder/volume/drivers/dell_emc/powerstore/driver.py:\n        storage_protocol.lower() \u003d\u003d adapter.PROTOCOL_FC.lower()\ncinder/volume/drivers/dell_emc/vnx/driver.py:\n        self.protocol \u003d self.configuration.storage_protocol.lower()\n\n","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"715da3d4439b229731d78d7c5d73e9ecc35c0530","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6e0006e2_3d44e097","updated":"2022-04-08 13:01:21.000000000","message":"Typo and a question inline.  Looks good otherwise.","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0f5d224c38e602ae368de88c3365d5b1608cdb17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7b6b92e2_9c74c5d5","updated":"2022-04-06 10:07:26.000000000","message":"recheck tempest-slow-py3: unrelated timeout","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fd4d1ba6a07b0051ea4e4e3ccb6d168fb09a2e6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"33e71b80_de7ad9af","updated":"2022-04-26 02:16:55.000000000","message":"I like this version better than the earlier patch set.  I think the release note is clear about what operators need to be aware of.","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"8cda2f11aae953a23b878186593f0679fcf06327","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0ca48ee6_ce598b97","updated":"2022-04-26 19:28:54.000000000","message":"Looks good to me, including the dependency on the patch to move strings to the constraints module.\n\nHowever, I\u0027m still very inexperienced in Cinder and it only means I found nothing to complain about.","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"317055d29d9a82d742c251d5fefc4a16bcdb94f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4bbec3db_e21e69c7","updated":"2022-04-29 18:23:44.000000000","message":"Thanks for unifying all this. Looks good to me!","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}],"cinder/api/views/scheduler_stats.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4b3dbff26fa8af261a051750ab06e61db3af8e01","unresolved":true,"context_lines":[{"line_number":42,"context_line":"        if capabilities:"},{"line_number":43,"context_line":"            protocol \u003d capabilities.get(\u0027storage_protocol\u0027)"},{"line_number":44,"context_line":"            if isinstance(protocol, list):"},{"line_number":45,"context_line":"                capabilities \u003d capabilities.copy()"},{"line_number":46,"context_line":"                capabilities[\u0027storage_protocol\u0027] \u003d protocol[0]"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ccab1c3_dfa0e271","line":45,"range":{"start_line":45,"start_character":16,"end_line":45,"end_character":50},"updated":"2022-06-07 08:23:26.000000000","message":"i assume this is done so we don\u0027t change the reference inside pool[\u0027capabilities\u0027]?","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}],"cinder/interface/volume_driver.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"715da3d4439b229731d78d7c5d73e9ecc35c0530","unresolved":true,"context_lines":[{"line_number":81,"context_line":"            string, currently acceptable values (case sensitive) are: iSCSI,"},{"line_number":82,"context_line":"            FC, vmdk, ceph, DRBD, SCSI, scaleio, file, iSER, NVMe-oF, and NFS."},{"line_number":83,"context_line":"            If a driver mistakenly reports a variant of these in a release they"},{"line_number":84,"context_line":"            can report a list/tuple on the next release witht he incorrect and"},{"line_number":85,"context_line":"            correct one to provide a non-breaking fix.  In some cases this may"},{"line_number":86,"context_line":"            have the same value as the driver_volume_type returned by the"},{"line_number":87,"context_line":"            initialize_connection method, but they are not the same thing,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d1d73cd9_18473512","line":84,"range":{"start_line":84,"start_character":60,"end_line":84,"end_character":62},"updated":"2022-04-08 13:01:21.000000000","message":"nit: transposed characters","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3cd8dc8c7c6bff06d442eb9d53ff215ba7d1ba9b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            string, currently acceptable values (case sensitive) are: iSCSI,"},{"line_number":82,"context_line":"            FC, vmdk, ceph, DRBD, SCSI, scaleio, file, iSER, NVMe-oF, and NFS."},{"line_number":83,"context_line":"            If a driver mistakenly reports a variant of these in a release they"},{"line_number":84,"context_line":"            can report a list/tuple on the next release witht he incorrect and"},{"line_number":85,"context_line":"            correct one to provide a non-breaking fix.  In some cases this may"},{"line_number":86,"context_line":"            have the same value as the driver_volume_type returned by the"},{"line_number":87,"context_line":"            initialize_connection method, but they are not the same thing,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d0b9b167_eb9c72cc","line":84,"range":{"start_line":84,"start_character":60,"end_line":84,"end_character":62},"in_reply_to":"d1d73cd9_18473512","updated":"2022-04-25 08:13:02.000000000","message":"Done","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4b3dbff26fa8af261a051750ab06e61db3af8e01","unresolved":true,"context_lines":[{"line_number":83,"context_line":"            must be used instead of string literals."},{"line_number":84,"context_line":"            Variant values only exist for older drivers that were already"},{"line_number":85,"context_line":"            reporting those values.  New drivers must use non variant versions."},{"line_number":86,"context_line":"            In some cases this may be the same value as the driver_volume_type"},{"line_number":87,"context_line":"            returned by the initialize_connection method, but they are not the"},{"line_number":88,"context_line":"            same thing, since this one is meant to be used by the scheduler,"},{"line_number":89,"context_line":"            while the latter is the os-brick connector identifier used in the"},{"line_number":90,"context_line":"            factory method."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        * total_capacity_gb"},{"line_number":93,"context_line":"            The total capacity in gigabytes (GiB) of the storage backend being"}],"source_content_type":"text/x-python","patch_set":2,"id":"33cfae89_ddd67690","line":90,"range":{"start_line":86,"start_character":12,"end_line":90,"end_character":27},"updated":"2022-06-07 08:23:26.000000000","message":"thanks for explicitly clarifying this!","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}],"cinder/scheduler/filters/driver_filter.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fd4d1ba6a07b0051ea4e4e3ccb6d168fb09a2e6d","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def backend_passes(self, backend_state, filter_properties):"},{"line_number":33,"context_line":"        \"\"\"Determines if a backend has a passing filter_function or not.\"\"\""},{"line_number":34,"context_line":"        stats \u003d self._generate_stats(backend_state, filter_properties)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        LOG.debug(\"Checking backend \u0027%s\u0027\","},{"line_number":37,"context_line":"                  stats[0][\u0027backend_stats\u0027][\u0027backend_id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"57b45733_809587a2","line":34,"range":{"start_line":34,"start_character":21,"end_line":34,"end_character":70},"updated":"2022-04-26 02:16:55.000000000","message":"This now returns a list.  (It will be nice when we get this file mypy\u0027d.)","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}],"cinder/scheduler/host_manager.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4b3dbff26fa8af261a051750ab06e61db3af8e01","unresolved":true,"context_lines":[{"line_number":325,"context_line":"        self.volume_backend_name \u003d capability.get(\u0027volume_backend_name\u0027, None)"},{"line_number":326,"context_line":"        self.vendor_name \u003d capability.get(\u0027vendor_name\u0027, None)"},{"line_number":327,"context_line":"        self.driver_version \u003d capability.get(\u0027driver_version\u0027, None)"},{"line_number":328,"context_line":"        self.driver_version \u003d capability.get(\u0027driver_version\u0027, None)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        # Protocols that have variants are replaced with ALL the variants"},{"line_number":331,"context_line":"        protocol \u003d capability.get(\u0027storage_protocol\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"58627e95_7e8bac3c","line":328,"range":{"start_line":328,"start_character":8,"end_line":328,"end_character":68},"updated":"2022-06-07 08:23:26.000000000","message":"remove this, redundant line","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"988cbe5b3027fc3e3c1d3b48e83300ae7243d7e3","unresolved":true,"context_lines":[{"line_number":325,"context_line":"        self.volume_backend_name \u003d capability.get(\u0027volume_backend_name\u0027, None)"},{"line_number":326,"context_line":"        self.vendor_name \u003d capability.get(\u0027vendor_name\u0027, None)"},{"line_number":327,"context_line":"        self.driver_version \u003d capability.get(\u0027driver_version\u0027, None)"},{"line_number":328,"context_line":"        self.driver_version \u003d capability.get(\u0027driver_version\u0027, None)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        # Protocols that have variants are replaced with ALL the variants"},{"line_number":331,"context_line":"        protocol \u003d capability.get(\u0027storage_protocol\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"71532714_c81f8403","line":328,"range":{"start_line":328,"start_character":8,"end_line":328,"end_character":68},"in_reply_to":"58627e95_7e8bac3c","updated":"2022-06-07 08:32:23.000000000","message":"fixed here\nhttps://review.opendev.org/c/openstack/cinder/+/844920","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}],"cinder/scheduler/weights/goodness.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"4b3dbff26fa8af261a051750ab06e61db3af8e01","unresolved":true,"context_lines":[{"line_number":153,"context_line":"            \u0027goodness_function\u0027: goodness_function,"},{"line_number":154,"context_line":"        }"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Only create individual entries for the different protocols variants"},{"line_number":157,"context_line":"        # if the function uses the protocol and there are variants."},{"line_number":158,"context_line":"        if uses_protocol and isinstance(host_state.storage_protocol, list):"},{"line_number":159,"context_line":"            result \u003d []"},{"line_number":160,"context_line":"            for protocol in host_state.storage_protocol:"},{"line_number":161,"context_line":"                new_stats \u003d stats.copy()"},{"line_number":162,"context_line":"                new_stats[\u0027host_stats\u0027] \u003d dict(new_stats[\u0027host_stats\u0027])"},{"line_number":163,"context_line":"                new_stats[\u0027host_stats\u0027][\u0027storage_protocol\u0027] \u003d protocol"},{"line_number":164,"context_line":"                new_stats[\u0027host_caps\u0027] \u003d dict(new_stats[\u0027host_caps\u0027])"},{"line_number":165,"context_line":"                new_stats[\u0027host_caps\u0027][\u0027storage_protocol\u0027] \u003d protocol"},{"line_number":166,"context_line":"                result.append(new_stats)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        else:"},{"line_number":169,"context_line":"            result \u003d [stats]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":2,"id":"1e2fe294_7a9425b9","line":169,"range":{"start_line":156,"start_character":0,"end_line":169,"end_character":28},"updated":"2022-06-07 08:23:26.000000000","message":"this could be a scheduler util function to update storage_protocol in stats as same code is used here as well\nhttps://review.opendev.org/c/openstack/cinder/+/836069/2/cinder/scheduler/filters/driver_filter.py#152","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}],"doc/source/contributor/drivers.rst":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"dff7ca7a24ab520186124c7dd19d3e51840d9346","unresolved":true,"context_lines":[{"line_number":117,"context_line":"protocols it must be the exact string (case sensitive) as defined in the"},{"line_number":118,"context_line":"``VolumeDriverCore`` interface.  For example, we have: ``iSCSI``, ``FC``,"},{"line_number":119,"context_line":"``vmdk``, ``ceph``, ``DRBD``, ``SCSI``, ``scaleio``, ``file``, ``iSER``,"},{"line_number":120,"context_line":"``NVMe-oF``, and ``NFS``."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"This is important because volume types may be setting a specific"},{"line_number":123,"context_line":"``storage_protocol`` value in their extra specs, and we need it to be correct."}],"source_content_type":"text/x-rst","patch_set":1,"id":"04998793_b17fea97","line":120,"updated":"2022-04-08 22:00:43.000000000","message":"But no \u0027lightos\u0027? See cinder/tests/unit/volume/drivers/lightos/test_lightos_storage.py","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3cd8dc8c7c6bff06d442eb9d53ff215ba7d1ba9b","unresolved":false,"context_lines":[{"line_number":117,"context_line":"protocols it must be the exact string (case sensitive) as defined in the"},{"line_number":118,"context_line":"``VolumeDriverCore`` interface.  For example, we have: ``iSCSI``, ``FC``,"},{"line_number":119,"context_line":"``vmdk``, ``ceph``, ``DRBD``, ``SCSI``, ``scaleio``, ``file``, ``iSER``,"},{"line_number":120,"context_line":"``NVMe-oF``, and ``NFS``."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"This is important because volume types may be setting a specific"},{"line_number":123,"context_line":"``storage_protocol`` value in their extra specs, and we need it to be correct."}],"source_content_type":"text/x-rst","patch_set":1,"id":"824f21b6_fa1eac27","line":120,"in_reply_to":"04998793_b17fea97","updated":"2022-04-25 08:13:02.000000000","message":"True, I missed it.  The new patch no longer enumerates them, but instead refers to the constants file where they should all be present (added in the previous patch of the series).","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"715da3d4439b229731d78d7c5d73e9ecc35c0530","unresolved":true,"context_lines":[{"line_number":123,"context_line":"``storage_protocol`` value in their extra specs, and we need it to be correct."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"There are drivers that didn\u0027t follow this rule, so they are currently reporting"},{"line_number":126,"context_line":"a tuple of strings with their original reported value and the right one.  The"},{"line_number":127,"context_line":"Cinder scheduler is able to properly handle this scenario."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"We must not mistake the value of the ``storage_protocol`` with the identifier"},{"line_number":130,"context_line":"of the os-brick connector, which is returned by the ``initialize_connection``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"49cc387c_20dbe94c","line":127,"range":{"start_line":126,"start_character":74,"end_line":127,"end_character":58},"updated":"2022-04-08 13:01:21.000000000","message":"I was looking at the code to verify this, and I\u0027m not clear about why it works.\n\nThe affected drivers will be reporting something like this:\n\n    { ... ,  \"storage_protocol\": (\u0027nfs\u0027, \u0027NFS\u0027), ... }\n\nIn the capabilities filter,\nhttps://opendev.org/openstack/cinder/src/commit/85387cae8b3641d6d193c6550edbfb0de1d8384e/cinder/scheduler/filters/capabilities_filter.py#L78\nwe have:\n            # Make all capability values a list so we can handle lists\n            cap_list \u003d [cap] if not isinstance(cap, list) else cap\n\nSince we\u0027re explicitly checking for a list and not an iterable, I believe what\nwill happen here is that cap_list will become:\n  [(\u0027nfs\u0027, \u0027NFS\u0027)]\n\nand then when we iterate through the values looking for a match, it will be\nevaluated here:\nhttps://opendev.org/openstack/cinder/src/commit/85387cae8b3641d6d193c6550edbfb0de1d8384e/cinder/scheduler/filters/extra_specs_ops.py#L54\nand we\u0027ll return\n\n  return (\u0027nfs\u0027, \u0027NFS\u0027) \u003d\u003d \u0027nfs\u0027\n\nwhich won\u0027t match.  \n\nI couldn\u0027t find anything explicitly testing tuples in the unit tests, but I may be looking in the wrong place, or maybe conversion to a list is happening somewhere else?","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"3cd8dc8c7c6bff06d442eb9d53ff215ba7d1ba9b","unresolved":false,"context_lines":[{"line_number":123,"context_line":"``storage_protocol`` value in their extra specs, and we need it to be correct."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"There are drivers that didn\u0027t follow this rule, so they are currently reporting"},{"line_number":126,"context_line":"a tuple of strings with their original reported value and the right one.  The"},{"line_number":127,"context_line":"Cinder scheduler is able to properly handle this scenario."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"We must not mistake the value of the ``storage_protocol`` with the identifier"},{"line_number":130,"context_line":"of the os-brick connector, which is returned by the ``initialize_connection``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f65252d_e3820539","line":127,"range":{"start_line":126,"start_character":74,"end_line":127,"end_character":58},"in_reply_to":"49cc387c_20dbe94c","updated":"2022-04-25 08:13:02.000000000","message":"Thank you for the comment. The code was relying on how data is being serialized for RPC calls, where tuples are changed into lists.\n\nThe approach has been changed in the second patch, as agreed in the PTG, and drivers will not be sending multiple values.  Instead it\u0027s the schedulers that will adapt received values to map them.","commit_id":"c5b71106e6466bde4e0772de6c374fdcc6ba72af"}],"releasenotes/notes/fix-storage_protocol-6baf55e13249463c.yaml":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fd4d1ba6a07b0051ea4e4e3ccb6d168fb09a2e6d","unresolved":true,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``storage_protocol`` treats all variants of the protocol name as the"},{"line_number":5,"context_line":"    same regarding matches, so for example using FC, fc, or fibre_channel will"},{"line_number":6,"context_line":"    be treated equally in the scheduler, be it when filtering using the volume"},{"line_number":7,"context_line":"    type\u0027s extra specs or when using filter and goodness functions."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":2,"id":"f2729a6c_7ee2fda1","line":5,"range":{"start_line":5,"start_character":49,"end_line":5,"end_character":73},"updated":"2022-04-26 02:16:55.000000000","message":"nit: might be better as: \u0027FC\u0027, \u0027fc\u0027, or \u0027fibre_channel\u0027 (both here and at line 19).","commit_id":"39e518456c0fcde8a2111d583e52c5dfe6fa515d"}]}
