)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"859aaa1f9379d1f83ae98df83b9b8f4cc8985559","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Gregory Thiemonge \u003cgthiemon@redhat.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Story: 2005608"},{"line_number":18,"context_line":"Task: 30847"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Depends-On: https://review.opendev.org/815313"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"d077cb60_1c247654","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":11},"updated":"2022-03-16 10:48:17.000000000","message":"Those IDs are not correct","commit_id":"9729a2ff5f1683c68b2736f3d103b4d610b547fd"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d3150b9bedf0125f8cc572bf1fee27e52be2438a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Gregory Thiemonge \u003cgthiemon@redhat.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Story: 2005608"},{"line_number":18,"context_line":"Task: 30847"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Depends-On: https://review.opendev.org/815313"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"47e568b5_b8630906","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":11},"in_reply_to":"d077cb60_1c247654","updated":"2022-03-21 09:20:25.000000000","message":"Done","commit_id":"9729a2ff5f1683c68b2736f3d103b4d610b547fd"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix plugging member subnets on existing networks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CalculateAmphoraDelta uses now subnest instead of networks."},{"line_number":10,"context_line":"HandleNetworkDelta plugs subnets on existing ports, or removes subnet"},{"line_number":11,"context_line":"from ports"},{"line_number":12,"context_line":"The Amphora server supports multiple \u0027plug\u0027 calls to the same port,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"72422b49_fb24b3ae","line":9,"range":{"start_line":9,"start_character":36,"end_line":9,"end_character":38},"updated":"2022-04-12 09:52:57.000000000","message":"typo","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b35f98cf803839534d6e7223dfbf05557b183acd","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix plugging member subnets on existing networks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CalculateAmphoraDelta uses now subnest instead of networks."},{"line_number":10,"context_line":"HandleNetworkDelta plugs subnets on existing ports, or removes subnet"},{"line_number":11,"context_line":"from ports"},{"line_number":12,"context_line":"The Amphora server supports multiple \u0027plug\u0027 calls to the same port,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"7aafdec1_715c9cde","line":9,"range":{"start_line":9,"start_character":36,"end_line":9,"end_character":38},"in_reply_to":"72422b49_fb24b3ae","updated":"2022-04-15 11:10:28.000000000","message":"Done","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"812bcad6437a03224739a06556ba402e322aaf5b","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Gregory Thiemonge \u003cgthiemon@redhat.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Story: 2005608"},{"line_number":18,"context_line":"Task: 30847"},{"line_number":19,"context_line":"Story: 2004112"},{"line_number":20,"context_line":"Task: 27533"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"1d8820bd_2c98215b","line":17,"updated":"2022-08-19 23:40:57.000000000","message":"This story is for the multi-vip patch:\nhttps://review.opendev.org/c/openstack/octavia/+/660239","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"3d00b4773403de4d67a3d8e48c470349ffac703b","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Gregory Thiemonge \u003cgthiemon@redhat.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Story: 2005608"},{"line_number":18,"context_line":"Task: 30847"},{"line_number":19,"context_line":"Story: 2004112"},{"line_number":20,"context_line":"Task: 27533"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"63926d49_95ff91ab","line":17,"in_reply_to":"1d8820bd_2c98215b","updated":"2022-08-22 07:07:00.000000000","message":"ack, I\u0027ll remove it","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d83a4cea9e47dda2d91cb7b0addd5635e58f8b7e","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Gregory Thiemonge \u003cgthiemon@redhat.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Story: 2005608"},{"line_number":18,"context_line":"Task: 30847"},{"line_number":19,"context_line":"Story: 2004112"},{"line_number":20,"context_line":"Task: 27533"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"9a0b3335_024d8b8d","line":17,"in_reply_to":"63926d49_95ff91ab","updated":"2022-08-23 07:42:30.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"8d252147da8f3ff7cbe2a75abfa61532cb33fb8d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"cdd4f8e3_d7a290db","updated":"2021-10-26 13:18:54.000000000","message":"recheck\n\nweird issue with new test, verifying if CI can reproduce it","commit_id":"599c8dd33a89ca9ba1a2ac3e98f066cebebec707"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"619e0ebc979aa898f531b21097db15021c2a8223","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"c0a1a24d_0074fedf","updated":"2021-11-29 08:26:06.000000000","message":"check experimental","commit_id":"79898a49b7220b7de3b1ff3002c8da71287632ed"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"455a4c16bb4dacf778597635f5cb8d795f729d1a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"f52b41c1_98aeac24","updated":"2021-11-29 08:25:57.000000000","message":"recheck","commit_id":"79898a49b7220b7de3b1ff3002c8da71287632ed"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"bcf263db354cef6cdb8385c49df92720806af90d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"c5ec984f_57e3c9c4","updated":"2021-12-06 10:21:05.000000000","message":"recheck\n","commit_id":"79898a49b7220b7de3b1ff3002c8da71287632ed"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"859aaa1f9379d1f83ae98df83b9b8f4cc8985559","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"8e84a7fb_483e6f1c","updated":"2022-03-16 10:48:17.000000000","message":"-1 for myself","commit_id":"9729a2ff5f1683c68b2736f3d103b4d610b547fd"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"2dcf87f7581164ff0c17ba88d424e4d57b75da73","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"a69099af_e51e22d8","updated":"2022-02-25 08:06:18.000000000","message":"We need to include https://review.opendev.org/c/openstack/octavia-tempest-plugin/+/810660\nin octavia-tempest-plugin to pass the scenario tests here.\nAs it has a CR+2 maybe we should wait for another core reviewer","commit_id":"9729a2ff5f1683c68b2736f3d103b4d610b547fd"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"bd2bbe87_e546bb0c","updated":"2022-04-12 09:52:57.000000000","message":"I did not review tests yet.","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"3048f908_d376017b","updated":"2022-04-27 22:19:34.000000000","message":"Partial review\nI still need to go through the task changes, v2, tests, and kick the tires.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"ab81283735115352ff4f5fc24085423108081ed6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"2cc51ef9_0c8a3492","updated":"2022-04-22 09:51:53.000000000","message":"recheck grenade job is fixed","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d12228584cb70b95482f61705d4e34587407e3f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"1f68b132_c883baff","updated":"2022-05-04 19:39:01.000000000","message":"Thanks for testing it","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"78bb896f22dc7fdb2aba1e27dd1b5d2dbcc58ce8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"4f21d28c_9318b43d","updated":"2022-05-04 17:46:19.000000000","message":"This isn\u0027t working correctly for me. I created a network with five subnets, I then created an LB with one member specifying no subnet (may not be related). When I then added a member on the first subnet in the network, it actually plugged two subnets from the network.\nI will email the log (too big for pastebin) and repro steps.","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"48af33f286459a9595474f74f959d483f98cc7ea","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"cb8627ae_fff62cc9","in_reply_to":"02e07b97_a635aff3","updated":"2022-05-04 20:47:27.000000000","message":"I think we want to be careful about allocating extra IPs.\nMaybe the right path here is for Octavia to create the port directly in neutron and then attach it to the instance. This way we can control and specify the subnets.\nThe less we rely on nova the better IMO.","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d12228584cb70b95482f61705d4e34587407e3f8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"02e07b97_a635aff3","in_reply_to":"4f21d28c_9318b43d","updated":"2022-05-04 19:39:01.000000000","message":"This is an annoying behavior due to the nova API.\n\nHere is what is happening:\n- we send a request to nova to create an interface in the amphora on a specific network (nova accepts only a network id and not a subnet id), nova returns a port that is plugged into the network (and into an undetermined subnet)\n- we send a request to neutron to add the desired subnet to the port if it is not already there\n\nso we have 2 subnets connected to the amphora.\n\nA workaround would be to unplug the undesired subnet after adding the desired subnet. I don\u0027t know if we can live with this extra subnet, or if we should add this step to remove the extra subnet.","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d043a7a000c923c97b8869c2454fc229e28ee17e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"cb835905_6d2b1651","in_reply_to":"c3dcac72_97a26c77","updated":"2022-05-05 06:56:55.000000000","message":"an alternative way is to delete the extra subnets are not needed, but it means that we would allocate an extra IP during a (few) second.","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b85421f61b0086f1d3d81aee5f45632a23da9fbf","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"9558d59e_499feec2","in_reply_to":"cb835905_6d2b1651","updated":"2022-05-06 13:26:55.000000000","message":"In patchetset 33 we check that we haven\u0027t plugged undesired subnets and those subnets are unplugged","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"c54e1b5666ce81bcfb737c78228c62e6570716c3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"c3dcac72_97a26c77","in_reply_to":"cb8627ae_fff62cc9","updated":"2022-05-05 06:30:02.000000000","message":"If Octavia creates the member ports, it also has to delete them manually (after a LB deletion or a failover), so it means that we need to add a new table that maintains the list of ports for each amphora. I would make this patch non-backportable.","commit_id":"0c112ecde3006a3f743cb4851ea18016488b21a5"},{"author":{"_account_id":27256,"name":"Vadim Ponomarev","email":"velizarx@gmail.com","username":"velizarx"},"change_message_id":"fbd8155d562ff8a35f44f01b1e019d81e23fd506","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"cfb6d038_217909b8","updated":"2022-07-14 09:29:25.000000000","message":"Does this change will fix this https://storyboard.openstack.org/#!/story/2009308 problem?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"211870bd_731a5b63","updated":"2022-08-09 17:19:00.000000000","message":"I didn\u0027t test it yet and didn\u0027t review tests except for test_network_tasks.py v2. Thanks Greg.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"29e5917a875ca57534b48f6bcfcfc4fd8ace82a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"74c5b9ad_5a7d8ff0","in_reply_to":"cfb6d038_217909b8","updated":"2022-07-19 09:09:29.000000000","message":"Yes it does, and the plan is to backport the bugfix down to wallaby","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"812bcad6437a03224739a06556ba402e322aaf5b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"b0cf5af1_a6c80c63","updated":"2022-08-19 23:40:57.000000000","message":"Still working on this one, but here are a few initial comments.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"a2afd8f7_c1ee1892","updated":"2022-08-24 00:16:53.000000000","message":"Alright, more review coverage.\nI will look closer at the tests tomorrow.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"595e42c2_cf622525","updated":"2022-08-24 12:31:16.000000000","message":"Reviewed current state.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ab3cd77b7892cb87e0e21ee35a961e02240e1a3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"4d44639d_e9275486","updated":"2022-08-31 15:00:00.000000000","message":"LGTM","commit_id":"4b0d4c1b591e41d42fba87ce4a50a899abee6fcf"}],"octavia/amphorae/backends/agent/api_server/osutils.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"63c6a4b18554d8f9f53835b698280c5b22e4a05e","unresolved":true,"context_lines":[{"line_number":96,"context_line":"            out \u003d subprocess.check_output(cmd.split(),"},{"line_number":97,"context_line":"                                          stderr\u003dsubprocess.STDOUT)"},{"line_number":98,"context_line":"            for line in out.decode(\u0027utf-8\u0027).split(\u0027\\n\u0027):"},{"line_number":99,"context_line":"                LOG.debug(line)"},{"line_number":100,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":101,"context_line":"            LOG.error(\u0027Failed to set up %s due to error: %s %s\u0027, interface,"},{"line_number":102,"context_line":"                      e, e.output)"}],"source_content_type":"text/x-python","patch_set":38,"id":"a7501071_c5eb573a","line":99,"updated":"2022-08-24 20:03:57.000000000","message":"nit: missing test coverage","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            out \u003d subprocess.check_output(cmd.split(),"},{"line_number":97,"context_line":"                                          stderr\u003dsubprocess.STDOUT)"},{"line_number":98,"context_line":"            for line in out.decode(\u0027utf-8\u0027).split(\u0027\\n\u0027):"},{"line_number":99,"context_line":"                LOG.debug(line)"},{"line_number":100,"context_line":"        except subprocess.CalledProcessError as e:"},{"line_number":101,"context_line":"            LOG.error(\u0027Failed to set up %s due to error: %s %s\u0027, interface,"},{"line_number":102,"context_line":"                      e, e.output)"}],"source_content_type":"text/x-python","patch_set":38,"id":"0afa81fe_b0006426","line":99,"in_reply_to":"a7501071_c5eb573a","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/amphorae/backends/agent/api_server/plug.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"6e237c764240eed606a0fe84e09b22d6e5d7e94c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        # network namespace"},{"line_number":200,"context_line":"        if self._netns_interface_exists(mac_address):"},{"line_number":201,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":202,"context_line":"                message\u003d\"Interface already exists\"), status\u003d409)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # This is the interface as it was initially plugged into the"},{"line_number":205,"context_line":"        # default network namespace, this will likely always be eth1"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_22ceb259","side":"PARENT","line":202,"updated":"2019-06-15 01:07:41.000000000","message":"So I added this as a crude semaphore to stop controller retries going down this code path. The controller can timeout waiting for a response from the amphora-agent even though the agent is still working on the request in this method. The controller will retry the call and gunicorn will fire up another one of these, which then gets into bad conflicts and both fail as they are manipulating linux systems.\nThere is an equal hack on the driver side here: https://github.com/openstack/octavia/blob/master/octavia/amphorae/drivers/haproxy/rest_api_driver.py#L248\nBasically it assumes that if the first step, moving the interface into the netns has already occurred, the rest is probably now complete as well.","commit_id":"8ea5d937e3cc6702b06155a5c8e7ae65a7f49078"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"6e237c764240eed606a0fe84e09b22d6e5d7e94c","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            # 1 means just loopback, but we should already have a VIP. This"},{"line_number":237,"context_line":"            # works for the add/delete/add case as we don\u0027t delete interfaces"},{"line_number":238,"context_line":"            # Note, eth0 is skipped because that is the VIP interface"},{"line_number":239,"context_line":"            netns_interface \u003d \u0027eth{0}\u0027.format(len(netns.get_links()))"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        LOG.info(\u0027Plugged interface %s will become %s in the namespace %s\u0027,"},{"line_number":242,"context_line":"                 default_netns_interface, netns_interface,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_c290f6ef","line":239,"updated":"2019-06-15 01:07:41.000000000","message":"You still need to do this. The code as written will not add new member networks, it is assuming the network already exists.","commit_id":"e258ccdcd3fc62f1b9aef7da34ed1cc1b0a2e24a"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":137,"context_line":"        # Do not attempt to re-plug the network if it is already in the"},{"line_number":138,"context_line":"        # network namespace"},{"line_number":139,"context_line":"        if self._netns_interface_exists(mac_address):"},{"line_number":140,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":141,"context_line":"                message\u003d\"Interface already exists\"), status\u003d409)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # This is the interface as it was initially plugged into the"}],"source_content_type":"text/x-python","patch_set":31,"id":"d214decd_85d4dd46","side":"PARENT","line":140,"updated":"2022-04-27 22:19:34.000000000","message":"Removing this concerns me a bit. I think this was part of helping make the API handle duplicate calls better.\nThe scenario was:\n1. Amp called to plug network\n2. Amp network configuration takes too long due to slow DHCP, slow host, or something similar.\n3. Controller times out the connection, closes it, and retries the call.\n\nThe problem is the amp is still completing the tasks from #2 when the controller starts at #1 again.\n\nIf I remember right, there were certain netlink calls that were not happy running at the same time.\n\nHave we resolved those issues and we can handle multiple calls ok now?","commit_id":"8e4d8be6a64ec4ba7e30f6f4c0b5c804e498afdf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":true,"context_lines":[{"line_number":137,"context_line":"        # Do not attempt to re-plug the network if it is already in the"},{"line_number":138,"context_line":"        # network namespace"},{"line_number":139,"context_line":"        if self._netns_interface_exists(mac_address):"},{"line_number":140,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":141,"context_line":"                message\u003d\"Interface already exists\"), status\u003d409)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # This is the interface as it was initially plugged into the"}],"source_content_type":"text/x-python","patch_set":31,"id":"12d0b8a9_7bc6993b","side":"PARENT","line":140,"in_reply_to":"d214decd_85d4dd46","updated":"2022-04-29 13:04:28.000000000","message":"I can test it more intensively but it should be ok.\nNow POST /network in the amphora supports multiple calls,\nthe first will do the basic configuration of the interface (moving to the ns, configuring the address/route, setting it up)\nand the next calls will only update the addresses/routes and will reconfigure the interface (no down/up)","commit_id":"8e4d8be6a64ec4ba7e30f6f4c0b5c804e498afdf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":180,"context_line":"                    interface\u003dexisting_interface)), status\u003d202)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            self._check_ip_addresses(fixed_ips\u003dfixed_ips)"},{"line_number":184,"context_line":"        except socket.error:"},{"line_number":185,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":186,"context_line":"                message\u003d\"Invalid network port\"), status\u003d400)"}],"source_content_type":"text/x-python","patch_set":31,"id":"f5c0a99b_88b26697","line":183,"updated":"2022-04-27 22:19:34.000000000","message":"This validation step should move up above otherwise you are passing the fixed_ips through un-validated in lines 165 and 172.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":false,"context_lines":[{"line_number":180,"context_line":"                    interface\u003dexisting_interface)), status\u003d202)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            self._check_ip_addresses(fixed_ips\u003dfixed_ips)"},{"line_number":184,"context_line":"        except socket.error:"},{"line_number":185,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":186,"context_line":"                message\u003d\"Invalid network port\"), status\u003d400)"}],"source_content_type":"text/x-python","patch_set":31,"id":"fedc04f2_d0fe2a7d","line":183,"in_reply_to":"f5c0a99b_88b26697","updated":"2022-04-29 13:04:28.000000000","message":"yes, it makes sense\ndone","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"812bcad6437a03224739a06556ba402e322aaf5b","unresolved":true,"context_lines":[{"line_number":148,"context_line":"            existing_interface \u003d self._netns_interface_by_mac(mac_address)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            # If we have net_info, this is the special case of plugging a new"},{"line_number":151,"context_line":"            # subnet on the vrrp port, which is essentially a re-vip-plug"},{"line_number":152,"context_line":"            if vip_net_info:"},{"line_number":153,"context_line":"                ip \u003d ipaddress.ip_address(vip_net_info[\u0027vip\u0027])"},{"line_number":154,"context_line":"                network \u003d ipaddress.ip_network(vip_net_info[\u0027subnet_cidr\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"ade6abcc_f7146fb3","line":151,"updated":"2022-08-19 23:40:57.000000000","message":"Two questions here:\n1. This seems to be code for multi-vip, which is a different patch. Why is it here and not in the multi-vip patch?\n2. Why is this in \"plug_network\" which is used for the backend networks? Should this be moved up to \"plug_vip\"? It\u0027s a bit confusing to do vip work when there is another method here for plugging vips. Also, VIPs have a bunch of special handling, so might be best to keep together.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"3d00b4773403de4d67a3d8e48c470349ffac703b","unresolved":true,"context_lines":[{"line_number":148,"context_line":"            existing_interface \u003d self._netns_interface_by_mac(mac_address)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            # If we have net_info, this is the special case of plugging a new"},{"line_number":151,"context_line":"            # subnet on the vrrp port, which is essentially a re-vip-plug"},{"line_number":152,"context_line":"            if vip_net_info:"},{"line_number":153,"context_line":"                ip \u003d ipaddress.ip_address(vip_net_info[\u0027vip\u0027])"},{"line_number":154,"context_line":"                network \u003d ipaddress.ip_network(vip_net_info[\u0027subnet_cidr\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"0bb5e040_e6aed3d2","line":151,"in_reply_to":"ade6abcc_f7146fb3","updated":"2022-08-22 07:07:00.000000000","message":"nop this is a specific case for the multi-subnet on members fix when a member network is also used as the vip network:\n\nlet\u0027s consider you have network1 with 2 subnets: subnet1.1 and subnet1.2\n\na LB is created on subnet1.1\nduring the creation of the LB plug_vip is invoked to connect the amp to network1/subnet1.1\n\nthen the user creates a member on subnet1.2\nplug_network is called to plug the subnet but as the network is already connected as the vip network, it has a special handling: we also pass the VIP information (vrrp address, etc...) to reconfigure the linux interface correctly, this vip_net_info dict contains the needed parameters to configure this member.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"812bcad6437a03224739a06556ba402e322aaf5b","unresolved":true,"context_lines":[{"line_number":266,"context_line":"            for link in netns.get_links():"},{"line_number":267,"context_line":"                attr_dict \u003d dict(link[\u0027attrs\u0027])"},{"line_number":268,"context_line":"                if attr_dict.get(\u0027IFLA_ADDRESS\u0027) \u003d\u003d mac_address:"},{"line_number":269,"context_line":"                    return attr_dict.get(\u0027IFLA_IFNAME\u0027)"},{"line_number":270,"context_line":"        return None"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def _netns_interface_exists(self, mac_address):"}],"source_content_type":"text/x-python","patch_set":37,"id":"522ea345_2299ec24","line":269,"updated":"2022-08-19 23:40:57.000000000","message":"IFLA_ADDRESS and IFLA_IFNAME seem to be used in a few places, it probably should be a constant.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d83a4cea9e47dda2d91cb7b0addd5635e58f8b7e","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            for link in netns.get_links():"},{"line_number":267,"context_line":"                attr_dict \u003d dict(link[\u0027attrs\u0027])"},{"line_number":268,"context_line":"                if attr_dict.get(\u0027IFLA_ADDRESS\u0027) \u003d\u003d mac_address:"},{"line_number":269,"context_line":"                    return attr_dict.get(\u0027IFLA_IFNAME\u0027)"},{"line_number":270,"context_line":"        return None"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def _netns_interface_exists(self, mac_address):"}],"source_content_type":"text/x-python","patch_set":37,"id":"dfeb87b6_daec36da","line":269,"in_reply_to":"522ea345_2299ec24","updated":"2022-08-23 07:42:30.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[{"line_number":181,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":182,"context_line":"                message\u003d\"OK\","},{"line_number":183,"context_line":"                details\u003d\"Updated existing interface {interface}\".format("},{"line_number":184,"context_line":"                    # TODO(rm_work): Everything in this should probably use"},{"line_number":185,"context_line":"                    # HTTP code 200, but continuing to use 202 for consistency."},{"line_number":186,"context_line":"                    interface\u003dexisting_interface)), status\u003d202)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # This is the interface as it was initially plugged into the"}],"source_content_type":"text/x-python","patch_set":38,"id":"c88eef9f_44f99b37","line":185,"range":{"start_line":184,"start_character":20,"end_line":185,"end_character":79},"updated":"2022-08-24 12:31:16.000000000","message":"I think we should decide on that and then remove this comment. In principle I agree with it. However, the fact that a wrong code was used somewhere else shouldn\u0027t justify using it here as well. If possible, I think I would use 200 (or 204 maybe) everywhere, unless there is some asynchronous operation.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"0a9455ef05c824cf4315c7fb3ed2e43ad712140b","unresolved":true,"context_lines":[{"line_number":181,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":182,"context_line":"                message\u003d\"OK\","},{"line_number":183,"context_line":"                details\u003d\"Updated existing interface {interface}\".format("},{"line_number":184,"context_line":"                    # TODO(rm_work): Everything in this should probably use"},{"line_number":185,"context_line":"                    # HTTP code 200, but continuing to use 202 for consistency."},{"line_number":186,"context_line":"                    interface\u003dexisting_interface)), status\u003d202)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # This is the interface as it was initially plugged into the"}],"source_content_type":"text/x-python","patch_set":38,"id":"136b0e6f_0b631424","line":185,"range":{"start_line":184,"start_character":20,"end_line":185,"end_character":79},"in_reply_to":"503b3ed2_f17ecea0","updated":"2022-08-29 15:36:34.000000000","message":"This is a minor issue. I\u0027d suggest to change it to 200 and to remove the comment.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3e6dbc3c0b1d0b4cbfe3570c17222e7ec4ffe399","unresolved":true,"context_lines":[{"line_number":181,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":182,"context_line":"                message\u003d\"OK\","},{"line_number":183,"context_line":"                details\u003d\"Updated existing interface {interface}\".format("},{"line_number":184,"context_line":"                    # TODO(rm_work): Everything in this should probably use"},{"line_number":185,"context_line":"                    # HTTP code 200, but continuing to use 202 for consistency."},{"line_number":186,"context_line":"                    interface\u003dexisting_interface)), status\u003d202)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # This is the interface as it was initially plugged into the"}],"source_content_type":"text/x-python","patch_set":38,"id":"d6f74f88_2596ffbe","line":185,"range":{"start_line":184,"start_character":20,"end_line":185,"end_character":79},"in_reply_to":"c88eef9f_44f99b37","updated":"2022-08-24 19:55:54.000000000","message":"Yeah, this is an internal API, so as long as we check the amphora driver side, we can change this as we need.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":181,"context_line":"            return webob.Response(json\u003ddict("},{"line_number":182,"context_line":"                message\u003d\"OK\","},{"line_number":183,"context_line":"                details\u003d\"Updated existing interface {interface}\".format("},{"line_number":184,"context_line":"                    # TODO(rm_work): Everything in this should probably use"},{"line_number":185,"context_line":"                    # HTTP code 200, but continuing to use 202 for consistency."},{"line_number":186,"context_line":"                    interface\u003dexisting_interface)), status\u003d202)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # This is the interface as it was initially plugged into the"}],"source_content_type":"text/x-python","patch_set":38,"id":"503b3ed2_f17ecea0","line":185,"range":{"start_line":184,"start_character":20,"end_line":185,"end_character":79},"in_reply_to":"d6f74f88_2596ffbe","updated":"2022-08-25 12:48:34.000000000","message":"so, what should we do? 200, 202? remove the TODO?","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/amphorae/drivers/driver_base.py":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        :param amphorae_network_config: A data model containing information"},{"line_number":163,"context_line":"                                        about the subnets and ports that an"},{"line_number":164,"context_line":"                                        amphorae owns."},{"line_number":165,"context_line":"        :type amphorae_network_config: octavia.network.data_models."},{"line_number":166,"context_line":"                                       AmphoraNetworkConfig"},{"line_number":167,"context_line":"        :param vrrp_port: VRRP port associated with the load balancer"},{"line_number":168,"context_line":"        :type vrrp_port: octavia.network.data_models.Port"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"5a1d040b_c1afab8e","line":166,"range":{"start_line":165,"start_character":8,"end_line":166,"end_character":59},"updated":"2022-08-24 12:31:16.000000000","message":"nit: Using Python type hints should be preferred. Modern IDEs and tools like mypy can process this information as well then. Also for humans it is easier to read if the type is directly in the parameter list.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/controller/worker/v1/tasks/network_tasks.py":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        else:"},{"line_number":76,"context_line":"            management_nets \u003d CONF.controller_worker.amp_boot_network_list"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        desired_subnet_to_net_map \u003d {"},{"line_number":79,"context_line":"            subnet: mgmt_net_id"},{"line_number":80,"context_line":"            for mgmt_net_id in management_nets"},{"line_number":81,"context_line":"            for subnet in self.network_driver.get_network("},{"line_number":82,"context_line":"                mgmt_net_id).subnets"},{"line_number":83,"context_line":"        }"},{"line_number":84,"context_line":"        desired_subnet_to_net_map.update(vip_subnet_to_net_map)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        for pool in loadbalancer.pools:"}],"source_content_type":"text/x-python","patch_set":30,"id":"2423ecdb_25e45012","line":83,"range":{"start_line":78,"start_character":36,"end_line":83,"end_character":9},"updated":"2022-04-12 09:52:57.000000000","message":"I don\u0027t think this works like you intended it to work. Demonstration:\n\n\u003e\u003e\u003e print({a: b for b in (1,2,3) for a in (\"a\", \"b\", \"c\")})\n{\u0027a\u0027: 3, \u0027b\u0027: 3, \u0027c\u0027: 3}\n\nIn your case all dict values will be set to the last item of management_nets.","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b35f98cf803839534d6e7223dfbf05557b183acd","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        else:"},{"line_number":76,"context_line":"            management_nets \u003d CONF.controller_worker.amp_boot_network_list"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        desired_subnet_to_net_map \u003d {"},{"line_number":79,"context_line":"            subnet: mgmt_net_id"},{"line_number":80,"context_line":"            for mgmt_net_id in management_nets"},{"line_number":81,"context_line":"            for subnet in self.network_driver.get_network("},{"line_number":82,"context_line":"                mgmt_net_id).subnets"},{"line_number":83,"context_line":"        }"},{"line_number":84,"context_line":"        desired_subnet_to_net_map.update(vip_subnet_to_net_map)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        for pool in loadbalancer.pools:"}],"source_content_type":"text/x-python","patch_set":30,"id":"7744319b_914c2b0d","line":83,"range":{"start_line":78,"start_character":36,"end_line":83,"end_character":9},"in_reply_to":"2423ecdb_25e45012","updated":"2022-04-15 11:10:28.000000000","message":"thanks for catching it, fixed","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":true,"context_lines":[{"line_number":103,"context_line":"        # TODO(rm_work): how accurate is this assumption really?"},{"line_number":104,"context_line":"        network_to_nic_map \u003d {nic.network_id: nic for nic in nics}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        del_ids \u003d set(network_to_nic_map) - desired_network_ids"},{"line_number":107,"context_line":"        delete_nics \u003d [n_data_models.Interface("},{"line_number":108,"context_line":"            network_id\u003dnet_id,"},{"line_number":109,"context_line":"            port_id\u003dnetwork_to_nic_map[net_id].port_id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"68edc439_ad0aba62","line":106,"range":{"start_line":106,"start_character":18,"end_line":106,"end_character":41},"updated":"2022-04-12 09:52:57.000000000","message":"set(network_to_nic_map) and set(plugged_subnets) get called multiple time. You should consider storing it in a variable so that it doesn\u0027t need to get computed multiple times.","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b35f98cf803839534d6e7223dfbf05557b183acd","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # TODO(rm_work): how accurate is this assumption really?"},{"line_number":104,"context_line":"        network_to_nic_map \u003d {nic.network_id: nic for nic in nics}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        del_ids \u003d set(network_to_nic_map) - desired_network_ids"},{"line_number":107,"context_line":"        delete_nics \u003d [n_data_models.Interface("},{"line_number":108,"context_line":"            network_id\u003dnet_id,"},{"line_number":109,"context_line":"            port_id\u003dnetwork_to_nic_map[net_id].port_id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"d2150121_86354d93","line":106,"range":{"start_line":106,"start_character":18,"end_line":106,"end_character":41},"in_reply_to":"68edc439_ad0aba62","updated":"2022-04-15 11:10:28.000000000","message":"Done, and same for set(plugged_subnets)","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":true,"context_lines":[{"line_number":120,"context_line":"            for net_id in add_ids]"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate member Subnet deltas"},{"line_number":123,"context_line":"        plugged_subnets \u003d {"},{"line_number":124,"context_line":"            fixed_ip.subnet_id: nic.network_id"},{"line_number":125,"context_line":"            for nic in network_to_nic_map.values()"},{"line_number":126,"context_line":"            for fixed_ip in nic.fixed_ips or []"},{"line_number":127,"context_line":"        }"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        del_subnet_ids \u003d set(plugged_subnets) - desired_subnet_ids"},{"line_number":130,"context_line":"        add_subnet_ids \u003d desired_subnet_ids - set(plugged_subnets)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9c87e7d6_b0d6bd5a","line":127,"range":{"start_line":123,"start_character":26,"end_line":127,"end_character":9},"updated":"2022-04-12 09:52:57.000000000","message":"It seems all dict values are the same here too.","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b35f98cf803839534d6e7223dfbf05557b183acd","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            for net_id in add_ids]"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate member Subnet deltas"},{"line_number":123,"context_line":"        plugged_subnets \u003d {"},{"line_number":124,"context_line":"            fixed_ip.subnet_id: nic.network_id"},{"line_number":125,"context_line":"            for nic in network_to_nic_map.values()"},{"line_number":126,"context_line":"            for fixed_ip in nic.fixed_ips or []"},{"line_number":127,"context_line":"        }"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        del_subnet_ids \u003d set(plugged_subnets) - desired_subnet_ids"},{"line_number":130,"context_line":"        add_subnet_ids \u003d desired_subnet_ids - set(plugged_subnets)"}],"source_content_type":"text/x-python","patch_set":30,"id":"b534067d_7fd5078b","line":127,"range":{"start_line":123,"start_character":26,"end_line":127,"end_character":9},"in_reply_to":"9c87e7d6_b0d6bd5a","updated":"2022-04-15 11:10:28.000000000","message":"Done","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[{"line_number":305,"context_line":"            fixed_ip.subnet \u003d self.network_driver.get_subnet("},{"line_number":306,"context_line":"                fixed_ip.subnet_id)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def execute(self, amphora, delta):"},{"line_number":309,"context_line":"        \"\"\"Handle network plugging based off deltas.\"\"\""},{"line_number":310,"context_line":"        updated_ports \u003d {}"},{"line_number":311,"context_line":"        for nic in delta.add_nics:"}],"source_content_type":"text/x-python","patch_set":38,"id":"0669208a_e221df7c","line":308,"range":{"start_line":308,"start_character":22,"end_line":308,"end_character":36},"updated":"2022-08-24 12:31:16.000000000","message":"In the v2 version delta seems to be a dict, while here it is data_models.Delta. Type annotations would make this a bit clearer.\n\n(self, amphora: Dict[str, str], delta: data_models.Delta) -\u003e Dict[str, list]:","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":305,"context_line":"            fixed_ip.subnet \u003d self.network_driver.get_subnet("},{"line_number":306,"context_line":"                fixed_ip.subnet_id)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def execute(self, amphora, delta):"},{"line_number":309,"context_line":"        \"\"\"Handle network plugging based off deltas.\"\"\""},{"line_number":310,"context_line":"        updated_ports \u003d {}"},{"line_number":311,"context_line":"        for nic in delta.add_nics:"}],"source_content_type":"text/x-python","patch_set":38,"id":"bdbee9e5_70efaae6","line":308,"range":{"start_line":308,"start_character":22,"end_line":308,"end_character":36},"in_reply_to":"0669208a_e221df7c","updated":"2022-08-25 12:48:34.000000000","message":"yeah this is the fundamental difference between tasks in v1 and v2.\nv1 uses python object\nv2 uses dict (easier to serialize for taskflow persistence)","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"0a9455ef05c824cf4315c7fb3ed2e43ad712140b","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            fixed_ip.subnet \u003d self.network_driver.get_subnet("},{"line_number":306,"context_line":"                fixed_ip.subnet_id)"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def execute(self, amphora, delta):"},{"line_number":309,"context_line":"        \"\"\"Handle network plugging based off deltas.\"\"\""},{"line_number":310,"context_line":"        updated_ports \u003d {}"},{"line_number":311,"context_line":"        for nic in delta.add_nics:"}],"source_content_type":"text/x-python","patch_set":38,"id":"30e9f376_4ce876b3","line":308,"range":{"start_line":308,"start_character":22,"end_line":308,"end_character":36},"in_reply_to":"bdbee9e5_70efaae6","updated":"2022-08-29 15:36:34.000000000","message":"Ack","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        \"\"\"Handle network plugging based off deltas.\"\"\""},{"line_number":310,"context_line":"        updated_ports \u003d {}"},{"line_number":311,"context_line":"        for nic in delta.add_nics:"},{"line_number":312,"context_line":"            subnet_id \u003d ["},{"line_number":313,"context_line":"                fixed_ip.subnet_id"},{"line_number":314,"context_line":"                for fixed_ip in nic.fixed_ips][0]"},{"line_number":315,"context_line":"            interface \u003d self.network_driver.plug_network("},{"line_number":316,"context_line":"                amphora.compute_id, nic.network_id)"},{"line_number":317,"context_line":"            port \u003d self.network_driver.get_port(interface.port_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"77f16f19_ef90efda","line":314,"range":{"start_line":312,"start_character":24,"end_line":314,"end_character":49},"updated":"2022-08-24 12:31:16.000000000","message":"This seems equivalent to nic.fixed_ips[0].subnet_id.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        \"\"\"Handle network plugging based off deltas.\"\"\""},{"line_number":310,"context_line":"        updated_ports \u003d {}"},{"line_number":311,"context_line":"        for nic in delta.add_nics:"},{"line_number":312,"context_line":"            subnet_id \u003d ["},{"line_number":313,"context_line":"                fixed_ip.subnet_id"},{"line_number":314,"context_line":"                for fixed_ip in nic.fixed_ips][0]"},{"line_number":315,"context_line":"            interface \u003d self.network_driver.plug_network("},{"line_number":316,"context_line":"                amphora.compute_id, nic.network_id)"},{"line_number":317,"context_line":"            port \u003d self.network_driver.get_port(interface.port_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"d521bc21_c03c5923","line":314,"range":{"start_line":312,"start_character":24,"end_line":314,"end_character":49},"in_reply_to":"77f16f19_ef90efda","updated":"2022-08-25 12:48:34.000000000","message":"Right, thanks","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[{"line_number":338,"context_line":"            # Avoid duplicated subnets"},{"line_number":339,"context_line":"            has_subnet \u003d False"},{"line_number":340,"context_line":"            if network_id in updated_ports:"},{"line_number":341,"context_line":"                for fixed_ip in updated_ports[network_id].fixed_ips:"},{"line_number":342,"context_line":"                    if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":343,"context_line":"                        has_subnet \u003d True"},{"line_number":344,"context_line":"            if not has_subnet:"},{"line_number":345,"context_line":"                port \u003d self.network_driver.plug_fixed_ip("},{"line_number":346,"context_line":"                    port_id\u003dport_id, subnet_id\u003dsubnet_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"9346f482_e88035f3","line":343,"range":{"start_line":341,"start_character":16,"end_line":343,"end_character":41},"updated":"2022-08-24 12:31:16.000000000","message":"This loop should break after the first match. Even better would be:\n\nhas_subnet \u003d any(fixed_ip.subnet_id \u003d\u003d subnet_id for fixed_ip in updated_ports[network_id].fixed_ips)","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            # Avoid duplicated subnets"},{"line_number":339,"context_line":"            has_subnet \u003d False"},{"line_number":340,"context_line":"            if network_id in updated_ports:"},{"line_number":341,"context_line":"                for fixed_ip in updated_ports[network_id].fixed_ips:"},{"line_number":342,"context_line":"                    if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":343,"context_line":"                        has_subnet \u003d True"},{"line_number":344,"context_line":"            if not has_subnet:"},{"line_number":345,"context_line":"                port \u003d self.network_driver.plug_fixed_ip("},{"line_number":346,"context_line":"                    port_id\u003dport_id, subnet_id\u003dsubnet_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"889fbb96_ca40629f","line":343,"range":{"start_line":341,"start_character":16,"end_line":343,"end_character":41},"in_reply_to":"9346f482_e88035f3","updated":"2022-08-25 12:48:34.000000000","message":"done I didn\u0027t touch the if network_id in updated_ports as it\u0027s more readable","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[{"line_number":358,"context_line":"            # port, it just ignores it."},{"line_number":359,"context_line":"            # https://bugs.launchpad.net/neutron/+bug/1945156"},{"line_number":360,"context_line":"            # When it happens, don\u0027t add the port to the updated_ports dict"},{"line_number":361,"context_line":"            has_subnet \u003d False"},{"line_number":362,"context_line":"            for fixed_ip in port.fixed_ips:"},{"line_number":363,"context_line":"                if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":364,"context_line":"                    has_subnet \u003d True"},{"line_number":365,"context_line":"                    break"},{"line_number":366,"context_line":"            if not has_subnet:"},{"line_number":367,"context_line":"                updated_ports[network_id] \u003d port"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"9d7562c8_44c59002","line":365,"range":{"start_line":361,"start_character":12,"end_line":365,"end_character":25},"updated":"2022-08-24 12:31:16.000000000","message":"nit: here the loop does use break, but using any() would still be better.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            # port, it just ignores it."},{"line_number":359,"context_line":"            # https://bugs.launchpad.net/neutron/+bug/1945156"},{"line_number":360,"context_line":"            # When it happens, don\u0027t add the port to the updated_ports dict"},{"line_number":361,"context_line":"            has_subnet \u003d False"},{"line_number":362,"context_line":"            for fixed_ip in port.fixed_ips:"},{"line_number":363,"context_line":"                if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":364,"context_line":"                    has_subnet \u003d True"},{"line_number":365,"context_line":"                    break"},{"line_number":366,"context_line":"            if not has_subnet:"},{"line_number":367,"context_line":"                updated_ports[network_id] \u003d port"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"f478ff9a_25e7cb62","line":365,"range":{"start_line":361,"start_character":12,"end_line":365,"end_character":25},"in_reply_to":"9d7562c8_44c59002","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/controller/worker/v2/tasks/network_tasks.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"6e237c764240eed606a0fe84e09b22d6e5d7e94c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                if member.subnet_id:"},{"line_number":65,"context_line":"                    member_network \u003d self.network_driver.get_subnet("},{"line_number":66,"context_line":"                        member.subnet_id).network_id"},{"line_number":67,"context_line":"                    desired_network_ids.add(member_network)"},{"line_number":68,"context_line":"                    desired_subnets[member.subnet_id] \u003d member_network"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # Calculate Network deltas"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a2514238","line":67,"updated":"2019-06-15 01:07:41.000000000","message":"Wouldn\u0027t this create duplicates? It\u0027s a dict not a set right?","commit_id":"e258ccdcd3fc62f1b9aef7da34ed1cc1b0a2e24a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"16084de001b0eaad7883b296e5043de8b80c2107","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                if member.subnet_id:"},{"line_number":65,"context_line":"                    member_network \u003d self.network_driver.get_subnet("},{"line_number":66,"context_line":"                        member.subnet_id).network_id"},{"line_number":67,"context_line":"                    desired_network_ids.add(member_network)"},{"line_number":68,"context_line":"                    desired_subnets[member.subnet_id] \u003d member_network"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # Calculate Network deltas"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_85cc4335","line":67,"in_reply_to":"9fb8cfa7_a2514238","updated":"2019-06-16 06:37:51.000000000","message":"desired_network_ids is a set (so the thing above this works as expected\ndesired_subnets is a dict, and adds based on the subnet_id key, so it will overwrite (and the network_id will always be the same for the same subnet so that\u0027s fine)","commit_id":"e258ccdcd3fc62f1b9aef7da34ed1cc1b0a2e24a"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"6e237c764240eed606a0fe84e09b22d6e5d7e94c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        # Calculate Network deltas"},{"line_number":71,"context_line":"        nics \u003d self.network_driver.get_plugged_networks(amphora.compute_id)"},{"line_number":72,"context_line":"        # assume we don\u0027t have two nics in the same network"},{"line_number":73,"context_line":"        # TODO(rm_work): how accurate is this assumption really?"},{"line_number":74,"context_line":"        actual_network_nics \u003d dict((nic.network_id, nic) for nic in nics)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        del_ids \u003d set(actual_network_nics) - desired_network_ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a2a622c0","line":73,"updated":"2019-06-15 01:07:41.000000000","message":"We *should* have prevented that in previous runs through the flow right?","commit_id":"e258ccdcd3fc62f1b9aef7da34ed1cc1b0a2e24a"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"6e237c764240eed606a0fe84e09b22d6e5d7e94c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        delete_nics \u003d list("},{"line_number":78,"context_line":"            actual_network_nics[net_id] for net_id in del_ids)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        add_ids \u003d desired_network_ids - set(actual_network_nics)"},{"line_number":81,"context_line":"        add_nics \u003d list(n_data_models.Interface("},{"line_number":82,"context_line":"            network_id\u003dnet_id) for net_id in add_ids)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_02628e0a","line":80,"updated":"2019-06-15 01:07:41.000000000","message":"dict - set, still has dups right?","commit_id":"e258ccdcd3fc62f1b9aef7da34ed1cc1b0a2e24a"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"16084de001b0eaad7883b296e5043de8b80c2107","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        delete_nics \u003d list("},{"line_number":78,"context_line":"            actual_network_nics[net_id] for net_id in del_ids)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        add_ids \u003d desired_network_ids - set(actual_network_nics)"},{"line_number":81,"context_line":"        add_nics \u003d list(n_data_models.Interface("},{"line_number":82,"context_line":"            network_id\u003dnet_id) for net_id in add_ids)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_25cf9729","line":80,"in_reply_to":"9fb8cfa7_02628e0a","updated":"2019-06-16 06:37:51.000000000","message":"desired_network_ids *is* a set. {item} creates a set, {key:item} makes a dict","commit_id":"e258ccdcd3fc62f1b9aef7da34ed1cc1b0a2e24a"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        db_lb \u003d self.loadbalancer_repo.get("},{"line_number":79,"context_line":"            db_apis.get_session(), id\u003dloadbalancer[constants.LOADBALANCER_ID])"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        desired_subnet_to_net_map \u003d {"},{"line_number":82,"context_line":"            subnet: mgmt_net_id"},{"line_number":83,"context_line":"            for mgmt_net_id in management_nets"},{"line_number":84,"context_line":"            for subnet in self.network_driver.get_network("},{"line_number":85,"context_line":"                mgmt_net_id).subnets"},{"line_number":86,"context_line":"        }"},{"line_number":87,"context_line":"        desired_subnet_to_net_map.update(vip_subnet_to_net_map)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        for pool in db_lb.pools:"}],"source_content_type":"text/x-python","patch_set":30,"id":"8b4b3590_d1668987","line":86,"range":{"start_line":81,"start_character":36,"end_line":86,"end_character":9},"updated":"2022-04-12 09:52:57.000000000","message":"All dict values will be the same.","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b35f98cf803839534d6e7223dfbf05557b183acd","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        db_lb \u003d self.loadbalancer_repo.get("},{"line_number":79,"context_line":"            db_apis.get_session(), id\u003dloadbalancer[constants.LOADBALANCER_ID])"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        desired_subnet_to_net_map \u003d {"},{"line_number":82,"context_line":"            subnet: mgmt_net_id"},{"line_number":83,"context_line":"            for mgmt_net_id in management_nets"},{"line_number":84,"context_line":"            for subnet in self.network_driver.get_network("},{"line_number":85,"context_line":"                mgmt_net_id).subnets"},{"line_number":86,"context_line":"        }"},{"line_number":87,"context_line":"        desired_subnet_to_net_map.update(vip_subnet_to_net_map)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        for pool in db_lb.pools:"}],"source_content_type":"text/x-python","patch_set":30,"id":"212caaad_f333336e","line":86,"range":{"start_line":81,"start_character":36,"end_line":86,"end_character":9},"in_reply_to":"8b4b3590_d1668987","updated":"2022-04-15 11:10:28.000000000","message":"Done","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"d7fd44fb7cad5546981eda8d7002abb6a519f0a5","unresolved":true,"context_lines":[{"line_number":123,"context_line":"            for net_id in add_ids]"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        # Calculate member Subnet deltas"},{"line_number":126,"context_line":"        plugged_subnets \u003d {"},{"line_number":127,"context_line":"            fixed_ip.subnet_id: nic.network_id"},{"line_number":128,"context_line":"            for nic in network_to_nic_map.values()"},{"line_number":129,"context_line":"            for fixed_ip in nic.fixed_ips or []"},{"line_number":130,"context_line":"        }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        del_subnet_ids \u003d set(plugged_subnets) - desired_subnet_ids"},{"line_number":133,"context_line":"        add_subnet_ids \u003d desired_subnet_ids - set(plugged_subnets)"}],"source_content_type":"text/x-python","patch_set":30,"id":"f39d26d6_ea86b7c5","line":130,"range":{"start_line":126,"start_character":26,"end_line":130,"end_character":9},"updated":"2022-04-12 09:52:57.000000000","message":"All dict values will be the same.","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b35f98cf803839534d6e7223dfbf05557b183acd","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            for net_id in add_ids]"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        # Calculate member Subnet deltas"},{"line_number":126,"context_line":"        plugged_subnets \u003d {"},{"line_number":127,"context_line":"            fixed_ip.subnet_id: nic.network_id"},{"line_number":128,"context_line":"            for nic in network_to_nic_map.values()"},{"line_number":129,"context_line":"            for fixed_ip in nic.fixed_ips or []"},{"line_number":130,"context_line":"        }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        del_subnet_ids \u003d set(plugged_subnets) - desired_subnet_ids"},{"line_number":133,"context_line":"        add_subnet_ids \u003d desired_subnet_ids - set(plugged_subnets)"}],"source_content_type":"text/x-python","patch_set":30,"id":"2013b394_084bb91b","line":130,"range":{"start_line":126,"start_character":26,"end_line":130,"end_character":9},"in_reply_to":"f39d26d6_ea86b7c5","updated":"2022-04-15 11:10:28.000000000","message":"Done","commit_id":"ce2464d18e39b98c6f35f32f99cef3c28830f14b"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":329,"context_line":"            interface \u003d self.network_driver.plug_network("},{"line_number":330,"context_line":"                db_amp.compute_id, nic[constants.NETWORK_ID])"},{"line_number":331,"context_line":"            port \u003d self.network_driver.get_port(interface.port_id)"},{"line_number":332,"context_line":"            # nova may plugged undesired subnets (it plugs one of the subnets"},{"line_number":333,"context_line":"            # of the network), we can safely unplug the subnets we don\u0027t need,"},{"line_number":334,"context_line":"            # the desired subnet will be added in the \u0027ADD_SUBNETS\u0027 loop."},{"line_number":335,"context_line":"            extra_subnets \u003d ["},{"line_number":336,"context_line":"                fixed_ip.subnet_id"}],"source_content_type":"text/x-python","patch_set":34,"id":"0406ab62_e86219b5","line":333,"range":{"start_line":332,"start_character":12,"end_line":333,"end_character":28},"updated":"2022-08-09 17:19:00.000000000","message":"May this happen only on v2? On v1 I didn\u0027t see the extra_subnets \nvariable and unplugging its fixed_ips.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            interface \u003d self.network_driver.plug_network("},{"line_number":330,"context_line":"                db_amp.compute_id, nic[constants.NETWORK_ID])"},{"line_number":331,"context_line":"            port \u003d self.network_driver.get_port(interface.port_id)"},{"line_number":332,"context_line":"            # nova may plugged undesired subnets (it plugs one of the subnets"},{"line_number":333,"context_line":"            # of the network), we can safely unplug the subnets we don\u0027t need,"},{"line_number":334,"context_line":"            # the desired subnet will be added in the \u0027ADD_SUBNETS\u0027 loop."},{"line_number":335,"context_line":"            extra_subnets \u003d ["},{"line_number":336,"context_line":"                fixed_ip.subnet_id"}],"source_content_type":"text/x-python","patch_set":34,"id":"450edbae_f0c796ac","line":333,"range":{"start_line":332,"start_character":12,"end_line":333,"end_character":28},"in_reply_to":"0406ab62_e86219b5","updated":"2022-08-18 07:59:07.000000000","message":"yes, you\u0027re right, I have updated v1 function","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":376,"context_line":"            # When it happens, don\u0027t add the port to the updated_ports dict"},{"line_number":377,"context_line":"            has_subnet \u003d False"},{"line_number":378,"context_line":"            for fixed_ip in port.fixed_ips:"},{"line_number":379,"context_line":"                if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":380,"context_line":"                    has_subnet \u003d True"},{"line_number":381,"context_line":"                    break"},{"line_number":382,"context_line":"            if not has_subnet:"}],"source_content_type":"text/x-python","patch_set":34,"id":"86ab5409_224f312a","line":379,"updated":"2022-08-09 17:19:00.000000000","message":"I might have missed something, but doesn\u0027t line 370 makes sure line 379 would never happen?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":true,"context_lines":[{"line_number":376,"context_line":"            # When it happens, don\u0027t add the port to the updated_ports dict"},{"line_number":377,"context_line":"            has_subnet \u003d False"},{"line_number":378,"context_line":"            for fixed_ip in port.fixed_ips:"},{"line_number":379,"context_line":"                if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":380,"context_line":"                    has_subnet \u003d True"},{"line_number":381,"context_line":"                    break"},{"line_number":382,"context_line":"            if not has_subnet:"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a6121ed_65c46a3e","line":379,"in_reply_to":"86ab5409_224f312a","updated":"2022-08-18 07:59:07.000000000","message":"there\u0027s comment just before the loop that explains why we need it","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    default_provides \u003d constants.DELTA"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # TODO(gthiemonge) ensure we no longer need vrrp_port"},{"line_number":59,"context_line":"    def execute(self, loadbalancer, amphora, availability_zone,"},{"line_number":60,"context_line":"                vrrp_port\u003dNone):"},{"line_number":61,"context_line":"        LOG.debug(\"Calculating network delta for amphora id: %s\","}],"source_content_type":"text/x-python","patch_set":37,"id":"dd80c68d_79d0df5d","line":58,"updated":"2022-08-24 00:16:53.000000000","message":"Is this TODO still relevant?","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    default_provides \u003d constants.DELTA"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # TODO(gthiemonge) ensure we no longer need vrrp_port"},{"line_number":59,"context_line":"    def execute(self, loadbalancer, amphora, availability_zone,"},{"line_number":60,"context_line":"                vrrp_port\u003dNone):"},{"line_number":61,"context_line":"        LOG.debug(\"Calculating network delta for amphora id: %s\","}],"source_content_type":"text/x-python","patch_set":37,"id":"cdb1adeb_e054fa09","line":58,"in_reply_to":"dd80c68d_79d0df5d","updated":"2022-08-25 12:48:34.000000000","message":"I\u0027m removing the TODO and the vrrp_port param, it is no longer used (same in v1), I\u0027m also updating the flows to remove \u0027vrrp_port\u0027 from the requirements of this task.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        nics \u003d self.network_driver.get_plugged_networks("},{"line_number":103,"context_line":"            amphora[constants.COMPUTE_ID])"},{"line_number":104,"context_line":"        # assume we don\u0027t have two nics in the same network"},{"line_number":105,"context_line":"        # TODO(rm_work): how accurate is this assumption really?"},{"line_number":106,"context_line":"        network_to_nic_map \u003d {nic.network_id: nic for nic in nics}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        plugged_network_ids \u003d set(network_to_nic_map)"}],"source_content_type":"text/x-python","patch_set":37,"id":"ed1c7106_cce8750d","line":105,"updated":"2022-08-24 00:16:53.000000000","message":"We are managing this, so I think we can remove this comment.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        nics \u003d self.network_driver.get_plugged_networks("},{"line_number":103,"context_line":"            amphora[constants.COMPUTE_ID])"},{"line_number":104,"context_line":"        # assume we don\u0027t have two nics in the same network"},{"line_number":105,"context_line":"        # TODO(rm_work): how accurate is this assumption really?"},{"line_number":106,"context_line":"        network_to_nic_map \u003d {nic.network_id: nic for nic in nics}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        plugged_network_ids \u003d set(network_to_nic_map)"}],"source_content_type":"text/x-python","patch_set":37,"id":"ebc8de06_deddb669","line":105,"in_reply_to":"ed1c7106_cce8750d","updated":"2022-08-25 12:48:34.000000000","message":"Yeah, removing...","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":468,"context_line":"                        delta[constants.COMPUTE_ID],"},{"line_number":469,"context_line":"                        nic[constants.NETWORK_ID])"},{"line_number":470,"context_line":"                except Exception:"},{"line_number":471,"context_line":"                    pass"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"                port_id \u003d nic[constants.PORT_ID]"},{"line_number":474,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":37,"id":"f343936c_09e2e3ff","line":471,"updated":"2022-08-24 00:16:53.000000000","message":"It is nice to have log entries for networks that were unable to be \"unpluged\" for cleanup/historical analysis of failure situations.\nCan we add a warning log here?\nAt a minimum it might tell us that neutron is down, etc.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                        delta[constants.COMPUTE_ID],"},{"line_number":469,"context_line":"                        nic[constants.NETWORK_ID])"},{"line_number":470,"context_line":"                except Exception:"},{"line_number":471,"context_line":"                    pass"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"                port_id \u003d nic[constants.PORT_ID]"},{"line_number":474,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":37,"id":"59787dd4_ed0abe0b","line":471,"in_reply_to":"f343936c_09e2e3ff","updated":"2022-08-25 12:48:34.000000000","message":"done (v1 too)","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":474,"context_line":"                try:"},{"line_number":475,"context_line":"                    self.network_driver.delete_port(port_id)"},{"line_number":476,"context_line":"                except Exception:"},{"line_number":477,"context_line":"                    pass"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"class PlugVIP(BaseNetworkTask):"}],"source_content_type":"text/x-python","patch_set":37,"id":"39ea1119_de2fecde","line":477,"updated":"2022-08-24 00:16:53.000000000","message":"Same here, can we log this situation?\nReally helps when you are trying to figure out why there are extra ports.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":474,"context_line":"                try:"},{"line_number":475,"context_line":"                    self.network_driver.delete_port(port_id)"},{"line_number":476,"context_line":"                except Exception:"},{"line_number":477,"context_line":"                    pass"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"class PlugVIP(BaseNetworkTask):"}],"source_content_type":"text/x-python","patch_set":37,"id":"04de170d_cf4a5760","line":477,"in_reply_to":"39ea1119_de2fecde","updated":"2022-08-25 12:48:34.000000000","message":"done (v1 too)","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"1d4cd4df88b877a17a16d57c01a9b147bdfa40ae","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":38,"id":"b11c66b7_9eb4fec8","updated":"2022-08-24 12:31:16.000000000","message":"The same comments as in the v1 version of this file apply here too basically.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"ef441f7b_4f9c4321","in_reply_to":"b11c66b7_9eb4fec8","updated":"2022-08-25 12:48:34.000000000","message":"yeah I always work in // so the files have the same issues ;-) and similar fixes","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"63c6a4b18554d8f9f53835b698280c5b22e4a05e","unresolved":true,"context_lines":[{"line_number":376,"context_line":"            # When it happens, don\u0027t add the port to the updated_ports dict"},{"line_number":377,"context_line":"            has_subnet \u003d False"},{"line_number":378,"context_line":"            for fixed_ip in port.fixed_ips:"},{"line_number":379,"context_line":"                if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":380,"context_line":"                    has_subnet \u003d True"},{"line_number":381,"context_line":"                    break"},{"line_number":382,"context_line":"            if not has_subnet:"}],"source_content_type":"text/x-python","patch_set":38,"id":"fc7943fa_fb22dc23","line":379,"updated":"2022-08-24 20:03:57.000000000","message":"nit: Missing coverage for this conditional.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":376,"context_line":"            # When it happens, don\u0027t add the port to the updated_ports dict"},{"line_number":377,"context_line":"            has_subnet \u003d False"},{"line_number":378,"context_line":"            for fixed_ip in port.fixed_ips:"},{"line_number":379,"context_line":"                if fixed_ip.subnet_id \u003d\u003d subnet_id:"},{"line_number":380,"context_line":"                    has_subnet \u003d True"},{"line_number":381,"context_line":"                    break"},{"line_number":382,"context_line":"            if not has_subnet:"}],"source_content_type":"text/x-python","patch_set":38,"id":"7a9ea51c_baa6b162","line":379,"in_reply_to":"fc7943fa_fb22dc23","updated":"2022-08-25 12:48:34.000000000","message":"now the code is covered but there\u0027s a msising branch, is that enough?","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/network/base.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":45,"context_line":"    pass"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class AllocateNetworkException(NetworkException):"},{"line_number":49,"context_line":"    pass"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"530941db_1dc091b9","line":48,"updated":"2022-04-27 22:19:34.000000000","message":"I don\u0027t see this used in this patch.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"e272bf0c335df969127eb282456d85033bea8080","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    pass"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class AllocateNetworkException(NetworkException):"},{"line_number":49,"context_line":"    pass"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1483b183_996ae0bc","line":48,"in_reply_to":"530941db_1dc091b9","updated":"2022-04-29 13:05:01.000000000","message":"Done","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":173,"context_line":"        \"\"\""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    @abc.abstractmethod"},{"line_number":176,"context_line":"    def plug_network(self, amphora, network_id, subnet_id\u003dNone):"},{"line_number":177,"context_line":"        \"\"\"Connects an existing amphora to an existing network."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param compute_id: id of an amphora in the compute service"}],"source_content_type":"text/x-python","patch_set":31,"id":"c9a374a9_4ac44ab1","line":176,"updated":"2022-04-27 22:19:34.000000000","message":"One of the early concepts with the network driver (which they may not have succeeded with) is to not have tight coupling to the \"amphora\" driver. I.e. the network drivers should not \"know\" about amphora, but instead have networking or compute primitives.\nThat way it could be used for other \"future\" drivers that maybe are not amphora based.\nDo we really need to pass an amphora object down to this level? Should this plug_network method be broken down more and not try to do to many things?","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        \"\"\""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    @abc.abstractmethod"},{"line_number":176,"context_line":"    def plug_network(self, amphora, network_id, subnet_id\u003dNone):"},{"line_number":177,"context_line":"        \"\"\"Connects an existing amphora to an existing network."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param compute_id: id of an amphora in the compute service"}],"source_content_type":"text/x-python","patch_set":31,"id":"d5b6f168_bd25b94a","line":176,"in_reply_to":"c9a374a9_4ac44ab1","updated":"2022-04-29 13:04:28.000000000","message":"reverted to compute_id","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param compute_id: id of an amphora in the compute service"},{"line_number":176,"context_line":"        :param network_id: id of a network"},{"line_number":177,"context_line":"        :param ip_address: ip address to attempt to be assigned to interface"},{"line_number":178,"context_line":"        :return: octavia.network.data_models.Interface instance"},{"line_number":179,"context_line":"        :raises: PlugNetworkException, AmphoraNotFound, NetworkNotFound"},{"line_number":180,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":34,"id":"bf2611b7_b171e6df","line":177,"range":{"start_line":177,"start_character":15,"end_line":177,"end_character":25},"updated":"2022-08-09 17:19:00.000000000","message":"subnet_id\n\nIn the method above ip_address still appears in the docstring.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param compute_id: id of an amphora in the compute service"},{"line_number":176,"context_line":"        :param network_id: id of a network"},{"line_number":177,"context_line":"        :param ip_address: ip address to attempt to be assigned to interface"},{"line_number":178,"context_line":"        :return: octavia.network.data_models.Interface instance"},{"line_number":179,"context_line":"        :raises: PlugNetworkException, AmphoraNotFound, NetworkNotFound"},{"line_number":180,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":34,"id":"37bc0de4_06d70698","line":177,"range":{"start_line":177,"start_character":15,"end_line":177,"end_character":25},"in_reply_to":"bf2611b7_b171e6df","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @abc.abstractmethod"},{"line_number":172,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":173,"context_line":"        \"\"\"Connects an existing amphora to an existing network."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param compute_id: id of an amphora in the compute service"}],"source_content_type":"text/x-python","patch_set":37,"id":"78ee6bc9_ed0e2eb3","line":172,"updated":"2022-08-24 00:16:53.000000000","message":"In allowed_address_pairs.py #592, the signature is:\ndef plug_network(self, compute_id, network_id, ip_address\u003dNone):\nWhich is right?","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @abc.abstractmethod"},{"line_number":172,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":173,"context_line":"        \"\"\"Connects an existing amphora to an existing network."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param compute_id: id of an amphora in the compute service"}],"source_content_type":"text/x-python","patch_set":37,"id":"3740f594_2b6bb3c8","line":172,"in_reply_to":"78ee6bc9_ed0e2eb3","updated":"2022-08-25 12:48:34.000000000","message":"I\u0027m removing the 3rd param (ip_address or subnet_id), it is no longer passed (we don\u0027t want to rely on the nova API to plug the correct subnet/ip_address (it doesn\u0027t handle it correctly)), we request to plug the network, and we check the plugged subnets in another task.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"b238b216c78becc5345d8f3940aec51a9bbe60d9","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @abc.abstractmethod"},{"line_number":172,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":173,"context_line":"        \"\"\"Connects an existing amphora to an existing network."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param compute_id: id of an amphora in the compute service"}],"source_content_type":"text/x-python","patch_set":37,"id":"4df662be_263a4653","line":172,"in_reply_to":"78ee6bc9_ed0e2eb3","updated":"2022-08-25 10:25:34.000000000","message":"Shouldn\u0027t the linters catch that? Is there an option to make it happen?","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @abc.abstractmethod"},{"line_number":197,"context_line":"    def plug_fixed_ip(self, port_id, subnet_id, ip_address\u003dNone):"},{"line_number":198,"context_line":"        \"\"\"Plug a fixed ip to an existing port."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        If ip_address is not specified, one will be auto-assigned."},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"ede08d04_f7e55fd6","line":198,"range":{"start_line":198,"start_character":18,"end_line":198,"end_character":26},"updated":"2022-08-24 00:16:53.000000000","message":"The title says fixed ip, but the next sentence says it doesn\u0027t have to be a fixed IP, it could be auto-assigned. What is the intent of this method?","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @abc.abstractmethod"},{"line_number":197,"context_line":"    def plug_fixed_ip(self, port_id, subnet_id, ip_address\u003dNone):"},{"line_number":198,"context_line":"        \"\"\"Plug a fixed ip to an existing port."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        If ip_address is not specified, one will be auto-assigned."},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"974d1bee_ccbf83cb","line":198,"range":{"start_line":198,"start_character":18,"end_line":198,"end_character":26},"in_reply_to":"ede08d04_f7e55fd6","updated":"2022-08-25 12:48:34.000000000","message":"it updates the \"fixed_ips\" parameter of a port.\nThe networking API allows a fixed_ip to contain only a subnet_id, then it allocates an ip_address.\nhttps://docs.openstack.org/api-ref/network/v2/?expanded\u003dupdate-port-detail#ports\n\ndo you think I should change the name of the function? (plug_subnet?)","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    @abc.abstractmethod"},{"line_number":183,"context_line":"    def unplug_network(self, compute_id, network_id):"},{"line_number":184,"context_line":"        \"\"\"Disconnects an existing amphora from an existing network."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        If ip_address is not specified, all the interfaces plugged on"}],"source_content_type":"text/x-python","patch_set":38,"id":"66bd3a3e_d00e2bd7","line":183,"updated":"2022-08-24 00:16:53.000000000","message":"This says \"compute_id\", but allowed_address_pairs.py#550 was changed to pass an amphora. Which is correct?","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    @abc.abstractmethod"},{"line_number":183,"context_line":"    def unplug_network(self, compute_id, network_id):"},{"line_number":184,"context_line":"        \"\"\"Disconnects an existing amphora from an existing network."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        If ip_address is not specified, all the interfaces plugged on"}],"source_content_type":"text/x-python","patch_set":38,"id":"7b8ca0bd_467a3b41","line":183,"in_reply_to":"66bd3a3e_d00e2bd7","updated":"2022-08-25 12:48:34.000000000","message":"good catch, it should be a compute_id, unplug_aap_port is called only in a revert task, I will check it is correctly covered by the tests\n\nupdate: I added coverage in test_unplug_aap_port","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/network/drivers/neutron/allowed_address_pairs.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":589,"context_line":"                load_balancer.amphorae):"},{"line_number":590,"context_line":"            self.unplug_aap_port(vip, amphora, subnet)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def plug_network(self, compute_id, network_id, ip_address\u003dNone):"},{"line_number":593,"context_line":"        try:"},{"line_number":594,"context_line":"            interface \u003d self.compute.attach_network_or_port("},{"line_number":595,"context_line":"                compute_id\u003dcompute_id, network_id\u003dnetwork_id,"}],"source_content_type":"text/x-python","patch_set":31,"id":"22099020_dbfaccab","line":592,"updated":"2022-04-27 22:19:34.000000000","message":"You changed the abstract method for plug_network in ../base.py to have an amphora and a subnet_id, but the implementation here still has the original parameters.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d83a4cea9e47dda2d91cb7b0addd5635e58f8b7e","unresolved":false,"context_lines":[{"line_number":589,"context_line":"                load_balancer.amphorae):"},{"line_number":590,"context_line":"            self.unplug_aap_port(vip, amphora, subnet)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def plug_network(self, compute_id, network_id, ip_address\u003dNone):"},{"line_number":593,"context_line":"        try:"},{"line_number":594,"context_line":"            interface \u003d self.compute.attach_network_or_port("},{"line_number":595,"context_line":"                compute_id\u003dcompute_id, network_id\u003dnetwork_id,"}],"source_content_type":"text/x-python","patch_set":31,"id":"e7638286_ebdb05bb","line":592,"in_reply_to":"0fc00cda_08fa3746","updated":"2022-08-23 07:42:30.000000000","message":"marked as resolved","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":true,"context_lines":[{"line_number":589,"context_line":"                load_balancer.amphorae):"},{"line_number":590,"context_line":"            self.unplug_aap_port(vip, amphora, subnet)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def plug_network(self, compute_id, network_id, ip_address\u003dNone):"},{"line_number":593,"context_line":"        try:"},{"line_number":594,"context_line":"            interface \u003d self.compute.attach_network_or_port("},{"line_number":595,"context_line":"                compute_id\u003dcompute_id, network_id\u003dnetwork_id,"}],"source_content_type":"text/x-python","patch_set":31,"id":"0fc00cda_08fa3746","line":592,"in_reply_to":"22099020_dbfaccab","updated":"2022-04-29 13:04:28.000000000","message":"Yeah I think I was working on using \"amphora\" in the aap driver, but I reverted to use compute_id, it seems that this \"amphora\" arg doesn\u0027t make sense now","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":589,"context_line":"                load_balancer.amphorae):"},{"line_number":590,"context_line":"            self.unplug_aap_port(vip, amphora, subnet)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def plug_network(self, compute_id, network_id, ip_address\u003dNone):"},{"line_number":593,"context_line":"        try:"},{"line_number":594,"context_line":"            interface \u003d self.compute.attach_network_or_port("},{"line_number":595,"context_line":"                compute_id\u003dcompute_id, network_id\u003dnetwork_id,"}],"source_content_type":"text/x-python","patch_set":38,"id":"96928a22_da83d506","line":592,"updated":"2022-08-24 00:16:53.000000000","message":"This does not match the base.py #172 abstract.","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":589,"context_line":"                load_balancer.amphorae):"},{"line_number":590,"context_line":"            self.unplug_aap_port(vip, amphora, subnet)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def plug_network(self, compute_id, network_id, ip_address\u003dNone):"},{"line_number":593,"context_line":"        try:"},{"line_number":594,"context_line":"            interface \u003d self.compute.attach_network_or_port("},{"line_number":595,"context_line":"                compute_id\u003dcompute_id, network_id\u003dnetwork_id,"}],"source_content_type":"text/x-python","patch_set":38,"id":"eb56949c_50765d27","line":592,"in_reply_to":"96928a22_da83d506","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/network/drivers/neutron/base.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":280,"context_line":"        port \u003d self.get_port(port_id).to_dict(recurse\u003dTrue)"},{"line_number":281,"context_line":"        fixed_ips \u003d port[\u0027fixed_ips\u0027]"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        new_fixed_ip \u003d {\u0027subnet_id\u0027: subnet_id}"},{"line_number":284,"context_line":"        if ip_address:"},{"line_number":285,"context_line":"            new_fixed_ip[\u0027ip_address\u0027] \u003d ip_address"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"95831d7f_d5cdc29a","line":283,"range":{"start_line":283,"start_character":8,"end_line":283,"end_character":20},"updated":"2022-04-27 22:19:34.000000000","message":"nit:This is confusing, maybe new_fixed_ip_dict?","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        port \u003d self.get_port(port_id).to_dict(recurse\u003dTrue)"},{"line_number":281,"context_line":"        fixed_ips \u003d port[\u0027fixed_ips\u0027]"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        new_fixed_ip \u003d {\u0027subnet_id\u0027: subnet_id}"},{"line_number":284,"context_line":"        if ip_address:"},{"line_number":285,"context_line":"            new_fixed_ip[\u0027ip_address\u0027] \u003d ip_address"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"679c1dd1_aec99b16","line":283,"range":{"start_line":283,"start_character":8,"end_line":283,"end_character":20},"in_reply_to":"95831d7f_d5cdc29a","updated":"2022-04-29 13:04:28.000000000","message":"Ack","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":296,"context_line":"    def unplug_fixed_ip(self, port_id, subnet_id):"},{"line_number":297,"context_line":"        port \u003d self.get_port(port_id)"},{"line_number":298,"context_line":"        fixed_ips \u003d ["},{"line_number":299,"context_line":"            fixed_ip.to_dict()"},{"line_number":300,"context_line":"            for fixed_ip in port.fixed_ips"},{"line_number":301,"context_line":"            if fixed_ip.subnet_id !\u003d subnet_id"},{"line_number":302,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":31,"id":"a1bb88ec_55cb855c","line":299,"updated":"2022-04-27 22:19:34.000000000","message":"fixed_ip is undefined here.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":true,"context_lines":[{"line_number":296,"context_line":"    def unplug_fixed_ip(self, port_id, subnet_id):"},{"line_number":297,"context_line":"        port \u003d self.get_port(port_id)"},{"line_number":298,"context_line":"        fixed_ips \u003d ["},{"line_number":299,"context_line":"            fixed_ip.to_dict()"},{"line_number":300,"context_line":"            for fixed_ip in port.fixed_ips"},{"line_number":301,"context_line":"            if fixed_ip.subnet_id !\u003d subnet_id"},{"line_number":302,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":31,"id":"ac057d2b_512e049f","line":299,"in_reply_to":"a1bb88ec_55cb855c","updated":"2022-04-29 13:04:28.000000000","message":"it looks fine to me, it\u0027s a comprehension list (for fixed_ip in port.fixed_ips)","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"563e972797ed8a00df104608f0fd66eec70ffd70","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    def unplug_fixed_ip(self, port_id, subnet_id):"},{"line_number":297,"context_line":"        port \u003d self.get_port(port_id)"},{"line_number":298,"context_line":"        fixed_ips \u003d ["},{"line_number":299,"context_line":"            fixed_ip.to_dict()"},{"line_number":300,"context_line":"            for fixed_ip in port.fixed_ips"},{"line_number":301,"context_line":"            if fixed_ip.subnet_id !\u003d subnet_id"},{"line_number":302,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":31,"id":"7aa42c66_58707132","line":299,"in_reply_to":"ac057d2b_512e049f","updated":"2022-08-22 14:56:54.000000000","message":"Ack","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"}],"octavia/network/drivers/noop_driver/driver.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":114,"context_line":"                                  vip.ip_address)] \u003d (vip, amphora, subnet,"},{"line_number":115,"context_line":"                                                      \u0027unplug_aap_port\u0027)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":118,"context_line":"        LOG.debug(\"Network %s no-op, plug_network compute_id %s, network_id \""},{"line_number":119,"context_line":"                  \"%s, subnet %s\", self.__class__.__name__, compute_id,"},{"line_number":120,"context_line":"                  network_id, subnet_id)"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa1b6cf4_61537e4f","line":117,"updated":"2022-04-27 22:19:34.000000000","message":"This does not match the implementation in the allowed_address_pairs driver.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                  vip.ip_address)] \u003d (vip, amphora, subnet,"},{"line_number":115,"context_line":"                                                      \u0027unplug_aap_port\u0027)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":118,"context_line":"        LOG.debug(\"Network %s no-op, plug_network compute_id %s, network_id \""},{"line_number":119,"context_line":"                  \"%s, subnet %s\", self.__class__.__name__, compute_id,"},{"line_number":120,"context_line":"                  network_id, subnet_id)"}],"source_content_type":"text/x-python","patch_set":31,"id":"734ca83e_8d62b4f5","line":117,"in_reply_to":"fa1b6cf4_61537e4f","updated":"2022-04-29 13:04:28.000000000","message":"should be fine now, the correct prototype is \"def plug_network(self, compute_id, network_id, subnet_id\u003dNone):\"","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ead6a663ccce8e1fed76f251c8cfecf4ece12c1f","unresolved":true,"context_lines":[{"line_number":391,"context_line":"    def unplug_vip(self, loadbalancer, vip):"},{"line_number":392,"context_line":"        self.driver.unplug_vip(loadbalancer, vip)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":395,"context_line":"        return self.driver.plug_network(compute_id, network_id,"},{"line_number":396,"context_line":"                                        subnet_id\u003dsubnet_id)"},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"356d7263_a7563392","line":394,"updated":"2022-04-27 22:19:34.000000000","message":"This doesn\u0027t match the implementation in the AAP driver.","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"51dd49f5c96f9764976d15ed1d37c7b8f86284d7","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    def unplug_vip(self, loadbalancer, vip):"},{"line_number":392,"context_line":"        self.driver.unplug_vip(loadbalancer, vip)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    def plug_network(self, compute_id, network_id, subnet_id\u003dNone):"},{"line_number":395,"context_line":"        return self.driver.plug_network(compute_id, network_id,"},{"line_number":396,"context_line":"                                        subnet_id\u003dsubnet_id)"},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"2dae34c2_0e781250","line":394,"in_reply_to":"356d7263_a7563392","updated":"2022-04-29 13:04:28.000000000","message":"same","commit_id":"025ac361cb235992f522cf8994326828ddd1b7ac"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":371,"context_line":"        self.networkconfigconfig[(port_id, subnet_id)] \u003d ("},{"line_number":372,"context_line":"            port_id, subnet_id, \u0027unplug_fixed_ip\u0027)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        return _PORTS.get(port_id)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class NoopNetworkDriver(driver_base.AbstractNetworkDriver):"}],"source_content_type":"text/x-python","patch_set":34,"id":"8c995cac_13223d28","line":374,"range":{"start_line":374,"start_character":16,"end_line":374,"end_character":34},"updated":"2022-08-09 17:19:00.000000000","message":"I think you missed popping the port from _PORTS.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        self.networkconfigconfig[(port_id, subnet_id)] \u003d ("},{"line_number":372,"context_line":"            port_id, subnet_id, \u0027unplug_fixed_ip\u0027)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        return _PORTS.get(port_id)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class NoopNetworkDriver(driver_base.AbstractNetworkDriver):"}],"source_content_type":"text/x-python","patch_set":34,"id":"a5c6e398_e8dd3199","line":374,"range":{"start_line":374,"start_character":16,"end_line":374,"end_character":34},"in_reply_to":"8c995cac_13223d28","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":134,"context_line":"        _PLUGGED_NETWORKS[(network_id, compute_id)] \u003d interface"},{"line_number":135,"context_line":"        return interface"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def unplug_network(self, compute_id, network_id):"},{"line_number":138,"context_line":"        LOG.debug(\"Network %s no-op, unplug_network compute_id %s, \""},{"line_number":139,"context_line":"                  \"network_id %s\","},{"line_number":140,"context_line":"                  self.__class__.__name__, compute_id, network_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"082ee4ef_67273357","line":137,"updated":"2022-08-24 00:16:53.000000000","message":"This says \"compute_id\", but allowed_address_pairs.py#550 was changed to pass an amphora. Which is correct?","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        _PLUGGED_NETWORKS[(network_id, compute_id)] \u003d interface"},{"line_number":135,"context_line":"        return interface"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def unplug_network(self, compute_id, network_id):"},{"line_number":138,"context_line":"        LOG.debug(\"Network %s no-op, unplug_network compute_id %s, \""},{"line_number":139,"context_line":"                  \"network_id %s\","},{"line_number":140,"context_line":"                  self.__class__.__name__, compute_id, network_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"4708defa_36e92969","line":137,"in_reply_to":"082ee4ef_67273357","updated":"2022-08-25 12:48:34.000000000","message":"Done, compute_id is correct","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}],"octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":996,"context_line":"        test_int_num \u003d str(test_int_num)"},{"line_number":997,"context_line":""},{"line_number":998,"context_line":"        # Interface already plugged"},{"line_number":999,"context_line":"        # TODO(gthiemonge) FIXME"},{"line_number":1000,"context_line":"        # mock_int_exists.return_value \u003d True"},{"line_number":1001,"context_line":"        # if distro \u003d\u003d consts.UBUNTU:"},{"line_number":1002,"context_line":"        #     rv \u003d self.ubuntu_app.post(\u0027/\u0027 + api_server.VERSION +"}],"source_content_type":"text/x-python","patch_set":37,"id":"2f8d65f8_27f063bf","line":999,"updated":"2022-08-24 00:16:53.000000000","message":"This should be fixed. grin","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":996,"context_line":"        test_int_num \u003d str(test_int_num)"},{"line_number":997,"context_line":""},{"line_number":998,"context_line":"        # Interface already plugged"},{"line_number":999,"context_line":"        # TODO(gthiemonge) FIXME"},{"line_number":1000,"context_line":"        # mock_int_exists.return_value \u003d True"},{"line_number":1001,"context_line":"        # if distro \u003d\u003d consts.UBUNTU:"},{"line_number":1002,"context_line":"        #     rv \u003d self.ubuntu_app.post(\u0027/\u0027 + api_server.VERSION +"}],"source_content_type":"text/x-python","patch_set":37,"id":"acf69bc3_9687afdb","line":999,"in_reply_to":"2f8d65f8_27f063bf","updated":"2022-08-25 12:48:34.000000000","message":"I\u0027m removing this block.\nBefore this commit, calling /plug/network on an already plugged network returned a 409\nWith this commit, calling this endpoint reconfigures the port/network (for instance to plug/unplug a subnet)","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":103,"context_line":"        mock_interface_file.return_value \u003d mock_interface"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        self.ubuntu_os_util.write_interface_file(\u0027eth1\u0027,"},{"line_number":106,"context_line":"                                                 \u00271.2.3.4\u0027, 16)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        mock_interface_file.assert_called_once_with("},{"line_number":109,"context_line":"            name\u003d\u0027eth1\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"ace0f369_a63e2dde","line":106,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        mock_interface_file.return_value \u003d mock_interface"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        self.ubuntu_os_util.write_interface_file(\u0027eth1\u0027,"},{"line_number":106,"context_line":"                                                 \u00271.2.3.4\u0027, 16)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        mock_interface_file.assert_called_once_with("},{"line_number":109,"context_line":"            name\u003d\u0027eth1\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"4323782c_29948bd6","line":106,"in_reply_to":"ace0f369_a63e2dde","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        mock_interface_file.assert_called_once_with("},{"line_number":109,"context_line":"            name\u003d\u0027eth1\u0027,"},{"line_number":110,"context_line":"            addresses\u003d[{\"address\": \"1.2.3.4\", \"prefixlen\": 16}])"},{"line_number":111,"context_line":"        mock_interface.write.assert_called_once()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.utils.interface_file.\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"71eb8671_08a036f3","line":110,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        mock_interface_file.assert_called_once_with("},{"line_number":109,"context_line":"            name\u003d\u0027eth1\u0027,"},{"line_number":110,"context_line":"            addresses\u003d[{\"address\": \"1.2.3.4\", \"prefixlen\": 16}])"},{"line_number":111,"context_line":"        mock_interface.write.assert_called_once()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @mock.patch(\u0027octavia.amphorae.backends.utils.interface_file.\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"b4787b61_6e896042","line":110,"in_reply_to":"71eb8671_08a036f3","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":232,"context_line":"             \u0027subnet_cidr\u0027: FAKE_CIDR_IPV4,"},{"line_number":233,"context_line":"             \u0027gateway\u0027: FAKE_GATEWAY_IPV4,"},{"line_number":234,"context_line":"             \u0027host_routes\u0027: ["},{"line_number":235,"context_line":"                 {\u0027destination\u0027: \u002710.1.0.0/16\u0027,"},{"line_number":236,"context_line":"                  \u0027nexthop\u0027: \u002710.0.1.254\u0027}]"},{"line_number":237,"context_line":"             }]"},{"line_number":238,"context_line":"        mtu \u003d 1400"}],"source_content_type":"text/x-python","patch_set":37,"id":"e800d431_b0212304","line":235,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":232,"context_line":"             \u0027subnet_cidr\u0027: FAKE_CIDR_IPV4,"},{"line_number":233,"context_line":"             \u0027gateway\u0027: FAKE_GATEWAY_IPV4,"},{"line_number":234,"context_line":"             \u0027host_routes\u0027: ["},{"line_number":235,"context_line":"                 {\u0027destination\u0027: \u002710.1.0.0/16\u0027,"},{"line_number":236,"context_line":"                  \u0027nexthop\u0027: \u002710.0.1.254\u0027}]"},{"line_number":237,"context_line":"             }]"},{"line_number":238,"context_line":"        mtu \u003d 1400"}],"source_content_type":"text/x-python","patch_set":37,"id":"a57d1f87_505852b3","line":235,"in_reply_to":"e800d431_b0212304","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":269,"context_line":"             \u0027subnet_cidr\u0027: FAKE_CIDR_IPV4,"},{"line_number":270,"context_line":"             \u0027gateway\u0027: FAKE_GATEWAY_IPV4,"},{"line_number":271,"context_line":"             \u0027host_routes\u0027: ["},{"line_number":272,"context_line":"                 {\u0027destination\u0027: \u002710.1.0.0/16\u0027,"},{"line_number":273,"context_line":"                  \u0027nexthop\u0027: \u002710.0.1.254\u0027}]"},{"line_number":274,"context_line":"             }, {\u0027ip_address\u0027: FAKE_IP_IPV6,"},{"line_number":275,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"}],"source_content_type":"text/x-python","patch_set":37,"id":"b9d25730_dbef7f8e","line":272,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":269,"context_line":"             \u0027subnet_cidr\u0027: FAKE_CIDR_IPV4,"},{"line_number":270,"context_line":"             \u0027gateway\u0027: FAKE_GATEWAY_IPV4,"},{"line_number":271,"context_line":"             \u0027host_routes\u0027: ["},{"line_number":272,"context_line":"                 {\u0027destination\u0027: \u002710.1.0.0/16\u0027,"},{"line_number":273,"context_line":"                  \u0027nexthop\u0027: \u002710.0.1.254\u0027}]"},{"line_number":274,"context_line":"             }, {\u0027ip_address\u0027: FAKE_IP_IPV6,"},{"line_number":275,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"}],"source_content_type":"text/x-python","patch_set":37,"id":"879f2204_0d8dbcd6","line":272,"in_reply_to":"b9d25730_dbef7f8e","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":275,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"},{"line_number":276,"context_line":"                 \u0027gateway\u0027: FAKE_GATEWAY_IPV6,"},{"line_number":277,"context_line":"                 \u0027host_routes\u0027: ["},{"line_number":278,"context_line":"                     {\u0027destination\u0027: \u00272001:1::/64\u0027,"},{"line_number":279,"context_line":"                      \u0027nexthop\u0027: \u00271001:1::ffff\u0027}]"},{"line_number":280,"context_line":"                 }]"},{"line_number":281,"context_line":"        mtu \u003d 1400"}],"source_content_type":"text/x-python","patch_set":37,"id":"98505696_d669423c","line":278,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"},{"line_number":276,"context_line":"                 \u0027gateway\u0027: FAKE_GATEWAY_IPV6,"},{"line_number":277,"context_line":"                 \u0027host_routes\u0027: ["},{"line_number":278,"context_line":"                     {\u0027destination\u0027: \u00272001:1::/64\u0027,"},{"line_number":279,"context_line":"                      \u0027nexthop\u0027: \u00271001:1::ffff\u0027}]"},{"line_number":280,"context_line":"                 }]"},{"line_number":281,"context_line":"        mtu \u003d 1400"}],"source_content_type":"text/x-python","patch_set":37,"id":"f7321544_6e5ebe1d","line":278,"in_reply_to":"98505696_d669423c","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":311,"context_line":"             \u0027subnet_cidr\u0027: FAKE_CIDR_IPV4,"},{"line_number":312,"context_line":"             \u0027gateway\u0027: FAKE_GATEWAY_IPV4,"},{"line_number":313,"context_line":"             \u0027host_routes\u0027: ["},{"line_number":314,"context_line":"                 {\u0027destination\u0027: \u002710.1.0.0/16\u0027,"},{"line_number":315,"context_line":"                  \u0027nexthop\u0027: \u002710.0.1.254\u0027}]"},{"line_number":316,"context_line":"             }, {\u0027ip_address\u0027: FAKE_IP_IPV6,"},{"line_number":317,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"}],"source_content_type":"text/x-python","patch_set":37,"id":"ad5d01f8_9652f2d9","line":314,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":311,"context_line":"             \u0027subnet_cidr\u0027: FAKE_CIDR_IPV4,"},{"line_number":312,"context_line":"             \u0027gateway\u0027: FAKE_GATEWAY_IPV4,"},{"line_number":313,"context_line":"             \u0027host_routes\u0027: ["},{"line_number":314,"context_line":"                 {\u0027destination\u0027: \u002710.1.0.0/16\u0027,"},{"line_number":315,"context_line":"                  \u0027nexthop\u0027: \u002710.0.1.254\u0027}]"},{"line_number":316,"context_line":"             }, {\u0027ip_address\u0027: FAKE_IP_IPV6,"},{"line_number":317,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"}],"source_content_type":"text/x-python","patch_set":37,"id":"25f4b24c_6984fe6e","line":314,"in_reply_to":"ad5d01f8_9652f2d9","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":317,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"},{"line_number":318,"context_line":"                 \u0027gateway\u0027: FAKE_GATEWAY_IPV6,"},{"line_number":319,"context_line":"                 \u0027host_routes\u0027: ["},{"line_number":320,"context_line":"                     {\u0027destination\u0027: \u00272001:1::/64\u0027,"},{"line_number":321,"context_line":"                      \u0027nexthop\u0027: \u00271001:1::ffff\u0027}]"},{"line_number":322,"context_line":"                 }]"},{"line_number":323,"context_line":"        mtu \u003d 1400"}],"source_content_type":"text/x-python","patch_set":37,"id":"6159639c_284a05f8","line":320,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                 \u0027subnet_cidr\u0027: FAKE_CIDR_IPV6,"},{"line_number":318,"context_line":"                 \u0027gateway\u0027: FAKE_GATEWAY_IPV6,"},{"line_number":319,"context_line":"                 \u0027host_routes\u0027: ["},{"line_number":320,"context_line":"                     {\u0027destination\u0027: \u00272001:1::/64\u0027,"},{"line_number":321,"context_line":"                      \u0027nexthop\u0027: \u00271001:1::ffff\u0027}]"},{"line_number":322,"context_line":"                 }]"},{"line_number":323,"context_line":"        mtu \u003d 1400"}],"source_content_type":"text/x-python","patch_set":37,"id":"21b25154_a0cda122","line":320,"in_reply_to":"6159639c_284a05f8","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":322,"context_line":"                 }]"},{"line_number":323,"context_line":"        mtu \u003d 1400"},{"line_number":324,"context_line":"        vip_net_info \u003d {"},{"line_number":325,"context_line":"            \u0027vip\u0027: \u002710.2.1.1\u0027,"},{"line_number":326,"context_line":"            \u0027subnet_cidr\u0027: \u002710.2.0.0/16\u0027,"},{"line_number":327,"context_line":"            \u0027vrrp_ip\u0027: \u002710.2.1.2\u0027,"},{"line_number":328,"context_line":"            \u0027gateway\u0027: \u002710.2.255.254\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"eac096b5_2d044066","line":325,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                 }]"},{"line_number":323,"context_line":"        mtu \u003d 1400"},{"line_number":324,"context_line":"        vip_net_info \u003d {"},{"line_number":325,"context_line":"            \u0027vip\u0027: \u002710.2.1.1\u0027,"},{"line_number":326,"context_line":"            \u0027subnet_cidr\u0027: \u002710.2.0.0/16\u0027,"},{"line_number":327,"context_line":"            \u0027vrrp_ip\u0027: \u002710.2.1.2\u0027,"},{"line_number":328,"context_line":"            \u0027gateway\u0027: \u002710.2.255.254\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"73fc0326_d0bafc2f","line":325,"in_reply_to":"eac096b5_2d044066","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        self.amp_net_config \u003d network_models.AmphoraNetworkConfig("},{"line_number":121,"context_line":"            vip_subnet\u003dnetwork_models.Subnet("},{"line_number":122,"context_line":"                id\u003dself.lb.vip.subnet_id,"},{"line_number":123,"context_line":"                cidr\u003d\u002710.1.0.0/16\u0027,"},{"line_number":124,"context_line":"                host_routes\u003d[]))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @mock.patch(\u0027octavia.amphorae.drivers.haproxy.rest_api_driver.\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"02ab166a_680079ab","line":123,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        self.amp_net_config \u003d network_models.AmphoraNetworkConfig("},{"line_number":121,"context_line":"            vip_subnet\u003dnetwork_models.Subnet("},{"line_number":122,"context_line":"                id\u003dself.lb.vip.subnet_id,"},{"line_number":123,"context_line":"                cidr\u003d\u002710.1.0.0/16\u0027,"},{"line_number":124,"context_line":"                host_routes\u003d[]))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @mock.patch(\u0027octavia.amphorae.drivers.haproxy.rest_api_driver.\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"ffad62bd_271dab85","line":123,"in_reply_to":"02ab166a_680079ab","updated":"2022-08-25 12:48:34.000000000","message":"Done (I also had to update existing code that didn\u0027t use reserved IPs)","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":752,"context_line":"                           mtu\u003dFAKE_MTU,"},{"line_number":753,"context_line":"                           vip_net_info\u003ddict("},{"line_number":754,"context_line":"                               vip\u003dself.amp.ha_ip,"},{"line_number":755,"context_line":"                               subnet_cidr\u003d\u002710.1.0.0/16\u0027,"},{"line_number":756,"context_line":"                               mac_address\u003dFAKE_MAC_ADDRESS,"},{"line_number":757,"context_line":"                               gateway\u003dNone,"},{"line_number":758,"context_line":"                               vrrp_ip\u003dself.amp.vrrp_ip,"}],"source_content_type":"text/x-python","patch_set":37,"id":"db471521_a50a308d","line":755,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":false,"context_lines":[{"line_number":752,"context_line":"                           mtu\u003dFAKE_MTU,"},{"line_number":753,"context_line":"                           vip_net_info\u003ddict("},{"line_number":754,"context_line":"                               vip\u003dself.amp.ha_ip,"},{"line_number":755,"context_line":"                               subnet_cidr\u003d\u002710.1.0.0/16\u0027,"},{"line_number":756,"context_line":"                               mac_address\u003dFAKE_MAC_ADDRESS,"},{"line_number":757,"context_line":"                               gateway\u003dNone,"},{"line_number":758,"context_line":"                               vrrp_ip\u003dself.amp.vrrp_ip,"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a6e619d_f4c74215","line":755,"in_reply_to":"db471521_a50a308d","updated":"2022-08-25 12:48:34.000000000","message":"Done","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"octavia/tests/unit/common/sample_configs/sample_configs_combined.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":655,"context_line":"        smtp_connect_timeout\u003d\u0027\u0027)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"def sample_vip_tuple(ip_address\u003d\u002710.0.0.2\u0027, subnet_id\u003d\u0027vip_subnet_uuid\u0027):"},{"line_number":659,"context_line":"    vip \u003d collections.namedtuple(\u0027vip\u0027, (\u0027ip_address\u0027, \u0027subnet_id\u0027))"},{"line_number":660,"context_line":"    return vip(ip_address\u003dip_address, subnet_id\u003dsubnet_id)"},{"line_number":661,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"ef50dee0_666d842c","line":658,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":655,"context_line":"        smtp_connect_timeout\u003d\u0027\u0027)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"def sample_vip_tuple(ip_address\u003d\u002710.0.0.2\u0027, subnet_id\u003d\u0027vip_subnet_uuid\u0027):"},{"line_number":659,"context_line":"    vip \u003d collections.namedtuple(\u0027vip\u0027, (\u0027ip_address\u0027, \u0027subnet_id\u0027))"},{"line_number":660,"context_line":"    return vip(ip_address\u003dip_address, subnet_id\u003dsubnet_id)"},{"line_number":661,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"e62be296_329ec0cb","line":658,"in_reply_to":"ef50dee0_666d842c","updated":"2022-08-25 12:48:34.000000000","message":"I didn\u0027t add this address, it was already there. Updating it would require to update many tests","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"octavia/tests/unit/common/sample_configs/sample_configs_split.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"2981b033894951be9d1de7c9da7e2f74021b2c71","unresolved":true,"context_lines":[{"line_number":603,"context_line":"        smtp_connect_timeout\u003d\u0027\u0027)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"def sample_vip_tuple(ip_address\u003d\u002710.0.0.2\u0027, subnet_id\u003d\u0027vip_subnet_uuid\u0027):"},{"line_number":607,"context_line":"    vip \u003d collections.namedtuple(\u0027vip\u0027, (\u0027ip_address\u0027, \u0027subnet_id\u0027))"},{"line_number":608,"context_line":"    return vip(ip_address\u003dip_address, subnet_id\u003dsubnet_id)"},{"line_number":609,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"fed6a482_d90a53fd","line":606,"updated":"2022-08-24 00:16:53.000000000","message":"We should use reserved test IPs here.","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"a6e4fdda6c45486c77963081f44a5c272c70d865","unresolved":true,"context_lines":[{"line_number":603,"context_line":"        smtp_connect_timeout\u003d\u0027\u0027)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"def sample_vip_tuple(ip_address\u003d\u002710.0.0.2\u0027, subnet_id\u003d\u0027vip_subnet_uuid\u0027):"},{"line_number":607,"context_line":"    vip \u003d collections.namedtuple(\u0027vip\u0027, (\u0027ip_address\u0027, \u0027subnet_id\u0027))"},{"line_number":608,"context_line":"    return vip(ip_address\u003dip_address, subnet_id\u003dsubnet_id)"},{"line_number":609,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"46ae47e2_70c4cc5f","line":606,"in_reply_to":"fed6a482_d90a53fd","updated":"2022-08-25 12:48:34.000000000","message":"same","commit_id":"e11a2eecde57b0ea30dfe449f3a7e941ecf93df9"}],"octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":131,"context_line":"        pool_mock.members \u003d [member_mock]"},{"line_number":132,"context_line":"        lb_mock \u003d mock.MagicMock()"},{"line_number":133,"context_line":"        lb_mock.pools \u003d [pool_mock]"},{"line_number":134,"context_line":"        lb_mock.vip.subnet.network_id \u003d MEMBER_NETWORK_ID"},{"line_number":135,"context_line":"        lb_dict \u003d {"},{"line_number":136,"context_line":"            constants.LOADBALANCER_ID: LB_ID,"},{"line_number":137,"context_line":"            constants.VIP_SUBNET_ID: VIP_SUBNET_ID,"}],"source_content_type":"text/x-python","patch_set":34,"id":"0e0a8052_562b979f","line":134,"range":{"start_line":134,"start_character":40,"end_line":134,"end_character":57},"updated":"2022-08-09 17:19:00.000000000","message":"Shouldn\u0027t that be VIP_NETWORK_ID?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        pool_mock.members \u003d [member_mock]"},{"line_number":132,"context_line":"        lb_mock \u003d mock.MagicMock()"},{"line_number":133,"context_line":"        lb_mock.pools \u003d [pool_mock]"},{"line_number":134,"context_line":"        lb_mock.vip.subnet.network_id \u003d MEMBER_NETWORK_ID"},{"line_number":135,"context_line":"        lb_dict \u003d {"},{"line_number":136,"context_line":"            constants.LOADBALANCER_ID: LB_ID,"},{"line_number":137,"context_line":"            constants.VIP_SUBNET_ID: VIP_SUBNET_ID,"}],"source_content_type":"text/x-python","patch_set":34,"id":"57df79d1_82d77b2d","line":134,"range":{"start_line":134,"start_character":40,"end_line":134,"end_character":57},"in_reply_to":"0e0a8052_562b979f","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":251,"context_line":"        ).to_dict()}"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        mgmt_subnet \u003d data_models.Subnet("},{"line_number":254,"context_line":"            id\u003dself.mgmt_subnet_id, network_id\u003dself.mgmt_net_id)"},{"line_number":255,"context_line":"        mgmt_net \u003d data_models.Network("},{"line_number":256,"context_line":"            id\u003dself.mgmt_net_id,"},{"line_number":257,"context_line":"            subnets\u003d[mgmt_subnet.id])"}],"source_content_type":"text/x-python","patch_set":34,"id":"66a85de7_69577ab5","line":254,"range":{"start_line":254,"start_character":15,"end_line":254,"end_character":34},"updated":"2022-08-09 17:19:00.000000000","message":"nit: in test_calculate_amphora_delta you use MGMT_SUBNET_ID and here self.mgmt_subnet_id, and to me it looks like they are the same.\nThe same happens with self.mgmt_net_id. Maybe we can delete either the upper case vars or the self.var ones?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        ).to_dict()}"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        mgmt_subnet \u003d data_models.Subnet("},{"line_number":254,"context_line":"            id\u003dself.mgmt_subnet_id, network_id\u003dself.mgmt_net_id)"},{"line_number":255,"context_line":"        mgmt_net \u003d data_models.Network("},{"line_number":256,"context_line":"            id\u003dself.mgmt_net_id,"},{"line_number":257,"context_line":"            subnets\u003d[mgmt_subnet.id])"}],"source_content_type":"text/x-python","patch_set":34,"id":"601850d3_25cf4c7a","line":254,"range":{"start_line":254,"start_character":15,"end_line":254,"end_character":34},"in_reply_to":"66a85de7_69577ab5","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":330,"context_line":"        calc_delta \u003d network_tasks.CalculateDelta()"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        # Test with no amps or anything at all"},{"line_number":333,"context_line":"        self.assertEqual(EMPTY, calc_delta.execute("},{"line_number":334,"context_line":"            self.load_balancer_mock, {}))"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Test with one amp and no pools, only the base network plugged"}],"source_content_type":"text/x-python","patch_set":34,"id":"1b5a52b4_c63c2223","line":333,"range":{"start_line":333,"start_character":25,"end_line":333,"end_character":30},"updated":"2022-08-09 17:19:00.000000000","message":"The \"EMPTY\" variable is only being used on this line. Maybe you could delete it and use \"empty_deltas\" instead?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        calc_delta \u003d network_tasks.CalculateDelta()"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        # Test with no amps or anything at all"},{"line_number":333,"context_line":"        self.assertEqual(EMPTY, calc_delta.execute("},{"line_number":334,"context_line":"            self.load_balancer_mock, {}))"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # Test with one amp and no pools, only the base network plugged"}],"source_content_type":"text/x-python","patch_set":34,"id":"fdfcfafe_878e0032","line":333,"range":{"start_line":333,"start_character":25,"end_line":333,"end_character":30},"in_reply_to":"1b5a52b4_c63c2223","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":968,"context_line":"            data_models.Subnet("},{"line_number":969,"context_line":"                id\u003dsubnet1,"},{"line_number":970,"context_line":"                network_id\u003dnetwork1)]"},{"line_number":971,"context_line":"        add_nics \u003d [_interface(network1)]"},{"line_number":972,"context_line":"        add_subnets \u003d [{"},{"line_number":973,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":974,"context_line":"            \u0027network_id\u0027: network1,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7b482792_93df6954","line":971,"updated":"2022-08-09 17:19:00.000000000","message":"Pycharm: Local variable \u0027add_nics\u0027 value is not used.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":968,"context_line":"            data_models.Subnet("},{"line_number":969,"context_line":"                id\u003dsubnet1,"},{"line_number":970,"context_line":"                network_id\u003dnetwork1)]"},{"line_number":971,"context_line":"        add_nics \u003d [_interface(network1)]"},{"line_number":972,"context_line":"        add_subnets \u003d [{"},{"line_number":973,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":974,"context_line":"            \u0027network_id\u0027: network1,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ee66836a_087928ec","line":971,"in_reply_to":"7b482792_93df6954","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":1021,"context_line":"                                      recurse\u003dTrue)"},{"line_number":1022,"context_line":"        updated_ports \u003d net.execute({self.db_amphora_mock.id: delta},"},{"line_number":1023,"context_line":"                                    self.load_balancer_mock)"},{"line_number":1024,"context_line":"        mock_driver.delete_port.assert_not_called()"},{"line_number":1025,"context_line":"        mock_driver.plug_network.assert_not_called()"},{"line_number":1026,"context_line":"        mock_driver.plug_fixed_ip.assert_not_called()"},{"line_number":1027,"context_line":"        self.assertEqual(1, len(updated_ports))"},{"line_number":1028,"context_line":"        self.assertEqual(1, len(updated_ports[self.db_amphora_mock.id]))"},{"line_number":1029,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"05328b5c_c0fc1e0a","line":1026,"range":{"start_line":1024,"start_character":8,"end_line":1026,"end_character":53},"updated":"2022-08-09 17:19:00.000000000","message":"Maybe we could assert unplug_fixed_ip was called once? (To make sure the for loop in delta.get(constants.DELETE_SUBNETS, []) was run).","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"                                      recurse\u003dTrue)"},{"line_number":1022,"context_line":"        updated_ports \u003d net.execute({self.db_amphora_mock.id: delta},"},{"line_number":1023,"context_line":"                                    self.load_balancer_mock)"},{"line_number":1024,"context_line":"        mock_driver.delete_port.assert_not_called()"},{"line_number":1025,"context_line":"        mock_driver.plug_network.assert_not_called()"},{"line_number":1026,"context_line":"        mock_driver.plug_fixed_ip.assert_not_called()"},{"line_number":1027,"context_line":"        self.assertEqual(1, len(updated_ports))"},{"line_number":1028,"context_line":"        self.assertEqual(1, len(updated_ports[self.db_amphora_mock.id]))"},{"line_number":1029,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"ee62a8de_32296141","line":1026,"range":{"start_line":1024,"start_character":8,"end_line":1026,"end_character":53},"in_reply_to":"05328b5c_c0fc1e0a","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":1036,"context_line":"        # Deleting a subnet, but neutron doesn\u0027t unplug it"},{"line_number":1037,"context_line":"        # Delta are empty because there\u0027s nothing to update"},{"line_number":1038,"context_line":"        mock_driver.reset_mock()"},{"line_number":1039,"context_line":"        delete_subnets \u003d [{"},{"line_number":1040,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":1041,"context_line":"            \u0027network_id\u0027: network1,"},{"line_number":1042,"context_line":"            \u0027port_id\u0027: port1}]"}],"source_content_type":"text/x-python","patch_set":34,"id":"5522a8f2_f167ab37","line":1039,"updated":"2022-08-09 17:19:00.000000000","message":"Pycharm: Local variable \u0027delete_subnets\u0027 value is not used.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"        # Deleting a subnet, but neutron doesn\u0027t unplug it"},{"line_number":1037,"context_line":"        # Delta are empty because there\u0027s nothing to update"},{"line_number":1038,"context_line":"        mock_driver.reset_mock()"},{"line_number":1039,"context_line":"        delete_subnets \u003d [{"},{"line_number":1040,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":1041,"context_line":"            \u0027network_id\u0027: network1,"},{"line_number":1042,"context_line":"            \u0027port_id\u0027: port1}]"}],"source_content_type":"text/x-python","patch_set":34,"id":"057f664f_32d7c073","line":1039,"in_reply_to":"5522a8f2_f167ab37","updated":"2022-08-18 07:59:07.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":1040,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":1041,"context_line":"            \u0027network_id\u0027: network1,"},{"line_number":1042,"context_line":"            \u0027port_id\u0027: port1}]"},{"line_number":1043,"context_line":"        mock_driver.get_subnet.side_effect \u003d ["},{"line_number":1044,"context_line":"            data_models.Subnet("},{"line_number":1045,"context_line":"                id\u003dsubnet2,"},{"line_number":1046,"context_line":"                network_id\u003dnetwork1),"}],"source_content_type":"text/x-python","patch_set":34,"id":"27d57927_71a07521","line":1043,"updated":"2022-08-09 17:19:00.000000000","message":"Just making sure: should get_subnet return 2 times subnet2?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":true,"context_lines":[{"line_number":1040,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":1041,"context_line":"            \u0027network_id\u0027: network1,"},{"line_number":1042,"context_line":"            \u0027port_id\u0027: port1}]"},{"line_number":1043,"context_line":"        mock_driver.get_subnet.side_effect \u003d ["},{"line_number":1044,"context_line":"            data_models.Subnet("},{"line_number":1045,"context_line":"                id\u003dsubnet2,"},{"line_number":1046,"context_line":"                network_id\u003dnetwork1),"}],"source_content_type":"text/x-python","patch_set":34,"id":"828c5a23_e0a072b4","line":1043,"in_reply_to":"27d57927_71a07521","updated":"2022-08-18 07:59:07.000000000","message":"well I don\u0027t understand this test, I\u0027m removing the mock that are not used","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d83a4cea9e47dda2d91cb7b0addd5635e58f8b7e","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"            \u0027subnet_id\u0027: subnet1,"},{"line_number":1041,"context_line":"            \u0027network_id\u0027: network1,"},{"line_number":1042,"context_line":"            \u0027port_id\u0027: port1}]"},{"line_number":1043,"context_line":"        mock_driver.get_subnet.side_effect \u003d ["},{"line_number":1044,"context_line":"            data_models.Subnet("},{"line_number":1045,"context_line":"                id\u003dsubnet2,"},{"line_number":1046,"context_line":"                network_id\u003dnetwork1),"}],"source_content_type":"text/x-python","patch_set":34,"id":"23fec716_869cb104","line":1043,"in_reply_to":"828c5a23_e0a072b4","updated":"2022-08-23 07:42:30.000000000","message":"Done","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"        mock_driver.delete_port.assert_called_once_with(12)"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"        mock_driver.reset_mock()"},{"line_number":1134,"context_line":"        net.execute({}, self.load_balancer_mock)"},{"line_number":1135,"context_line":"        self.assertFalse(mock_driver.unplug_network.called)"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        delta \u003d data_models.Delta(amphora_id\u003dself.db_amphora_mock.id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"6515aae2_7a7c9520","line":1134,"updated":"2022-08-09 17:19:00.000000000","message":"We have the same line in #896. Maybe we can move the assertFalse (#1135) to be run right after it?","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"        mock_driver.delete_port.assert_called_once_with(12)"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"        mock_driver.reset_mock()"},{"line_number":1134,"context_line":"        net.execute({}, self.load_balancer_mock)"},{"line_number":1135,"context_line":"        self.assertFalse(mock_driver.unplug_network.called)"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        delta \u003d data_models.Delta(amphora_id\u003dself.db_amphora_mock.id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"5a0b00db_3c70cc7b","line":1134,"in_reply_to":"6515aae2_7a7c9520","updated":"2022-08-18 07:59:07.000000000","message":"sorry I don\u0027t get it","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"d61f67d13804481dd651f198942f3565c48a4284","unresolved":true,"context_lines":[{"line_number":1134,"context_line":"        net.execute({}, self.load_balancer_mock)"},{"line_number":1135,"context_line":"        self.assertFalse(mock_driver.unplug_network.called)"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        delta \u003d data_models.Delta(amphora_id\u003dself.db_amphora_mock.id,"},{"line_number":1138,"context_line":"                                  compute_id\u003dself.db_amphora_mock.compute_id,"},{"line_number":1139,"context_line":"                                  add_nics\u003d[],"},{"line_number":1140,"context_line":"                                  delete_nics\u003d[],"},{"line_number":1141,"context_line":"                                  add_subnets\u003d[],"},{"line_number":1142,"context_line":"                                  delete_subnets\u003d[]).to_dict(recurse\u003dTrue)"},{"line_number":1143,"context_line":"        net.execute({self.db_amphora_mock.id: delta}, self.load_balancer_mock)"},{"line_number":1144,"context_line":"        self.assertFalse(mock_driver.unplug_network.called)"},{"line_number":1145,"context_line":""},{"line_number":1146,"context_line":"        delta \u003d data_models.Delta(amphora_id\u003dself.db_amphora_mock.id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1d6afafc_c04873e7","line":1143,"range":{"start_line":1137,"start_character":8,"end_line":1143,"end_character":78},"updated":"2022-08-09 17:19:00.000000000","message":"We have the same scenario in lines 899 - 905, 1101 - 1107, 1137 - 1143, with pretty similar asserts.","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"338ddf013e56b771ed8ffc840e3c269e96dfa425","unresolved":false,"context_lines":[{"line_number":1134,"context_line":"        net.execute({}, self.load_balancer_mock)"},{"line_number":1135,"context_line":"        self.assertFalse(mock_driver.unplug_network.called)"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        delta \u003d data_models.Delta(amphora_id\u003dself.db_amphora_mock.id,"},{"line_number":1138,"context_line":"                                  compute_id\u003dself.db_amphora_mock.compute_id,"},{"line_number":1139,"context_line":"                                  add_nics\u003d[],"},{"line_number":1140,"context_line":"                                  delete_nics\u003d[],"},{"line_number":1141,"context_line":"                                  add_subnets\u003d[],"},{"line_number":1142,"context_line":"                                  delete_subnets\u003d[]).to_dict(recurse\u003dTrue)"},{"line_number":1143,"context_line":"        net.execute({self.db_amphora_mock.id: delta}, self.load_balancer_mock)"},{"line_number":1144,"context_line":"        self.assertFalse(mock_driver.unplug_network.called)"},{"line_number":1145,"context_line":""},{"line_number":1146,"context_line":"        delta \u003d data_models.Delta(amphora_id\u003dself.db_amphora_mock.id,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1679bd12_30ba625f","line":1143,"range":{"start_line":1137,"start_character":8,"end_line":1143,"end_character":78},"in_reply_to":"1d6afafc_c04873e7","updated":"2022-08-18 07:59:07.000000000","message":"I agree, I have removed the duplicated tests","commit_id":"5afea696b796ff122346ebb4e5d149dcad09fd82"}],"releasenotes/notes/fix-plugging-member-subnets-8560cd9403ff79a7.yaml":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"a34e2c71c4a77ef6b77beddcb2341765aa7f7723","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Fix a bug when adding a member on a subnet that belongs to a network with"},{"line_number":5,"context_line":"    multiple subnets, an incorrect subnet may have been plugged in the amphora."},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Fix a bug when deleting the last member plugged on a network, the port that"},{"line_number":8,"context_line":"    was no longer used was not deleted."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"5a1b1660_8a0b7c2a","line":7,"updated":"2022-08-24 00:19:09.000000000","message":"There should be a story for this too. So should be added to the commit message.\n\nhttps://storyboard.openstack.org/#!/story/1609050","commit_id":"1ce8218d426e4fb894480cbdb891aa3e51026fbf"}]}
