~blake-rouse/maas/fix-1484696-2

« back to all changes in this revision

Viewing changes to src/maasserver/api/tests/test_subnets.py

  • Committer: MAAS Lander
  • Author(s): Mike Pontillo
  • Date: 2015-09-24 04:53:36 UTC
  • mfrom: (4280.4.9 subnet-websockets)
  • Revision ID: maas_lander-20150924045336-o5i3wyyhqrdz5i77
[r=blake-rouse][bug=1498221][author=mpontillo] Add websocket handler for Subnet model object, and corresponding APIs on the subnet endpoint.

 * Add 'subnet ip-addresses' API.
 * Add 'subnet statistics' API.
 * Add support for ArrayField type in base websocket handler.
 * Refactor Subnet range code for better code reuse, query efficiency.
 * Minor docstring cleanup.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
from django.core.urlresolvers import reverse
22
22
from maasserver.enum import (
23
23
    IPADDRESS_TYPE,
 
24
    NODE_STATUS,
24
25
    NODEGROUP_STATUS,
25
26
)
26
27
from maasserver.testing.api import (
30
31
from maasserver.testing.factory import factory
31
32
from maasserver.testing.orm import reload_object
32
33
from maasserver.testing.testcase import MAASServerTestCase
33
 
from provisioningserver.utils.network import inet_ntop
 
34
from provisioningserver.utils.network import (
 
35
    inet_ntop,
 
36
    IPRangeStatistics,
 
37
)
34
38
from testtools.matchers import (
35
39
    ContainsDict,
36
40
    Equals,
359
363
                "end": expected_last_address,
360
364
                "num_addresses": second_range_size,
361
365
            }]))
 
366
 
 
367
 
 
368
class TestSubnetStatisticsAPI(APITestCase):
 
369
 
 
370
    def test__default_does_not_include_ranges(self):
 
371
        subnet = factory.make_Subnet()
 
372
        factory.make_StaticIPAddress(
 
373
            alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet=subnet)
 
374
        response = self.client.get(
 
375
            get_subnet_uri(subnet), {
 
376
                'op': 'statistics',
 
377
            })
 
378
        self.assertEqual(
 
379
            httplib.OK, response.status_code,
 
380
            explain_unexpected_response(httplib.OK, response))
 
381
        result = json.loads(response.content)
 
382
        full_iprange = subnet.get_iprange_usage()
 
383
        statistics = IPRangeStatistics(full_iprange)
 
384
        expected_result = statistics.render_json(include_ranges=False)
 
385
        self.assertThat(result, Equals(expected_result))
 
386
 
 
387
    def test__with_include_ranges(self):
 
388
        subnet = factory.make_Subnet()
 
389
        factory.make_StaticIPAddress(
 
390
            alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet=subnet)
 
391
        response = self.client.get(
 
392
            get_subnet_uri(subnet), {
 
393
                'op': 'statistics',
 
394
                'include_ranges': 'true'
 
395
            })
 
396
        self.assertEqual(
 
397
            httplib.OK, response.status_code,
 
398
            explain_unexpected_response(httplib.OK, response))
 
399
        result = json.loads(response.content)
 
400
        full_iprange = subnet.get_iprange_usage()
 
401
        statistics = IPRangeStatistics(full_iprange)
 
402
        expected_result = statistics.render_json(include_ranges=True)
 
403
        self.assertThat(result, Equals(expected_result))
 
404
 
 
405
    def test__without_include_ranges(self):
 
406
        subnet = factory.make_Subnet()
 
407
        factory.make_StaticIPAddress(
 
408
            alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet=subnet)
 
409
        response = self.client.get(
 
410
            get_subnet_uri(subnet), {
 
411
                'op': 'statistics',
 
412
                'include_ranges': 'false'
 
413
            })
 
414
        self.assertEqual(
 
415
            httplib.OK, response.status_code,
 
416
            explain_unexpected_response(httplib.OK, response))
 
417
        result = json.loads(response.content)
 
418
        full_iprange = subnet.get_iprange_usage()
 
419
        statistics = IPRangeStatistics(full_iprange)
 
420
        expected_result = statistics.render_json(include_ranges=False)
 
421
        self.assertThat(result, Equals(expected_result))
 
422
 
 
423
 
 
424
class TestSubnetIPAddressesAPI(APITestCase):
 
425
 
 
426
    def test__default_parameters(self):
 
427
        subnet = factory.make_Subnet()
 
428
        user = factory.make_User()
 
429
        node = factory.make_Node_with_Interface_on_Subnet(
 
430
            subnet=subnet, status=NODE_STATUS.READY)
 
431
        factory.make_StaticIPAddress(
 
432
            alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet=subnet, user=user)
 
433
        factory.make_StaticIPAddress(
 
434
            alloc_type=IPADDRESS_TYPE.STICKY, subnet=subnet, user=user,
 
435
            interface=node.get_boot_interface())
 
436
        response = self.client.get(
 
437
            get_subnet_uri(subnet), {
 
438
                'op': 'ip_addresses',
 
439
            })
 
440
        self.assertEqual(
 
441
            httplib.OK, response.status_code,
 
442
            explain_unexpected_response(httplib.OK, response))
 
443
        result = json.loads(response.content)
 
444
        expected_result = subnet.render_json_for_related_ips(
 
445
            with_username=True, with_node_summary=True)
 
446
        self.assertThat(result, Equals(expected_result))
 
447
 
 
448
    def test__with_username_false(self):
 
449
        subnet = factory.make_Subnet()
 
450
        user = factory.make_User()
 
451
        node = factory.make_Node_with_Interface_on_Subnet(
 
452
            subnet=subnet, status=NODE_STATUS.READY)
 
453
        factory.make_StaticIPAddress(
 
454
            alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet=subnet, user=user)
 
455
        factory.make_StaticIPAddress(
 
456
            alloc_type=IPADDRESS_TYPE.STICKY, subnet=subnet, user=user,
 
457
            interface=node.get_boot_interface())
 
458
        response = self.client.get(
 
459
            get_subnet_uri(subnet), {
 
460
                'op': 'ip_addresses',
 
461
                'with_username': 'false',
 
462
            })
 
463
        self.assertEqual(
 
464
            httplib.OK, response.status_code,
 
465
            explain_unexpected_response(httplib.OK, response))
 
466
        result = json.loads(response.content)
 
467
        expected_result = subnet.render_json_for_related_ips(
 
468
            with_username=False, with_node_summary=True)
 
469
        self.assertThat(result, Equals(expected_result))
 
470
 
 
471
    def test__with_node_summary_false(self):
 
472
        subnet = factory.make_Subnet()
 
473
        user = factory.make_User()
 
474
        node = factory.make_Node_with_Interface_on_Subnet(
 
475
            subnet=subnet, status=NODE_STATUS.READY)
 
476
        factory.make_StaticIPAddress(
 
477
            alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet=subnet, user=user)
 
478
        factory.make_StaticIPAddress(
 
479
            alloc_type=IPADDRESS_TYPE.STICKY, subnet=subnet, user=user,
 
480
            interface=node.get_boot_interface())
 
481
        response = self.client.get(
 
482
            get_subnet_uri(subnet), {
 
483
                'op': 'ip_addresses',
 
484
                'with_node_summary': 'false',
 
485
            })
 
486
        self.assertEqual(
 
487
            httplib.OK, response.status_code,
 
488
            explain_unexpected_response(httplib.OK, response))
 
489
        result = json.loads(response.content)
 
490
        expected_result = subnet.render_json_for_related_ips(
 
491
            with_username=True, with_node_summary=False)
 
492
        self.assertThat(result, Equals(expected_result))