Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
 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))
Exemple #4
0
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
Exemple #5
0
    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)
Exemple #6
0
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
Exemple #7
0
 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()))
Exemple #8
0
    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))
Exemple #9
0
    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))
Exemple #10
0
 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))
Exemple #11
0
 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']})
Exemple #13
0
 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))
Exemple #14
0
 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))
Exemple #15
0
    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))
Exemple #16
0
 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']
     })
Exemple #17
0
    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)
Exemple #18
0
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
Exemple #20
0
"""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)
Exemple #21
0
# 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)