)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Alokedip Choudhuri \u003cAlokedip.Choudhuri@infoscale.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-05-18 19:11:14 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"New Cinder driver for InfoScale"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Supported Features"},{"line_number":10,"context_line":" - Volume Create/Delete"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"d69d2798_0ee0c75c","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":31},"updated":"2026-11-06 15:37:46.000000000","message":"You added a lists of  features but doesn\u0027t explain the architecture: volumes are files on the InfoScale cluster file system, managed through a REST API, attached through a new infoscale os-brick protocol, and NFS-exported to compute hosts outside the cluster. It also doesn\u0027t explain why the Nova and os-brick dependencies are needed.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alokedip Choudhuri \u003cAlokedip.Choudhuri@infoscale.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-05-18 19:11:14 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"New Cinder driver for InfoScale"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Supported Features"},{"line_number":10,"context_line":" - Volume Create/Delete"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"77f19c6c_c6d3d77d","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":31},"in_reply_to":"d69d2798_0ee0c75c","updated":"2026-11-08 18:39:57.000000000","message":"Corrected the commit message with detailed information about this driver just like it is being mentioned in the OS-brick one.","commit_id":"57913e0be13f989c0723bd47a194425374956666"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"0f22fc843af3c6ad989733baab94ff43fcc9382d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7850a4f4_7a982354","updated":"2026-04-24 14:50:39.000000000","message":"recheck","commit_id":"e7508adeec0cdb4e5db1e5962c0c7a0f75c07531"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"cea2e671e0c809da30ddc2118de82b15f1af8294","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1caec6c8_0c3a561f","in_reply_to":"7850a4f4_7a982354","updated":"2026-04-26 10:19:24.000000000","message":"Done","commit_id":"e7508adeec0cdb4e5db1e5962c0c7a0f75c07531"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"3f834f89db23f6ed97bbd0e77c0c4fa7410128f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f5209269_69046e21","updated":"2026-04-26 09:38:03.000000000","message":"recheck","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"cea2e671e0c809da30ddc2118de82b15f1af8294","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0c4bff62_3d1f3581","updated":"2026-04-26 10:19:24.000000000","message":"run infoscale-ci","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"baaabbdcab984a73b45cef2ed23477f0d00a3659","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f65ea4fd_c1bce547","updated":"2026-04-26 10:26:09.000000000","message":"run infoscale-ci","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"3bc8a3325ebf834092d142ad9c8cbee4119ed744","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f858c4d1_cadba131","updated":"2026-04-26 10:37:45.000000000","message":"run infoscale-ci","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"af0c1389_10c996ad","updated":"2026-11-06 15:37:46.000000000","message":"Hi Alokedip,\n\nWhile your patch has  the expected parts of a new driver are present (code, unit tests, docs, release note, support matrix), and earlier review comments were addressed. However, several correctness issues remain. I flagged many of the issues in line but also did an automated review[1], which points to many other issues. So please address them.\n\n\n[1] https://gist.github.com/sombrafam/c6df522e5842901f3499dc397de846b9","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"68b9e9b6_534e42c9","updated":"2026-11-08 18:39:57.000000000","message":"Thank you, @Erlon and @Eric for the detailed Review.\n\nI have addressed the review comments and also please find my responses inline.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"06edd139755e096697ba56ca78379364a2cf88ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"01fbcc1c_2d950b2d","updated":"2026-06-07 04:50:41.000000000","message":"Thank you, @jayaanand.borra@netapp.com for reviewing the code changes.\n\nHi @Eric Harney,\n\nI have incorporated the review comments in the latest patch set and successfully enabled/verified our in-house CI system.\n\nCould you please take another look when you have a moment?\n\nThanks!","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"798fe44d2f926e2afbc1835aea89f0199e3e14ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"b5f5168e_da028025","updated":"2026-08-21 14:57:26.000000000","message":"os-brick patch required hasn\u0027t made the release, it needs to merge first before this can go in.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"0d4f8aca839bc893cda618a22a80b78559559707","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"824713eb_16d077b6","updated":"2026-05-19 07:41:18.000000000","message":"run-infoscale_ci","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"43d15960_c3a2b429","in_reply_to":"01f1620d_6502cb3f","updated":"2026-11-08 18:39:57.000000000","message":"Done","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"90575137ff71132237e82723f7861107febee415","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"01f1620d_6502cb3f","in_reply_to":"01fbcc1c_2d950b2d","updated":"2026-07-07 12:01:59.000000000","message":"Hi Reviewers,\n\nFriendly bump on this patch. The previous comments have been integrated, the CI is green, and we currently have a +1. Looking for core review and feedback to help move this toward a +2.\n\nThank you!","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c79b5a30_e139b88d","in_reply_to":"af0c1389_10c996ad","updated":"2026-11-08 18:39:57.000000000","message":"Hi Erlon,\n\nThank you for the detailed review!\n\nI have incorporated the review comments in PS8. Please have a look.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"36e1fc3f_fbbc5e60","updated":"2026-11-11 16:20:56.000000000","message":"One thing holds me at -1: the driver publishes pool capabilities to the scheduler with their JSON types but validates extra specs against their string forms, so for any int or bool capability, such as the `nlog: [0, 1]` in your own fixture, the plain value the doc tells operators to set is rejected by the scheduler and the `\u003d\u003d 1` form the scheduler accepts is rejected by the driver. If the REST server only ever emits strings, tell me and it becomes a nit. Minors inline: pool placement, the empty-specs window after a restart, an unnamed pool breaking the scheduler, the exports-disabled path, NFS mount options, two doc points, and the module should be typed and listed in `pyproject.toml` for mypy as cinder asks of new code.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"c905dbfa9b61c5543b3fb9540e1e425a8630b2d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"5747b720_5c480158","updated":"2026-11-08 18:41:24.000000000","message":"run-infoscale_ci","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98b1f07c2c00d9d3ddba19140ced0472e595966e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"6c4e19ea_2408fbb3","updated":"2026-11-11 16:42:54.000000000","message":"run-infoscale_ci","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"}],"cinder/volume/drivers/infoscale.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dbfb26f434c1dc2ab1121416622e6976ae7c8e1b","unresolved":true,"context_lines":[{"line_number":99,"context_line":"    INFOSCALE_REST_OBJID \u003d \"InfoScaleObjId\""},{"line_number":100,"context_line":"    INFOSCALE_PROTONAME \u003d \"infoscale\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __init__(self, execute \u003d processutils.execute, *args, **kwargs):"},{"line_number":103,"context_line":"        super(InfoScaleCinderDriver, self).__init__(*args, **kwargs)"},{"line_number":104,"context_line":"        self.configuration.append_config_values(volume_opts)"},{"line_number":105,"context_line":"        self._base \u003d self.configuration.inf_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"ab13b78f_2a130031","line":102,"updated":"2026-04-30 18:34:45.000000000","message":"execute is declared and never used","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"6d44a6203884fb258abb9cdc63e3f703bda6a97a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    INFOSCALE_REST_OBJID \u003d \"InfoScaleObjId\""},{"line_number":100,"context_line":"    INFOSCALE_PROTONAME \u003d \"infoscale\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __init__(self, execute \u003d processutils.execute, *args, **kwargs):"},{"line_number":103,"context_line":"        super(InfoScaleCinderDriver, self).__init__(*args, **kwargs)"},{"line_number":104,"context_line":"        self.configuration.append_config_values(volume_opts)"},{"line_number":105,"context_line":"        self._base \u003d self.configuration.inf_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"ab7b9943_1905f745","line":102,"in_reply_to":"ab13b78f_2a130031","updated":"2026-05-01 14:08:03.000000000","message":"Corrected.","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dbfb26f434c1dc2ab1121416622e6976ae7c8e1b","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        if self._token is not None:"},{"line_number":144,"context_line":"            now \u003d timeutils.utcnow()"},{"line_number":145,"context_line":"            tdelta \u003d now - self._token_time"},{"line_number":146,"context_line":"            if timedelta(minutes \u003d 15) \u003c\u003d tdelta:"},{"line_number":147,"context_line":"                msg \u003d (_(\"InfoScaleCinderDriver: Token has been \""},{"line_number":148,"context_line":"                         \"expired now: %(now)s, token_issued: \""},{"line_number":149,"context_line":"                         \"%(token_issue_time)s, delta: %(delta)s\") % {"}],"source_content_type":"text/x-python","patch_set":3,"id":"34ffc16e_3bcb7d2a","line":146,"updated":"2026-04-30 18:34:45.000000000","message":"why 15 minutes hardcoded","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"6d44a6203884fb258abb9cdc63e3f703bda6a97a","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if self._token is not None:"},{"line_number":144,"context_line":"            now \u003d timeutils.utcnow()"},{"line_number":145,"context_line":"            tdelta \u003d now - self._token_time"},{"line_number":146,"context_line":"            if timedelta(minutes \u003d 15) \u003c\u003d tdelta:"},{"line_number":147,"context_line":"                msg \u003d (_(\"InfoScaleCinderDriver: Token has been \""},{"line_number":148,"context_line":"                         \"expired now: %(now)s, token_issued: \""},{"line_number":149,"context_line":"                         \"%(token_issue_time)s, delta: %(delta)s\") % {"}],"source_content_type":"text/x-python","patch_set":3,"id":"a32c9652_97f9927f","line":146,"in_reply_to":"34ffc16e_3bcb7d2a","updated":"2026-05-01 14:08:03.000000000","message":"Corrected. \n\nI have made one configuration parameter for the token expiry time. Infoscale REST API token\u0027s expiry time is 15 minutes. Hence made the default value of the newly configurable parameter as \"15\".","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dbfb26f434c1dc2ab1121416622e6976ae7c8e1b","unresolved":true,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def _do_volume_snapshot(self, src_vol, tgt_vol):"},{"line_number":283,"context_line":"        input_data \u003d {\u0027SnapshotName\u0027: tgt_vol.name}"},{"line_number":284,"context_line":"        src_volid \u003d src_vol.metadata[self.INFOSCALE_REST_OBJID]"},{"line_number":285,"context_line":"        api_endpoint \u003d self._create_cindersnapshot.format(src_volid)"},{"line_number":286,"context_line":"        resp, __ \u003d self._rest_api(api_endpoint, self.VA_POST_STR, input_data)"},{"line_number":287,"context_line":"        return resp[\u0027SnapshotId\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"972e65c4_040af333","line":284,"updated":"2026-04-30 18:34:45.000000000","message":"INFOSCALE_REST_OBJID may miss. get with default will help","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"6d44a6203884fb258abb9cdc63e3f703bda6a97a","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def _do_volume_snapshot(self, src_vol, tgt_vol):"},{"line_number":283,"context_line":"        input_data \u003d {\u0027SnapshotName\u0027: tgt_vol.name}"},{"line_number":284,"context_line":"        src_volid \u003d src_vol.metadata[self.INFOSCALE_REST_OBJID]"},{"line_number":285,"context_line":"        api_endpoint \u003d self._create_cindersnapshot.format(src_volid)"},{"line_number":286,"context_line":"        resp, __ \u003d self._rest_api(api_endpoint, self.VA_POST_STR, input_data)"},{"line_number":287,"context_line":"        return resp[\u0027SnapshotId\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"0b293358_06d67614","line":284,"in_reply_to":"972e65c4_040af333","updated":"2026-05-01 14:08:03.000000000","message":"Corrected.","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dbfb26f434c1dc2ab1121416622e6976ae7c8e1b","unresolved":true,"context_lines":[{"line_number":297,"context_line":"    def _build_volume_payload(self, volume):"},{"line_number":298,"context_line":"        vtype \u003d volume.volume_type"},{"line_number":299,"context_line":"        vtype_name \u003d vtype.get(\u0027name\u0027, None)"},{"line_number":300,"context_line":"        vtype_extraspecs \u003d vtype.extra_specs if vtype else {}"},{"line_number":301,"context_line":"        volcreate_payload \u003d {}"},{"line_number":302,"context_line":"        pv_props \u003d {}"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"39e29b6b_3e7253dc","line":300,"updated":"2026-04-30 18:34:45.000000000","message":"vtype is a object or dict? .get not work for object.","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"6d44a6203884fb258abb9cdc63e3f703bda6a97a","unresolved":false,"context_lines":[{"line_number":297,"context_line":"    def _build_volume_payload(self, volume):"},{"line_number":298,"context_line":"        vtype \u003d volume.volume_type"},{"line_number":299,"context_line":"        vtype_name \u003d vtype.get(\u0027name\u0027, None)"},{"line_number":300,"context_line":"        vtype_extraspecs \u003d vtype.extra_specs if vtype else {}"},{"line_number":301,"context_line":"        volcreate_payload \u003d {}"},{"line_number":302,"context_line":"        pv_props \u003d {}"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c91dab2c_2ae38b3f","line":300,"in_reply_to":"39e29b6b_3e7253dc","updated":"2026-05-01 14:08:03.000000000","message":"vtype is a VolumeType object. However, it supports dict-like access (.get(), []) because it inherits from CinderObjectDictCompat. But I have updated the code to access the name like vtype.name to keep it consistent with other drivers.","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dbfb26f434c1dc2ab1121416622e6976ae7c8e1b","unresolved":true,"context_lines":[{"line_number":344,"context_line":"        \"\"\"Make sure volume is exported.\"\"\""},{"line_number":345,"context_line":"        pass"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def check_for_setup_error(self):"},{"line_number":348,"context_line":"        pass"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def do_setup(self, context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"67bf508d_eb55dc77","line":347,"updated":"2026-04-30 18:34:45.000000000","message":"you may check config errors hear. New driver needs to inform config issue to user","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"6d44a6203884fb258abb9cdc63e3f703bda6a97a","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        \"\"\"Make sure volume is exported.\"\"\""},{"line_number":345,"context_line":"        pass"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def check_for_setup_error(self):"},{"line_number":348,"context_line":"        pass"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def do_setup(self, context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"f7614ad3_3377faa0","line":347,"in_reply_to":"67bf508d_eb55dc77","updated":"2026-05-01 14:08:03.000000000","message":"Updated.","commit_id":"392eb2802dde23d69261aa2920ec184ba2702b7f"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"9a695034fa184b41baaa236d3a28e91af874a880","unresolved":true,"context_lines":[{"line_number":550,"context_line":"        metadata \u003d volume.metadata or {}"},{"line_number":551,"context_line":"        return {\u0027provider_location\u0027: volume.provider_location,"},{"line_number":552,"context_line":"                \u0027metadata\u0027: {**metadata,"},{"line_number":553,"context_line":"                             self.INFOSCALE_REST_OBJID: vol_objid}}"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"},{"line_number":556,"context_line":"    def create_volume(self, volume):"}],"source_content_type":"text/x-python","patch_set":5,"id":"f1241c3b_b1981e07","line":553,"updated":"2026-05-05 20:51:51.000000000","message":"This looks like it\u0027s persisting info about identifying the volume in the volume metadata. The volume metadata is user-editable so this isn\u0027t safe to do - should be in the provider_location or provider_id field.","commit_id":"a87497ca6a24faa90e8fb8c32dd4a30d0e49aa69"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"29fdb2f8e9aec0a2a2da10f9c209467598aebbf0","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        metadata \u003d volume.metadata or {}"},{"line_number":551,"context_line":"        return {\u0027provider_location\u0027: volume.provider_location,"},{"line_number":552,"context_line":"                \u0027metadata\u0027: {**metadata,"},{"line_number":553,"context_line":"                             self.INFOSCALE_REST_OBJID: vol_objid}}"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"},{"line_number":556,"context_line":"    def create_volume(self, volume):"}],"source_content_type":"text/x-python","patch_set":5,"id":"adc4e377_258f2e52","line":553,"in_reply_to":"75014213_f267bd75","updated":"2026-05-07 13:46:30.000000000","message":"Typo, made the code changes to store the ID in \"provider_id\".","commit_id":"a87497ca6a24faa90e8fb8c32dd4a30d0e49aa69"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"ba73e7190b7a952c505906ebb28fb8eb4d43fa16","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        metadata \u003d volume.metadata or {}"},{"line_number":551,"context_line":"        return {\u0027provider_location\u0027: volume.provider_location,"},{"line_number":552,"context_line":"                \u0027metadata\u0027: {**metadata,"},{"line_number":553,"context_line":"                             self.INFOSCALE_REST_OBJID: vol_objid}}"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"},{"line_number":556,"context_line":"    def create_volume(self, volume):"}],"source_content_type":"text/x-python","patch_set":5,"id":"75014213_f267bd75","line":553,"in_reply_to":"f1241c3b_b1981e07","updated":"2026-05-07 13:39:32.000000000","message":"Hi Eric,\n\nThank you for the review!\n\nI have incorporated the changes to store the ID in the \"provider_location\".","commit_id":"a87497ca6a24faa90e8fb8c32dd4a30d0e49aa69"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"169dfd00dea13169cf637ffeb8bee4cf54360575","unresolved":true,"context_lines":[{"line_number":45,"context_line":"               help\u003d\u0027Virtual IP of InfoScale REST server.\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027inf_rest\u0027,"},{"line_number":47,"context_line":"               help\u003d\u0027InfoScale REST API endpoint sub-domain.\u0027),"},{"line_number":48,"context_line":"    cfg.IntOpt(\u0027inf_port\u0027,"},{"line_number":49,"context_line":"               default\u003d5637,"},{"line_number":50,"context_line":"               help\u003d\u0027InfoScale server REST port.\u0027),"},{"line_number":51,"context_line":"    cfg.IntOpt(\u0027inf_token_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"316f3e3c_e4632b46","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":14},"updated":"2026-11-06 19:51:53.000000000","message":"```suggestion\n    cfg.PortOpt(\u0027inf_port\u0027,\n```","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":45,"context_line":"               help\u003d\u0027Virtual IP of InfoScale REST server.\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027inf_rest\u0027,"},{"line_number":47,"context_line":"               help\u003d\u0027InfoScale REST API endpoint sub-domain.\u0027),"},{"line_number":48,"context_line":"    cfg.IntOpt(\u0027inf_port\u0027,"},{"line_number":49,"context_line":"               default\u003d5637,"},{"line_number":50,"context_line":"               help\u003d\u0027InfoScale server REST port.\u0027),"},{"line_number":51,"context_line":"    cfg.IntOpt(\u0027inf_token_interval\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"14cf1f46_8e45c1c0","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":14},"in_reply_to":"316f3e3c_e4632b46","updated":"2026-11-08 18:39:57.000000000","message":"Corrected and also renamed these config parameters from inf_* to infoscale_*.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"169dfd00dea13169cf637ffeb8bee4cf54360575","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    cfg.StrOpt(\u0027inf_restcert\u0027,"},{"line_number":56,"context_line":"               help\u003d\u0027InfoScale server REST authentication client \u0027"},{"line_number":57,"context_line":"                    \u0027certificate.\u0027),"},{"line_number":58,"context_line":"    cfg.StrOpt(\u0027inf_restkey\u0027,"},{"line_number":59,"context_line":"               help\u003d\u0027InfoScale server REST authentication client \u0027"},{"line_number":60,"context_line":"                    \u0027private key.\u0027),"},{"line_number":61,"context_line":"    cfg.BoolOpt(\u0027inf_export\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"c6ffe253_d406e8c8","line":58,"updated":"2026-11-06 19:51:53.000000000","message":"Needs secret\u003dTrue","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    cfg.StrOpt(\u0027inf_restcert\u0027,"},{"line_number":56,"context_line":"               help\u003d\u0027InfoScale server REST authentication client \u0027"},{"line_number":57,"context_line":"                    \u0027certificate.\u0027),"},{"line_number":58,"context_line":"    cfg.StrOpt(\u0027inf_restkey\u0027,"},{"line_number":59,"context_line":"               help\u003d\u0027InfoScale server REST authentication client \u0027"},{"line_number":60,"context_line":"                    \u0027private key.\u0027),"},{"line_number":61,"context_line":"    cfg.BoolOpt(\u0027inf_export\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fb745783_3039985d","line":58,"in_reply_to":"c6ffe253_d406e8c8","updated":"2026-11-08 18:39:57.000000000","message":"Marked as resolved.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"169dfd00dea13169cf637ffeb8bee4cf54360575","unresolved":true,"context_lines":[{"line_number":61,"context_line":"    cfg.BoolOpt(\u0027inf_export\u0027,"},{"line_number":62,"context_line":"                help\u003d\u0027InfoScale storage domain-type from which \u0027"},{"line_number":63,"context_line":"                     \u0027shares are served.\u0027),"},{"line_number":64,"context_line":"    cfg.BoolOpt(\u0027inf_ssl_verify\u0027,"},{"line_number":65,"context_line":"                default\u003dTrue,"},{"line_number":66,"context_line":"                help\u003d\u0027Verify SSL certificate of the InfoScale \u0027"},{"line_number":67,"context_line":"                     \u0027REST server. Set to False only if using \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"2deca3e9_2044b3ad","line":64,"range":{"start_line":64,"start_character":16,"end_line":64,"end_character":32},"updated":"2026-11-06 19:51:53.000000000","message":"This should just use the existing \"driver_ssl_cert_verify\" option rather than creating a new one.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    cfg.BoolOpt(\u0027inf_export\u0027,"},{"line_number":62,"context_line":"                help\u003d\u0027InfoScale storage domain-type from which \u0027"},{"line_number":63,"context_line":"                     \u0027shares are served.\u0027),"},{"line_number":64,"context_line":"    cfg.BoolOpt(\u0027inf_ssl_verify\u0027,"},{"line_number":65,"context_line":"                default\u003dTrue,"},{"line_number":66,"context_line":"                help\u003d\u0027Verify SSL certificate of the InfoScale \u0027"},{"line_number":67,"context_line":"                     \u0027REST server. Set to False only if using \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"17db3f94_c2e96909","line":64,"range":{"start_line":64,"start_character":16,"end_line":64,"end_character":32},"in_reply_to":"2deca3e9_2044b3ad","updated":"2026-11-08 18:39:57.000000000","message":"Done. Using these default config parameter instead of adding new ones.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":407,"context_line":"    def do_setup(self, context):"},{"line_number":408,"context_line":"        \"\"\"Any initialization the volume driver does while starting.\"\"\""},{"line_number":409,"context_line":"        super(InfoScaleCinderDriver, self).do_setup(context)"},{"line_number":410,"context_line":"        self._nova \u003d compute.API()"},{"line_number":411,"context_line":"        ondemand_export \u003d f\"{self._server_ip}:\""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        self.shares \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"c536494d_06779b5d","line":410,"range":{"start_line":410,"start_character":8,"end_line":410,"end_character":34},"updated":"2026-11-06 15:37:46.000000000","message":"What are you using this for?","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    def do_setup(self, context):"},{"line_number":408,"context_line":"        \"\"\"Any initialization the volume driver does while starting.\"\"\""},{"line_number":409,"context_line":"        super(InfoScaleCinderDriver, self).do_setup(context)"},{"line_number":410,"context_line":"        self._nova \u003d compute.API()"},{"line_number":411,"context_line":"        ondemand_export \u003d f\"{self._server_ip}:\""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        self.shares \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"2963c126_dfd3846b","line":410,"range":{"start_line":410,"start_character":8,"end_line":410,"end_character":34},"in_reply_to":"c536494d_06779b5d","updated":"2026-11-08 18:39:57.000000000","message":"It was a dead assignment. I have removed it.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":410,"context_line":"        self._nova \u003d compute.API()"},{"line_number":411,"context_line":"        ondemand_export \u003d f\"{self._server_ip}:\""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        self.shares \u003d {"},{"line_number":414,"context_line":"            f\"{ondemand_export}\": None"},{"line_number":415,"context_line":"        }"},{"line_number":416,"context_line":"        self._mounted_shares.append(ondemand_export)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"c8aeed78_5a4829ac","line":415,"range":{"start_line":413,"start_character":8,"end_line":415,"end_character":9},"updated":"2026-11-06 15:37:46.000000000","message":"Please simplify this dic instead of creating a this indirection link:\n\nself.shares \u003d f\"{self._server_ip: None}\"\n\nSomething like this ^","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        self._nova \u003d compute.API()"},{"line_number":411,"context_line":"        ondemand_export \u003d f\"{self._server_ip}:\""},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        self.shares \u003d {"},{"line_number":414,"context_line":"            f\"{ondemand_export}\": None"},{"line_number":415,"context_line":"        }"},{"line_number":416,"context_line":"        self._mounted_shares.append(ondemand_export)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"6a6f68b5_357ceefe","line":415,"range":{"start_line":413,"start_character":8,"end_line":415,"end_character":9},"in_reply_to":"c8aeed78_5a4829ac","updated":"2026-11-08 18:39:57.000000000","message":"I rethink and have figured out a way which would make this part of the code simple. Hence in PS8 I have refactored it.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":472,"context_line":"        return conn_info"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def _update_volume_stats(self):"},{"line_number":475,"context_line":"        self._stats[\"volume_backend_name\"] \u003d self.driver_volume_type"},{"line_number":476,"context_line":"        self._stats[\"vendor_name\"] \u003d \u0027InfoScale\u0027"},{"line_number":477,"context_line":"        self._stats[\"reserved_percentage\"] \u003d 0"},{"line_number":478,"context_line":"        self._stats[\"driver_version\"] \u003d \"1.0\""}],"source_content_type":"text/x-python","patch_set":7,"id":"decb44e0_25a0abcd","line":475,"range":{"start_line":475,"start_character":46,"end_line":475,"end_character":68},"updated":"2026-11-06 15:37:46.000000000","message":"This should not be hardcoded, and should get the configs from the configuration.\nconfiguration.volume_backend_name","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        return conn_info"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    def _update_volume_stats(self):"},{"line_number":475,"context_line":"        self._stats[\"volume_backend_name\"] \u003d self.driver_volume_type"},{"line_number":476,"context_line":"        self._stats[\"vendor_name\"] \u003d \u0027InfoScale\u0027"},{"line_number":477,"context_line":"        self._stats[\"reserved_percentage\"] \u003d 0"},{"line_number":478,"context_line":"        self._stats[\"driver_version\"] \u003d \"1.0\""}],"source_content_type":"text/x-python","patch_set":7,"id":"2eedb5a0_e4cbf6f1","line":475,"range":{"start_line":475,"start_character":46,"end_line":475,"end_character":68},"in_reply_to":"decb44e0_25a0abcd","updated":"2026-11-08 18:39:57.000000000","message":"Corrected.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":474,"context_line":"    def _update_volume_stats(self):"},{"line_number":475,"context_line":"        self._stats[\"volume_backend_name\"] \u003d self.driver_volume_type"},{"line_number":476,"context_line":"        self._stats[\"vendor_name\"] \u003d \u0027InfoScale\u0027"},{"line_number":477,"context_line":"        self._stats[\"reserved_percentage\"] \u003d 0"},{"line_number":478,"context_line":"        self._stats[\"driver_version\"] \u003d \"1.0\""},{"line_number":479,"context_line":"        self._stats[\"storage_protocol\"] \u003d self.driver_volume_type"},{"line_number":480,"context_line":"        self._stats[\u0027QoS_support\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"ddf8d563_2d1951f0","line":477,"range":{"start_line":477,"start_character":8,"end_line":477,"end_character":46},"updated":"2026-11-06 15:37:46.000000000","message":"You should get this from the config options. That is available to all drivers","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":474,"context_line":"    def _update_volume_stats(self):"},{"line_number":475,"context_line":"        self._stats[\"volume_backend_name\"] \u003d self.driver_volume_type"},{"line_number":476,"context_line":"        self._stats[\"vendor_name\"] \u003d \u0027InfoScale\u0027"},{"line_number":477,"context_line":"        self._stats[\"reserved_percentage\"] \u003d 0"},{"line_number":478,"context_line":"        self._stats[\"driver_version\"] \u003d \"1.0\""},{"line_number":479,"context_line":"        self._stats[\"storage_protocol\"] \u003d self.driver_volume_type"},{"line_number":480,"context_line":"        self._stats[\u0027QoS_support\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":7,"id":"2bab764f_c7907d4d","line":477,"range":{"start_line":477,"start_character":8,"end_line":477,"end_character":46},"in_reply_to":"ddf8d563_2d1951f0","updated":"2026-11-08 18:39:57.000000000","message":"Done. Reading it from the config options.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":475,"context_line":"        self._stats[\"volume_backend_name\"] \u003d self.driver_volume_type"},{"line_number":476,"context_line":"        self._stats[\"vendor_name\"] \u003d \u0027InfoScale\u0027"},{"line_number":477,"context_line":"        self._stats[\"reserved_percentage\"] \u003d 0"},{"line_number":478,"context_line":"        self._stats[\"driver_version\"] \u003d \"1.0\""},{"line_number":479,"context_line":"        self._stats[\"storage_protocol\"] \u003d self.driver_volume_type"},{"line_number":480,"context_line":"        self._stats[\u0027QoS_support\u0027] \u003d False"},{"line_number":481,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"38b75ad0_fb19e6f5","line":478,"range":{"start_line":478,"start_character":8,"end_line":478,"end_character":45},"updated":"2026-11-06 15:37:46.000000000","message":"VERSION","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        self._stats[\"volume_backend_name\"] \u003d self.driver_volume_type"},{"line_number":476,"context_line":"        self._stats[\"vendor_name\"] \u003d \u0027InfoScale\u0027"},{"line_number":477,"context_line":"        self._stats[\"reserved_percentage\"] \u003d 0"},{"line_number":478,"context_line":"        self._stats[\"driver_version\"] \u003d \"1.0\""},{"line_number":479,"context_line":"        self._stats[\"storage_protocol\"] \u003d self.driver_volume_type"},{"line_number":480,"context_line":"        self._stats[\u0027QoS_support\u0027] \u003d False"},{"line_number":481,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"a7ea0913_c8af8c8d","line":478,"range":{"start_line":478,"start_character":8,"end_line":478,"end_character":45},"in_reply_to":"38b75ad0_fb19e6f5","updated":"2026-11-08 18:39:57.000000000","message":"Done.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":511,"context_line":"        pass"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{src_vref.id}\u0027)"},{"line_number":514,"context_line":"    def create_cloned_volume(self, volume, src_vref):"},{"line_number":515,"context_line":"        \"\"\"Creates a clone of the specified volume.\"\"\""},{"line_number":516,"context_line":"        clone_objid \u003d self._do_clone_volume(src_vref, volume)"},{"line_number":517,"context_line":"        return {\u0027provider_location\u0027: src_vref.provider_location,"}],"source_content_type":"text/x-python","patch_set":7,"id":"54c36cd3_b235876c","line":514,"range":{"start_line":514,"start_character":8,"end_line":514,"end_character":28},"updated":"2026-11-06 15:37:46.000000000","message":"You need to check for the size and extend if the volume being created is bigger than the source volume, just like you did for this snapshot","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":511,"context_line":"        pass"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{src_vref.id}\u0027)"},{"line_number":514,"context_line":"    def create_cloned_volume(self, volume, src_vref):"},{"line_number":515,"context_line":"        \"\"\"Creates a clone of the specified volume.\"\"\""},{"line_number":516,"context_line":"        clone_objid \u003d self._do_clone_volume(src_vref, volume)"},{"line_number":517,"context_line":"        return {\u0027provider_location\u0027: src_vref.provider_location,"}],"source_content_type":"text/x-python","patch_set":7,"id":"e162c432_d5c2b6a4","line":514,"range":{"start_line":514,"start_character":8,"end_line":514,"end_character":28},"in_reply_to":"54c36cd3_b235876c","updated":"2026-11-08 18:39:57.000000000","message":"I missed this in the clone function. I have incorporated it.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":530,"context_line":"               \u0027volume\u0027: volume.name,"},{"line_number":531,"context_line":"               \u0027snapshot\u0027: snapshot.id})"},{"line_number":532,"context_line":"        LOG.debug(msg)"},{"line_number":533,"context_line":"        if vol_size !\u003d snap_size:"},{"line_number":534,"context_line":"            try:"},{"line_number":535,"context_line":"                self.extend_volume(volume, vol_size)"},{"line_number":536,"context_line":"            except exception.ExtendVolumeError as ex:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fd8394c6_59d36c06","line":533,"range":{"start_line":533,"start_character":11,"end_line":533,"end_character":32},"updated":"2026-11-06 15:37:46.000000000","message":"\"\u003e\"","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":530,"context_line":"               \u0027volume\u0027: volume.name,"},{"line_number":531,"context_line":"               \u0027snapshot\u0027: snapshot.id})"},{"line_number":532,"context_line":"        LOG.debug(msg)"},{"line_number":533,"context_line":"        if vol_size !\u003d snap_size:"},{"line_number":534,"context_line":"            try:"},{"line_number":535,"context_line":"                self.extend_volume(volume, vol_size)"},{"line_number":536,"context_line":"            except exception.ExtendVolumeError as ex:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1c15422f_a8343a41","line":533,"range":{"start_line":533,"start_character":11,"end_line":533,"end_character":32},"in_reply_to":"fd8394c6_59d36c06","updated":"2026-11-08 18:39:57.000000000","message":"Done.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        if vol_size !\u003d snap_size:"},{"line_number":534,"context_line":"            try:"},{"line_number":535,"context_line":"                self.extend_volume(volume, vol_size)"},{"line_number":536,"context_line":"            except exception.ExtendVolumeError as ex:"},{"line_number":537,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":538,"context_line":"                    msg \u003d (_(\u0027InfoScaleCinderDriver: Failed to extend \u0027"},{"line_number":539,"context_line":"                             \u0027Volume: %(err)s\u0027) % {\u0027err\u0027: ex.msg})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ed3dfb87_0cf39834","line":536,"range":{"start_line":536,"start_character":12,"end_line":536,"end_character":46},"updated":"2026-11-06 15:37:46.000000000","message":"The extend_volume raises VolumeBackendAPIException (via _rest_api), not ExtendVolumeError. The cleanup in the except block never runs, so a failed extend leaves an orphan volume on the backend. ex.msg is also fragile.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        if vol_size !\u003d snap_size:"},{"line_number":534,"context_line":"            try:"},{"line_number":535,"context_line":"                self.extend_volume(volume, vol_size)"},{"line_number":536,"context_line":"            except exception.ExtendVolumeError as ex:"},{"line_number":537,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":538,"context_line":"                    msg \u003d (_(\u0027InfoScaleCinderDriver: Failed to extend \u0027"},{"line_number":539,"context_line":"                             \u0027Volume: %(err)s\u0027) % {\u0027err\u0027: ex.msg})"}],"source_content_type":"text/x-python","patch_set":7,"id":"6e56b45f_73f14c29","line":536,"range":{"start_line":536,"start_character":12,"end_line":536,"end_character":46},"in_reply_to":"ed3dfb87_0cf39834","updated":"2026-11-08 18:39:57.000000000","message":"Corrected.","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"f5ca2eb9c36edf767aa07e103ef0a351c79504a4","unresolved":true,"context_lines":[{"line_number":586,"context_line":"        # restore it to the original volume size."},{"line_number":587,"context_line":"        #"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"        self.extend_volume(volume, volume.size)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"},{"line_number":592,"context_line":"    def extend_volume(self, volume, size):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8f9349_b2dd24d8","line":589,"range":{"start_line":589,"start_character":8,"end_line":589,"end_character":47},"updated":"2026-11-06 15:37:46.000000000","message":"This does not look right. Why are you extending the volume to its own size? How do you handle when the image is bigger than the volume?","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"98eaeb5c3dc5a360cb00a2590392fe710ffe7080","unresolved":false,"context_lines":[{"line_number":586,"context_line":"        # restore it to the original volume size."},{"line_number":587,"context_line":"        #"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"        self.extend_volume(volume, volume.size)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"    @coordination.synchronized(\u0027{self.driver_prefix}-{volume.id}\u0027)"},{"line_number":592,"context_line":"    def extend_volume(self, volume, size):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5c91ce83_22edae45","line":589,"range":{"start_line":589,"start_character":8,"end_line":589,"end_character":47},"in_reply_to":"7a8f9349_b2dd24d8","updated":"2026-11-08 18:39:57.000000000","message":"Here is my understanding: Cinder prevents `copy_image_to_volume` if the source image exceeds the target volume size. If the image is smaller than the volume, the volume object is truncated to match the image size, then subsequently extended back to its original requested capacity.\n\nPlease correct me if this flow is inaccurate","commit_id":"57913e0be13f989c0723bd47a194425374956666"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":90,"context_line":"    # ThirdPartySystems wiki page"},{"line_number":91,"context_line":"    CI_WIKI_NAME \u003d \u0027InfoScale_CI\u0027"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    driver_volume_type \u003d \u0027infoscale\u0027"},{"line_number":94,"context_line":"    driver_prefix \u003d driver_volume_type"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    API_PATH \u003d \u0027/infoscale/api/2.0\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"401fc394_ba3818aa","line":93,"updated":"2026-11-11 16:20:56.000000000","message":"Nit: `storage_protocol` at 355 should come from `cinder.common.constants` as `constants.LIGHTOS` and `constants.STORPOOL` do (`lightos.py:1331`, `storpool.py:368`); add `INFOSCALE \u003d \u0027infoscale\u0027` there and use it here and at 355.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":102,"context_line":"    # The InfoScale REST API limits the length of the mount point base."},{"line_number":103,"context_line":"    MOUNT_POINT_BASE_MAX_LENGTH \u003d 64"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":106,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":107,"context_line":"        self.configuration.append_config_values(volume_opts)"},{"line_number":108,"context_line":"        conf \u003d self.configuration"}],"source_content_type":"text/x-python","patch_set":8,"id":"0ac3b087_0fda5923","line":105,"updated":"2026-11-11 16:20:56.000000000","message":"The module carries no type annotations: mypy on this file alone reports 5 errors (`specs` at 261, `stats` at 351, `supported_specs` at 369, and the `stats[\u0027pools\u0027].append` at 386 twice), and `cinder.volume.drivers.infoscale` is not in the `[tool.mypy] modules` list in `pyproject.toml`, so the cinder-mypy job never sees it. `doc/source/contributor/gerrit.rst:191-195` asks new code to include mypy constructs; please annotate the signatures, type the three dicts, and add the module to that list. The PS5 os-brick connector already did this.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _present_in_cluster(self, cluster_name, host):"},{"line_number":237,"context_line":"        \"\"\"Return whether a host is a node of the InfoScale cluster.\"\"\""},{"line_number":238,"context_line":"        system_name \u003d host.split(\u0027.\u0027)[0]"},{"line_number":239,"context_line":"        path \u003d \u0027/clusters/%s/systems/%s\u0027 % (parse.quote(cluster_name, safe\u003d\u0027\u0027),"},{"line_number":240,"context_line":"                                            parse.quote(system_name, safe\u003d\u0027\u0027))"},{"line_number":241,"context_line":"        result, status \u003d self._rest_api(\u0027GET\u0027, path,"}],"source_content_type":"text/x-python","patch_set":8,"id":"6eda65a6_8f158dfb","line":238,"updated":"2026-11-11 16:20:56.000000000","message":"Nit: this probes the InfoScale system named by the first label of `connector[\u0027host\u0027]`. For cinder-volume\u0027s own attaches that is the host name, but for Nova it is `[DEFAULT] host`, which Nova documents as \"Hostname, FQDN or IP address\", so a compute with an alias or an IP there is treated as external, and the INFO at 245-249 logs the host and the REST detail but not the `system_name` actually sent. Say at rst 124-125 which name is compared, and add `system_name` to that log line.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":285,"context_line":"                   {\u0027type\u0027: volume_type.name, \u0027format\u0027: volume_format})"},{"line_number":286,"context_line":"            raise exception.InvalidVolumeType(reason\u003dmsg)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        pv_props \u003d {}"},{"line_number":289,"context_line":"        for key, supported_values in self._supported_specs.items():"},{"line_number":290,"context_line":"            if key not in specs:"},{"line_number":291,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":8,"id":"9d947547_67b7dd40","line":288,"updated":"2026-11-11 16:20:56.000000000","message":"This fills `PvProps` only from the type\u0027s extra specs and never reads the pool the scheduler chose from `volume.host`, while 386 advertises one pool per disk group, so with two disk groups and a type without `pool_name` the scheduler consumes capacity on the pool it picked and the backend places the volume where it likes; rst 136-139 documents this rather than fixing Erlon\u0027s point. The usual `volume_utils.extract_host(volume.host, \u0027pool\u0027)` is not a drop-in because 299-301 keep a type\u0027s volumes in storage named after the type, so say how the backend behaves when a later volume of a type is scheduled to a different disk group and pass the scheduled pool when the type sets none, or report a single aggregate pool so the scheduler cannot pick one you ignore. At minimum raise `InvalidVolumeType` here when more than one pool is reported and the type has no `pool_name`.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":286,"context_line":"            raise exception.InvalidVolumeType(reason\u003dmsg)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        pv_props \u003d {}"},{"line_number":289,"context_line":"        for key, supported_values in self._supported_specs.items():"},{"line_number":290,"context_line":"            if key not in specs:"},{"line_number":291,"context_line":"                continue"},{"line_number":292,"context_line":"            if specs[key] not in supported_values:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fdec0af1_9a89e2a8","line":289,"updated":"2026-11-11 16:20:56.000000000","message":"`_supported_specs` is `{}` from `__init__` at 135 until the first successful stats update at 387, and the except branch at 360-367 leaves it empty, so a create in that window validates `volume_format` at 280-286 and then drops it with `pool_name` and `layout`, posting `PvProps\u003d{\u0027vol_name\u0027: ...}` and letting the backend choose, which is what rst 136-140 says `pool_name` prevents. The window is real on a restart: `check_for_setup_error` makes the same GET at 344 and discards the body, and `manager.py:637` publishes capabilities before `service.py:243` starts the RPC server, so if that publish GET fails the queued creates run against `{}`. Parse the stat response you already fetch in `check_for_setup_error` into `_supported_specs`, or raise here when it is empty, and add the empty case; every payload test preloads the dict (`test_infoscale.py:485-490`, `683-684`).","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":377,"context_line":"                        if fmt in self.SUPPORTED_FORMATS]"},{"line_number":378,"context_line":"                pool.update(capabilities)"},{"line_number":379,"context_line":"                pool[\u0027reserved_percentage\u0027] \u003d reserved_percentage"},{"line_number":380,"context_line":"                supported_specs[\u0027pool_name\u0027].add(str(pool.get(\u0027pool_name\u0027)))"},{"line_number":381,"context_line":"                for key, values in capabilities.items():"},{"line_number":382,"context_line":"                    if not isinstance(values, list):"},{"line_number":383,"context_line":"                        values \u003d [values]"}],"source_content_type":"text/x-python","patch_set":8,"id":"935434d1_8ef1ab81","line":380,"updated":"2026-11-11 16:20:56.000000000","message":"`str(pool.get(\u0027pool_name\u0027))` tolerates a pool without a name, records the string `None` as supported, and 386 forwards the dict unchanged. `host_manager.py:239` then does `pool_cap[\u0027pool_name\u0027]` unguarded inside `_update_backend_state_map`, which runs over every service on each scheduling pass, so one unnamed pool from this server fails every create on that scheduler, not just this backend\u0027s. You guard the sibling keys at 370-371; please skip a pool with no `pool_name` with a warning, and add a ddt case to `test_infoscale.py:904` such as `{\u0027pools\u0027: [{\u0027total_capacity_gb\u0027: 10, \u0027free_capacity_gb\u0027: 10}]}` asserting `stats[\u0027pools\u0027] \u003d\u003d []`.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":381,"context_line":"                for key, values in capabilities.items():"},{"line_number":382,"context_line":"                    if not isinstance(values, list):"},{"line_number":383,"context_line":"                        values \u003d [values]"},{"line_number":384,"context_line":"                    supported_specs.setdefault(key, set()).update("},{"line_number":385,"context_line":"                        str(value) for value in values)"},{"line_number":386,"context_line":"                stats[\u0027pools\u0027].append(pool)"},{"line_number":387,"context_line":"            self._supported_specs \u003d supported_specs"}],"source_content_type":"text/x-python","patch_set":8,"id":"01221d1b_4b808826","line":384,"updated":"2026-11-11 16:20:56.000000000","message":"`pool.update(capabilities)` at 378 hands the scheduler the values with the JSON types the server sent, but this line stringifies them for the check at 292. Extra-spec values are always strings, and `CapabilitiesFilter` compares each list element with `extra_specs_ops.match`, where `match(1, \u00271\u0027)` and `match(True, \u0027True\u0027)` are False (`extra_specs_ops.py:54-55, value \u003d\u003d req`) while `match(1, \u0027\u003d\u003d 1\u0027)` is True. So for an int or bool capability like the `\u0027nlog\u0027: [0, 1]` in `test_infoscale.py:831`, the plain value the doc tells operators to set at rst 148-151 filters every pool out with \"No valid backend\", and the `\u003d\u003d 1` form the scheduler accepts fails here at 292-297 with `InvalidVolumeType`; only string capabilities work end to end. Normalise the values to lists of strings once, before `pool.update()`, reuse that for `_supported_specs`, and add a test that pushes an int capability through `CapabilitiesFilter` and `_build_volume_payload` with the same extra spec. If the server only ever sends strings, say so and this is a dead `str()`.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":526,"context_line":"        cluster \u003d volume.availability_zone"},{"line_number":527,"context_line":"        host \u003d connector[\u0027host\u0027]"},{"line_number":528,"context_line":"        if storage_type \u003d\u003d \u0027file\u0027:"},{"line_number":529,"context_line":"            need_export \u003d (self._nfs_export_enabled and"},{"line_number":530,"context_line":"                           not self._present_in_cluster(cluster, host))"},{"line_number":531,"context_line":"        else:"},{"line_number":532,"context_line":"            # Only files can be exported, so only cluster nodes can attach"}],"source_content_type":"text/x-python","patch_set":8,"id":"917251e2_00c43d27","line":529,"updated":"2026-11-11 16:20:56.000000000","message":"With `infoscale_nfs_export_enabled` False this short-circuits before the cluster probe, so a file volume attached from a host that is not a cluster node gets `need_export: False` and the CFS path with no check, while the block branch at 534-540 probes regardless and raises a clear error for the same host. The connector just joins `device_path` and `name` (986070 PS5 `infoscale.py:53-55`), so the attach fails a layer later as `DeviceUnavailable` or a libvirt file-not-found instead of here with the host named. The option help at 65-66 and rst 43-44 say only cluster nodes can attach, yet `test_infoscale.py:1298` asserts the opposite. Compute `in_cluster` once, raise the existing error for a non-node when exports are disabled or the volume is not a file, set `need_export \u003d storage_type \u003d\u003d \u0027file\u0027 and not in_cluster`, and change that test to expect the cluster GET; or, if freeing exports-disabled deployments from the AZ-equals-cluster rule is intended, say so in the help text and apply it to block volumes too.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":543,"context_line":"        data \u003d {"},{"line_number":544,"context_line":"            \u0027name\u0027: details[\u0027CinderVolname\u0027],"},{"line_number":545,"context_line":"            \u0027device_path\u0027: path,"},{"line_number":546,"context_line":"            \u0027export\u0027: (self._share + path) if need_export else \u0027\u0027,"},{"line_number":547,"context_line":"            \u0027need_export\u0027: need_export,"},{"line_number":548,"context_line":"            \u0027infoscale_voltype\u0027: storage_type,"},{"line_number":549,"context_line":"            \u0027infoscale_protoname\u0027: self.driver_volume_type,"}],"source_content_type":"text/x-python","patch_set":8,"id":"4d853b43_07e39774","line":546,"updated":"2026-11-11 16:20:56.000000000","message":"The connection data never carries `options` and `volume_opts` has no mount-options option, so no NFS mount options reach the export mount on either side. The connector reads them: 986070 PS5 `infoscale.py:41` documents `options`, and `RemoteFsConnector._get_volume_path` splits them into mount flags at `remotefs.py:80-81`; Nova 986071 has only the mount base. Every other remotefs-family driver provides this (`nfs.py:170`, `quobyte.py:559`, `remotefs.py:203`), so an operator whose exports need `nolock`, `soft,timeo\u003d`, `sec\u003d` or `vers\u003d3` has nowhere to set them. Add an `infoscale_mount_options` StrOpt, listed in the doc\u0027s options table, and set `data[\u0027options\u0027]` from it when `need_export` is True.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"}],"doc/source/configuration/block-storage/drivers/infoscale-volume-driver.rst":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3bfd44b49a4b9a08aa85e39ff4b533f4fdb59529","unresolved":true,"context_lines":[{"line_number":120,"context_line":"-----------------"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Set ``backend_availability_zone`` to the name of the InfoScale cluster."},{"line_number":123,"context_line":"When a volume is attached and ``infoscale_nfs_export_enabled`` is ``True``,"},{"line_number":124,"context_line":"the driver asks the InfoScale REST server whether the host, identified by"},{"line_number":125,"context_line":"its host name without the domain, is a node of the cluster that is named"},{"line_number":126,"context_line":"by the volume\u0027s availability zone. If no InfoScale cluster has that name,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7784deea_d3fc6b43","line":123,"updated":"2026-11-11 16:20:56.000000000","message":"This section is true only for file volumes. For a volume whose `CinderStorageType` is not `file`, `initialize_connection` at `infoscale.py:534-540` queries the cluster whatever the option is set to, and a missing cluster or a non-member host raises \"Only nodes of InfoScale cluster ... can attach volume\" instead of falling back to NFS, which `test_infoscale.py:1302-1340` pin. Since the storage type is a pool capability an operator can select with an extra spec, add a sentence saying that such volumes can only be attached by nodes of the cluster named by the availability zone, and that attaching fails if the cluster or node is not found.","commit_id":"281fdc76c1c14c36cbca1f74c1af899658dc7ab4"}]}
