Merge ~bjornt/maas:bug-1845459-2.6 into maas:2.6

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: a512bc1b0c461d121457864568406f9082aa36b8
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:bug-1845459-2.6
Merge into: maas:2.6
Diff against target: 60 lines (+27/-0)
2 files modified
src/metadataserver/api_twisted.py (+10/-0)
src/metadataserver/tests/test_api_twisted.py (+17/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Björn Tillenius Approve
Review via email: mp+373416@code.launchpad.net

Commit message

LP #1845459: Failure creating KVM pod in CI

Re-raise DatabaseErrors if form_pod.save() raises an exception.

The old code tried to mark the node as failed deployment, which failed
since the transaction was broken. Further more, the transaction wouldn't
be retried, which would have make the deploy succeed.

This is a stop-gap fix that improves the situation slightly. It's made
small so tha it can be backported to 2.6. The real fix is to refactor
the processing of the messages, so that marking the node as failed or
succeeded happens in a separate transaction.

(cherry picked from commit 6df0418010f49265549dac05233bc6cdfbc177e0)

To post a comment you must log in.
Revision history for this message
Björn Tillenius (bjornt) wrote :

Self-approve backport

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b bug-1845459-2.6 lp:~bjornt/maas/+git/maas into -b 2.6 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: a512bc1b0c461d121457864568406f9082aa36b8

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/metadataserver/api_twisted.py b/src/metadataserver/api_twisted.py
2index e1d5ded..429e8e3 100644
3--- a/src/metadataserver/api_twisted.py
4+++ b/src/metadataserver/api_twisted.py
5@@ -9,6 +9,7 @@ from collections import defaultdict
6 from datetime import datetime
7 import json
8
9+from django.db.utils import DatabaseError
10 from maasserver.api.utils import extract_oauth_key_from_auth_header
11 from maasserver.enum import (
12 NODE_STATUS,
13@@ -211,6 +212,15 @@ def _create_pod_for_deployment(node):
14 if pod_form.is_valid():
15 try:
16 pod_form.save()
17+ except DatabaseError:
18+ # Re-raise database errors, since we want it to be
19+ # retried if possible. If it's not retriable, we
20+ # couldn't mark the node as failed anyway, since the
21+ # transaction will be broken.
22+ # XXX: We should refactor the processing of messages so
23+ # that the node is marked failed/deployed in a seperate
24+ # transaction than the one doing the processing.
25+ raise
26 except Exception:
27 node.mark_failed(comment=POD_CREATION_ERROR, commit=False)
28 log.err(None, "Exception while saving pod form.")
29diff --git a/src/metadataserver/tests/test_api_twisted.py b/src/metadataserver/tests/test_api_twisted.py
30index 4c2add2..dce81a3 100644
31--- a/src/metadataserver/tests/test_api_twisted.py
32+++ b/src/metadataserver/tests/test_api_twisted.py
33@@ -21,6 +21,7 @@ from unittest.mock import (
34 )
35
36 from crochet import wait_for
37+from django.db.utils import DatabaseError
38 from maasserver.enum import NODE_STATUS
39 from maasserver.models import (
40 Event,
41@@ -1125,3 +1126,19 @@ class TestCreatePodForDeployment(MAASServerTestCase):
42 self.assertThat(node.status, Equals(NODE_STATUS.FAILED_DEPLOYMENT))
43 self.assertThat(node.error_description, DocTestMatches(
44 POD_CREATION_ERROR))
45+
46+ def test__raises_if_save_raises_database_error(self):
47+ mock_pod_form = Mock()
48+ self.mock_PodForm.return_value = mock_pod_form
49+ mock_pod_form.errors = {}
50+ mock_pod_form.is_valid = Mock()
51+ mock_pod_form.is_valid.return_value = True
52+ mock_pod_form.save = Mock()
53+ mock_pod_form.save.side_effect = DatabaseError('broken transaction')
54+ node = factory.make_Node_with_Interface_on_Subnet(
55+ status=NODE_STATUS.DEPLOYING, agent_name="maas-kvm-pod",
56+ install_kvm=True)
57+ factory.make_StaticIPAddress(interface=node.boot_interface)
58+ NodeMetadata.objects.create(
59+ node=node, key="virsh_password", value="xyz123")
60+ self.assertRaises(DatabaseError, _create_pod_for_deployment, node)

Subscribers

People subscribed via source and target branches