)]}'
{"id":"openstack%2Fnetworking-generic-switch~1005277","triplet_id":"openstack%2Fnetworking-generic-switch~master~I770be10ca9508c9c581c096010f04fd3b8425fe8","project":"openstack/networking-generic-switch","branch":"master","topic":"ngs-port-channels","attention_set":{"39426":{"account":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"last_update":"2026-09-18 13:47:11.000000000","reason":"\u003cGERRIT_ACCOUNT_24245\u003e replied on the change","reason_account":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"}}},"removed_from_attention_set":{},"hashtags":[],"change_id":"I770be10ca9508c9c581c096010f04fd3b8425fe8","subject":"Configure link aggregations declaratively, never their member ports","status":"NEW","created":"2026-09-11 15:04:51.000000000","updated":"2026-09-18 15:10:17.000000000","submit_type":"MERGE_IF_NECESSARY","mergeable":false,"submittable":false,"total_comment_count":8,"unresolved_comment_count":6,"has_review_started":true,"meta_rev_id":"4a458e7c5a89a82988aaf374be643c2f153c20c6","_number":1005277,"virtual_id_number":1005277,"owner":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"actions":{},"labels":{"Verified":{"recommended":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},{"tag":"autogenerated:zuul:check","value":1,"date":"2026-09-11 16:55:01.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":1,"default_value":0,"optional":true},"Code-Review":{"disliked":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"all":[{"value":-1,"date":"2026-09-18 13:47:11.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},{"value":-1,"date":"2026-09-18 15:09:08.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","value":-1,"default_value":0,"optional":true},"Workflow":{"all":[{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true},"Backport-Candidate":{"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}],"values":{"-1":"Do Not Backport"," 0":"Backport Review Needed","+1":"Should Backport"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-09-11 16:55:01.000000000","updated_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"reviewer":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2026-09-18 13:47:11.000000000","updated_by":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"reviewer":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"state":"REVIEWER"},{"updated":"2026-09-18 15:09:08.000000000","updated_by":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"reviewer":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"state":"REVIEWER"}],"messages":[{"id":"143f1081103d9f8ddfb9ba512796b532cfb47af5","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"date":"2026-09-11 15:04:51.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"9a7b028b42ac290eb3c27c3449d0dd21da2d6ab3","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-09-11 16:55:01.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/01d4d4c4bbf94877a1036e5b7156e48b\n\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/b0ef5920b35f4cf8a9a9a6c52ade1eea : SUCCESS in 3m 17s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/a1dfe2e546d7420199822c9656a3d26c : SUCCESS in 4m 49s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/218f2db9bc974ae6be05acfdd1547cc4 : SUCCESS in 3m 23s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/4f1ce10e92384f15bcc92bd3dae0ef8e : SUCCESS in 4m 28s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/88b49d3dc8044b6aa0b84ebf37a5fe5c : SUCCESS in 9m 16s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/8dd32e04509c47a4b102e571f0809a5a : SUCCESS in 4m 52s\n- networking-generic-switch-tempest-dlm https://zuul.opendev.org/t/openstack/build/ee6db08e8cad446ab3ff91928a3cda01 : SUCCESS in 23m 13s\n- ironic-tempest-ipa-wholedisk-direct-multinode https://zuul.opendev.org/t/openstack/build/3bb3ad971548425f9944fc8686d1bc68 : SUCCESS in 1h 43m 38s\n- networking-baremetal-ovn-vxlan https://zuul.opendev.org/t/openstack/build/91fba62aeb3d42ecb2d97767eb2f5f5d : SUCCESS in 20m 19s\n- networking-generic-switch-tox-codespell https://zuul.opendev.org/t/openstack/build/d7320d9e68bb4afe9b153a7f8bd82f20 : SUCCESS in 2m 40s","accounts_in_message":[],"_revision_number":1},{"id":"4925188f36539097be901145b01282fa7f615cfd","author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"date":"2026-09-18 13:47:11.000000000","message":"Patch Set 1: Code-Review-1\n\n(3 comments)","accounts_in_message":[],"_revision_number":1},{"id":"f36ca87af0b26d46f41d52e380fd9c90bb0f9e57","author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"date":"2026-09-18 15:09:08.000000000","message":"Patch Set 1: Code-Review-1\n\n(4 comments)","accounts_in_message":[],"_revision_number":1},{"id":"4a458e7c5a89a82988aaf374be643c2f153c20c6","author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"date":"2026-09-18 15:10:17.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1}],"current_revision_number":1,"current_revision":"5d04cbe6ea4a8ce12c2fed12b7c59bd97c1fcd0b","revisions":{"5d04cbe6ea4a8ce12c2fed12b7c59bd97c1fcd0b":{"kind":"REWORK","_number":1,"created":"2026-09-11 15:04:51.000000000","uploader":{"_account_id":39426,"name":"fivetime","display_name":"fivetime","email":"td@fivetime.ltd","username":"fivetime"},"ref":"refs/changes/77/1005277/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/networking-generic-switch","ref":"refs/changes/77/1005277/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/networking-generic-switch refs/changes/77/1005277/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/networking-generic-switch refs/changes/77/1005277/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/networking-generic-switch refs/changes/77/1005277/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/networking-generic-switch refs/changes/77/1005277/1"}}},"commit":{"parents":[{"commit":"c98db0840f47728155780af86e43869dad123a73","subject":"Merge \"Add opt-in port carrier bounce on bind\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/networking-generic-switch/commit/c98db0840f47728155780af86e43869dad123a73"}]}],"author":{"name":"Simon Zhou","email":"td@fivetime.ltd","date":"2026-09-08 16:48:47.000000000","tz":0},"committer":{"name":"Simon Zhou","email":"td@fivetime.ltd","date":"2026-09-11 15:04:31.000000000","tz":0},"subject":"Configure link aggregations declaratively, never their member ports","message":"Configure link aggregations declaratively, never their member ports\n\nA bonded baremetal host reaches Neutron as one port per NIC. Ironic\u0027s\nprovisioning ports name the physical switch port and carry no\nlocal_group_information at all, and even a tenant VIF on an 802.3ad\nport group arrives as one link per member. NGS then configures each\nmember as an access port and, on unbind, runs DELETE_PORT on each of\nthem, which on Arista EOS writes \"switchport trunk allowed vlan none\"\nto channel-group members whose Port-Channel, the interface that\nactually carries the traffic, is never touched. On Arista the\naggregate decides what its members carry, so the only effect is to\ndrift the members\u0027 static configuration, and with\nngs_save_configuration the drift is saved to startup-config on every\noperation.\n\nThree changes:\n\n* ngs_port_channels: a per-switch mapping of aggregate to member\n  ports. Any plug or unplug that names a member is applied to the\n  aggregate, once per aggregate per operation, and the members are\n  never configured. A malformed mapping fails when the driver loads,\n  not on the first plug. When Ironic passes local_group_information\n  for an 802.3ad port group whose name is the aggregate, that name is\n  used the same way.\n\n* AristaEos gains PLUG_BOND_TO_NETWORK and UNPLUG_BOND_FROM_NETWORK\n  (and ENABLE_BOND/DISABLE_BOND). Until now it had none, so plug_bond\n  fell back to the per-port access templates. The aggregate is always\n  a trunk whose native VLAN is the port\u0027s network, with trunk subports\n  added on top, and the allowed list is set rather than added to. With\n  ngs_port_default_vlan, both plug and unplug reset the aggregate\n  first and then write the whole desired state, so the result does not\n  depend on what the interface looked like before, and an unplug\n  leaves it on the default VLAN so a ramdisk can still boot through it.\n\n* The default-VLAN replug on unplug no longer sends ADD_NETWORK when\n  ngs_manage_vlans is False. Re-issuing \"vlan N / name N\" renames a\n  VLAN that the driver does not manage.\n\nTests cover the mapping (parse, unset, invalid, member listed under two\naggregates), the Arista templates (plain plug, convergence with\nsubports, unplug to the default VLAN, with and without VLAN management)\nand the driver (members routed to one aggregate call on plug and on\nunplug, two aggregates kept distinct, a non-member port configured as\nitself, port group name used as the aggregate).\n\nAssisted-By: Claude Fable 5.1\nAssisted-By: Claude Opus 5\nChange-Id: I770be10ca9508c9c581c096010f04fd3b8425fe8\nSigned-off-by: Simon Zhou \u003ctd@fivetime.ltd\u003e\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01FqXGTd71E38jvvpBo7NHuP\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/networking-generic-switch/commit/5d04cbe6ea4a8ce12c2fed12b7c59bd97c1fcd0b"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/networking-generic-switch/commit/5d04cbe6ea4a8ce12c2fed12b7c59bd97c1fcd0b"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~DefaultSubmitRule","status":"OK","labels":[{"label":"Verified","status":"MAY","applied_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"MAY","applied_by":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"}},{"label":"Workflow","status":"MAY"},{"label":"Backport-Candidate","status":"MAY"}]}],"submit_requirements":[{"name":"Verified","description":"Verified in gate by CI","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Verified\u003dMAX AND -label:Verified\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Verified\u003dMAX","label:Verified\u003dMIN"],"atom_explanations":{"label:Verified\u003dMAX":"","label:Verified\u003dMIN":""}}},{"name":"Backport-Candidate","description":"Backport candidate status","status":"NOT_APPLICABLE","is_legacy":false,"applicability_expression_result":{"fulfilled":false,"status":"FAIL"},"submittability_expression_result":{"expression":"is:true","fulfilled":true,"status":"NOT_EVALUATED","passing_atoms":[],"failing_atoms":[],"atom_explanations":{}}},{"name":"Code-Review","description":"Code reviewed by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Code-Review\u003dMAX AND -label:Code-Review\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Code-Review\u003dMAX","label:Code-Review\u003dMIN"],"atom_explanations":{"label:Code-Review\u003dMAX":"","label:Code-Review\u003dMIN":""}}},{"name":"Workflow","description":"Approved for gate by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Workflow\u003dMAX AND -label:Workflow\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Workflow\u003dMAX","label:Workflow\u003dMIN"],"atom_explanations":{"label:Workflow\u003dMAX":"","label:Workflow\u003dMIN":""}}}]}
