def inject_lshw_result(self):
     # inject_lshw_result() just calls through to inject_result().
     inject_result = self.patch(cs_module, "inject_result",
                                create_autospec(cs_module.inject_result))
     inject_lshw_result(sentinel.node, sentinel.output, sentinel.status)
     inject_result.assert_called_once_with(sentinel.node, LSHW_OUTPUT_NAME,
                                           sentinel.output, sentinel.status)
 def inject_lshw_result(self):
     # inject_lshw_result() just calls through to inject_result().
     inject_result = self.patch(
         cs_module, "inject_result",
         create_autospec(cs_module.inject_result))
     inject_lshw_result(sentinel.node, sentinel.output, sentinel.status)
     inject_result.assert_called_once_with(
         sentinel.node, LSHW_OUTPUT_NAME, sentinel.output, sentinel.status)
Beispiel #3
0
 def test_applies_tags_to_nodes(self):
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><child /></node>')
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node />')
     tag = factory.make_tag(definition='//node/child')
     self.assertItemsEqual([tag.name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
Beispiel #4
0
 def test_rollsback_invalid_xpath(self):
     node = factory.make_node()
     inject_lshw_result(node, b'<node><foo /></node>')
     tag = factory.make_tag(definition='//node/foo')
     self.assertItemsEqual([tag.name], node.tag_names())
     tag.definition = 'invalid::tag'
     self.assertRaises(ValidationError, tag.save)
     self.assertItemsEqual([tag.name], node.tag_names())
Beispiel #5
0
 def test_doesnt_touch_other_tags(self):
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><foo /></node>')
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node><bar /></node>')
     tag1 = factory.make_tag(definition='//node/foo')
     self.assertItemsEqual([tag1.name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
     tag2 = factory.make_tag(definition='//node/bar')
     self.assertItemsEqual([tag1.name], node1.tag_names())
     self.assertItemsEqual([tag2.name], node2.tag_names())
Beispiel #6
0
    def test_PUT_invalid_definition(self):
        self.become_admin()
        node = factory.make_node()
        inject_lshw_result(node, b'<node ><child/></node>')
        tag = factory.make_tag(definition='//child')
        self.assertItemsEqual([tag.name], node.tag_names())
        response = self.client_put(
            self.get_tag_uri(tag), {'definition': 'invalid::tag'})

        self.assertEqual(httplib.BAD_REQUEST, response.status_code)
        # The tag should not be modified
        tag = reload_object(tag)
        self.assertItemsEqual([tag.name], node.tag_names())
        self.assertEqual('//child', tag.definition)
Beispiel #7
0
    def test_PUT_invalid_definition(self):
        self.become_admin()
        node = factory.make_node()
        inject_lshw_result(node, b'<node ><child/></node>')
        tag = factory.make_tag(definition='//child')
        self.assertItemsEqual([tag.name], node.tag_names())
        response = self.client_put(self.get_tag_uri(tag),
                                   {'definition': 'invalid::tag'})

        self.assertEqual(httplib.BAD_REQUEST, response.status_code)
        # The tag should not be modified
        tag = reload_object(tag)
        self.assertItemsEqual([tag.name], node.tag_names())
        self.assertEqual('//child', tag.definition)
Beispiel #8
0
 def test_PUT_updates_node_associations(self):
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><foo/></node>')
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node><bar/></node>')
     tag = factory.make_tag(definition='//node/foo')
     self.assertItemsEqual([tag.name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
     self.become_admin()
     response = self.client_put(self.get_tag_uri(tag),
                                {'definition': '//node/bar'})
     self.assertEqual(httplib.OK, response.status_code)
     self.assertItemsEqual([], node1.tag_names())
     self.assertItemsEqual([tag.name], node2.tag_names())
Beispiel #9
0
 def test_PUT_updates_node_associations(self):
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><foo/></node>')
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node><bar/></node>')
     tag = factory.make_tag(definition='//node/foo')
     self.assertItemsEqual([tag.name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
     self.become_admin()
     response = self.client_put(
         self.get_tag_uri(tag),
         {'definition': '//node/bar'})
     self.assertEqual(httplib.OK, response.status_code)
     self.assertItemsEqual([], node1.tag_names())
     self.assertItemsEqual([tag.name], node2.tag_names())
Beispiel #10
0
 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()
     inject_lshw_result(node_matching, b'<foo><bar/></foo>')
     node_bogus = factory.make_node()
     inject_lshw_result(node_bogus, b'<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())
Beispiel #11
0
 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()
     inject_lshw_result(node_matching, b'<foo><bar/></foo>')
     node_bogus = factory.make_node()
     inject_lshw_result(node_bogus, b'<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())
Beispiel #12
0
 def test_removes_old_values(self):
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><foo /></node>')
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node><bar /></node>')
     tag = factory.make_tag(definition='//node/foo')
     self.assertItemsEqual([tag.name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
     tag.definition = '//node/bar'
     tag.save()
     self.assertItemsEqual([], node1.tag_names())
     self.assertItemsEqual([tag.name], node2.tag_names())
     # And we notice if we change it *again* and then save.
     tag.definition = '//node/foo'
     tag.save()
     self.assertItemsEqual([tag.name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
Beispiel #13
0
    def test_GET_nodes_hides_invisible_nodes(self):
        user2 = factory.make_user()
        node1 = factory.make_node()
        inject_lshw_result(node1, b'<node><foo/></node>')
        node2 = factory.make_node(status=NODE_STATUS.ALLOCATED, owner=user2)
        inject_lshw_result(node2, b'<node><bar/></node>')
        tag = factory.make_tag(definition='//node')
        response = self.client.get(self.get_tag_uri(tag), {'op': 'nodes'})

        self.assertEqual(httplib.OK, response.status_code)
        parsed_result = json.loads(response.content)
        self.assertEqual([node1.system_id],
                         [r['system_id'] for r in parsed_result])
        # However, for the other user, they should see the result
        client2 = OAuthAuthenticatedClient(user2)
        response = client2.get(self.get_tag_uri(tag), {'op': 'nodes'})
        self.assertEqual(httplib.OK, response.status_code)
        parsed_result = json.loads(response.content)
        self.assertItemsEqual([node1.system_id, node2.system_id],
                              [r['system_id'] for r in parsed_result])
Beispiel #14
0
    def test_GET_nodes_hides_invisible_nodes(self):
        user2 = factory.make_user()
        node1 = factory.make_node()
        inject_lshw_result(node1, b'<node><foo/></node>')
        node2 = factory.make_node(status=NODE_STATUS.ALLOCATED, owner=user2)
        inject_lshw_result(node2, b'<node><bar/></node>')
        tag = factory.make_tag(definition='//node')
        response = self.client.get(self.get_tag_uri(tag), {'op': 'nodes'})

        self.assertEqual(httplib.OK, response.status_code)
        parsed_result = json.loads(response.content)
        self.assertEqual([node1.system_id],
                         [r['system_id'] for r in parsed_result])
        # However, for the other user, they should see the result
        client2 = OAuthAuthenticatedClient(user2)
        response = client2.get(self.get_tag_uri(tag), {'op': 'nodes'})
        self.assertEqual(httplib.OK, response.status_code)
        parsed_result = json.loads(response.content)
        self.assertItemsEqual([node1.system_id, node2.system_id],
                              [r['system_id'] for r in parsed_result])
Beispiel #15
0
 def test_POST_new_populates_nodes(self):
     self.become_admin()
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><child/></node>')
     # Create another node that doesn't have a 'child'
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node/>')
     self.assertItemsEqual([], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
     name = factory.getRandomString()
     definition = '//node/child'
     comment = factory.getRandomString()
     response = self.client.post(
         reverse('tags_handler'), {
             'op': 'new',
             'name': name,
             'comment': comment,
             'definition': definition,
         })
     self.assertEqual(httplib.OK, response.status_code)
     self.assertItemsEqual([name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
Beispiel #16
0
 def test_POST_new_populates_nodes(self):
     self.become_admin()
     node1 = factory.make_node()
     inject_lshw_result(node1, b'<node><child/></node>')
     # Create another node that doesn't have a 'child'
     node2 = factory.make_node()
     inject_lshw_result(node2, b'<node/>')
     self.assertItemsEqual([], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())
     name = factory.getRandomString()
     definition = '//node/child'
     comment = factory.getRandomString()
     response = self.client.post(
         reverse('tags_handler'),
         {
             'op': 'new',
             'name': name,
             'comment': comment,
             'definition': definition,
         })
     self.assertEqual(httplib.OK, response.status_code)
     self.assertItemsEqual([name], node1.tag_names())
     self.assertItemsEqual([], node2.tag_names())