)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"2371e4396aafd527795e6c0ea668d8a320c01adb","unresolved":true,"context_lines":[{"line_number":11,"context_line":"TODO:"},{"line_number":12,"context_line":"* replace exceptions with ones from SDK"},{"line_number":13,"context_line":"* Tests"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"https://bugs.launchpad.net/neutron/+bug/1999774"},{"line_number":16,"context_line":"Change-Id: I847112eb8d73f61cee62019fc0c616f63f479d35"},{"line_number":17,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"4335b69c_44570a44","line":14,"updated":"2025-08-11 14:12:07.000000000","message":"SDK release with https://review.opendev.org/c/openstack/openstacksdk/+/956658","commit_id":"611a7cda8c9c60cd83caedf9ca4fbc2b89810ad3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":false,"context_lines":[{"line_number":11,"context_line":"TODO:"},{"line_number":12,"context_line":"* replace exceptions with ones from SDK"},{"line_number":13,"context_line":"* Tests"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"https://bugs.launchpad.net/neutron/+bug/1999774"},{"line_number":16,"context_line":"Change-Id: I847112eb8d73f61cee62019fc0c616f63f479d35"},{"line_number":17,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"6b1de428_03ed12f2","line":14,"in_reply_to":"4335b69c_44570a44","updated":"2026-02-02 19:15:11.000000000","message":"Done","commit_id":"611a7cda8c9c60cd83caedf9ca4fbc2b89810ad3"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0195350754f19f614a72ae87ab8994278e60259f","unresolved":true,"context_lines":[{"line_number":10,"context_line":"Gazpacho is started and SDK 4.7.0 will be added to"},{"line_number":11,"context_line":"upper-constraints"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Depends-On: https://review.opendev.org/956658"},{"line_number":14,"context_line":"Related-Bug: #1999774"},{"line_number":15,"context_line":"Change-Id: I847112eb8d73f61cee62019fc0c616f63f479d35"},{"line_number":16,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"b48d3e0d_a3b06653","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":45},"updated":"2025-09-05 14:31:55.000000000","message":"seems like still not 4.7.0 is pulled by zuul, as I have the same failures in my local env with older SDK....","commit_id":"950f3634e1b1fc0a6858a3d8cfd034329f2497ae"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Gazpacho is started and SDK 4.7.0 will be added to"},{"line_number":11,"context_line":"upper-constraints"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Depends-On: https://review.opendev.org/956658"},{"line_number":14,"context_line":"Related-Bug: #1999774"},{"line_number":15,"context_line":"Change-Id: I847112eb8d73f61cee62019fc0c616f63f479d35"},{"line_number":16,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"19d3bc0b_624c4b0c","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":45},"in_reply_to":"b48d3e0d_a3b06653","updated":"2026-02-02 19:15:11.000000000","message":"Done","commit_id":"950f3634e1b1fc0a6858a3d8cfd034329f2497ae"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"385498e5cd9985ec96411bbaf07378da074e2017","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Use SDK for Neutron networks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Related-Bug: #1999774"},{"line_number":10,"context_line":"Depends-On: https://review.opendev.org/995724"},{"line_number":11,"context_line":"Change-Id: I847112eb8d73f61cee62019fc0c616f63f479d35"},{"line_number":12,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"e65ed4eb_1c111d34","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":45},"updated":"2026-07-09 08:16:34.000000000","message":"for this we need to be released in SDK and bumped in req to make things green in zuul","commit_id":"000736dbdcb166a473ef77c69b85523867b6a266"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"46324c0447a557f07950b5a71feb93b58088b5d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3f9ed846_b5d14445","updated":"2025-09-11 18:47:17.000000000","message":"SDK req bump was merged (https://review.opendev.org/c/openstack/requirements/+/960027) let\u0027s see....","commit_id":"70dcd38cd22b5e8b1b0895e224ddccc36914d6d9"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"cd8e6b9f215e93f0443704368f50333e12d5c085","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"2a0fea56_949fb46b","updated":"2025-09-22 15:28:02.000000000","message":"recheck\ngrenade job failed with volume issue, the nova-next job failed with no host available, none seems to be related","commit_id":"3c5aa843276100d69cdfda74cfc9f006abf55de5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"7d361d76_debc0185","updated":"2026-06-15 20:18:16.000000000","message":"im honestly not sure how i feel about how this is beign done.\nim somewhat concersn that the neutron fixture is being adapted to the sdk shap instead of maintianiing it neutorn api shape.\n\ni kikd of wish this was being hooked up kind of like how placement uses wsgi_intercept so that we were feeding our neutron fixture vlaues into the sdk without mockign the sdk in the functional tests.\n\n\nthat or we folleed the pather that we are using for watcher and celimpeter where we have dataclases that we normalise too\n\nhttps://github.com/openstack/watcher/blob/06e361e0aa18b78bbe830b01fc3cc6d9cc1efca2/watcher/common/nova_helper.py#L98-L180\n\nwe really dont want the sdk classes to be vial in the code base so no sdk object form neturon shoudl escape nova/netwowrk/neturon\n\nthey shoudl all be converted to classes form \n\nhttps://github.com/openstack/nova/blob/master/nova/network/model.py\n\nbefore they are reuten ideally before they leave that module or to a dict/opace type\n\nhttps://github.com/openstack/nova/blob/master/nova/network/model.py#L359\n\n\n```\nclass Network(Model):\n    \"\"\"Represents a Network in Nova.\"\"\"\n\n    def __init__(self, id\u003dNone, bridge\u003dNone, label\u003dNone,\n                 subnets\u003dNone, **kwargs):\n        super(Network, self).__init__()\n\n        self[\u0027id\u0027] \u003d id\n        self[\u0027bridge\u0027] \u003d bridge\n        self[\u0027label\u0027] \u003d label\n        self[\u0027subnets\u0027] \u003d subnets or []\n\n        self._set_meta(kwargs)\n\n    def add_subnet(self, subnet):\n        if subnet not in self[\u0027subnets\u0027]:\n            self[\u0027subnets\u0027].append(subnet)\n\n    @classmethod\n    def hydrate(cls, network):\n        if network:\n            network \u003d cls(**network)\n            network[\u0027subnets\u0027] \u003d [Subnet.hydrate(subnet)\n                                  for subnet in network[\u0027subnets\u0027]]\n        return network\n\n    def __eq__(self, other):\n        keys \u003d [\u0027id\u0027, \u0027bridge\u0027, \u0027label\u0027, \u0027subnets\u0027]\n        return all(self[k] \u003d\u003d other[k] for k in keys)\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n```\n\nin the case fo a netork object \n\nthe problem is we have not been that good at enfoceign this in all place i.e.\n\nhttps://github.com/openstack/nova/blob/master/nova/network/neutron.py#L1981-L1997\n\ninstead of convertign the ports to vif module obejcts\nhttps://github.com/openstack/nova/blob/master/nova/network/model.py#L414\nwe have incorreclty returned the raw value or a minor wrapper.\n\nso part of me feels like we shoud be fixing that first before doing the convertion but its also fair to say this is prexisting technical debt.","commit_id":"ec7b0024e324eb00da509b5e50fabac2e1c6af53"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a3d47bdeecd32ca8f116637ed8591d7e234ed62","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"862c45ab_ac3940db","in_reply_to":"3c2f76cb_703d59df","updated":"2026-06-16 18:02:34.000000000","message":"we can use sdk classes  in nova/netowrk/neutron.py we just shoudl not let them leak elasewehre\n\nthe sdk is still a third aprty depency in the same sense that olso and we really dont want to have its fucntioantly leak into the rest of the code.\n\nbut we can use it as much as we like on the edges.\n\nand ya i not really expecting that we refactor to mock the api i was just hoping the change could be made less invaise and alsigning clsoe to the api.\n\ni assume we cant turn off the renameing that the sdk is doitng as that is kind of harmful to understanidn in that its breaking the connection bteween the api ref and the sdk names?","commit_id":"ec7b0024e324eb00da509b5e50fabac2e1c6af53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ae76419c27824b0b9db7c6bad5a3ab0e51b60b3f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"3c2f76cb_703d59df","in_reply_to":"7d361d76_debc0185","updated":"2026-06-16 15:33:01.000000000","message":"\u003e i kikd of wish this was being hooked up kind of like how placement uses wsgi_intercept so that we were feeding our neutron fixture vlaues into the sdk without mockign the sdk in the functional tests.\n\nI agree that this would be a better layer to mock at for functional tests (though not unit tests), but it\u0027s a significantly larger lift.\n\n\u003e that or we folleed the pather that we are using for watcher and celimpeter where we have dataclases that we normalise too\n\u003e \n\u003e https://github.com/openstack/watcher/blob/06e361e0aa18b78bbe830b01fc3cc6d9cc1efca2/watcher/common/nova_helper.py#L98-L180\n\u003e \n\u003e we really dont want the sdk classes to be vial in the code base so no sdk object form neturon shoudl escape nova/netwowrk/neturon\n\nI really don\u0027t like this. You\u0027re adding yet another layer of indirection for no appreciable gain. SDK\u0027s entire purpose is to handle this for you. Why bother with it if you\u0027re going to do it all over again.\n\n\u003e they shoudl all be converted to classes form \n\u003e \n\u003e https://github.com/openstack/nova/blob/master/nova/network/model.py\n\u003e \n\u003e before they are reuten ideally before they leave that module or to a dict/opace type\n\nI also disagree with this. You lose whatever type safety SDK/objects in general give you by dumping to a dict. But I see we\u0027re already doing this in this PR 😞","commit_id":"ec7b0024e324eb00da509b5e50fabac2e1c6af53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1cb3d81955c00b7fb88a344014b656bac4807228","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"9b5bd3c6_5b1c172a","in_reply_to":"862c45ab_ac3940db","updated":"2026-06-16 18:28:09.000000000","message":"\u003e we can use sdk classes  in nova/netowrk/neutron.py we just shoudl not let them leak elasewehre\n\u003e \n\u003e the sdk is still a third aprty depency in the same sense that olso and we really dont want to have its fucntioantly leak into the rest of the code.\n\nWe let webob objects leak everywhere. os-vif objects are in a couple of places too. I get that we don\u0027t want to have calls (e.g. `network_client.networks()`) outside of this module and that we probably want to return just the information we need from each method (i.e. prefer `get_network_id` returning a string to `get_network` returning a `Network` object, if all we need is an ID). What I don\u0027t get and don\u0027t like is exposing everything that e.g. a SDK `Network` object does only via our own custom dataclass or something. Hopefully that makes sense.","commit_id":"ec7b0024e324eb00da509b5e50fabac2e1c6af53"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"90b1d000da4d7b1d7a1a47e38572cf9d334eefeb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"86308656_1d0613fa","in_reply_to":"9b5bd3c6_5b1c172a","updated":"2026-06-19 06:34:29.000000000","message":"the original idea was to keep these migration patches as minimal as possible to avoid the extra \"hazard\" of doing multiple things under one umbrella.","commit_id":"ec7b0024e324eb00da509b5e50fabac2e1c6af53"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"608153aa0f95d23e6bef908a2780a63bb9b788bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"ff866c29_153febf7","updated":"2025-11-21 10:27:18.000000000","message":"recheck\nnova-multi-cell failure is not related","commit_id":"1169a6d2d1a9d865daa95d9763c54457fa60a085"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"78e346b929fded07522878da3fcc2705d4b382ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"19492bc3_9866d47c","updated":"2025-11-17 08:56:10.000000000","message":"rechekc\nnova-multi-cell failure is not related","commit_id":"1169a6d2d1a9d865daa95d9763c54457fa60a085"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"813654d9dc698b136f3ae85f922fe73c20e810e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"5bea0ad3_66e547d6","updated":"2026-01-14 08:27:13.000000000","message":"recheck\nthe errors seems to be not related","commit_id":"835eca482a64867d63d7c538b85566cc797f2d19"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"267f35d8_0f03dbec","updated":"2026-02-02 19:15:11.000000000","message":"I stopped at the fixture today but have plenty of questions / comments.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"441ae128829fae98f8285e5ed3ff7f0d8dbc45ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"053de24d_b8f1114c","updated":"2026-02-06 07:34:15.000000000","message":"recheck\nceph-multistore and cyborg job failures are not related","commit_id":"a1fde81d996a0f4098b137554522b8975d33e330"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5da14ecde45accc35fb6cc76e75f802d824e97cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"cb54ae24_2b969664","updated":"2026-05-11 12:09:15.000000000","message":"thanks Stephen","commit_id":"a3c753003d99e8551dc3adb2637d5d73b21dd501"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"85854f24ae110746c9a9bd92850e9cde4e1c38b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"235fa6b1_57eeac95","updated":"2026-06-09 00:55:20.000000000","message":"Just some minor comments, looks good otherwise Lajos","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"cda4a081f67dcbcc4ec6782f1e940ebbaba03abc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"273ea828_f9668a66","updated":"2026-06-02 14:15:33.000000000","message":"recheck\nnova-multi-cell timeout","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"90b1d000da4d7b1d7a1a47e38572cf9d334eefeb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"e8cfedb1_ee2666c2","updated":"2026-06-19 06:34:29.000000000","message":"thanks for the discussion, I am on it to read , answer and fix them 😀","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"}],"nova/network/constants.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Search fields"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"NET_EXTERNAL \u003d \u0027is_router_external\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"# Misc"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"6d40b0b5_af0adf93","line":47,"updated":"2026-06-15 20:18:16.000000000","message":"we were checkign for `router:external` atribute before to determin if it is an external network and its called that because we tag networks as external so that neutron know it can use it for the routes gateway port\n\nso i guess we dont need to change the constant but acommetn might help explain why the value and name of the constant are so diffentent\n\ni assume the sdk is normaliseign the filed name to  is_router_external which is why we are not checkign for `is_router_external`\neven thought taht is not a filed in the network response?\n\nhttps://docs.openstack.org/api-ref/network/v2/index.html#id13\n\n`is_router_external` is kind of confusing as its not the router that is external its the network but that an sdk issue not an issue with this patch.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"}],"nova/network/neutron.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ed8c49360cc843696bbbc0480848340db46179af","unresolved":true,"context_lines":[{"line_number":253,"context_line":"        session\u003dsession,"},{"line_number":254,"context_line":"        oslo_conf\u003dCONF,"},{"line_number":255,"context_line":"    )"},{"line_number":256,"context_line":"    return c.network"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def get_client(context, admin\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"422d99e6_72aade40","line":256,"updated":"2024-09-04 18:03:24.000000000","message":"im not familar enough with the sdk to know at a glance but i belive this is going to use the auth creditals form the nova conifg file to creat this client which would only be create in teh admin clinet case.\n\notherwise we shoudl be useing the token form the context.\n\ni think you likely need to be using \n\nhttps://github.com/openstack/nova/blob/master/nova/utils.py#L969-L995\n\nbut you also need the enhancements form https://review.opendev.org/c/openstack/nova/+/925277/5","commit_id":"c7c3ce9c2372809ec0c5397cabf039c73d4086c6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"87c8ff86ba5f7f6955cd4909d468214dac9ab292","unresolved":true,"context_lines":[{"line_number":253,"context_line":"        session\u003dsession,"},{"line_number":254,"context_line":"        oslo_conf\u003dCONF,"},{"line_number":255,"context_line":"    )"},{"line_number":256,"context_line":"    return c.network"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def get_client(context, admin\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"620ba0b3_3c0d3da6","line":256,"in_reply_to":"422d99e6_72aade40","updated":"2024-09-05 07:24:07.000000000","message":"thanks, I check it","commit_id":"c7c3ce9c2372809ec0c5397cabf039c73d4086c6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":253,"context_line":"        session\u003dsession,"},{"line_number":254,"context_line":"        oslo_conf\u003dCONF,"},{"line_number":255,"context_line":"    )"},{"line_number":256,"context_line":"    return c.network"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def get_client(context, admin\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c89ccfb4_d60c12f8","line":256,"in_reply_to":"620ba0b3_3c0d3da6","updated":"2026-02-02 19:15:11.000000000","message":"Is this settled yet?","commit_id":"c7c3ce9c2372809ec0c5397cabf039c73d4086c6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        session\u003dsession,"},{"line_number":254,"context_line":"        oslo_conf\u003dCONF,"},{"line_number":255,"context_line":"    )"},{"line_number":256,"context_line":"    return c.network"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"def get_client(context, admin\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e8e2086_4849b472","line":256,"in_reply_to":"c89ccfb4_d60c12f8","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"c7c3ce9c2372809ec0c5397cabf039c73d4086c6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"838e55c10a7484a4d372b30a93e22f0a6f8cf10d","unresolved":true,"context_lines":[{"line_number":575,"context_line":"    def _update_port(self, port_client, instance, port_id,"},{"line_number":576,"context_line":"                     port_req_body):"},{"line_number":577,"context_line":"        try:"},{"line_number":578,"context_line":"            port \u003d port_client.update_port(port_id, **port_req_body).to_dict()"},{"line_number":579,"context_line":"            _ensure_no_port_binding_failure(port)"},{"line_number":580,"context_line":"            LOG.debug(\u0027Successfully updated port: %s\u0027, port_id,"},{"line_number":581,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"a40ec782_9faad528","line":578,"updated":"2025-08-01 14:27:01.000000000","message":"nit: you probably want to explode `port_req_body` (perhaps in a precursor patch) so that we know we\u0027re not passing unsupported fields here","commit_id":"7564c70c2f168ea7722685505e787746f067426c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":575,"context_line":"    def _update_port(self, port_client, instance, port_id,"},{"line_number":576,"context_line":"                     port_req_body):"},{"line_number":577,"context_line":"        try:"},{"line_number":578,"context_line":"            port \u003d port_client.update_port(port_id, **port_req_body).to_dict()"},{"line_number":579,"context_line":"            _ensure_no_port_binding_failure(port)"},{"line_number":580,"context_line":"            LOG.debug(\u0027Successfully updated port: %s\u0027, port_id,"},{"line_number":581,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"88ec12a3_98267791","line":578,"in_reply_to":"0debe4eb_5fc8a285","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"7564c70c2f168ea7722685505e787746f067426c"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"bca429bef643d1dda2c452869ff6583cf9c390bd","unresolved":true,"context_lines":[{"line_number":575,"context_line":"    def _update_port(self, port_client, instance, port_id,"},{"line_number":576,"context_line":"                     port_req_body):"},{"line_number":577,"context_line":"        try:"},{"line_number":578,"context_line":"            port \u003d port_client.update_port(port_id, **port_req_body).to_dict()"},{"line_number":579,"context_line":"            _ensure_no_port_binding_failure(port)"},{"line_number":580,"context_line":"            LOG.debug(\u0027Successfully updated port: %s\u0027, port_id,"},{"line_number":581,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"0debe4eb_5fc8a285","line":578,"in_reply_to":"a40ec782_9faad528","updated":"2025-08-05 10:24:56.000000000","message":"yeah, good idea, the main issue with this migration is that SDK changed some of the field names compared to how on the API they are called","commit_id":"7564c70c2f168ea7722685505e787746f067426c"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"402505ecf82349cfa91f1c4f60eb40a4722a62a6","unresolved":true,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"            try:"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"                port_client.update_port(port_id, **port_req_body)"},{"line_number":709,"context_line":"            except sdk_exc.NotFoundException:"},{"line_number":710,"context_line":"                LOG.debug(\u0027Unable to unbind port %s as it no longer \u0027"},{"line_number":711,"context_line":"                          \u0027exists.\u0027, port_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa06577f_c593e1a6","line":708,"range":{"start_line":708,"start_character":16,"end_line":708,"end_character":65},"updated":"2025-08-05 12:41:46.000000000","message":"here I got back \nopenstack.exceptions.ForbiddenException: ForbiddenException: 403: Client Error for url: http://100.109.0.136/networking/v2.0/ports/79cc2c3a-e1d3-4d5e-8cdd-88c798e64087, ((((rule:update_port and rule:update_port:device_id) and rule:update_port:device_owner) and rule:update_port:binding:host_id) and rule:update_port:binding:profile) is disallowed by policy\nI suppose have to have another client here for service (?) user?","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"16bfc324a464a26118f600e4c8605c65afae01bc","unresolved":true,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"            try:"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"                port_client.update_port(port_id, **port_req_body)"},{"line_number":709,"context_line":"            except sdk_exc.NotFoundException:"},{"line_number":710,"context_line":"                LOG.debug(\u0027Unable to unbind port %s as it no longer \u0027"},{"line_number":711,"context_line":"                          \u0027exists.\u0027, port_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bc8850f3_d7023d9f","line":708,"range":{"start_line":708,"start_character":16,"end_line":708,"end_character":65},"in_reply_to":"471a6ec7_ab83b1bb","updated":"2025-08-06 06:57:18.000000000","message":"that was in my mind also. I suppose (from https://opendev.org/openstack/nova/src/branch/master/nova/service_auth.py#L33 ) if I forgot admin\u003dTrue I will have service user","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"            try:"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"                port_client.update_port(port_id, **port_req_body)"},{"line_number":709,"context_line":"            except sdk_exc.NotFoundException:"},{"line_number":710,"context_line":"                LOG.debug(\u0027Unable to unbind port %s as it no longer \u0027"},{"line_number":711,"context_line":"                          \u0027exists.\u0027, port_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"857c7419_ed21adf1","line":708,"range":{"start_line":708,"start_character":16,"end_line":708,"end_character":65},"in_reply_to":"bc8850f3_d7023d9f","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"94ee8d77373605c7fe2751a0fecfe7c4927ffcc4","unresolved":true,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"            try:"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"                port_client.update_port(port_id, **port_req_body)"},{"line_number":709,"context_line":"            except sdk_exc.NotFoundException:"},{"line_number":710,"context_line":"                LOG.debug(\u0027Unable to unbind port %s as it no longer \u0027"},{"line_number":711,"context_line":"                          \u0027exists.\u0027, port_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"471a6ec7_ab83b1bb","line":708,"range":{"start_line":708,"start_character":16,"end_line":708,"end_character":65},"in_reply_to":"fa06577f_c593e1a6","updated":"2025-08-05 15:30:43.000000000","message":"Shouldn\u0027t everything be a service user?","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"402505ecf82349cfa91f1c4f60eb40a4722a62a6","unresolved":true,"context_lines":[{"line_number":3649,"context_line":"        subnet_ids \u003d (set(ip[\u0027subnet_id\u0027] for ip in fixed_ips))"},{"line_number":3650,"context_line":"        ipam_subnets \u003d []"},{"line_number":3651,"context_line":"        for s_id in subnet_ids:"},{"line_number":3652,"context_line":"            ipam_subnets.append(client.get_subnet(s_id))"},{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"        subnets \u003d []"},{"line_number":3655,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4f0b2e98_eb1ca126","line":3652,"range":{"start_line":3652,"start_character":32,"end_line":3652,"end_character":55},"updated":"2025-08-05 12:41:46.000000000","message":"seems like with SDK query like {\u0027id\u0027: [\u0027uuid1\u0027, \u0027uuid2\u0027]} is not working, have to fetch the subnets one-by-one","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"16bfc324a464a26118f600e4c8605c65afae01bc","unresolved":true,"context_lines":[{"line_number":3649,"context_line":"        subnet_ids \u003d (set(ip[\u0027subnet_id\u0027] for ip in fixed_ips))"},{"line_number":3650,"context_line":"        ipam_subnets \u003d []"},{"line_number":3651,"context_line":"        for s_id in subnet_ids:"},{"line_number":3652,"context_line":"            ipam_subnets.append(client.get_subnet(s_id))"},{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"        subnets \u003d []"},{"line_number":3655,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"89727d09_d7cef01c","line":3652,"range":{"start_line":3652,"start_character":32,"end_line":3652,"end_character":55},"in_reply_to":"1935cf40_a25cca82","updated":"2025-08-06 06:57:18.000000000","message":"thanks, I check it.","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"94ee8d77373605c7fe2751a0fecfe7c4927ffcc4","unresolved":true,"context_lines":[{"line_number":3649,"context_line":"        subnet_ids \u003d (set(ip[\u0027subnet_id\u0027] for ip in fixed_ips))"},{"line_number":3650,"context_line":"        ipam_subnets \u003d []"},{"line_number":3651,"context_line":"        for s_id in subnet_ids:"},{"line_number":3652,"context_line":"            ipam_subnets.append(client.get_subnet(s_id))"},{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"        subnets \u003d []"},{"line_number":3655,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1935cf40_a25cca82","line":3652,"range":{"start_line":3652,"start_character":32,"end_line":3652,"end_character":55},"in_reply_to":"4f0b2e98_eb1ca126","updated":"2025-08-05 15:30:43.000000000","message":"This is a bug. I think the issue is that `id` is missing from the list of filters.\n\nhttps://github.com/openstack/openstacksdk/blob/8c2f9a1e57d2a008ab230d3b35d38fe206ee56aa/openstack/network/v2/subnet.py#L34\n\nIf so, this will be easy to both test and fix.","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"614d5618e1e061f6f52e2ebc85774ad49e93ed2a","unresolved":true,"context_lines":[{"line_number":3649,"context_line":"        subnet_ids \u003d (set(ip[\u0027subnet_id\u0027] for ip in fixed_ips))"},{"line_number":3650,"context_line":"        ipam_subnets \u003d []"},{"line_number":3651,"context_line":"        for s_id in subnet_ids:"},{"line_number":3652,"context_line":"            ipam_subnets.append(client.get_subnet(s_id))"},{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"        subnets \u003d []"},{"line_number":3655,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"cd84a2ad_4b393d0c","line":3652,"range":{"start_line":3652,"start_character":32,"end_line":3652,"end_character":55},"in_reply_to":"89727d09_d7cef01c","updated":"2025-08-06 11:17:09.000000000","message":"I added the id field: https://review.opendev.org/c/openstack/openstacksdk/+/956658 , and it solves the issue","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":3649,"context_line":"        subnet_ids \u003d (set(ip[\u0027subnet_id\u0027] for ip in fixed_ips))"},{"line_number":3650,"context_line":"        ipam_subnets \u003d []"},{"line_number":3651,"context_line":"        for s_id in subnet_ids:"},{"line_number":3652,"context_line":"            ipam_subnets.append(client.get_subnet(s_id))"},{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"        subnets \u003d []"},{"line_number":3655,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"6e4c8704_2612e134","line":3652,"range":{"start_line":3652,"start_character":32,"end_line":3652,"end_character":55},"in_reply_to":"cd84a2ad_4b393d0c","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"91421d4ca10570c4d44563fa3737a3e1f01c13f9"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e5d65919abeed46d33f5f672f52fef96342dc005","unresolved":true,"context_lines":[{"line_number":3825,"context_line":"                                constants.BINDING_PROFILE] \u003d binding_profile"},{"line_number":3826,"context_line":"                        else:"},{"line_number":3827,"context_line":"                            raise exception.PortUpdateFailed("},{"line_number":3828,"context_line":"                                port_id\u003dport_dict[\u0027id\u0027],"},{"line_number":3829,"context_line":"                                reason\u003d_(\"Unable to correlate PCI slot %s\") %"},{"line_number":3830,"context_line":"                                pci_slot)"},{"line_number":3831,"context_line":"                # NOTE(artom) If migration is None, this is an unshelve, and we"},{"line_number":3832,"context_line":"                # need to figure out the pci related binding information from"},{"line_number":3833,"context_line":"                # the InstancePCIRequest and PciDevice objects."}],"source_content_type":"text/x-python","patch_set":5,"id":"1e3f7f3c_11510afd","line":3830,"range":{"start_line":3828,"start_character":0,"end_line":3830,"end_character":41},"updated":"2025-08-12 07:43:09.000000000","message":"strange that none of pep8 tasks hit me in the face for the previous formatting ....","commit_id":"8e2e229cdc7232d3ee4089826b83aa25ca211866"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":3825,"context_line":"                                constants.BINDING_PROFILE] \u003d binding_profile"},{"line_number":3826,"context_line":"                        else:"},{"line_number":3827,"context_line":"                            raise exception.PortUpdateFailed("},{"line_number":3828,"context_line":"                                port_id\u003dport_dict[\u0027id\u0027],"},{"line_number":3829,"context_line":"                                reason\u003d_(\"Unable to correlate PCI slot %s\") %"},{"line_number":3830,"context_line":"                                pci_slot)"},{"line_number":3831,"context_line":"                # NOTE(artom) If migration is None, this is an unshelve, and we"},{"line_number":3832,"context_line":"                # need to figure out the pci related binding information from"},{"line_number":3833,"context_line":"                # the InstancePCIRequest and PciDevice objects."}],"source_content_type":"text/x-python","patch_set":5,"id":"32fd989f_242a36ad","line":3830,"range":{"start_line":3828,"start_character":0,"end_line":3830,"end_character":41},"in_reply_to":"1e3f7f3c_11510afd","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"8e2e229cdc7232d3ee4089826b83aa25ca211866"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0645eacb506fc1ea7c3447ebe00e970f8b70a621","unresolved":true,"context_lines":[{"line_number":483,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":486,"context_line":"            search_opts \u003d {\u0027tenant_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":487,"context_line":"            if auto_allocate:"},{"line_number":488,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":489,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":9,"id":"69ca8dc1_22989279","line":486,"range":{"start_line":486,"start_character":28,"end_line":486,"end_character":37},"updated":"2025-09-19 17:54:02.000000000","message":"I have to push a patch for SDK to make it possible to filter by tenant_id.....","commit_id":"2af94e80844b0bad60c5c347baf45a9e97d38572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d1061d31d2a833f710f3a43cc99e12f0ef42bd6c","unresolved":true,"context_lines":[{"line_number":483,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":486,"context_line":"            search_opts \u003d {\u0027tenant_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":487,"context_line":"            if auto_allocate:"},{"line_number":488,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":489,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":9,"id":"564bbefa_9f4fb542","line":486,"range":{"start_line":486,"start_character":28,"end_line":486,"end_character":37},"in_reply_to":"01952093_1e6f33f0","updated":"2025-09-23 13:31:35.000000000","message":"I think (that needs to be confirmed) that we are removing tenant_id internally and setting project_id","commit_id":"2af94e80844b0bad60c5c347baf45a9e97d38572"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"63134e6eaa44a9c25fb95d8a5789b0b80a7c7323","unresolved":true,"context_lines":[{"line_number":483,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":486,"context_line":"            search_opts \u003d {\u0027tenant_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":487,"context_line":"            if auto_allocate:"},{"line_number":488,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":489,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":9,"id":"f0e0629a_989ee3b3","line":486,"range":{"start_line":486,"start_character":28,"end_line":486,"end_character":37},"in_reply_to":"564bbefa_9f4fb542","updated":"2025-09-24 08:44:21.000000000","message":"+1, thanks. Project_id works for filtering with SDK so I have to be careful to use that everywhere.","commit_id":"2af94e80844b0bad60c5c347baf45a9e97d38572"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4ad8a3def066d3ae004cc0ff07a7fc71c10c96ab","unresolved":true,"context_lines":[{"line_number":483,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":486,"context_line":"            search_opts \u003d {\u0027tenant_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":487,"context_line":"            if auto_allocate:"},{"line_number":488,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":489,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":9,"id":"01952093_1e6f33f0","line":486,"range":{"start_line":486,"start_character":28,"end_line":486,"end_character":37},"in_reply_to":"69ca8dc1_22989279","updated":"2025-09-22 07:48:16.000000000","message":"project_id seems to be working as filter, surprise, surprise....","commit_id":"2af94e80844b0bad60c5c347baf45a9e97d38572"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":486,"context_line":"            search_opts \u003d {\u0027tenant_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":487,"context_line":"            if auto_allocate:"},{"line_number":488,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":489,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":9,"id":"0e99d1db_053d88fc","line":486,"range":{"start_line":486,"start_character":28,"end_line":486,"end_character":37},"in_reply_to":"f0e0629a_989ee3b3","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"2af94e80844b0bad60c5c347baf45a9e97d38572"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":233,"context_line":"    # call will be migrated away from neutronclient to SDK. Till that"},{"line_number":234,"context_line":"    # to avoid cases when we change client due to unfinished move to SDK"},{"line_number":235,"context_line":"    # let\u0027s reset those _AUTHS and _SESSIONS globals in service_auth"},{"line_number":236,"context_line":"    service_auth.reset_globals()"},{"line_number":237,"context_line":"    session \u003d service_auth.get_service_auth_session("},{"line_number":238,"context_line":"            nova.conf.neutron.NEUTRON_GROUP, auth\u003dauth_plugin)"},{"line_number":239,"context_line":"    c \u003d openstack.connection.Connection("}],"source_content_type":"text/x-python","patch_set":20,"id":"fbfe6f4e_790957cd","line":236,"updated":"2026-02-02 19:15:11.000000000","message":"Does it mean that now (until the transition is done) nova will do a lot more work as each get_*_client() call will cause that we build up those constructs in service_auth again? If so could we have two sets of cached data one for the old client and one for the new client used selectively?","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":233,"context_line":"    # call will be migrated away from neutronclient to SDK. Till that"},{"line_number":234,"context_line":"    # to avoid cases when we change client due to unfinished move to SDK"},{"line_number":235,"context_line":"    # let\u0027s reset those _AUTHS and _SESSIONS globals in service_auth"},{"line_number":236,"context_line":"    service_auth.reset_globals()"},{"line_number":237,"context_line":"    session \u003d service_auth.get_service_auth_session("},{"line_number":238,"context_line":"            nova.conf.neutron.NEUTRON_GROUP, auth\u003dauth_plugin)"},{"line_number":239,"context_line":"    c \u003d openstack.connection.Connection("}],"source_content_type":"text/x-python","patch_set":20,"id":"c68b49af_1873b317","line":236,"in_reply_to":"cd588496_e074a4ef","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":233,"context_line":"    # call will be migrated away from neutronclient to SDK. Till that"},{"line_number":234,"context_line":"    # to avoid cases when we change client due to unfinished move to SDK"},{"line_number":235,"context_line":"    # let\u0027s reset those _AUTHS and _SESSIONS globals in service_auth"},{"line_number":236,"context_line":"    service_auth.reset_globals()"},{"line_number":237,"context_line":"    session \u003d service_auth.get_service_auth_session("},{"line_number":238,"context_line":"            nova.conf.neutron.NEUTRON_GROUP, auth\u003dauth_plugin)"},{"line_number":239,"context_line":"    c \u003d openstack.connection.Connection("}],"source_content_type":"text/x-python","patch_set":20,"id":"cd588496_e074a4ef","line":236,"in_reply_to":"fbfe6f4e_790957cd","updated":"2026-02-05 18:58:41.000000000","message":"This part was refactored here: https://review.opendev.org/c/openstack/nova/+/974267/2/nova/service_auth.py\n\nSo my idea was to change the way _SESSIONS and _AUTHS these things but as that was part of the TPM work, I tried to avoid messing with that. So perhaps I create a separate dict for neutron and sdk_neutron, I will check that.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":455,"context_line":"            # If user has specified to attach instance only to specific"},{"line_number":456,"context_line":"            # networks then only add these to **search_opts. This search will"},{"line_number":457,"context_line":"            # also include \u0027shared\u0027 networks."},{"line_number":458,"context_line":"            nets_dict \u003d []"},{"line_number":459,"context_line":"            search_opts \u003d {\u0027id\u0027: net_ids}"},{"line_number":460,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":461,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"}],"source_content_type":"text/x-python","patch_set":20,"id":"d0e08e71_c096ed8f","line":458,"updated":"2026-02-02 19:15:11.000000000","message":"nit: the `[]` value set here is never used as L461 overwrites it anyhow. You can drop the variable declaration","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            # If user has specified to attach instance only to specific"},{"line_number":456,"context_line":"            # networks then only add these to **search_opts. This search will"},{"line_number":457,"context_line":"            # also include \u0027shared\u0027 networks."},{"line_number":458,"context_line":"            nets_dict \u003d []"},{"line_number":459,"context_line":"            search_opts \u003d {\u0027id\u0027: net_ids}"},{"line_number":460,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":461,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"}],"source_content_type":"text/x-python","patch_set":20,"id":"83327f8d_00490791","line":458,"in_reply_to":"d0e08e71_c096ed8f","updated":"2026-02-05 19:04:32.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":457,"context_line":"            # also include \u0027shared\u0027 networks."},{"line_number":458,"context_line":"            nets_dict \u003d []"},{"line_number":459,"context_line":"            search_opts \u003d {\u0027id\u0027: net_ids}"},{"line_number":460,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":461,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":462,"context_line":"        else:"},{"line_number":463,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":464,"context_line":"            search_opts \u003d {\u0027project_id\u0027: project_id, \u0027is_shared\u0027: False}"}],"source_content_type":"text/x-python","patch_set":20,"id":"11b7d37f_536e6503","line":461,"range":{"start_line":460,"start_character":0,"end_line":461,"end_character":55},"updated":"2026-02-02 19:15:11.000000000","message":"nit:\n```\nnets_dict \u003d [net.to_dict() for net in neutron.networks(**search_opts)]\n```","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":457,"context_line":"            # also include \u0027shared\u0027 networks."},{"line_number":458,"context_line":"            nets_dict \u003d []"},{"line_number":459,"context_line":"            search_opts \u003d {\u0027id\u0027: net_ids}"},{"line_number":460,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":461,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":462,"context_line":"        else:"},{"line_number":463,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":464,"context_line":"            search_opts \u003d {\u0027project_id\u0027: project_id, \u0027is_shared\u0027: False}"}],"source_content_type":"text/x-python","patch_set":20,"id":"a00a870b_12d6297f","line":461,"range":{"start_line":460,"start_character":0,"end_line":461,"end_character":55},"in_reply_to":"11b7d37f_536e6503","updated":"2026-02-05 19:04:32.000000000","message":"thanks","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        :param context: The request context."},{"line_number":646,"context_line":"        :param ports: list of port IDs."},{"line_number":647,"context_line":"        :param neutron: neutron client for the current context."},{"line_number":648,"context_line":"        :param port_client: The client with appropriate karma for"},{"line_number":649,"context_line":"            updating the ports."},{"line_number":650,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"6315df53_8a247754","line":647,"updated":"2026-02-02 19:15:11.000000000","message":"sdk_neutron is missing here","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        :param context: The request context."},{"line_number":646,"context_line":"        :param ports: list of port IDs."},{"line_number":647,"context_line":"        :param neutron: neutron client for the current context."},{"line_number":648,"context_line":"        :param port_client: The client with appropriate karma for"},{"line_number":649,"context_line":"            updating the ports."},{"line_number":650,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"369f1b3f_bb41d76d","line":647,"in_reply_to":"6315df53_8a247754","updated":"2026-02-05 19:04:32.000000000","message":"thanks, I hope checked all the docstrings","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":957,"context_line":""},{"line_number":958,"context_line":"        :param context: The request context."},{"line_number":959,"context_line":"        :param instance: nova.objects.instance.Instance object."},{"line_number":960,"context_line":"        :param neutron: neutron client"},{"line_number":961,"context_line":"        :param requested_networks: nova.objects.NetworkRequestList, list of"},{"line_number":962,"context_line":"            user-requested networks and/or ports; may be empty"},{"line_number":963,"context_line":"        :param ordered_networks: output from _validate_requested_port_ids"}],"source_content_type":"text/x-python","patch_set":20,"id":"a60c58f2_0f30b99b","line":960,"updated":"2026-02-02 19:15:11.000000000","message":"sync the doc with the param rename","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":957,"context_line":""},{"line_number":958,"context_line":"        :param context: The request context."},{"line_number":959,"context_line":"        :param instance: nova.objects.instance.Instance object."},{"line_number":960,"context_line":"        :param neutron: neutron client"},{"line_number":961,"context_line":"        :param requested_networks: nova.objects.NetworkRequestList, list of"},{"line_number":962,"context_line":"            user-requested networks and/or ports; may be empty"},{"line_number":963,"context_line":"        :param ordered_networks: output from _validate_requested_port_ids"}],"source_content_type":"text/x-python","patch_set":20,"id":"3c062222_e7412bea","line":960,"in_reply_to":"a60c58f2_0f30b99b","updated":"2026-02-05 19:04:32.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":1022,"context_line":"        # NOTE(melwitt): check external net attach permission after the"},{"line_number":1023,"context_line":"        #                check for ambiguity, there could be another"},{"line_number":1024,"context_line":"        #                available net which is permitted bug/1364344"},{"line_number":1025,"context_line":"        self._check_external_network_attach(context, nets)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return {net[\u0027id\u0027]: net for net in nets}"},{"line_number":1028,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"2e81c4b4_bab05cfe","line":1025,"updated":"2026-02-02 19:15:11.000000000","message":"does this call takes now sdk objects instead of dicts?","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":1022,"context_line":"        # NOTE(melwitt): check external net attach permission after the"},{"line_number":1023,"context_line":"        #                check for ambiguity, there could be another"},{"line_number":1024,"context_line":"        #                available net which is permitted bug/1364344"},{"line_number":1025,"context_line":"        self._check_external_network_attach(context, nets)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return {net[\u0027id\u0027]: net for net in nets}"},{"line_number":1028,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"c27aeae4_253d3f3e","line":1025,"in_reply_to":"2e81c4b4_bab05cfe","updated":"2026-02-05 18:58:41.000000000","message":"No, I kept the dict everywhere, so _get_available_networks returns with dict.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"        # NOTE(melwitt): check external net attach permission after the"},{"line_number":1023,"context_line":"        #                check for ambiguity, there could be another"},{"line_number":1024,"context_line":"        #                available net which is permitted bug/1364344"},{"line_number":1025,"context_line":"        self._check_external_network_attach(context, nets)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return {net[\u0027id\u0027]: net for net in nets}"},{"line_number":1028,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"db85a14d_8ca6d935","line":1025,"in_reply_to":"c27aeae4_253d3f3e","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":1024,"context_line":"        #                available net which is permitted bug/1364344"},{"line_number":1025,"context_line":"        self._check_external_network_attach(context, nets)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return {net[\u0027id\u0027]: net for net in nets}"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"    def _create_ports_for_instance(self, context, instance, ordered_networks,"},{"line_number":1030,"context_line":"            nets, neutron, security_group_ids):"}],"source_content_type":"text/x-python","patch_set":20,"id":"c2dbbabc_8cc5fe12","line":1027,"updated":"2026-02-02 19:15:11.000000000","message":"is this work without a to_dict() call when net is an sdk object?","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"        #                available net which is permitted bug/1364344"},{"line_number":1025,"context_line":"        self._check_external_network_attach(context, nets)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return {net[\u0027id\u0027]: net for net in nets}"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"    def _create_ports_for_instance(self, context, instance, ordered_networks,"},{"line_number":1030,"context_line":"            nets, neutron, security_group_ids):"}],"source_content_type":"text/x-python","patch_set":20,"id":"b03e8845_88f7bb4f","line":1027,"in_reply_to":"640a7095_d1a62594","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":1024,"context_line":"        #                available net which is permitted bug/1364344"},{"line_number":1025,"context_line":"        self._check_external_network_attach(context, nets)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return {net[\u0027id\u0027]: net for net in nets}"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"    def _create_ports_for_instance(self, context, instance, ordered_networks,"},{"line_number":1030,"context_line":"            nets, neutron, security_group_ids):"}],"source_content_type":"text/x-python","patch_set":20,"id":"640a7095_d1a62594","line":1027,"in_reply_to":"c2dbbabc_8cc5fe12","updated":"2026-02-05 18:58:41.000000000","message":"as I remember sdk objects can behave like dicts, but with extras 😊 :\nhttps://opendev.org/openstack/openstacksdk/src/commit/7afe210333ec236a14fc5fa2d4a589e481a43745/openstack/resource.py#L368","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":1033,"context_line":"        :param context: The request context."},{"line_number":1034,"context_line":"        :param instance: nova.objects.instance.Instance object."},{"line_number":1035,"context_line":"        :param ordered_networks: objects.NetworkRequestList in requested order"},{"line_number":1036,"context_line":"        :param nets: a dict of network_id to networks returned from neutron"},{"line_number":1037,"context_line":"        :param neutron: neutronclient built from users request context"},{"line_number":1038,"context_line":"        :param security_group_ids: a list of security group IDs to be applied"},{"line_number":1039,"context_line":"            to any ports created"}],"source_content_type":"text/x-python","patch_set":20,"id":"a49a4dcb_39c8969f","line":1036,"range":{"start_line":1036,"start_character":45,"end_line":1036,"end_character":75},"updated":"2026-02-02 19:15:11.000000000","message":"is this now returned via the sdk hence the field name changes below?","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"        :param context: The request context."},{"line_number":1034,"context_line":"        :param instance: nova.objects.instance.Instance object."},{"line_number":1035,"context_line":"        :param ordered_networks: objects.NetworkRequestList in requested order"},{"line_number":1036,"context_line":"        :param nets: a dict of network_id to networks returned from neutron"},{"line_number":1037,"context_line":"        :param neutron: neutronclient built from users request context"},{"line_number":1038,"context_line":"        :param security_group_ids: a list of security group IDs to be applied"},{"line_number":1039,"context_line":"            to any ports created"}],"source_content_type":"text/x-python","patch_set":20,"id":"5268529e_7e769c15","line":1036,"range":{"start_line":1036,"start_character":45,"end_line":1036,"end_character":75},"in_reply_to":"4e31026f_a3917188","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":1033,"context_line":"        :param context: The request context."},{"line_number":1034,"context_line":"        :param instance: nova.objects.instance.Instance object."},{"line_number":1035,"context_line":"        :param ordered_networks: objects.NetworkRequestList in requested order"},{"line_number":1036,"context_line":"        :param nets: a dict of network_id to networks returned from neutron"},{"line_number":1037,"context_line":"        :param neutron: neutronclient built from users request context"},{"line_number":1038,"context_line":"        :param security_group_ids: a list of security group IDs to be applied"},{"line_number":1039,"context_line":"            to any ports created"}],"source_content_type":"text/x-python","patch_set":20,"id":"4e31026f_a3917188","line":1036,"range":{"start_line":1036,"start_character":45,"end_line":1036,"end_character":75},"in_reply_to":"a49a4dcb_39c8969f","updated":"2026-02-05 18:58:41.000000000","message":"yes, SDK uses slightly different naming conventions than what we have on the API ( for network: https://opendev.org/openstack/openstacksdk/src/commit/7afe210333ec236a14fc5fa2d4a589e481a43745/openstack/network/v2/network.py )\n\nso a translation is necessary like admin_state_up \u003d\u003e is_admin_state_up, subnet_ids \u003d\u003e subnets etc...","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":2218,"context_line":"        \"\"\"Retrieve detailed network info."},{"line_number":2219,"context_line":""},{"line_number":2220,"context_line":"        :param context: The request context."},{"line_number":2221,"context_line":"        :param neutron: The neutron client object."},{"line_number":2222,"context_line":"        :param net_id: The ID of the network to retrieve information for."},{"line_number":2223,"context_line":""},{"line_number":2224,"context_line":"        :return: A tuple containing the physnet name, if defined, and the"}],"source_content_type":"text/x-python","patch_set":20,"id":"83b03e0d_d03d30d2","line":2221,"updated":"2026-02-02 19:15:11.000000000","message":"missing param","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        \"\"\"Retrieve detailed network info."},{"line_number":2219,"context_line":""},{"line_number":2220,"context_line":"        :param context: The request context."},{"line_number":2221,"context_line":"        :param neutron: The neutron client object."},{"line_number":2222,"context_line":"        :param net_id: The ID of the network to retrieve information for."},{"line_number":2223,"context_line":""},{"line_number":2224,"context_line":"        :return: A tuple containing the physnet name, if defined, and the"}],"source_content_type":"text/x-python","patch_set":20,"id":"32faaed9_0302cbe0","line":2221,"in_reply_to":"83b03e0d_d03d30d2","updated":"2026-02-05 19:04:32.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":2229,"context_line":"        if self.has_multi_provider_extension(client\u003dneutron):"},{"line_number":2230,"context_line":"            network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":2231,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":2232,"context_line":"            if segments:"},{"line_number":2233,"context_line":"                for net in segments:"},{"line_number":2234,"context_line":"                    # NOTE(vladikr): In general, \"multi-segments\" network is a"},{"line_number":2235,"context_line":"                    # combination of L2 segments. The current implementation"}],"source_content_type":"text/x-python","patch_set":20,"id":"3b8edee0_0a76bfb6","line":2232,"updated":"2026-02-02 19:15:11.000000000","message":"Can segments be None now? It seem previously the key was either missing from the dict or it was a dict.\n\nBtw if it can be none then you can avoid the extra nesting by\n```\nsegments \u003d network.get(\u0027segment\u0027, {}) or {}\n```","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":2229,"context_line":"        if self.has_multi_provider_extension(client\u003dneutron):"},{"line_number":2230,"context_line":"            network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":2231,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":2232,"context_line":"            if segments:"},{"line_number":2233,"context_line":"                for net in segments:"},{"line_number":2234,"context_line":"                    # NOTE(vladikr): In general, \"multi-segments\" network is a"},{"line_number":2235,"context_line":"                    # combination of L2 segments. The current implementation"}],"source_content_type":"text/x-python","patch_set":20,"id":"e9f34487_6e2c5df9","line":2232,"in_reply_to":"3b8edee0_0a76bfb6","updated":"2026-02-05 18:58:41.000000000","message":"yes it can, SDK unlike dicts from n-client always have all the fields, but the ones that are not returned by Neutron in this case will be None\nthanks.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":2229,"context_line":"        if self.has_multi_provider_extension(client\u003dneutron):"},{"line_number":2230,"context_line":"            network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":2231,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {})"},{"line_number":2232,"context_line":"            if segments:"},{"line_number":2233,"context_line":"                for net in segments:"},{"line_number":2234,"context_line":"                    # NOTE(vladikr): In general, \"multi-segments\" network is a"},{"line_number":2235,"context_line":"                    # combination of L2 segments. The current implementation"}],"source_content_type":"text/x-python","patch_set":20,"id":"39ddab4f_9f655a65","line":2232,"in_reply_to":"e9f34487_6e2c5df9","updated":"2026-02-05 19:04:32.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":2522,"context_line":"                      str(ex))"},{"line_number":2523,"context_line":"            return False"},{"line_number":2524,"context_line":""},{"line_number":2525,"context_line":"    def _auto_allocate_network(self, instance, neutron):"},{"line_number":2526,"context_line":"        \"\"\"Automatically allocates a network for the given project."},{"line_number":2527,"context_line":""},{"line_number":2528,"context_line":"        :param instance: create the network for the project that owns this"}],"source_content_type":"text/x-python","patch_set":20,"id":"ed5caa51_1288a1e5","line":2525,"range":{"start_line":2525,"start_character":47,"end_line":2525,"end_character":54},"updated":"2026-02-02 19:15:11.000000000","message":"Do we want to rename this to sdk_neutron for consistency with the rest of the param names?","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":2522,"context_line":"                      str(ex))"},{"line_number":2523,"context_line":"            return False"},{"line_number":2524,"context_line":""},{"line_number":2525,"context_line":"    def _auto_allocate_network(self, instance, neutron):"},{"line_number":2526,"context_line":"        \"\"\"Automatically allocates a network for the given project."},{"line_number":2527,"context_line":""},{"line_number":2528,"context_line":"        :param instance: create the network for the project that owns this"}],"source_content_type":"text/x-python","patch_set":20,"id":"413a981b_bfea571b","line":2525,"range":{"start_line":2525,"start_character":47,"end_line":2525,"end_character":54},"in_reply_to":"ed5caa51_1288a1e5","updated":"2026-02-05 19:04:32.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":2542,"context_line":"            raise exception.UnableToAutoAllocateNetwork(project_id\u003dproject_id)"},{"line_number":2543,"context_line":""},{"line_number":2544,"context_line":"        try:"},{"line_number":2545,"context_line":"            network \u003d neutron.get_network(topology[\u0027id\u0027])"},{"line_number":2546,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2547,"context_line":"            # This shouldn\u0027t happen since we just created the network, but"},{"line_number":2548,"context_line":"            # handle it anyway."}],"source_content_type":"text/x-python","patch_set":20,"id":"a6d48ab2_c57a6aae","line":2545,"updated":"2026-02-02 19:15:11.000000000","message":"I\u0027m wondering if we need a to_dict() call here as this is now an sdk call","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":2542,"context_line":"            raise exception.UnableToAutoAllocateNetwork(project_id\u003dproject_id)"},{"line_number":2543,"context_line":""},{"line_number":2544,"context_line":"        try:"},{"line_number":2545,"context_line":"            network \u003d neutron.get_network(topology[\u0027id\u0027])"},{"line_number":2546,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2547,"context_line":"            # This shouldn\u0027t happen since we just created the network, but"},{"line_number":2548,"context_line":"            # handle it anyway."}],"source_content_type":"text/x-python","patch_set":20,"id":"b41bb392_bcb72d94","line":2545,"in_reply_to":"8cf9c461_1c2407a7","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":true,"context_lines":[{"line_number":2542,"context_line":"            raise exception.UnableToAutoAllocateNetwork(project_id\u003dproject_id)"},{"line_number":2543,"context_line":""},{"line_number":2544,"context_line":"        try:"},{"line_number":2545,"context_line":"            network \u003d neutron.get_network(topology[\u0027id\u0027])"},{"line_number":2546,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2547,"context_line":"            # This shouldn\u0027t happen since we just created the network, but"},{"line_number":2548,"context_line":"            # handle it anyway."}],"source_content_type":"text/x-python","patch_set":20,"id":"8cf9c461_1c2407a7","line":2545,"in_reply_to":"a6d48ab2_c57a6aae","updated":"2026-02-05 19:04:32.000000000","message":"to keep all the callers happy I return with the good old dict.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":2559,"context_line":"                                   requested_networks):"},{"line_number":2560,"context_line":""},{"line_number":2561,"context_line":"        LOG.info(\u0027_ports_needed_per_instance requested_netwokrs\u003d%s\u0027,"},{"line_number":2562,"context_line":"                 requested_networks)"},{"line_number":2563,"context_line":"        # TODO(danms): Remove me when all callers pass an object"},{"line_number":2564,"context_line":"        if requested_networks and isinstance(requested_networks[0], tuple):"},{"line_number":2565,"context_line":"            requested_networks \u003d objects.NetworkRequestList.from_tuples("}],"source_content_type":"text/x-python","patch_set":20,"id":"2205732d_87b9ae1b","line":2562,"updated":"2026-02-02 19:15:11.000000000","message":"probably remaining here from debugging","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":true,"context_lines":[{"line_number":2559,"context_line":"                                   requested_networks):"},{"line_number":2560,"context_line":""},{"line_number":2561,"context_line":"        LOG.info(\u0027_ports_needed_per_instance requested_netwokrs\u003d%s\u0027,"},{"line_number":2562,"context_line":"                 requested_networks)"},{"line_number":2563,"context_line":"        # TODO(danms): Remove me when all callers pass an object"},{"line_number":2564,"context_line":"        if requested_networks and isinstance(requested_networks[0], tuple):"},{"line_number":2565,"context_line":"            requested_networks \u003d objects.NetworkRequestList.from_tuples("}],"source_content_type":"text/x-python","patch_set":20,"id":"f640ab2d_1ef55679","line":2562,"in_reply_to":"2205732d_87b9ae1b","updated":"2026-02-05 19:04:32.000000000","message":"true, I removed","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":2559,"context_line":"                                   requested_networks):"},{"line_number":2560,"context_line":""},{"line_number":2561,"context_line":"        LOG.info(\u0027_ports_needed_per_instance requested_netwokrs\u003d%s\u0027,"},{"line_number":2562,"context_line":"                 requested_networks)"},{"line_number":2563,"context_line":"        # TODO(danms): Remove me when all callers pass an object"},{"line_number":2564,"context_line":"        if requested_networks and isinstance(requested_networks[0], tuple):"},{"line_number":2565,"context_line":"            requested_networks \u003d objects.NetworkRequestList.from_tuples("}],"source_content_type":"text/x-python","patch_set":20,"id":"09f427ec_606e1fd9","line":2562,"in_reply_to":"f640ab2d_1ef55679","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":2906,"context_line":"        \"\"\"Get specific network for client.\"\"\""},{"line_number":2907,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2908,"context_line":"        try:"},{"line_number":2909,"context_line":"            return client.get_network(network_uuid).to_dict() or {}"},{"line_number":2910,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2911,"context_line":"            raise exception.NetworkNotFound(network_id\u003dnetwork_uuid)"},{"line_number":2912,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bdd1a4d9_be90a089","line":2909,"range":{"start_line":2909,"start_character":52,"end_line":2909,"end_character":67},"updated":"2026-02-02 19:15:11.000000000","message":"Could you double check if to_dict() can ever return something that is not a dict? If it always returns a dict then you can drop `or {}`","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":2906,"context_line":"        \"\"\"Get specific network for client.\"\"\""},{"line_number":2907,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2908,"context_line":"        try:"},{"line_number":2909,"context_line":"            return client.get_network(network_uuid).to_dict() or {}"},{"line_number":2910,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2911,"context_line":"            raise exception.NetworkNotFound(network_id\u003dnetwork_uuid)"},{"line_number":2912,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"f48e0e8c_63f709d9","line":2909,"range":{"start_line":2909,"start_character":52,"end_line":2909,"end_character":67},"in_reply_to":"1bff61d7_f34f74f7","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":2906,"context_line":"        \"\"\"Get specific network for client.\"\"\""},{"line_number":2907,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2908,"context_line":"        try:"},{"line_number":2909,"context_line":"            return client.get_network(network_uuid).to_dict() or {}"},{"line_number":2910,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2911,"context_line":"            raise exception.NetworkNotFound(network_id\u003dnetwork_uuid)"},{"line_number":2912,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1bff61d7_f34f74f7","line":2909,"range":{"start_line":2909,"start_character":52,"end_line":2909,"end_character":67},"in_reply_to":"bdd1a4d9_be90a089","updated":"2026-02-05 18:58:41.000000000","message":"true, done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":3522,"context_line":"            client \u003d get_client(context, admin\u003dTrue)"},{"line_number":3523,"context_line":"        else:"},{"line_number":3524,"context_line":"            client \u003d admin_client"},{"line_number":3525,"context_line":"        sdk_neutron \u003d get_network_client(context)"},{"line_number":3526,"context_line":""},{"line_number":3527,"context_line":"        data \u003d client.list_ports(**search_opts)"},{"line_number":3528,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"778f3d5f_e9d05a31","line":3525,"updated":"2026-02-02 19:15:11.000000000","message":"maybe sdk_client is more consistent here. (Or you can take the opportunity and move each occasion of sdk_* as you transform to a single postfix either neutron or client)","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":false,"context_lines":[{"line_number":3522,"context_line":"            client \u003d get_client(context, admin\u003dTrue)"},{"line_number":3523,"context_line":"        else:"},{"line_number":3524,"context_line":"            client \u003d admin_client"},{"line_number":3525,"context_line":"        sdk_neutron \u003d get_network_client(context)"},{"line_number":3526,"context_line":""},{"line_number":3527,"context_line":"        data \u003d client.list_ports(**search_opts)"},{"line_number":3528,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"a39c4f7a_33f26484","line":3525,"in_reply_to":"778f3d5f_e9d05a31","updated":"2026-02-05 19:04:32.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"85854f24ae110746c9a9bd92850e9cde4e1c38b8","unresolved":true,"context_lines":[{"line_number":685,"context_line":"                if net_id in networks:"},{"line_number":686,"context_line":"                    network \u003d networks[net_id]"},{"line_number":687,"context_line":"                else:"},{"line_number":688,"context_line":"                    network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":689,"context_line":"                    networks[net_id] \u003d network"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"            # Unbind Port device"}],"source_content_type":"text/x-python","patch_set":26,"id":"86280c87_fc15475b","line":688,"updated":"2026-06-09 00:55:20.000000000","message":"Should we specify fields\u003d\u0027dns_domain\u0027 here? Assuming it works, it\u0027s all the code below wants.\n\n...get_network(net_id, fields\u003d\u0027dns_domain\u0027)...\n\nThe API ref does show it as the only supported option for a GET w/ID\n\nhttps://docs.openstack.org/api-ref/network/v2/index.html#networks","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8293b172f5061407829905f8fa180238a2d2fa88","unresolved":false,"context_lines":[{"line_number":685,"context_line":"                if net_id in networks:"},{"line_number":686,"context_line":"                    network \u003d networks[net_id]"},{"line_number":687,"context_line":"                else:"},{"line_number":688,"context_line":"                    network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":689,"context_line":"                    networks[net_id] \u003d network"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"            # Unbind Port device"}],"source_content_type":"text/x-python","patch_set":26,"id":"05bc81e2_9a7f2e9d","line":688,"in_reply_to":"194a0773_fee3041e","updated":"2026-07-08 10:58:20.000000000","message":"With the SDK patches (https://review.opendev.org/q/topic:%22fields_for_network%22 ) we can use fields for Neutron API + SDK, the same can work for other APIs you only have to add fields in Openstack resource definitions for ypur class\u0027 _query_mapping","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"047e3ec86e68c17912af37c0bdf4663dbb1aad1f","unresolved":false,"context_lines":[{"line_number":685,"context_line":"                if net_id in networks:"},{"line_number":686,"context_line":"                    network \u003d networks[net_id]"},{"line_number":687,"context_line":"                else:"},{"line_number":688,"context_line":"                    network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":689,"context_line":"                    networks[net_id] \u003d network"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"            # Unbind Port device"}],"source_content_type":"text/x-python","patch_set":26,"id":"194a0773_fee3041e","line":688,"in_reply_to":"86280c87_fc15475b","updated":"2026-06-12 12:11:57.000000000","message":"that is a big difference in SDK (at least what I know about it) compared to neutronclient that we always get back resource objects which has all the fields anyway.\nIn this case a Network object (openstack.network.v2.network.Network: https://opendev.org/openstack/openstacksdk/src/branch/master/openstack/network/v2/network.py ). So no reason for asking for some field only as we anyway have an object with all the fields, but some will be None or the default set in the resource class.","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"85854f24ae110746c9a9bd92850e9cde4e1c38b8","unresolved":true,"context_lines":[{"line_number":2221,"context_line":"            used for the physnet name."},{"line_number":2222,"context_line":"        \"\"\""},{"line_number":2223,"context_line":"        if self.has_multi_provider_extension(client\u003dneutron):"},{"line_number":2224,"context_line":"            network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":2225,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {}) or {}"},{"line_number":2226,"context_line":"            for net in segments:"},{"line_number":2227,"context_line":"                # NOTE(vladikr): In general, \"multi-segments\" network is a"}],"source_content_type":"text/x-python","patch_set":26,"id":"48ef30ba_b98bbb76","line":2224,"updated":"2026-06-09 00:55:20.000000000","message":"Same here, does passing fields\u003d\u0027segments\u0027 work?","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"047e3ec86e68c17912af37c0bdf4663dbb1aad1f","unresolved":false,"context_lines":[{"line_number":2221,"context_line":"            used for the physnet name."},{"line_number":2222,"context_line":"        \"\"\""},{"line_number":2223,"context_line":"        if self.has_multi_provider_extension(client\u003dneutron):"},{"line_number":2224,"context_line":"            network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":2225,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {}) or {}"},{"line_number":2226,"context_line":"            for net in segments:"},{"line_number":2227,"context_line":"                # NOTE(vladikr): In general, \"multi-segments\" network is a"}],"source_content_type":"text/x-python","patch_set":26,"id":"6802b6b6_c2dd02fe","line":2224,"in_reply_to":"48ef30ba_b98bbb76","updated":"2026-06-12 12:11:57.000000000","message":"the same as above. I even tried just to make me remember when I first played with these:\npython snippet:\n...\nnets \u003d conn.network.get_network(\u0027878bb568-87c0-4267-b717-91cdaec47197\u0027, fields\u003d[\u0027name\u0027])\n...\n\n$ python3 sdk_test.py \nTraceback (most recent call last):\n  File \"/home/lajoskatona/sdk_test.py\", line 17, in \u003cmodule\u003e\n    nets \u003d conn.network.get_network(\u0027878bb568-87c0-4267-b717-91cdaec47197\u0027, fields\u003d[\u0027name\u0027])\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTypeError: Proxy.get_network() got an unexpected keyword argument \u0027fields\u0027","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8293b172f5061407829905f8fa180238a2d2fa88","unresolved":false,"context_lines":[{"line_number":2221,"context_line":"            used for the physnet name."},{"line_number":2222,"context_line":"        \"\"\""},{"line_number":2223,"context_line":"        if self.has_multi_provider_extension(client\u003dneutron):"},{"line_number":2224,"context_line":"            network \u003d sdk_neutron.get_network(net_id).to_dict()"},{"line_number":2225,"context_line":"            segments \u003d network.get(\u0027segments\u0027, {}) or {}"},{"line_number":2226,"context_line":"            for net in segments:"},{"line_number":2227,"context_line":"                # NOTE(vladikr): In general, \"multi-segments\" network is a"}],"source_content_type":"text/x-python","patch_set":26,"id":"2479f51d_7313ff80","line":2224,"in_reply_to":"6802b6b6_c2dd02fe","updated":"2026-07-08 10:58:20.000000000","message":"ditto","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        else:"},{"line_number":457,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":458,"context_line":"            search_opts \u003d {\u0027project_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":459,"context_line":"            if auto_allocate:"},{"line_number":460,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":461,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":28,"id":"8d80180a_f880f722","line":458,"updated":"2026-06-15 20:18:16.000000000","message":"out of interest will this return tenant netowrks that are shared with me via neutron rbac rules.\n\nnova had no awareness fo that expclitly before so im not asking you to make\nthat work if it previosuly didnt im jsut confirming if there is any bevhioral change in that regard.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":true,"context_lines":[{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        else:"},{"line_number":457,"context_line":"            # (1) Retrieve non-public network list owned by the tenant."},{"line_number":458,"context_line":"            search_opts \u003d {\u0027project_id\u0027: project_id, \u0027is_shared\u0027: False}"},{"line_number":459,"context_line":"            if auto_allocate:"},{"line_number":460,"context_line":"                # The auto-allocated-topology extension may create complex"},{"line_number":461,"context_line":"                # network topologies and it does so in a non-transactional"}],"source_content_type":"text/x-python","patch_set":28,"id":"aa6d60d7_e23dc6ff","line":458,"in_reply_to":"8d80180a_f880f722","updated":"2026-06-22 17:07:42.000000000","message":"you mean with RBAC policies (https://docs.openstack.org/api-ref/network/v2/index.html#rbac-policies) ? That can make it more difficult, but the default case is that Neutron API will return for this call networks that owned by project and the shared field is False (I add here also a note to help mental mapping between API field shared and SDK property is_shared)","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":false,"context_lines":[{"line_number":464,"context_line":"                # resources that are meant to be ready and this can be done by"},{"line_number":465,"context_line":"                # checking their admin_state_up flag."},{"line_number":466,"context_line":"                search_opts[\u0027is_admin_state_up\u0027] \u003d True"},{"line_number":467,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            # (2) Retrieve public network list."},{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"}],"source_content_type":"text/x-python","patch_set":28,"id":"fb19b4e9_2ff153ce","line":467,"range":{"start_line":467,"start_character":12,"end_line":467,"end_character":16},"updated":"2026-06-15 20:18:16.000000000","message":"so nets was a list before but the sdk returns a generator so we have to egerly evaulatte that here to keep the types the same\n\ngithub.com/openstack/openstacksdk/blob/cd5d8aefef3d85683fdfcd2f465937ccacea0e83/openstack/network/v2/_proxy.py#L3099-L3100","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":464,"context_line":"                # resources that are meant to be ready and this can be done by"},{"line_number":465,"context_line":"                # checking their admin_state_up flag."},{"line_number":466,"context_line":"                search_opts[\u0027is_admin_state_up\u0027] \u003d True"},{"line_number":467,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            # (2) Retrieve public network list."},{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"}],"source_content_type":"text/x-python","patch_set":28,"id":"cc1fcf47_82c552f8","line":467,"range":{"start_line":467,"start_character":12,"end_line":467,"end_character":16},"in_reply_to":"fb19b4e9_2ff153ce","updated":"2026-06-22 17:07:42.000000000","message":"yes, exactly to keep \"outside\" world unaware of this difference I changed to an oldschool list.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                search_opts[\u0027is_admin_state_up\u0027] \u003d True"},{"line_number":467,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            # (2) Retrieve public network list."},{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"},{"line_number":471,"context_line":"            nets +\u003d list(neutron.networks(**search_opts))"},{"line_number":472,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"8a64254b_d35ab916","line":469,"range":{"start_line":469,"start_character":27,"end_line":469,"end_character":33},"updated":"2026-06-15 20:18:16.000000000","message":"i guess depending on your interperation of public that is valid.\n\npublic in this context does not mean \"A network on the internet\" it means a network that is viabel to all proejcts.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                search_opts[\u0027is_admin_state_up\u0027] \u003d True"},{"line_number":467,"context_line":"            nets \u003d list(neutron.networks(**search_opts))"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            # (2) Retrieve public network list."},{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"},{"line_number":471,"context_line":"            nets +\u003d list(neutron.networks(**search_opts))"},{"line_number":472,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"b8fe8867_f7d82759","line":469,"range":{"start_line":469,"start_character":27,"end_line":469,"end_character":33},"in_reply_to":"8a64254b_d35ab916","updated":"2026-06-22 17:07:42.000000000","message":"yes, router:external / is_router_external is for \"a network on the internet\" or more a network that is attached to outer wild.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":false,"context_lines":[{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            # (2) Retrieve public network list."},{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"},{"line_number":471,"context_line":"            nets +\u003d list(neutron.networks(**search_opts))"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"1293e77c_16157d6a","line":471,"range":{"start_line":471,"start_character":12,"end_line":471,"end_character":17},"updated":"2026-06-15 20:18:16.000000000","message":"with that said if we didnt concert to a list we could use itertools.chain here\n\nusign chain on the iterators would avoid the contcution fo the lists\n\nthe items in teh lists are goint to be converted into a dict later anyways so there will be at least one copy of the data regardless.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":false,"context_lines":[{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"},{"line_number":471,"context_line":"            nets +\u003d list(neutron.networks(**search_opts))"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        _ensure_requested_network_ordering("},{"line_number":476,"context_line":"            lambda x: x[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"ff07e162_3bc7dc3b","line":473,"range":{"start_line":473,"start_character":12,"end_line":473,"end_character":55},"updated":"2026-06-15 20:18:16.000000000","message":"here you are flateing the sdk object into a list of dictionaires.\n\n\nlookign at what the neutron cleint used to return \n\nlist networks evnetually callde do_request which called deseriase on a succesful repsocne\n\nhttps://github.com/openstack/python-neutronclient/blob/9d338dc92ac51d78809c7a9d4d6ccdc603837039/neutronclient/v2_0/client.py#L295\n\nwhich took the raw body jason and retruend a dict then it passes that to \n_convert_into_with_meta which raps the contiet in into _DictWithMeta \n\nwhich is class _DictWithMeta(dict, _RequestIdMixin):\n\nso it was previosly \n\nHTTP Response (JSON string) → deserialize() → Python dict → _convert_into_with_meta() → _DictWithMeta object (which is a dict with attached request IDs)\n\nso this is eqiventlint if the sdk to_dict has the request id.\n\nwe might not be depending on that anywayer but if we were it woudl be a regression.\n\nnow we are calling \n\nhttps://github.com/openstack/openstacksdk/blob/master/openstack/network/v2/_proxy.py#L3096\n\nwhich returns a generator of network objects \nhttps://github.com/openstack/openstacksdk/blob/cd5d8aefef3d85683fdfcd2f465937ccacea0e83/openstack/network/v2/_proxy.py#L3099-L3100\n\nto_dict incldue the heard by defult\nhttps://github.com/openstack/openstacksdk/blob/master/openstack/resource.py#L1118\nso \nhttps://github.com/openstack/openstacksdk/blob/master/openstack/resource.py#L1152-L1153\n\nso it not qutie the same shap as the sdk drops them\nhttps://github.com/openstack/openstacksdk/blob/cd5d8aefef3d85683fdfcd2f465937ccacea0e83/openstack/cloud/_network_common.py#L2147\nhttps://github.com/openstack/openstacksdk/blob/cd5d8aefef3d85683fdfcd2f465937ccacea0e83/openstack/cloud/_network_common.py#L2242\n\n\nbut i think its closee enought to work with.\n\nwe pass the request id that we expect to use via the context object anyway so the reqest id shoudl be the one we passed above\n\nhttps://review.opendev.org/c/openstack/nova/+/928022/28/nova/network/neutron.py#446\n\n\nim not goign to trace the other really i jsut wanted to confirm that the respocnes are roghly the same shap as the reason this python file exists is to normalise the  data that the rest fo nova sees.\n\nso we shoudl not expect any of these details to really leak out to other files.\n\nso as long as this file is consitented in the use of the new types interenally and hide the details externally that sufficient.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a3d47bdeecd32ca8f116637ed8591d7e234ed62","unresolved":true,"context_lines":[{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"},{"line_number":471,"context_line":"            nets +\u003d list(neutron.networks(**search_opts))"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        _ensure_requested_network_ordering("},{"line_number":476,"context_line":"            lambda x: x[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"3bd026e8_e0606aed","line":473,"range":{"start_line":473,"start_character":12,"end_line":473,"end_character":55},"in_reply_to":"c49084a1_0bf4d4a8","updated":"2026-06-16 18:02:34.000000000","message":"classes are fine as long as the stay within this module.\ni woudl prefer to use atibute access over dict acssess anyway\n\nbut i was more looking at the exeitnt type vs the new ones and trying to make sure we didnt change that drasticly as part fo the refactor","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"db06460aedfbecacf240aec6b7a29a4ec9785394","unresolved":true,"context_lines":[{"line_number":470,"context_line":"            search_opts \u003d {\u0027is_shared\u0027: True}"},{"line_number":471,"context_line":"            nets +\u003d list(neutron.networks(**search_opts))"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"            nets_dict \u003d [net.to_dict() for net in nets]"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        _ensure_requested_network_ordering("},{"line_number":476,"context_line":"            lambda x: x[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"c49084a1_0bf4d4a8","line":473,"range":{"start_line":473,"start_character":12,"end_line":473,"end_character":55},"in_reply_to":"ff07e162_3bc7dc3b","updated":"2026-06-16 15:43:27.000000000","message":"Is there a reason we need to convert these to dicts? Classes gives us more type safety (and this will only get better with time) and the `Resource` class already behaves like a dict in many ways (e.g. you can access fields like `foo[\u0027id\u0027]` I believe)?","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":627,"context_line":"        neutron \u003d get_client(context)"},{"line_number":628,"context_line":"        sdk_neutron \u003d get_network_client(context)"},{"line_number":629,"context_line":"        self._unbind_ports(context, ports, neutron, sdk_neutron\u003dsdk_neutron,"},{"line_number":630,"context_line":"                           detach\u003ddetach)"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    def _unbind_ports(self, context, ports,"},{"line_number":633,"context_line":"                      neutron, sdk_neutron\u003dNone, port_client\u003dNone,"}],"source_content_type":"text/x-python","patch_set":28,"id":"7061aea6_eb22bd83","line":630,"updated":"2026-06-15 20:18:16.000000000","message":"ok so we need both clients for now because we will use the sdk for retriving network resouces adn the neutron client for ports.\n\nso in a followup patch i expect to only pass one.\n\nalernitivly we coudl have defert this until we move ports. that may have been a litte cleaner.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        neutron \u003d get_client(context)"},{"line_number":628,"context_line":"        sdk_neutron \u003d get_network_client(context)"},{"line_number":629,"context_line":"        self._unbind_ports(context, ports, neutron, sdk_neutron\u003dsdk_neutron,"},{"line_number":630,"context_line":"                           detach\u003ddetach)"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    def _unbind_ports(self, context, ports,"},{"line_number":633,"context_line":"                      neutron, sdk_neutron\u003dNone, port_client\u003dNone,"}],"source_content_type":"text/x-python","patch_set":28,"id":"27c92e44_a39c637e","line":630,"in_reply_to":"7061aea6_eb22bd83","updated":"2026-06-22 17:07:42.000000000","message":"exactly, when I realized that this work must be cut into pieces, I kept the clients for example where it was not necessary to change. Here only the one client was changed to sdk client not the one for ports. That is changed in a coming patch ( https://review.opendev.org/c/openstack/nova/+/969298 )","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":906,"context_line":"            # speed processing of this request a lot in case when tenant has"},{"line_number":907,"context_line":"            # got many security groups"},{"line_number":908,"context_line":"            sg_fields \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":909,"context_line":"            search_opts \u003d {\u0027project_id\u0027: instance.project_id}"},{"line_number":910,"context_line":"            sg_filter_ext \u003d self.has_sg_shared_filter_extension(client\u003dneutron)"},{"line_number":911,"context_line":"            user_security_groups \u003d neutron.list_security_groups("},{"line_number":912,"context_line":"                fields\u003dsg_fields, **search_opts).get(\u0027security_groups\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"66249063_1c048fd6","line":909,"updated":"2026-06-15 20:18:16.000000000","message":"this is technically unrelated to the network conversion\n\nthat would be better placed with the security groups patch.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2987b16f624b48dec8f6b7a772f76a5e42106f2c","unresolved":true,"context_lines":[{"line_number":906,"context_line":"            # speed processing of this request a lot in case when tenant has"},{"line_number":907,"context_line":"            # got many security groups"},{"line_number":908,"context_line":"            sg_fields \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":909,"context_line":"            search_opts \u003d {\u0027project_id\u0027: instance.project_id}"},{"line_number":910,"context_line":"            sg_filter_ext \u003d self.has_sg_shared_filter_extension(client\u003dneutron)"},{"line_number":911,"context_line":"            user_security_groups \u003d neutron.list_security_groups("},{"line_number":912,"context_line":"                fields\u003dsg_fields, **search_opts).get(\u0027security_groups\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"df7b92ee_6b1bdc58","line":909,"in_reply_to":"66249063_1c048fd6","updated":"2026-06-15 21:45:12.000000000","message":"I can put it in my follow-on at the end of the series if you want. Neutron is removing support for tenant_id, which at this point might slip to 2027.1, but I am making that push after 10 years of trying.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":906,"context_line":"            # speed processing of this request a lot in case when tenant has"},{"line_number":907,"context_line":"            # got many security groups"},{"line_number":908,"context_line":"            sg_fields \u003d [\u0027id\u0027, \u0027name\u0027]"},{"line_number":909,"context_line":"            search_opts \u003d {\u0027project_id\u0027: instance.project_id}"},{"line_number":910,"context_line":"            sg_filter_ext \u003d self.has_sg_shared_filter_extension(client\u003dneutron)"},{"line_number":911,"context_line":"            user_security_groups \u003d neutron.list_security_groups("},{"line_number":912,"context_line":"                fields\u003dsg_fields, **search_opts).get(\u0027security_groups\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"fc0d43d1_5992f6e4","line":909,"in_reply_to":"df7b92ee_6b1bdc58","updated":"2026-06-22 17:07:42.000000000","message":"true, I change it back","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":1043,"context_line":"                continue"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"            try:"},{"line_number":1046,"context_line":"                port_security_enabled \u003d network.get("},{"line_number":1047,"context_line":"                    \u0027is_port_security_enabled\u0027, True)"},{"line_number":1048,"context_line":"                if port_security_enabled:"},{"line_number":1049,"context_line":"                    if not network.get(\u0027subnet_ids\u0027):"},{"line_number":1050,"context_line":"                        # Neutron can\u0027t apply security groups to a port"},{"line_number":1051,"context_line":"                        # for a network without L3 assignments."},{"line_number":1052,"context_line":"                        LOG.debug(\u0027Network with port security enabled does \u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"4e873f72_3a8799f2","line":1049,"range":{"start_line":1046,"start_character":7,"end_line":1049,"end_character":53},"updated":"2026-06-15 20:18:16.000000000","message":"i guess this is fine. \n\nthe other way to have done this conversion woudl have been to defien data clases that model the current shape fo the repocns with te neutron client\nand then provided a diffent static method ot constuct it form the sdk.\n\nthat the pattern we have chosen  to use for watcher but this is valid we just need to be carful that we never return the dictionares form the sdk outside this module.\n\nif we do we need to ensure it never changes teh responce of the nova api or metadata api content.\n\nwe have openapi responce scemas for the main api which should catch any change so we really just need ot be careful about the metadata api.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"                continue"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"            try:"},{"line_number":1046,"context_line":"                port_security_enabled \u003d network.get("},{"line_number":1047,"context_line":"                    \u0027is_port_security_enabled\u0027, True)"},{"line_number":1048,"context_line":"                if port_security_enabled:"},{"line_number":1049,"context_line":"                    if not network.get(\u0027subnet_ids\u0027):"},{"line_number":1050,"context_line":"                        # Neutron can\u0027t apply security groups to a port"},{"line_number":1051,"context_line":"                        # for a network without L3 assignments."},{"line_number":1052,"context_line":"                        LOG.debug(\u0027Network with port security enabled does \u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"ccae2f85_19c47728","line":1049,"range":{"start_line":1046,"start_character":7,"end_line":1049,"end_character":53},"in_reply_to":"4e873f72_3a8799f2","updated":"2026-06-22 17:07:42.000000000","message":"ack","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":2891,"context_line":"    def get_all(self, context):"},{"line_number":2892,"context_line":"        \"\"\"Get all networks for client.\"\"\""},{"line_number":2893,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2894,"context_line":"        return client.networks()"},{"line_number":2895,"context_line":""},{"line_number":2896,"context_line":"    def get(self, context, network_uuid):"},{"line_number":2897,"context_line":"        \"\"\"Get specific network for client.\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"11a97248_7be2bce1","line":2894,"range":{"start_line":2894,"start_character":15,"end_line":2894,"end_character":32},"updated":"2026-06-15 20:18:16.000000000","message":"client.list_networks() returns the json deserislaed resonce body as a dict and then we retun the content of the networks key which is a dict \nhere i belive we are now returnign a generator\n\nhttps://github.com/openstack/openstacksdk/blob/cd5d8aefef3d85683fdfcd2f465937ccacea0e83/openstack/network/v2/_proxy.py#L3096-L3124\n\nso i think you need to wrap this in list() ior\n\n\n\n```suggestion\n        return [net.to_dict() for net in client.networks()]\n```\n\nto keep the return type a LIST[DICT]","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":2891,"context_line":"    def get_all(self, context):"},{"line_number":2892,"context_line":"        \"\"\"Get all networks for client.\"\"\""},{"line_number":2893,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2894,"context_line":"        return client.networks()"},{"line_number":2895,"context_line":""},{"line_number":2896,"context_line":"    def get(self, context, network_uuid):"},{"line_number":2897,"context_line":"        \"\"\"Get specific network for client.\"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"48833e52_396a69ab","line":2894,"range":{"start_line":2894,"start_character":15,"end_line":2894,"end_character":32},"in_reply_to":"11a97248_7be2bce1","updated":"2026-06-22 17:07:42.000000000","message":"Acknowledged","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":2897,"context_line":"        \"\"\"Get specific network for client.\"\"\""},{"line_number":2898,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2899,"context_line":"        try:"},{"line_number":2900,"context_line":"            return client.get_network(network_uuid).to_dict()"},{"line_number":2901,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2902,"context_line":"            raise exception.NetworkNotFound(network_id\u003dnetwork_uuid)"},{"line_number":2903,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"2963bd58_44fb5b95","line":2900,"updated":"2026-06-15 20:18:16.000000000","message":"like you are converting to a dict here instead of returnign the sdk object","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":2897,"context_line":"        \"\"\"Get specific network for client.\"\"\""},{"line_number":2898,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2899,"context_line":"        try:"},{"line_number":2900,"context_line":"            return client.get_network(network_uuid).to_dict()"},{"line_number":2901,"context_line":"        except sdk_exc.NotFoundException:"},{"line_number":2902,"context_line":"            raise exception.NetworkNotFound(network_id\u003dnetwork_uuid)"},{"line_number":2903,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"f31ef9f3_29f76916","line":2900,"in_reply_to":"2963bd58_44fb5b95","updated":"2026-06-22 17:07:42.000000000","message":"Acknowledged","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":2981,"context_line":"        \"\"\"Return floating IP pools a.k.a. external networks.\"\"\""},{"line_number":2982,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2983,"context_line":"        data \u003d client.networks(**{constants.NET_EXTERNAL: True})"},{"line_number":2984,"context_line":"        return data"},{"line_number":2985,"context_line":""},{"line_number":2986,"context_line":"    def get_floating_ips_by_project(self, context):"},{"line_number":2987,"context_line":"        client \u003d get_client(context)"}],"source_content_type":"text/x-python","patch_set":28,"id":"03f6cb41_3e4c93d4","line":2984,"range":{"start_line":2984,"start_character":15,"end_line":2984,"end_character":19},"updated":"2026-06-15 20:18:16.000000000","message":"[net.to_dict() for net in data]\n \n that needed to convert the returned generateor and the items into dicts\n \n wethere we actully call `to_dict()` or not is actully kind fo an interesting question\n \n because both the sdk object and client obvject eitehr inherit form dict or have get atibute overied that tires to find the filed in the body\n \n means that subscript access or dict access will sometime \"just work\" even fi we don\u0027t explicitly convert it. but it also means we are keeping all the hearder and other information around for longer. so it would be increaing memory usage even if we are not breakign teh duck typing\n \ni kind of wish we had mypy types for these function and the return vlaues to catch some of this.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":2981,"context_line":"        \"\"\"Return floating IP pools a.k.a. external networks.\"\"\""},{"line_number":2982,"context_line":"        client \u003d get_network_client(context)"},{"line_number":2983,"context_line":"        data \u003d client.networks(**{constants.NET_EXTERNAL: True})"},{"line_number":2984,"context_line":"        return data"},{"line_number":2985,"context_line":""},{"line_number":2986,"context_line":"    def get_floating_ips_by_project(self, context):"},{"line_number":2987,"context_line":"        client \u003d get_client(context)"}],"source_content_type":"text/x-python","patch_set":28,"id":"e657d529_5a42d411","line":2984,"range":{"start_line":2984,"start_character":15,"end_line":2984,"end_character":19},"in_reply_to":"03f6cb41_3e4c93d4","updated":"2026-06-22 17:07:42.000000000","message":"true, thanks.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"        for net in networks:"},{"line_number":3327,"context_line":"            if port[\u0027network_id\u0027] \u003d\u003d net[\u0027id\u0027]:"},{"line_number":3328,"context_line":"                network_name \u003d net[\u0027name\u0027]"},{"line_number":3329,"context_line":"                tenant_id \u003d net.get(\u0027project_id\u0027) or net.get(\u0027tenant_id\u0027)"},{"line_number":3330,"context_line":"                network_mtu \u003d net.get(\u0027mtu\u0027)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"82a7f9af_e04099e8","line":3329,"range":{"start_line":3329,"start_character":15,"end_line":3329,"end_character":73},"updated":"2026-06-15 20:18:16.000000000","message":"ah this is required because neutron is not using microverions\nim kind of surpsied that the sdk does not handel that but ok.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3e9506eb46ca66e9b3a11432d66ea2891991bdb4","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"        for net in networks:"},{"line_number":3327,"context_line":"            if port[\u0027network_id\u0027] \u003d\u003d net[\u0027id\u0027]:"},{"line_number":3328,"context_line":"                network_name \u003d net[\u0027name\u0027]"},{"line_number":3329,"context_line":"                tenant_id \u003d net.get(\u0027project_id\u0027) or net.get(\u0027tenant_id\u0027)"},{"line_number":3330,"context_line":"                network_mtu \u003d net.get(\u0027mtu\u0027)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"b08014a6_f1fa7206","line":3329,"range":{"start_line":3329,"start_character":15,"end_line":3329,"end_character":73},"in_reply_to":"3021f2e2_1a2f9691","updated":"2026-06-15 22:10:49.000000000","message":"so nova need to run with old neuton.\nwhile we dont define a requrement for exacatly how old\ni woudl say if there is a stable branch of neutron alive the does not include proejct_id in the responce we need to supprot tenant_id\n\nonce it goes unmaintianed i dont mind if nova cant run with it but others might.\nat the very minium however we need to supprot 2026.1 neutron with master nova but as i said ideally at lesat 2 if not 3 releases.\n\nwhen did neutron start returning project_id?\n\nif it fits that range we are good.\n\nwith that said perhasp the sdk will handle this for us? will it convert tenant_id to project id internally? that woudl also allow use to drop teanat_id handlign in nova sooner.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2987b16f624b48dec8f6b7a772f76a5e42106f2c","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"        for net in networks:"},{"line_number":3327,"context_line":"            if port[\u0027network_id\u0027] \u003d\u003d net[\u0027id\u0027]:"},{"line_number":3328,"context_line":"                network_name \u003d net[\u0027name\u0027]"},{"line_number":3329,"context_line":"                tenant_id \u003d net.get(\u0027project_id\u0027) or net.get(\u0027tenant_id\u0027)"},{"line_number":3330,"context_line":"                network_mtu \u003d net.get(\u0027mtu\u0027)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3021f2e2_1a2f9691","line":3329,"range":{"start_line":3329,"start_character":15,"end_line":3329,"end_character":73},"in_reply_to":"82a7f9af_e04099e8","updated":"2026-06-15 21:45:12.000000000","message":"I completely remove the tenant_id part in my follow-on at the end of the series.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a3d47bdeecd32ca8f116637ed8591d7e234ed62","unresolved":false,"context_lines":[{"line_number":3326,"context_line":"        for net in networks:"},{"line_number":3327,"context_line":"            if port[\u0027network_id\u0027] \u003d\u003d net[\u0027id\u0027]:"},{"line_number":3328,"context_line":"                network_name \u003d net[\u0027name\u0027]"},{"line_number":3329,"context_line":"                tenant_id \u003d net.get(\u0027project_id\u0027) or net.get(\u0027tenant_id\u0027)"},{"line_number":3330,"context_line":"                network_mtu \u003d net.get(\u0027mtu\u0027)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"69518d49_72b20f3a","line":3329,"range":{"start_line":3329,"start_character":15,"end_line":3329,"end_character":73},"in_reply_to":"b0563857_910ea379","updated":"2026-06-16 18:02:34.000000000","message":"ok we shoudl good in that case form an upgrade point of view.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b1edc075c29694c008527da27b143361e6621040","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"        for net in networks:"},{"line_number":3327,"context_line":"            if port[\u0027network_id\u0027] \u003d\u003d net[\u0027id\u0027]:"},{"line_number":3328,"context_line":"                network_name \u003d net[\u0027name\u0027]"},{"line_number":3329,"context_line":"                tenant_id \u003d net.get(\u0027project_id\u0027) or net.get(\u0027tenant_id\u0027)"},{"line_number":3330,"context_line":"                network_mtu \u003d net.get(\u0027mtu\u0027)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"b0563857_910ea379","line":3329,"range":{"start_line":3329,"start_character":15,"end_line":3329,"end_character":73},"in_reply_to":"b08014a6_f1fa7206","updated":"2026-06-16 16:04:43.000000000","message":"I think neutron has returned both tenant_id and project_id keys since the Newton release? At least that is when we added the Project mixin (2016). Right now I believe the sdk will return both keys, even if neutron only returns one, but I\u0027ve been pushing that recently to only send project_id in requests going forward.\n\nCurrently even our neutron-lib code is doing this same dance - make sure tenant_id and project_id are in every call, but I started adding warnings to neutron so people notice (like on plugin calls where it\u0027s not via the API). I want to make those complaints \"louder\" so people change their code since eventually it *will* fail - 2026.2 will probably be the last cycle to return tenant_id, all the TODOs we\u0027ve been accumulating are going away in 2027.1, we have to rip the band-aid off.\n\nBTW, I removed this tenant_id code in [0] and it worked fine.\n\n[0] https://review.opendev.org/c/openstack/nova/+/991948/7/nova/network/neutron.py","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":3373,"context_line":"        # as the bridge is a \u0027\u003cnetwork-name\u003e-\u003cnetwork-UUID\u003e\u0027."},{"line_number":3374,"context_line":"        if bridge is not None and vif_type !\u003d network_model.VIF_TYPE_DVS:"},{"line_number":3375,"context_line":"            bridge \u003d bridge[:network_model.NIC_NAME_LEN]"},{"line_number":3376,"context_line":""},{"line_number":3377,"context_line":"        physnet, tunneled \u003d self._get_physnet_tunneled_info("},{"line_number":3378,"context_line":"            context, neutron\u003dneutron, sdk_neutron\u003dsdk_neutron,"},{"line_number":3379,"context_line":"            net_id\u003dport[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"387f7bb6_5eac964e","line":3376,"updated":"2026-06-15 20:18:16.000000000","message":"for what its worth i woudl be tempeted ot place \n`sdk_neutron \u003d get_network_client(context)` here for now\nbut it will gradually get moved up as more stuff uses it so that is ok.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":3373,"context_line":"        # as the bridge is a \u0027\u003cnetwork-name\u003e-\u003cnetwork-UUID\u003e\u0027."},{"line_number":3374,"context_line":"        if bridge is not None and vif_type !\u003d network_model.VIF_TYPE_DVS:"},{"line_number":3375,"context_line":"            bridge \u003d bridge[:network_model.NIC_NAME_LEN]"},{"line_number":3376,"context_line":""},{"line_number":3377,"context_line":"        physnet, tunneled \u003d self._get_physnet_tunneled_info("},{"line_number":3378,"context_line":"            context, neutron\u003dneutron, sdk_neutron\u003dsdk_neutron,"},{"line_number":3379,"context_line":"            net_id\u003dport[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"9aec6e27_ff271ad0","line":3376,"in_reply_to":"387f7bb6_5eac964e","updated":"2026-06-22 17:07:42.000000000","message":"Acknowledged, I kept the sdk_client close to the old one to make it more visible that there is something new, but it can be close to the place where we now start to use it, that can be another option.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"}],"nova/tests/fixtures/neutron.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":867,"context_line":"        if network_id not in self._networks:"},{"line_number":868,"context_line":"            raise sdk_exceptions.NotFoundException()"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("}],"source_content_type":"text/x-python","patch_set":20,"id":"055b3d93_4ec5a845","line":870,"updated":"2026-02-02 19:15:11.000000000","message":"I guess the deepcopy here was intentional to avoid that the caller modifying the returned object has an effect on the simulated neutron server here. I see that now we are constructing a wrapper. So scalar fields probably OK as they are copied into the fields of sdk_net.Network but I don\u0027t know what happens with list and dicts from self._networks[id].","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4b3b4115f993228dfb39aab44ec3014bc769d7d7","unresolved":true,"context_lines":[{"line_number":867,"context_line":"        if network_id not in self._networks:"},{"line_number":868,"context_line":"            raise sdk_exceptions.NotFoundException()"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("}],"source_content_type":"text/x-python","patch_set":20,"id":"dc70ff13_1799c790","line":870,"in_reply_to":"055b3d93_4ec5a845","updated":"2026-02-05 19:04:32.000000000","message":"good catch. I tested it to be sure and it seems when we create an instance of SDK network for example it even creates new references for lists but let\u0027s have on the safe side.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":867,"context_line":"        if network_id not in self._networks:"},{"line_number":868,"context_line":"            raise sdk_exceptions.NotFoundException()"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("}],"source_content_type":"text/x-python","patch_set":20,"id":"8070b302_0a112910","line":870,"in_reply_to":"dc70ff13_1799c790","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"37cbb5585939a9a2a853705f4d2fed82672d0161","unresolved":true,"context_lines":[{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("},{"line_number":874,"context_line":"                self._networks, retrieve_all, **_params,"},{"line_number":875,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":20,"id":"3c70830b_0b878f84","line":872,"updated":"2026-02-02 19:15:11.000000000","message":"does retrieve_all part of the new interface? Could you point me where the sdk defines these functions?","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8426ec98105a59af44beb1c12f32024205318510","unresolved":true,"context_lines":[{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("},{"line_number":874,"context_line":"                self._networks, retrieve_all, **_params,"},{"line_number":875,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":20,"id":"4344040a_89f6d67e","line":872,"in_reply_to":"3c70830b_0b878f84","updated":"2026-02-05 18:58:41.000000000","message":"good catch, no it is not part, for networks:\nhttps://opendev.org/openstack/openstacksdk/src/branch/master/openstack/network/v2/_proxy.py#L2433\n\nneutronclient has much more options for such things, like fetching only fields.","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98cd54a7bc16e52455e6f9d57acdb0c966a211bc","unresolved":false,"context_lines":[{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("},{"line_number":874,"context_line":"                self._networks, retrieve_all, **_params,"},{"line_number":875,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":20,"id":"b32b9f35_36e15417","line":872,"in_reply_to":"4344040a_89f6d67e","updated":"2026-04-29 13:56:16.000000000","message":"Done","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8293b172f5061407829905f8fa180238a2d2fa88","unresolved":false,"context_lines":[{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        return sdk_net.Network(**self._networks[network_id])"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def networks(self, retrieve_all\u003dTrue, **_params):"},{"line_number":873,"context_line":"        nets \u003d self._list_resource("},{"line_number":874,"context_line":"                self._networks, retrieve_all, **_params,"},{"line_number":875,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":20,"id":"77b57b17_5314ac65","line":872,"in_reply_to":"b32b9f35_36e15417","updated":"2026-07-08 10:58:20.000000000","message":"With the SDK patches (https://review.opendev.org/q/topic:%22fields_for_network%22 ) we can use fields for Neutron API + SDK, the same can work for other APIs you only have to add fields in Openstack resource definitions for ypur class\u0027 _query_mapping","commit_id":"0af665c9a11f0e478cd1f23f7ed575573985facc"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"85854f24ae110746c9a9bd92850e9cde4e1c38b8","unresolved":true,"context_lines":[{"line_number":976,"context_line":"        if _params \u003d\u003d {\u0027fields\u0027: [\u0027dry-run\u0027]}:"},{"line_number":977,"context_line":"            return ("},{"line_number":978,"context_line":"                sdk_aat.AutoAllocatedTopology("},{"line_number":979,"context_line":"                    **{\u0027id\u0027: \u0027dry-run\u003dpass\u0027, \u0027tenant_id\u0027: project_id}))"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        return ("},{"line_number":982,"context_line":"            sdk_aat.AutoAllocatedTopology("}],"source_content_type":"text/x-python","patch_set":26,"id":"9b248c8a_f4679d87","line":979,"range":{"start_line":979,"start_character":46,"end_line":979,"end_character":55},"updated":"2026-06-09 00:55:20.000000000","message":"s/project_id ?","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"047e3ec86e68c17912af37c0bdf4663dbb1aad1f","unresolved":false,"context_lines":[{"line_number":976,"context_line":"        if _params \u003d\u003d {\u0027fields\u0027: [\u0027dry-run\u0027]}:"},{"line_number":977,"context_line":"            return ("},{"line_number":978,"context_line":"                sdk_aat.AutoAllocatedTopology("},{"line_number":979,"context_line":"                    **{\u0027id\u0027: \u0027dry-run\u003dpass\u0027, \u0027tenant_id\u0027: project_id}))"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        return ("},{"line_number":982,"context_line":"            sdk_aat.AutoAllocatedTopology("}],"source_content_type":"text/x-python","patch_set":26,"id":"06b497c2_b3999d94","line":979,"range":{"start_line":979,"start_character":46,"end_line":979,"end_character":55},"in_reply_to":"9b248c8a_f4679d87","updated":"2026-06-12 12:11:57.000000000","message":"thanks, tenant_id/project_id was not in my focus, and tried to keep the patches minimal (the patches anyway fat....)","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"85854f24ae110746c9a9bd92850e9cde4e1c38b8","unresolved":true,"context_lines":[{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        return ("},{"line_number":982,"context_line":"            sdk_aat.AutoAllocatedTopology("},{"line_number":983,"context_line":"                **{\u0027id\u0027: self.network_1[\u0027id\u0027], \u0027tenant_id\u0027: project_id, }))"}],"source_content_type":"text/x-python","patch_set":26,"id":"c1945c13_228db332","line":983,"range":{"start_line":983,"start_character":48,"end_line":983,"end_character":57},"updated":"2026-06-09 00:55:20.000000000","message":"Same. I think I missed this in my follow-on patch too.","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"047e3ec86e68c17912af37c0bdf4663dbb1aad1f","unresolved":false,"context_lines":[{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        return ("},{"line_number":982,"context_line":"            sdk_aat.AutoAllocatedTopology("},{"line_number":983,"context_line":"                **{\u0027id\u0027: self.network_1[\u0027id\u0027], \u0027tenant_id\u0027: project_id, }))"}],"source_content_type":"text/x-python","patch_set":26,"id":"e8aea131_b988a976","line":983,"range":{"start_line":983,"start_character":48,"end_line":983,"end_character":57},"in_reply_to":"c1945c13_228db332","updated":"2026-06-12 12:11:57.000000000","message":"Done","commit_id":"3998d4375962a5a81a331e57dfdc5108c8dbc5b5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class _FakeNetworkClient:"},{"line_number":65,"context_line":"    def __init__(self, fixture):"},{"line_number":66,"context_line":"        self.fixture \u003d fixture"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __getattr__(self, name):"},{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"}],"source_content_type":"text/x-python","patch_set":28,"id":"6f71b3d2_a39d79d8","line":70,"range":{"start_line":64,"start_character":0,"end_line":70,"end_character":1},"updated":"2026-06-15 20:18:16.000000000","message":"this is not really correct.\nthis client shoudl be enulating the normalisation doen by the sdk or failing that you shoudl be monkeypatchign the openstack client connection rather then moifying the fixture.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0cd57b7a12c4149d1867c0d508862304f893a135","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class _FakeNetworkClient:"},{"line_number":65,"context_line":"    def __init__(self, fixture):"},{"line_number":66,"context_line":"        self.fixture \u003d fixture"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __getattr__(self, name):"},{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"}],"source_content_type":"text/x-python","patch_set":28,"id":"ded92972_1c0a0c24","line":70,"range":{"start_line":64,"start_character":0,"end_line":70,"end_character":1},"in_reply_to":"6975c8df_aadd3606","updated":"2026-06-16 18:11:54.000000000","message":"ya i think that woudl be better\n\nFakeNeutronProxy is the new class that has or fake methods right?\n\nso \n\n```\nclass FakeNeutronProxy:\n\n  def networks(...):\n     ...\n```\n\nand with that\n\n```\n  fake_proxy \u003d mock.Mock(openstack.network.v2.Proxy)\n    stub \u003d FakeNeutronProxy()\n    for attr in dir(stub):\n        # Ignore built-in dunder methods\n        if not attr.startswith(\"__\"):\n            setattr(mock_instance, attr, getattr(stub, attr))\n```\n\n we woudl creat a mock form the proxy\nthen replace all fo the method we have implemted with or stub impletion form FakeNeutronProxy\n\nand any we dont implemnet woudl jsut be mock.Mock() obhectws right right?\nso it would intercept calls while also allowing us to stub or asset on them?\n\nor am i not understning whtat your suggesting?\n\ni assume we cant just reuse the neutron fake?\nhttps://github.com/openstack/python-openstackclient/blob/733b4325186dd4a8b79eac77fab66a6811d22732/openstackclient/tests/unit/network/v2/fakes.py#L98-L103","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"179b28b0c26ac10ec3a67968d0c1de3120f20ec1","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class _FakeNetworkClient:"},{"line_number":65,"context_line":"    def __init__(self, fixture):"},{"line_number":66,"context_line":"        self.fixture \u003d fixture"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __getattr__(self, name):"},{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"}],"source_content_type":"text/x-python","patch_set":28,"id":"6975c8df_aadd3606","line":70,"range":{"start_line":64,"start_character":0,"end_line":70,"end_character":1},"in_reply_to":"6bca7bdb_df1bfa56","updated":"2026-06-16 15:27:38.000000000","message":"In OSC, we use mock with `spec` on the `Proxy` class\n\nhttps://github.com/openstack/python-openstackclient/blob/733b4325186dd4a8b79eac77fab66a6811d22732/openstackclient/tests/unit/compute/v2/fakes.py#L47\n\nThere is also the `openstack.test.fakes.generate_fake_proxy` helper which will do this for you. Obviously in both cases you would then need to go assign the mock methods. I think for this case, something like so would do the trick?\n\n```\n    fake_proxy \u003d mock.Mock(openstack.network.v2.Proxy)\n    stub \u003d FakeNeutronProxy()\n    for attr in dir(stub):\n        # Ignore built-in dunder methods\n        if not attr.startswith(\"__\"):\n            setattr(mock_instance, attr, getattr(stub, attr))\n```\n\nPS: note that that Proxy classes are now exposed in `__init__.py` so the import should be `openstack.network.v2.Proxy` rather than importing from a private module: OSC needs to be updated","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f2cf274af47b9da206d5c8c3f53ab39ce126d458","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class _FakeNetworkClient:"},{"line_number":65,"context_line":"    def __init__(self, fixture):"},{"line_number":66,"context_line":"        self.fixture \u003d fixture"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __getattr__(self, name):"},{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"}],"source_content_type":"text/x-python","patch_set":28,"id":"6bca7bdb_df1bfa56","line":70,"range":{"start_line":64,"start_character":0,"end_line":70,"end_character":1},"in_reply_to":"6f71b3d2_a39d79d8","updated":"2026-06-15 20:30:05.000000000","message":"i think a more correct approch woudl be to build up an entirly new fixture\n\nso instead of modifying the Neutron fixture in place create a \n\nnetwork SDK fixture where you implement each method as you swap them\n```\nclass NetworkingFixture(fixtures.Fixture):\n\n   def networks(...):\n    ...\n```","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class _FakeNetworkClient:"},{"line_number":65,"context_line":"    def __init__(self, fixture):"},{"line_number":66,"context_line":"        self.fixture \u003d fixture"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __getattr__(self, name):"},{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"}],"source_content_type":"text/x-python","patch_set":28,"id":"10d23a12_1df0c179","line":70,"range":{"start_line":64,"start_character":0,"end_line":70,"end_character":1},"in_reply_to":"b5ff013a_57840b64","updated":"2026-06-22 17:07:42.000000000","message":"Acknowledged","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06211d48f019197b89c7baff500ca9c6de341d44","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class _FakeNetworkClient:"},{"line_number":65,"context_line":"    def __init__(self, fixture):"},{"line_number":66,"context_line":"        self.fixture \u003d fixture"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __getattr__(self, name):"},{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"}],"source_content_type":"text/x-python","patch_set":28,"id":"b5ff013a_57840b64","line":70,"range":{"start_line":64,"start_character":0,"end_line":70,"end_character":1},"in_reply_to":"ded92972_1c0a0c24","updated":"2026-06-16 18:22:00.000000000","message":"Yes, exactly that. You\u0027ll want a larger fake than what\u0027s in OSC though since that just stubs the methods: it doesn\u0027t set fake return values etc. since we typically do that on per-test basis.\n\nObviously we could also carry a fake neutron proxy fixture in SDK and re-use that here, but I suspect nova\u0027s requirements are a little to specific to do that.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f2cf274af47b9da206d5c8c3f53ab39ce126d458","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        return getattr(self.fixture, name)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(stephenfin): We should split out the stubs of neutronclient from the"},{"line_number":73,"context_line":"# stubs of \u0027nova.network.neutron\u0027 to simplify matters"},{"line_number":74,"context_line":"class NeutronFixture(fixtures.Fixture):"},{"line_number":75,"context_line":"    \"\"\"A fixture to boot instances with neutron ports\"\"\""},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5875a828_e0f81dbc","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":53},"updated":"2026-06-15 20:30:05.000000000","message":"doing that split first woudl also help here.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        \u0027provider_network_type\u0027: \u0027vxlan\u0027,"},{"line_number":100,"context_line":"        \u0027provider_physical_network\u0027: None,"},{"line_number":101,"context_line":"        \u0027provider_segmentation_id\u0027: 24,"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    security_group \u003d {"},{"line_number":105,"context_line":"        \u0027id\u0027: \u0027aec9df91-db1f-4e04-8ac6-e761d8461c53\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"381e88f9_b328524a","line":102,"updated":"2026-06-15 20:18:16.000000000","message":"this is one of the downside of not creating an indirection layer.\n\nthe neturon fixture is really ment to be emulating the neutron api reponce not the neutron client respocne\n\nso ideally none of this would have needed to change and inteadt we coudl have hooked this into the sdk by patchign its request client to pasrse this.\n\ni dont really know how to do that but ideally this would have kept aligned to the neutron api ref not to the the sdk\u0027s view.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \u0027provider_network_type\u0027: \u0027vxlan\u0027,"},{"line_number":100,"context_line":"        \u0027provider_physical_network\u0027: None,"},{"line_number":101,"context_line":"        \u0027provider_segmentation_id\u0027: 24,"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    security_group \u003d {"},{"line_number":105,"context_line":"        \u0027id\u0027: \u0027aec9df91-db1f-4e04-8ac6-e761d8461c53\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"ad1ec002_6f54c73a","line":102,"in_reply_to":"009b3400_1d1580f7","updated":"2026-06-22 17:07:42.000000000","message":"agree, in an ideal world as we have the same functionality we changed only a lib to another the tests should be the same","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f2cf274af47b9da206d5c8c3f53ab39ce126d458","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        \u0027provider_network_type\u0027: \u0027vxlan\u0027,"},{"line_number":100,"context_line":"        \u0027provider_physical_network\u0027: None,"},{"line_number":101,"context_line":"        \u0027provider_segmentation_id\u0027: 24,"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    security_group \u003d {"},{"line_number":105,"context_line":"        \u0027id\u0027: \u0027aec9df91-db1f-4e04-8ac6-e761d8461c53\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"009b3400_1d1580f7","line":102,"in_reply_to":"381e88f9_b328524a","updated":"2026-06-15 20:30:05.000000000","message":"by the way i know we are currently stubign the neutorn client method rather the the http request.\n\nif we were using wsgi interceph to actully emulate the neturon api server then we really woudl have to take a differnt approach here.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"}],"nova/tests/unit/api/openstack/compute/test_security_groups.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":16,"context_line":"from neutronclient.common import exceptions as n_exc"},{"line_number":17,"context_line":"from unittest import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from openstack.network.v2 import network as sdk_network"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_serialization import jsonutils"},{"line_number":22,"context_line":"from oslo_utils import encodeutils"}],"source_content_type":"text/x-python","patch_set":28,"id":"4e779c6a_29aa7e04","line":19,"updated":"2026-06-15 20:18:16.000000000","message":"so all fo teses change should be in https://review.opendev.org/c/openstack/nova/+/981141","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5998f6f629205399635410049b195db8f32d8c3c","unresolved":true,"context_lines":[{"line_number":16,"context_line":"from neutronclient.common import exceptions as n_exc"},{"line_number":17,"context_line":"from unittest import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from openstack.network.v2 import network as sdk_network"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_serialization import jsonutils"},{"line_number":22,"context_line":"from oslo_utils import encodeutils"}],"source_content_type":"text/x-python","patch_set":28,"id":"b94679ce_12619edd","line":19,"in_reply_to":"4e779c6a_29aa7e04","updated":"2026-06-22 17:07:42.000000000","message":"I have to keep some as nova.tests.unit.api.openstack.compute.test_security_groups.TestSecurityGroupsV21.test_delete_security_group_in_use call allocate_for_instance and that in nova/network/neutron.py is already waits for sdk style Network","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"}],"nova/tests/unit/network/test_neutron.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82145620b79ae3c92d7126f9e343a6de9489be7d","unresolved":true,"context_lines":[{"line_number":292,"context_line":"                         \u0027availability_zone\u0027: \u0027nova\u0027,"},{"line_number":293,"context_line":"                         \u0027info_cache\u0027: {\u0027network_info\u0027: []},"},{"line_number":294,"context_line":"                         \u0027security_groups\u0027: []}"},{"line_number":295,"context_line":"        self.nets1 \u003d [{\u0027id\u0027: uuids.my_netid1,"},{"line_number":296,"context_line":"                      \u0027name\u0027: \u0027my_netname1\u0027,"},{"line_number":297,"context_line":"                      \u0027subnet_ids\u0027: [\u0027mysubnid1\u0027],"},{"line_number":298,"context_line":"                      \u0027project_id\u0027: uuids.my_tenant}]"},{"line_number":299,"context_line":"        self.nets2 \u003d []"},{"line_number":300,"context_line":"        self.nets2.append(self.nets1[0])"},{"line_number":301,"context_line":"        self.nets2.append({\u0027id\u0027: uuids.my_netid2,"}],"source_content_type":"text/x-python","patch_set":28,"id":"d26a0f5f_afa0fcc6","line":298,"range":{"start_line":295,"start_character":0,"end_line":298,"end_character":53},"updated":"2026-06-15 20:18:16.000000000","message":"at the unit test level changing the fake data is a litele more ok because we shoudl be mockign or all calls to external client and our own function alsthough\nits till a littel unforcuate that we have this churn given there should be no or very little visabel change to the return values of any of these fucnitons.","commit_id":"b1ea7543f6bfff151f564d6a361be86940d4e803"}]}
