)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"acc7eb9645e9d8237dd9e734f92393f8c21ca5f7","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1c11924a_237680f2","updated":"2026-05-18 05:09:10.000000000","message":"Needs a depends-on on the spec","commit_id":"8ec7fb5783daa3da9828f8e7289a1b455409e5ff"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"a44c34a5bf7df8be44b2502835e9c756dc40a9af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6b6a5e57_9da4f0cf","in_reply_to":"1c11924a_237680f2","updated":"2026-07-09 01:54:08.000000000","message":"Done","commit_id":"8ec7fb5783daa3da9828f8e7289a1b455409e5ff"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"8c0b2f190a14ca070c76c88e1fbec351c12948ac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"dfe01fd0_9df6df8c","updated":"2026-07-17 06:00:34.000000000","message":"LGTM","commit_id":"34738d90ac6a0f8c84e5ff9f10ff063dc8fc8d93"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"2a237a5375dc2d1938d75cd59059b08d807b2d20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8cfd0bfc_1c0b3a81","updated":"2026-07-17 05:19:51.000000000","message":"recheck","commit_id":"34738d90ac6a0f8c84e5ff9f10ff063dc8fc8d93"}],"magnum/api/controllers/v1/nodegroup.py":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"87d1566190026759afbb200bbbe8319bdb6fc8d2","unresolved":true,"context_lines":[{"line_number":109,"context_line":"            raise exception.NodeGroupInvalidInput(attr\u003d\u0027node_taints\u0027,"},{"line_number":110,"context_line":"                                                  nodegroup\u003dng.name,"},{"line_number":111,"context_line":"                                                  expl\u003dexpl)"},{"line_number":112,"context_line":"        key \u003d taint.get(\u0027key\u0027)"},{"line_number":113,"context_line":"        effect \u003d taint.get(\u0027effect\u0027)"},{"line_number":114,"context_line":"        if not key:"},{"line_number":115,"context_line":"            expl \u003d \"node_taints[%d].key is required\" % index"},{"line_number":116,"context_line":"            raise exception.NodeGroupInvalidInput(attr\u003d\u0027node_taints\u0027,"},{"line_number":117,"context_line":"                                                  nodegroup\u003dng.name,"},{"line_number":118,"context_line":"                                                  expl\u003dexpl)"},{"line_number":119,"context_line":"        if effect not in _VALID_TAINT_EFFECTS:"},{"line_number":120,"context_line":"            expl \u003d (\"node_taints[%d].effect must be one of %s\" %"},{"line_number":121,"context_line":"                    (index, \u0027, \u0027.join(_VALID_TAINT_EFFECTS)))"},{"line_number":122,"context_line":"            raise exception.NodeGroupInvalidInput(attr\u003d\u0027node_taints\u0027,"},{"line_number":123,"context_line":"                                                  nodegroup\u003dng.name,"},{"line_number":124,"context_line":"                                                  expl\u003dexpl)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def _validate_node_attrs_role(ng):"}],"source_content_type":"text/x-python","patch_set":5,"id":"cc3fcb0c_75e33797","line":124,"range":{"start_line":112,"start_character":1,"end_line":124,"end_character":60},"updated":"2026-07-16 13:50:32.000000000","message":"We only validate key and effect, so if there\u0027s a malformed entry - we just silently ignore it? Since API type is just text?","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"},{"author":{"_account_id":3031,"name":"Sam Morrison","email":"sorrison@gmail.com","username":"sorrison"},"change_message_id":"4c6bba867e9d50b4b436a4ae448fdca337743062","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            raise exception.NodeGroupInvalidInput(attr\u003d\u0027node_taints\u0027,"},{"line_number":110,"context_line":"                                                  nodegroup\u003dng.name,"},{"line_number":111,"context_line":"                                                  expl\u003dexpl)"},{"line_number":112,"context_line":"        key \u003d taint.get(\u0027key\u0027)"},{"line_number":113,"context_line":"        effect \u003d taint.get(\u0027effect\u0027)"},{"line_number":114,"context_line":"        if not key:"},{"line_number":115,"context_line":"            expl \u003d \"node_taints[%d].key is required\" % index"},{"line_number":116,"context_line":"            raise exception.NodeGroupInvalidInput(attr\u003d\u0027node_taints\u0027,"},{"line_number":117,"context_line":"                                                  nodegroup\u003dng.name,"},{"line_number":118,"context_line":"                                                  expl\u003dexpl)"},{"line_number":119,"context_line":"        if effect not in _VALID_TAINT_EFFECTS:"},{"line_number":120,"context_line":"            expl \u003d (\"node_taints[%d].effect must be one of %s\" %"},{"line_number":121,"context_line":"                    (index, \u0027, \u0027.join(_VALID_TAINT_EFFECTS)))"},{"line_number":122,"context_line":"            raise exception.NodeGroupInvalidInput(attr\u003d\u0027node_taints\u0027,"},{"line_number":123,"context_line":"                                                  nodegroup\u003dng.name,"},{"line_number":124,"context_line":"                                                  expl\u003dexpl)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def _validate_node_attrs_role(ng):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f3a21c3_7c2b13c7","line":124,"range":{"start_line":112,"start_character":1,"end_line":124,"end_character":60},"in_reply_to":"cc3fcb0c_75e33797","updated":"2026-07-17 04:02:10.000000000","message":"Done","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"87d1566190026759afbb200bbbe8319bdb6fc8d2","unresolved":true,"context_lines":[{"line_number":124,"context_line":"                                                  expl\u003dexpl)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def _validate_node_attrs_role(ng):"},{"line_number":128,"context_line":"    \"\"\"node_labels and node_taints are only allowed on worker nodegroups."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    Control plane nodes have their own kubeadm-managed taints and allowing"}],"source_content_type":"text/x-python","patch_set":5,"id":"aae747a3_13ea8296","line":127,"updated":"2026-07-16 13:50:32.000000000","message":"If you create a nodegroup with role \u003d\u003d \u0027test\u0027 - then this is not working correctly.\nAmongst the codebase we are rather checking if role is not master","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"},{"author":{"_account_id":3031,"name":"Sam Morrison","email":"sorrison@gmail.com","username":"sorrison"},"change_message_id":"4c6bba867e9d50b4b436a4ae448fdca337743062","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                                  expl\u003dexpl)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def _validate_node_attrs_role(ng):"},{"line_number":128,"context_line":"    \"\"\"node_labels and node_taints are only allowed on worker nodegroups."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    Control plane nodes have their own kubeadm-managed taints and allowing"}],"source_content_type":"text/x-python","patch_set":5,"id":"91508c77_787e785e","line":127,"in_reply_to":"aae747a3_13ea8296","updated":"2026-07-17 04:02:10.000000000","message":"Done","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"}],"releasenotes/notes/nodegroup-node-labels-taints-7d62e1ab2e1c2415.yaml":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"87d1566190026759afbb200bbbe8319bdb6fc8d2","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    objects where ``effect`` is one of ``NoSchedule``, ``PreferNoSchedule``"},{"line_number":9,"context_line":"    or ``NoExecute``. Both fields are optional and may be supplied on"},{"line_number":10,"context_line":"    create or updated via PATCH. They are surfaced from REST API"},{"line_number":11,"context_line":"    microversion 1.14. The Cluster API / Helm driver propagates them to"},{"line_number":12,"context_line":"    the underlying ``MachineDeployment`` ``KubeadmConfigTemplate``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"4b40a69f_3084dfe0","line":12,"range":{"start_line":11,"start_character":23,"end_line":12,"end_character":67},"updated":"2026-07-16 13:50:32.000000000","message":"Are you sure the driver propagates them? I don\u0027t think magnum-capi-helm does that today","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"},{"author":{"_account_id":3031,"name":"Sam Morrison","email":"sorrison@gmail.com","username":"sorrison"},"change_message_id":"4c6bba867e9d50b4b436a4ae448fdca337743062","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    objects where ``effect`` is one of ``NoSchedule``, ``PreferNoSchedule``"},{"line_number":9,"context_line":"    or ``NoExecute``. Both fields are optional and may be supplied on"},{"line_number":10,"context_line":"    create or updated via PATCH. They are surfaced from REST API"},{"line_number":11,"context_line":"    microversion 1.14. The Cluster API / Helm driver propagates them to"},{"line_number":12,"context_line":"    the underlying ``MachineDeployment`` ``KubeadmConfigTemplate``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"dc425417_ede39cbc","line":12,"range":{"start_line":11,"start_character":23,"end_line":12,"end_character":67},"in_reply_to":"4b40a69f_3084dfe0","updated":"2026-07-17 04:02:10.000000000","message":"I\u0027ve got https://github.com/azimuth-cloud/capi-helm-charts/pull/741 but will remove the comment that this works with those charts specifically","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"66a3e1c578ac9b2557339af26410b79798f26599","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    objects where ``effect`` is one of ``NoSchedule``, ``PreferNoSchedule``"},{"line_number":9,"context_line":"    or ``NoExecute``. Both fields are optional and may be supplied on"},{"line_number":10,"context_line":"    create or updated via PATCH. They are surfaced from REST API"},{"line_number":11,"context_line":"    microversion 1.14. The Cluster API / Helm driver propagates them to"},{"line_number":12,"context_line":"    the underlying ``MachineDeployment`` ``KubeadmConfigTemplate``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"d58f6c9b_1297825a","line":12,"range":{"start_line":11,"start_character":23,"end_line":12,"end_character":67},"in_reply_to":"dc425417_ede39cbc","updated":"2026-07-17 05:58:57.000000000","message":"Acknowledged","commit_id":"a559b36a447bb8dde69a0f80fe0234a41d3c7653"}]}
