Skip to content

Commit a5c313e

Browse files
committed
fix: add control-plane label to topology metadata
Render both the legacy master label and the modern control-plane label on control-plane topology metadata so the OpenStack CCM nodeSelector can match the generated control-plane node. Assisted-By: Codex <noreply@openai.com> Signed-off-by: Rico Lin <rlin@vexxhost.com>
1 parent 0d6f417 commit a5c313e

2 files changed

Lines changed: 121 additions & 0 deletions

File tree

magnum_cluster_api/resources.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,7 @@ def get_object(self) -> dict:
10301030
"metadata": {
10311031
"labels": {
10321032
"node-role.kubernetes.io/master": "",
1033+
"node-role.kubernetes.io/control-plane": "",
10331034
}
10341035
},
10351036
"replicas": self.cluster.master_count,

magnum_cluster_api/tests/unit/test_resources.py

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414

15+
from types import SimpleNamespace
16+
1517
import pytest
1618
from magnum.objects import fields
1719
from magnum.tests.unit.objects import utils
@@ -82,6 +84,124 @@ def test_generate_machine_deployments_for_cluster_with_deleting_node_group(
8284
assert len(mds) == 2
8385

8486

87+
def test_cluster_control_plane_labels_match_cloud_controller_manager(
88+
context, mocker
89+
):
90+
cluster = mocker.Mock()
91+
cluster.cluster_template = mocker.Mock(
92+
network_driver="calico",
93+
dns_nameserver="1.1.1.1",
94+
external_network_id="public",
95+
)
96+
cluster.default_ng_master = mocker.Mock(image_id="image")
97+
cluster.docker_volume_size = None
98+
cluster.fixed_network = None
99+
cluster.fixed_subnet = None
100+
cluster.flavor_id = "worker"
101+
cluster.keypair = None
102+
cluster.labels = {}
103+
cluster.master_count = 1
104+
cluster.master_flavor_id = "control-plane"
105+
cluster.master_lb_enabled = True
106+
cluster.nodegroups = []
107+
cluster.stack_id = "kube-test"
108+
109+
default_volume_type = SimpleNamespace(name="fast")
110+
openstack_client = mocker.Mock()
111+
openstack_client.cinder.return_value.volume_types.default.return_value = (
112+
default_volume_type
113+
)
114+
mocker.patch(
115+
"magnum_cluster_api.resources.clients.get_openstack_api",
116+
return_value=openstack_client,
117+
)
118+
mocker.patch(
119+
"magnum_cluster_api.resources.cinder.get_default_boot_volume_type",
120+
return_value=default_volume_type.name,
121+
)
122+
mocker.patch(
123+
"magnum_cluster_api.resources.generate_machine_deployments_for_cluster",
124+
return_value=[],
125+
)
126+
mocker.patch(
127+
"magnum_cluster_api.resources.neutron.get_external_network_id",
128+
return_value="external-network",
129+
)
130+
mocker.patch(
131+
"magnum_cluster_api.resources.neutron.get_fixed_subnet_id",
132+
return_value=None,
133+
)
134+
mocker.patch(
135+
"magnum_cluster_api.resources.utils.ensure_controlplane_server_group",
136+
return_value="server-group",
137+
)
138+
mocker.patch(
139+
"magnum_cluster_api.resources.utils.generate_api_cert_san_list",
140+
return_value="",
141+
)
142+
mocker.patch(
143+
"magnum_cluster_api.resources.utils.generate_apt_proxy_config",
144+
return_value="",
145+
)
146+
mocker.patch(
147+
"magnum_cluster_api.resources.utils.generate_containerd_config",
148+
return_value="",
149+
)
150+
mocker.patch(
151+
"magnum_cluster_api.resources.utils.generate_systemd_proxy_config",
152+
return_value="",
153+
)
154+
mocker.patch(
155+
"magnum_cluster_api.resources.utils.get_cluster_container_infra_prefix",
156+
return_value="",
157+
)
158+
mocker.patch(
159+
"magnum_cluster_api.resources.utils.get_fixed_network_id",
160+
return_value=None,
161+
)
162+
mocker.patch(
163+
"magnum_cluster_api.resources.utils.get_kube_tag",
164+
return_value="v1.34.3",
165+
)
166+
mocker.patch(
167+
"magnum_cluster_api.resources.utils.get_operating_system",
168+
return_value="ubuntu",
169+
)
170+
mocker.patch(
171+
"magnum_cluster_api.resources.utils.is_controlplane_different_failure_domain",
172+
return_value=False,
173+
)
174+
mocker.patch(
175+
"magnum_cluster_api.resources.utils.lookup_flavor",
176+
side_effect=[
177+
SimpleNamespace(name="control-plane"),
178+
SimpleNamespace(name="worker"),
179+
],
180+
)
181+
mocker.patch(
182+
"magnum_cluster_api.resources.utils.lookup_image",
183+
return_value={"id": "image"},
184+
)
185+
186+
rust_driver = mocker.Mock()
187+
rust_driver.resolve_immutable_fields.return_value = {
188+
"apiServerLoadBalancer": {"enabled": True}
189+
}
190+
191+
resource = resources.Cluster(
192+
context,
193+
mocker.Mock(),
194+
mocker.Mock(),
195+
cluster,
196+
rust_driver,
197+
).get_object()
198+
199+
assert resource["spec"]["topology"]["controlPlane"]["metadata"]["labels"] == {
200+
"node-role.kubernetes.io/master": "",
201+
"node-role.kubernetes.io/control-plane": "",
202+
}
203+
204+
85205
@pytest.mark.parametrize(
86206
"auto_scaling_enabled",
87207
[True, False, None],

0 commit comments

Comments
 (0)