launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #12326
[Merge] lp:~gz/maas/populate_tags into lp:maas
Martin Packman has proposed merging lp:~gz/maas/populate_tags into lp:maas with lp:~gz/maas/populate_mem_and_cpu as a prerequisite.
Requested reviews:
MAAS Maintainers (maas-maintainers)
For more details, see:
https://code.launchpad.net/~gz/maas/populate_tags/+merge/125722
When hardware_details is updated, fill in any matching tags and remove any that no longer match. Again, this means bypassing django, but all the messiness is contained in one function at least. There a few tidy ups to do still, but this should get us rolling with the basics needed from constraints.
Resumbit to include prereq branch.
--
https://code.launchpad.net/~gz/maas/populate_tags/+merge/125722
Your team MAAS Maintainers is requested to review the proposed merge of lp:~gz/maas/populate_tags into lp:maas.
=== modified file 'src/maasserver/models/node.py'
--- src/maasserver/models/node.py 2012-09-21 14:14:40 +0000
+++ src/maasserver/models/node.py 2012-09-21 14:14:40 +0000
@@ -347,8 +347,17 @@
cpu_count, memory = cursor.fetchone()
node.cpu_count = cpu_count or 0
node.memory = memory or 0
+ for tag in Tag.objects.all():
+ cursor.execute(
+ "SELECT xpath_exists(%s, hardware_details)"
+ " FROM maasserver_node WHERE id = %s",
+ [tag.definition, node.id])
+ has_tag, = cursor.fetchone()
+ if has_tag:
+ node.tags.add(tag)
+ else:
+ node.tags.remove(tag)
node.save()
- # TODO: update node-tag links
class Node(CleanSave, TimestampedModel):
=== modified file 'src/metadataserver/tests/test_api.py'
--- src/metadataserver/tests/test_api.py 2012-09-21 14:14:40 +0000
+++ src/metadataserver/tests/test_api.py 2012-09-21 14:14:40 +0000
@@ -528,6 +528,30 @@
node = reload_object(node)
self.assertEqual(4, node.memory)
+ def test_signal_lshw_tags_match(self):
+ tag1 = factory.make_tag(factory.getRandomString(10), "/node")
+ tag2 = factory.make_tag(factory.getRandomString(10), "//node")
+ node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
+ client = self.make_node_client(node=node)
+ xmlbytes = '<node/>'.encode("utf-8")
+ response = self.call_signal(client, files={'01-lshw.out': xmlbytes})
+ self.assertEqual(httplib.OK, response.status_code)
+ node = reload_object(node)
+ self.assertEqual([tag1, tag2], list(node.tags.all()))
+
+ def test_signal_lshw_tags_no_match(self):
+ tag1 = factory.make_tag(factory.getRandomString(10), "/missing")
+ tag2 = factory.make_tag(factory.getRandomString(10), "/nothing")
+ node = factory.make_node(status=NODE_STATUS.COMMISSIONING)
+ node.tags = [tag2]
+ node.save()
+ client = self.make_node_client(node=node)
+ xmlbytes = '<node/>'.encode("utf-8")
+ response = self.call_signal(client, files={'01-lshw.out': xmlbytes})
+ self.assertEqual(httplib.OK, response.status_code)
+ node = reload_object(node)
+ self.assertEqual([], list(node.tags.all()))
+
def test_api_retrieves_node_metadata_by_mac(self):
mac = factory.make_mac_address()
url = reverse(