launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #12910
[Merge] lp:~jameinel/maas/manually-trigger-tag-rebuild into lp:maas
John A Meinel has proposed merging lp:~jameinel/maas/manually-trigger-tag-rebuild into lp:maas.
Commit message:
Add a way to manually trigger a tag rebuilding, rather than having to delete and re-add a tag, or change its definition. tags/tag-name/?op=rebuild
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
For more details, see:
https://code.launchpad.net/~jameinel/maas/manually-trigger-tag-rebuild/+merge/127928
This is meant as a recovery mechanism.
We are going to start by trusting that the rabbit queues get tags rebuilt properly. The alternative is building a lot of additional queue infrastructure in the local db.
The idea here is that if something does go wrong (a worker is started but doesn't have credentials yet, etc), we at least have a manual relief valve to poke at. (Note they could already do this by deleting/recreating the tag, or by changing the definition slightly.)
This also gives us a way to load test easily.
--
https://code.launchpad.net/~jameinel/maas/manually-trigger-tag-rebuild/+merge/127928
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~jameinel/maas/manually-trigger-tag-rebuild into lp:maas.
=== modified file 'src/maasserver/api.py'
--- src/maasserver/api.py 2012-10-03 12:02:59 +0000
+++ src/maasserver/api.py 2012-10-04 05:17:22 +0000
@@ -1371,6 +1371,14 @@
return nodes
@operation(idempotent=False)
+ def rebuild(self, request, name):
+ """Trigger rebuilding the tag <=> node mapping."""
+ tag = Tag.objects.get_tag_or_404(name=name, user=request.user,
+ to_edit=True)
+ tag.populate_nodes()
+ return {'rebuilding': tag.name}
+
+ @operation(idempotent=False)
def update_nodes(self, request, name):
"""Add or remove nodes being associated with this tag.
=== modified file 'src/maasserver/tests/test_api.py'
--- src/maasserver/tests/test_api.py 2012-10-03 14:24:37 +0000
+++ src/maasserver/tests/test_api.py 2012-10-04 05:17:22 +0000
@@ -2584,6 +2584,36 @@
self.assertEqual({'added': 0, 'removed': 0}, parsed_result)
self.assertItemsEqual([], tag.node_set.all())
+ def test_POST_rebuild_rebuilds_node_mapping(self):
+ tag = factory.make_tag(definition='/foo/bar')
+ # Only one node matches the tag definition, rebuilding should notice
+ node_matching = factory.make_node()
+ node_matching.set_hardware_details('<foo><bar /></foo>')
+ node_bogus = factory.make_node()
+ node_bogus.set_hardware_details('<foo />')
+ node_matching.tags.add(tag)
+ node_bogus.tags.add(tag)
+ self.assertItemsEqual(
+ [node_matching, node_bogus], tag.node_set.all())
+ self.become_admin()
+ response = self.client.post(self.get_tag_uri(tag), {'op': 'rebuild'})
+ self.assertEqual(httplib.OK, response.status_code)
+ parsed_result = json.loads(response.content)
+ self.assertEqual({'rebuilding': tag.name}, parsed_result)
+ self.assertItemsEqual([node_matching], tag.node_set.all())
+
+ def test_POST_rebuild_unknown_404(self):
+ self.become_admin()
+ response = self.client.post(
+ self.get_uri('tags/unknown-tag/'), {'op': 'rebuild'})
+ self.assertEqual(httplib.NOT_FOUND, response.status_code)
+
+ def test_POST_rebuild_refuses_user(self):
+ tag = factory.make_tag(definition='/foo/bar')
+ response = self.client.post(
+ self.get_tag_uri(tag), {'op': 'rebuild'})
+ self.assertEqual(httplib.FORBIDDEN, response.status_code)
+
class TestTagsAPI(APITestCase):