Merge lp:~ubuntudotcom1/maas/event-api-test-409 into lp:~maas-committers/maas/trunk

Proposed by ubuntudotcom1
Status: Rejected
Rejected by: Andres Rodriguez
Proposed branch: lp:~ubuntudotcom1/maas/event-api-test-409
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 157 lines (+26/-13)
3 files modified
src/maasserver/api/tests/test_api.py (+16/-10)
src/maasserver/exceptions.py (+7/-2)
src/maasserver/utils/views.py (+3/-1)
To merge this branch: bzr merge lp:~ubuntudotcom1/maas/event-api-test-409
Reviewer Review Type Date Requested Status
Raphaël Badin (community) Needs Information
Gavin Panella (community) Needs Information
Review via email: mp+255862@code.launchpad.net

Commit message

Make HttpResponseConflict also inherit from MAASAPIMaxRetryAttempts so that it may be handled by the api.

Description of the change

Make HttpResponseConflict also inherit from MAASAPIMaxRetryAttempts so that it may be handled by the api.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) wrote :

I don't fully understand why this is needed. I'd like to get a second opinion from Raphaël.

review: Needs Information
Revision history for this message
Raphaël Badin (rvb) wrote :

Agree with Gavin's remark: I'm not sure having a specific template for 409 exceptions is a good idea: it mixes things up (but maybe the code could be fixed) but also it's mostly useless: most of the code that's susceptible to raise said exception has been "websocketified" already.

Additionally (and as discussed in Nuremberg), we should see if it isn't possible to put all this exception-handling logic in src/maasserver/middleware.py; this is where all the other exception-handling happens. This is mostly a problem with the previous branch (the one whose behavior this branches fixes), not this one.

Revision history for this message
Raphaël Badin (rvb) :
review: Needs Information

Unmerged revisions

3814. By ubuntudotcom1

