Skip to content

Commit 34f90c2

Browse files
fix(compute): reuse an existing node key when registering a Node
Node.insert() unconditionally created a NodeEncryptionKey for its uuid, so registering a compute Node for a machine that was already a local hypervisor's node (which provisions its own key the same way) crashed on the unique node uuid. Route through get_or_create like MachinePool already does.
1 parent 81c18fe commit 34f90c2

1 file changed

Lines changed: 47 additions & 0 deletions

File tree

exordos_core/tests/functional/restapi/compute/test_hypervisor_api.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,3 +376,50 @@ def test_hypervisors_add_local_hyper_provisions_a_node_key(
376376
client.delete(
377377
client.build_resource_uri(["compute", "hypervisors", hypervisor["uuid"]])
378378
)
379+
380+
def test_node_reuses_a_local_hyper_pools_node_key(
381+
self,
382+
pool_factory: tp.Callable,
383+
node_factory: tp.Callable,
384+
user_api_client: iam_clients.GenesisCoreTestRESTClient,
385+
auth_user_admin: iam_clients.GenesisCoreAuth,
386+
):
387+
# A machine can be both a local hypervisor's node and a plain
388+
# compute Node - both provision a NodeEncryptionKey for the same
389+
# uuid, so registering the Node after the hypervisor must reuse
390+
# the existing key instead of conflicting on insert.
391+
node_uuid = sys_uuid.uuid4()
392+
client = user_api_client(auth_user_admin)
393+
394+
hypervisor = pool_factory(
395+
driver_spec={
396+
"kind": "exordos_local_hyper",
397+
"connection_uri": "qemu:///system",
398+
"node": str(node_uuid),
399+
},
400+
)
401+
hypervisor.pop("status", None)
402+
response = client.post(
403+
client.build_collection_uri(["compute", "hypervisors"]), json=hypervisor
404+
)
405+
assert response.status_code == 201
406+
407+
key_before = ua_models.NodeEncryptionKey.objects.get_one(
408+
filters={"uuid": dm_filters.EQ(node_uuid)}
409+
)
410+
411+
node = node_factory(uuid=node_uuid)
412+
response = client.post(
413+
client.build_collection_uri(["compute", "nodes"]), json=node
414+
)
415+
assert response.status_code == 201
416+
417+
key_after = ua_models.NodeEncryptionKey.objects.get_one(
418+
filters={"uuid": dm_filters.EQ(node_uuid)}
419+
)
420+
assert key_after.private_key == key_before.private_key
421+
422+
client.delete(client.build_resource_uri(["compute", "nodes", str(node_uuid)]))
423+
client.delete(
424+
client.build_resource_uri(["compute", "hypervisors", hypervisor["uuid"]])
425+
)

0 commit comments

Comments
 (0)