def test_GET_query_with_agent_name_filters_with_empty_string(self): node1 = factory.make_Node(agent_name="") node1_events = make_events(node=node1) node2 = factory.make_Node(agent_name=factory.make_name("agent-name")) node2_events = make_events(node=node2) # Request events relating to node1's agent, the empty string. response = self.client.get( reverse("events_handler"), { "op": "query", "agent_name": "", "level": "DEBUG" }, ) self.assertEqual(http.client.OK, response.status_code) parsed_result = json_load_bytes(response.content) # Only events pertaining to node1 are returned. self.assertSequenceEqual( [event.id for event in reversed(node1_events)], extract_event_ids(parsed_result), ) self.assertEqual(parsed_result["count"], len(node1_events)) ignore_unused(node2_events)
def test_GET_query_with_zone_filters_by_zone(self): zone1 = factory.make_Zone(name="zone1") node1 = factory.make_Node(zone=zone1) node1_events = make_events(node=node1) zone2 = factory.make_Zone(name="zone2") node2 = factory.make_Node(zone=zone2) node2_events = make_events(node=node2) response = self.client.get( reverse("events_handler"), { "op": "query", "zone": zone1.name, "level": "DEBUG" }, ) self.assertEqual(http.client.OK, response.status_code) parsed_result = json_load_bytes(response.content) self.assertSequenceEqual( [event.id for event in reversed(node1_events)], extract_event_ids(parsed_result), ) self.assertEqual(len(node1_events), parsed_result["count"]) ignore_unused(node2_events)
def test_update_leases_combines_additions_deletions_and_replacements(self): nodegroup = factory.make_node_group() mac1 = factory.getRandomMACAddress() mac2 = factory.getRandomMACAddress() obsolete_lease = factory.make_dhcp_lease( nodegroup=nodegroup, mac=mac1) # The obsolete lease won't be in the update, so it'll disappear. ignore_unused(obsolete_lease) unchanged_lease = factory.make_dhcp_lease( nodegroup=nodegroup, mac=mac1) reassigned_lease = factory.make_dhcp_lease( nodegroup=nodegroup, mac=mac1) new_ip = factory.getRandomIPAddress() DHCPLease.objects.update_leases(nodegroup, { reassigned_lease.ip: mac2, unchanged_lease.ip: mac1, new_ip: mac1, }) self.assertEqual( { reassigned_lease.ip: mac2, unchanged_lease.ip: mac1, new_ip: mac1, }, map_leases(nodegroup))
def parse_headers_and_body_with_mimer(headers, body): """Use piston's Mimer functionality to handle the content. :return: The value of 'request.data' after using Piston's translate_mime on the input. """ # JAM 2012-10-09 Importing emitters has a side effect of registering mime # type handlers with utils.translate_mime. So we must import it, even # though we don't use it. However, piston loads Django's QuerySet code # which fails if you don't have a settings.py available. Which we don't # during 'test.pserv'. So we import this late. from piston import emitters ignore_unused(emitters) from piston.utils import translate_mime environ = {'wsgi.input': BytesIO(body)} for name, value in headers.items(): environ[name.upper().replace('-', '_')] = value environ['REQUEST_METHOD'] = 'POST' environ['SCRIPT_NAME'] = '' environ['PATH_INFO'] = '' # Django 1.6 needs DJANGO_SETTINGS_MODULE to be defined # when importing WSGIRequest. os.environ['DJANGO_SETTINGS_MODULE'] = 'maas.development' from django.core.handlers.wsgi import WSGIRequest request = WSGIRequest(environ) translate_mime(request) return request.data
def test_GET_query_with_agent_name_filters_by_agent_name(self): agent_name1 = factory.make_name('agent-name') node1 = factory.make_Node(agent_name=agent_name1) node1_events = make_events(node=node1) agent_name2 = factory.make_name('agent-name') node2 = factory.make_Node(agent_name=agent_name2) node2_events = make_events(node=node2) # Request events relating to node1's agent. response = self.client.get(reverse('events_handler'), { 'op': 'query', 'agent_name': agent_name1, 'level': 'DEBUG', }) self.assertEqual(http.client.OK, response.status_code) parsed_result = json_load_bytes(response.content) # Only events pertaining to node1 are returned. self.assertSequenceEqual( [event.id for event in reversed(node1_events)], extract_event_ids(parsed_result)) self.assertEqual(parsed_result['count'], len(node1_events)) ignore_unused(node2_events)
def parse_headers_and_body_with_mimer(headers, body): """Use piston's Mimer functionality to handle the content. :return: The value of 'request.data' after using Piston's translate_mime on the input. """ # JAM 2012-10-09 Importing emitters has a side effect of registering mime # type handlers with utils.translate_mime. So we must import it, even # though we don't use it. However, piston loads Django's QuerySet code # which fails if you don't have a settings.py available. Which we don't # during 'test.pserv'. So we import this late. from piston import emitters ignore_unused(emitters) from piston.utils import translate_mime environ = {'wsgi.input': BytesIO(body)} for name, value in headers.items(): environ[name.upper().replace('-', '_')] = value environ['REQUEST_METHOD'] = 'POST' environ['SCRIPT_NAME'] = '' environ['PATH_INFO'] = '' # Django 1.6 needs DJANGO_SETTINGS_MODULE to be defined # when importing WSGIRequest. os.environ['DJANGO_SETTINGS_MODULE'] = 'maas.development' from django.core.handlers.wsgi import WSGIRequest request = WSGIRequest(environ) translate_mime(request) return request.data
def test_hardware_updates_tags_no_match(self): tag1 = factory.make_tag(factory.getRandomString(10), "/missing") ignore_unused(tag1) tag2 = factory.make_tag(factory.getRandomString(10), "/nothing") node = factory.make_node() node.tags = [tag2] node.save() xmlbytes = '<node/>' node.set_hardware_details(xmlbytes) node = reload_object(node) self.assertEqual([], list(node.tags.all()))
def test_node_list_with_zone_filters_by_zone(self): non_listed_node = factory.make_Node(zone=factory.make_Zone( name="twilight")) ignore_unused(non_listed_node) zone = factory.make_Zone() node = factory.make_Node(zone=zone) query = RequestFixture({"zone": zone.name}, "zone") node_list = nodes_module.filtered_nodes_list_from_request(query) self.assertSequenceEqual([node.system_id], extract_system_ids_from_nodes(node_list))
def test_node_list_with_agent_name_filters_by_agent_name(self): non_listed_node = factory.make_Node( agent_name=factory.make_name("agent_name")) ignore_unused(non_listed_node) agent_name = factory.make_name("agent-name") node = factory.make_Node(agent_name=agent_name) query = RequestFixture({"agent_name": agent_name}, "agent_name") node_list = nodes_module.filtered_nodes_list_from_request(query) self.assertSequenceEqual([node.system_id], extract_system_ids_from_nodes(node_list))
def test_GET_with_agent_name_filters_by_agent_name(self): non_listed_node = factory.make_Node( agent_name=factory.make_name("agent_name")) ignore_unused(non_listed_node) agent_name = factory.make_name("agent-name") node = factory.make_Node(agent_name=agent_name) response = self.client.get(reverse("nodes_handler"), {"agent_name": agent_name}) self.assertEqual(http.client.OK, response.status_code) parsed_result = json.loads( response.content.decode(settings.DEFAULT_CHARSET)) self.assertSequenceEqual([node.system_id], extract_system_ids(parsed_result))
def test_GET_with_zone_filters_by_zone(self): non_listed_node = factory.make_Node(zone=factory.make_Zone( name="twilight")) ignore_unused(non_listed_node) zone = factory.make_Zone() node = factory.make_Node(zone=zone) response = self.client.get(reverse("nodes_handler"), {"zone": zone.name}) self.assertEqual(http.client.OK, response.status_code) parsed_result = json.loads( response.content.decode(settings.DEFAULT_CHARSET)) self.assertSequenceEqual([node.system_id], extract_system_ids(parsed_result))
def test_combined_constraints(self): tag_big = factory.make_tag(name='big') node_big = factory.make_node(architecture=ARCHITECTURE.i386) node_big.tags.add(tag_big) node_small = factory.make_node(architecture=ARCHITECTURE.i386) ignore_unused(node_small) node_big_arm = factory.make_node( architecture=ARCHITECTURE.armhf_highbank) node_big_arm.tags.add(tag_big) self.assertConstrainedNodes( [node_big, node_big_arm], {'tags': ['big']}) self.assertConstrainedNodes( [node_big], {'arch': 'i386/generic', 'tags': ['big']})
def test_GET_list_with_agent_name_filters_by_agent_name(self): non_listed_node = factory.make_node( agent_name=factory.make_name('agent_name')) ignore_unused(non_listed_node) agent_name = factory.make_name('agent-name') node = factory.make_node(agent_name=agent_name) response = self.client.get(reverse('nodes_handler'), { 'op': 'list', 'agent_name': agent_name, }) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertSequenceEqual([node.system_id], extract_system_ids(parsed_result))
def test_GET_list_with_agent_name_filters_by_agent_name(self): non_listed_node = factory.make_node( agent_name=factory.make_name('agent_name')) ignore_unused(non_listed_node) agent_name = factory.make_name('agent-name') node = factory.make_node(agent_name=agent_name) response = self.client.get(reverse('nodes_handler'), { 'op': 'list', 'agent_name': agent_name, }) self.assertEqual(httplib.OK, response.status_code) parsed_result = json.loads(response.content) self.assertSequenceEqual( [node.system_id], extract_system_ids(parsed_result))
def test_update_leases_returns_new_leases(self): nodegroup = factory.make_node_group() obsolete_lease = factory.make_dhcp_lease(nodegroup=nodegroup) ignore_unused(obsolete_lease) remaining_lease = factory.make_dhcp_lease(nodegroup=nodegroup) new_lease = factory.make_random_leases() surviving_leases = { remaining_lease.ip: remaining_lease.mac, new_lease.keys()[0]: new_lease.values()[0], } self.assertItemsEqual( new_lease.keys(), DHCPLease.objects.update_leases(nodegroup, surviving_leases))
def test_combined_constraints(self): tag_big = factory.make_tag(name='big') node_big = factory.make_node(architecture=ARCHITECTURE.i386) node_big.tags.add(tag_big) node_small = factory.make_node(architecture=ARCHITECTURE.i386) ignore_unused(node_small) node_big_arm = factory.make_node( architecture=ARCHITECTURE.armhf_highbank) node_big_arm.tags.add(tag_big) self.assertConstrainedNodes([node_big, node_big_arm], {'tags': ['big']}) self.assertConstrainedNodes([node_big], { 'arch': 'i386/generic', 'tags': ['big'] })
def test_GET_query_with_zone_filters_by_zone(self): zone1 = factory.make_Zone(name='zone1') node1 = factory.make_Node(zone=zone1) node1_events = make_events(node=node1) zone2 = factory.make_Zone(name='zone2') node2 = factory.make_Node(zone=zone2) node2_events = make_events(node=node2) response = self.client.get(reverse('events_handler'), { 'op': 'query', 'zone': zone1.name, 'level': 'DEBUG' }) self.assertEqual(http.client.OK, response.status_code) parsed_result = json_load_bytes(response.content) self.assertSequenceEqual( [event.id for event in reversed(node1_events)], extract_event_ids(parsed_result)) self.assertEqual(len(node1_events), parsed_result['count']) ignore_unused(node2_events)
from maasserver.models.node import Node from maasserver.models.nodegroup import NodeGroup from maasserver.models.nodegroupinterface import NodeGroupInterface from maasserver.models.sshkey import SSHKey from maasserver.models.tag import Tag from maasserver.models.user import create_user from maasserver.models.userprofile import UserProfile from maasserver.models.zone import Zone from maasserver.utils import ignore_unused from piston.doc import HandlerDocumentation from piston.models import Consumer # Suppress warning about symbols being imported, but only used for # export in __all__. ignore_unused( ComponentError, Config, DHCPLease, FileStorage, MACAddress, NodeGroup, SSHKey, Tag, UserProfile, NodeGroupInterface) # Connect the 'create_user' method to the post save signal of User. post_save.connect(create_user, sender=User) # Monkey patch django.contrib.auth.models.User to force email to be unique. User._meta.get_field('email')._unique = True # Monkey patch piston's usage of Django's get_resolver to be compatible # with Django 1.4. # XXX: rvb 2012-09-21 bug=1054040 # See https://bitbucket.org/jespern/django-piston/issue/218 for details.
def make_interface(self): # Precache the node. So a database query is not made in the event-loop. interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL) node = interface.node ignore_unused(node) return interface
"""Model for the metadata server. DO NOT add new models to this module. Add them to the package as separate modules, but import them here and add them to `__all__`. """ from __future__ import ( absolute_import, print_function, unicode_literals, ) str = None __metaclass__ = type __all__ = [ 'CommissioningScript', 'NodeCommissionResult', 'NodeKey', 'NodeUserData', ] from maasserver.utils import ignore_unused from metadataserver.models.commissioningscript import CommissioningScript from metadataserver.models.nodecommissionresult import NodeCommissionResult from metadataserver.models.nodekey import NodeKey from metadataserver.models.nodeuserdata import NodeUserData ignore_unused(CommissioningScript, NodeCommissionResult, NodeKey, NodeUserData)
# GNU Affero General Public License version 3 (see the file LICENSE). """Model for the metadata server. DO NOT add new models to this module. Add them to the package as separate modules, but import them here and add them to `__all__`. """ from __future__ import ( absolute_import, print_function, unicode_literals, ) str = None __metaclass__ = type __all__ = [ 'CommissioningScript', 'NodeCommissionResult', 'NodeKey', 'NodeUserData', ] from maasserver.utils import ignore_unused from metadataserver.models.commissioningscript import CommissioningScript from metadataserver.models.nodecommissionresult import NodeCommissionResult from metadataserver.models.nodekey import NodeKey from metadataserver.models.nodeuserdata import NodeUserData ignore_unused(CommissioningScript, NodeCommissionResult, NodeKey, NodeUserData)