Make HttpResponseConflict also inherit from MAASAPIMaxRetryAttempts so that it may be handled by the api.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/api/tests/test_api.py'
--- src/maasserver/api/tests/test_api.py 2015-03-25 15:33:23 +0000
+++ src/maasserver/api/tests/test_api.py 2015-04-10 16:21:54 +0000
@@ -7,7 +7,7 @@
7 absolute_import,7 absolute_import,
8 print_function,8 print_function,
9 unicode_literals,9 unicode_literals,
10 )10)
1111
12str = None12str = None
1313
@@ -45,6 +45,7 @@
45from maasserver.testing.orm import reload_object45from maasserver.testing.orm import reload_object
46from maasserver.testing.testcase import MAASServerTestCase46from maasserver.testing.testcase import MAASServerTestCase
47from maasserver.utils.orm import get_one47from maasserver.utils.orm import get_one
48from maasserver.utils.views import HttpResponseConflict
48from maastesting.djangotestcase import DjangoTransactionTestCase49from maastesting.djangotestcase import DjangoTransactionTestCase
49from mock import Mock50from mock import Mock
50from netaddr import IPAddress51from netaddr import IPAddress
@@ -69,7 +70,7 @@
69 expected = (70 expected = (
70 Equals(httplib.UNAUTHORIZED),71 Equals(httplib.UNAUTHORIZED),
71 Contains("Invalid access token:"),72 Contains("Invalid access token:"),
72 )73 )
73 self.assertThat(observed, MatchesListwise(expected))74 self.assertThat(observed, MatchesListwise(expected))
7475
7576
@@ -121,7 +122,7 @@
121 self.request.POST = {122 self.request.POST = {
122 "power_type": power_type,123 "power_type": power_type,
123 "power_parameters": json.dumps(power_parameters),124 "power_parameters": json.dumps(power_parameters),
124 }125 }
125 store_node_power_parameters(self.node, self.request)126 store_node_power_parameters(self.node, self.request)
126 self.assertEqual(power_type, self.node.power_type)127 self.assertEqual(power_type, self.node.power_type)
127 self.assertEqual(power_parameters, self.node.power_parameters)128 self.assertEqual(power_parameters, self.node.power_parameters)
@@ -134,7 +135,7 @@
134 self.request.POST = {135 self.request.POST = {
135 "power_type": power_type,136 "power_type": power_type,
136 "power_parameters": "Not JSON.",137 "power_parameters": "Not JSON.",
137 }138 }
138 self.assertRaises(139 self.assertRaises(
139 MAASAPIBadRequest, store_node_power_parameters,140 MAASAPIBadRequest, store_node_power_parameters,
140 self.node, self.request)141 self.node, self.request)
@@ -156,7 +157,7 @@
156 power_type = ''157 power_type = ''
157 self.request.POST = {158 self.request.POST = {
158 "power_type": '',159 "power_type": '',
159 }160 }
160 store_node_power_parameters(self.node, self.request)161 store_node_power_parameters(self.node, self.request)
161 self.assertEqual(power_type, self.node.power_type)162 self.assertEqual(power_type, self.node.power_type)
162 self.save.assert_called_once_with()163 self.save.assert_called_once_with()
@@ -224,13 +225,13 @@
224 id=keys[0].id,225 id=keys[0].id,
225 key=keys[0].key,226 key=keys[0].key,
226 resource_uri=reverse('sshkey_handler', args=[keys[0].id]),227 resource_uri=reverse('sshkey_handler', args=[keys[0].id]),
227 ),228 ),
228 dict(229 dict(
229 id=keys[1].id,230 id=keys[1].id,
230 key=keys[1].key,231 key=keys[1].key,
231 resource_uri=reverse('sshkey_handler', args=[keys[1].id]),232 resource_uri=reverse('sshkey_handler', args=[keys[1].id]),
232 ),233 ),
233 ]234 ]
234 self.assertEqual(expected_result, parsed_result)235 self.assertEqual(expected_result, parsed_result)
235236
236 def test_get_by_id_works(self):237 def test_get_by_id_works(self):
@@ -245,7 +246,7 @@
245 id=key.id,246 id=key.id,
246 key=key.key,247 key=key.key,
247 resource_uri=reverse('sshkey_handler', args=[key.id]),248 resource_uri=reverse('sshkey_handler', args=[key.id]),
248 )249 )
249 self.assertEqual(expected, parsed_result)250 self.assertEqual(expected, parsed_result)
250251
251 def test_delete_by_id_works(self):252 def test_delete_by_id_works(self):
@@ -313,7 +314,6 @@
313314
314315
315class MAASAPITest(APITestCase):316class MAASAPITest(APITestCase):
316
317 def test_handler_path(self):317 def test_handler_path(self):
318 self.assertEqual(318 self.assertEqual(
319 '/api/1.0/maas/', reverse('maas_handler'))319 '/api/1.0/maas/', reverse('maas_handler'))
@@ -470,6 +470,12 @@
470 (httplib.INTERNAL_SERVER_ERROR, error_message),470 (httplib.INTERNAL_SERVER_ERROR, error_message),
471 (response.status_code, response.content))471 (response.status_code, response.content))
472472
473 def test_translates_http_409_conflict(self):
474 self.patch(nodes_module,
475 'create_node').side_effect = HttpResponseConflict()
476 response = self.client.post(reverse('nodes_handler'), {'op': 'new'})
477 self.assertEqual(httplib.CONFLICT, response.status_code)
478
473479
474def dict_subset(obj, fields):480def dict_subset(obj, fields):
475 """Return a dict of a subset of the fields/values of an object."""481 """Return a dict of a subset of the fields/values of an object."""
476482
=== modified file 'src/maasserver/exceptions.py'
--- src/maasserver/exceptions.py 2015-03-25 15:33:23 +0000
+++ src/maasserver/exceptions.py 2015-04-10 16:21:54 +0000
@@ -7,7 +7,7 @@
7 absolute_import,7 absolute_import,
8 print_function,8 print_function,
9 unicode_literals,9 unicode_literals,
10 )10)
1111
12str = None12str = None
1313
@@ -26,7 +26,7 @@
26 "StaticIPAddressExhaustion",26 "StaticIPAddressExhaustion",
27 "StaticIPAddressTypeClash",27 "StaticIPAddressTypeClash",
28 "UnresolvableHost",28 "UnresolvableHost",
29 ]29]
3030
3131
32import httplib32import httplib
@@ -110,6 +110,11 @@
110 api_error = httplib.CONFLICT110 api_error = httplib.CONFLICT
111111
112112
113class MAASAPIMaxRetryAttempts(MAASAPIException):
114 """The api has reached the maximum number of retry attempts."""
115 api_error = httplib.CONFLICT
116
117
113class NodesNotAvailable(NodeStateViolation):118class NodesNotAvailable(NodeStateViolation):
114 """Requested node(s) are not available to be acquired."""119 """Requested node(s) are not available to be acquired."""
115 api_error = httplib.CONFLICT120 api_error = httplib.CONFLICT
116121
=== modified file 'src/maasserver/utils/views.py'
--- src/maasserver/utils/views.py 2015-04-09 15:53:25 +0000
+++ src/maasserver/utils/views.py 2015-04-10 16:21:54 +0000
@@ -28,6 +28,7 @@
28from django.core.urlresolvers import get_resolver28from django.core.urlresolvers import get_resolver
29from django.db import transaction29from django.db import transaction
30from django.template.response import SimpleTemplateResponse30from django.template.response import SimpleTemplateResponse
31from maasserver.exceptions import MAASAPIMaxRetryAttempts
31from maasserver.utils.orm import (32from maasserver.utils.orm import (
32 gen_retry_intervals,33 gen_retry_intervals,
33 is_serialization_failure,34 is_serialization_failure,
@@ -124,7 +125,8 @@
124 self.content = response.content125 self.content = response.content
125126
126127
127class HttpResponseConflict(MAASDjangoTemplateResponse):128class HttpResponseConflict(
129 MAASAPIMaxRetryAttempts, MAASDjangoTemplateResponse):
128 status_code = httplib.CONFLICT130 status_code = httplib.CONFLICT
129131
130132