Exemple #1
0
    def test_network_config_entry(self):
        dc = DataCenter(name='dc1')
        dc.save()
        net = Network(
            name='net',
            address='127.0.0.0/24',
            data_center=dc,
            dhcp_config='ziew',
        )
        net.save()
        entry = DHCPEntry(ip='127.0.0.1', mac='deadbeefcafe')
        entry.save()
        config = generate_dhcp_config(dc=dc, with_networks=True)
        # remove first line with the date and last line
        config = '\n'.join(config.splitlines()[1:-1])
        self.assertEqual(
            config, """\
shared-network "net" {
    subnet 127.0.0.0 netmask 255.255.255.0 {
ziew
    }
}

host 127.0.0.1 { fixed-address 127.0.0.1; hardware ethernet DE:AD:BE:EF:CA:FE; }"""
        )
    def test_network_config_entry(self):
        dc = DataCenter(name='dc1')
        dc.save()
        net = Network(
            name='net',
            address='127.0.0.0/24',
            data_center=dc,
            dhcp_config='ziew',
        )
        net.save()
        entry = DHCPEntry(ip='127.0.0.1', mac='deadbeefcafe')
        entry.save()
        config = generate_dhcp_config(dc=dc, with_networks=True)
        # remove first line with the date and last line
        config = '\n'.join(config.splitlines()[1:-1])
        self.assertEqual(
            config,
            """\
shared-network "net" {
    subnet 127.0.0.0 netmask 255.255.255.0 {
ziew
    }
}

host 127.0.0.1 { fixed-address 127.0.0.1; hardware ethernet DE:AD:BE:EF:CA:FE; }"""
        )
Exemple #3
0
 def test_datacenter_entry(self):
     dc = DataCenter(name="dc1")
     dc.save()
     net = Network(name="net", address="127.0.0.0/24", data_center=dc)
     net.save()
     entry = DHCPEntry(ip="127.0.0.1", mac="deadbeefcafe")
     entry.save()
     config = generate_dhcp_config(dc=dc)
     # remove first line with the date and last line
     config = "\n".join(config.splitlines()[1:-1])
     self.assertEqual(config, "host 127.0.0.1 { fixed-address 127.0.0.1; " "hardware ethernet DE:AD:BE:EF:CA:FE; }")
Exemple #4
0
 def test_validate_ip_address(self):
     dc = DataCenter(name='dc')
     dc.save()
     net = Network(name='wroom', address='127.0.0.1/24', data_center=dc)
     net.save()
     _validate_ip_address('127.0.0.1', net, [], 0)
     with self.assertRaises(forms.ValidationError):
         _validate_ip_address('127.0.0.1/24', net, [], 0)
     with self.assertRaises(forms.ValidationError):
         _validate_ip_address('127.1.0.1', net, [], 0)
     with self.assertRaises(forms.ValidationError):
         _validate_ip_address('127.0.0.1', net, ['127.0.0.1'], 0)
Exemple #5
0
 def test_other_datacenter_entry(self):
     dc = DataCenter(name="dc1")
     dc.save()
     dc2 = DataCenter(name="dc2")
     dc2.save()
     net = Network(name="net", address="127.0.0.0/24", data_center=dc)
     net.save()
     entry = DHCPEntry(ip="127.0.0.1", mac="deadbeefcafe")
     entry.save()
     config = generate_dhcp_config(dc=dc2)
     # remove first line with the date and last line
     config = "\n".join(config.splitlines()[1:-1])
     self.assertEqual(config, "")
Exemple #6
0
 def test_datacenter_entry(self):
     dc = DataCenter(name='dc1')
     dc.save()
     net = Network(name='net', address='127.0.0.0/24', data_center=dc)
     net.save()
     entry = DHCPEntry(ip='127.0.0.1', mac='deadbeefcafe')
     entry.save()
     config = generate_dhcp_config(dc=dc)
     # remove first line with the date and last line
     config = '\n'.join(config.splitlines()[1:-1])
     self.assertEqual(
         config, 'host 127.0.0.1 { fixed-address 127.0.0.1; '
         'hardware ethernet DE:AD:BE:EF:CA:FE; }')
 def test_datacenter_entry(self):
     dc = DataCenter(name='dc1')
     dc.save()
     net = Network(name='net', address='127.0.0.0/24', data_center=dc)
     net.save()
     entry = DHCPEntry(ip='127.0.0.1', mac='deadbeefcafe')
     entry.save()
     config = generate_dhcp_config(dc=dc)
     # remove first line with the date and last line
     config = '\n'.join(config.splitlines()[1:-1])
     self.assertEqual(
         config,
         'host 127.0.0.1 { fixed-address 127.0.0.1; '
         'hardware ethernet DE:AD:BE:EF:CA:FE; }'
     )
Exemple #8
0
def _connect_dc(ip_address, device):
    try:
        network = Network.from_ip(ip_address)
    except IndexError:
        dc_no = None
        rack = None
    else:
        dc_no = network.data_center.name if network.data_center else None
        rack = None
        for rack in network.racks.all()[:1]:
            break
    dc = _make_dc(dc_no)
    if rack:
        device.parent = rack
    elif device.parent is None:
        device.parent = rack or dc
    else:
        return  # Already has better info...
    stack = [device]
    while stack:
        device = stack.pop()
        for child in device.child_set.all():
            stack.append(child)
        if rack:
            device.rack = rack.sn if rack.sn else None
        if dc_no:
            device.dc = dc_no
        device.save()
Exemple #9
0
def scan_address(address, plugins):
    """Queue manual discovery on the specified address."""

    try:
        network = Network.from_ip(address)
    except IndexError:
        raise NoQueueError(
            "Address {0} doesn't belong to any configured "
            "network.".format(address),
        )
    if not network.queue:
        raise NoQueueError(
            "The network {0} has no discovery queue.".format(network),
        )
    ipaddress, created = IPAddress.objects.get_or_create(address=address)
    queue_name = network.queue.name
    queue = django_rq.get_queue(queue_name)
    job = queue.enqueue_call(
        func=_scan_address,
        args=(
            address,
            plugins,
        ),
        kwargs={
            'snmp_community': ipaddress.snmp_community,
#            'snmp_version': ipaddress.snmp_version,
            'snmp_version': '2c',
            'http_family': ipaddress.http_family,
            'snmp_name': ipaddress.snmp_name,
        },
        timeout=60,
        result_ttl=3600,
    )
    return job
Exemple #10
0
def _connect_dc(ip, dev):
    try:
        network = Network.from_ip(ip)
    except IndexError:
        dc_no = None
        rack = None
    else:
        dc_no = network.data_center.name if network.data_center else None
        rack = None
        for rack in network.racks.all()[:1]:
            break

    dc = _make_dc(dc_no)
    if rack:
        dev.parent = rack
    elif dev.parent is None:
        dev.parent = rack or dc
    else:
        return 'Already has better info.'

    stack = [dev]
    while stack:
        dev = stack.pop()
        for child in dev.child_set.all():
            stack.append(child)
        if rack:
            dev.rack = rack.sn if rack.sn else None
        if dc_no:
            dev.dc = dc_no
        dev.save()
    return '%s %s' % (dc_no, rack.name if rack else '?')
Exemple #11
0
def _connect_dc(ip_address, device):
    try:
        network = Network.from_ip(ip_address)
    except IndexError:
        dc_no = None
        rack = None
    else:
        dc_no = network.data_center.name if network.data_center else None
        rack = None
        for rack in network.racks.all()[:1]:
            break
    dc = _make_dc(dc_no)
    if rack:
        device.parent = rack
    elif device.parent is None:
        device.parent = rack or dc
    else:
        return  # Already has better info...
    stack = [device]
    while stack:
        device = stack.pop()
        for child in device.child_set.all():
            stack.append(child)
        if rack:
            device.rack = rack.sn if rack.sn else None
        if dc_no:
            device.dc = dc_no
        device.save()
 def test_other_datacenter_entry(self):
     dc = DataCenter(name='dc1')
     dc.save()
     dc2 = DataCenter(name='dc2')
     dc2.save()
     net = Network(name='net', address='127.0.0.0/24', data_center=dc)
     net.save()
     entry = DHCPEntry(ip='127.0.0.1', mac='deadbeefcafe')
     entry.save()
     config = generate_dhcp_config(dc=dc2)
     # remove first line with the date and last line
     config = '\n'.join(config.splitlines()[1:-1])
     self.assertEqual(
         config,
         '',
     )
Exemple #13
0
def _connect_dc(ip, dev):
    try:
        network = Network.from_ip(ip)
        dc_no = network.data_center.name if network.data_center else None
        if network.rack:
            rack_no = network.rack
            if ',' in rack_no:
                rack_no = rack_no.split(',', 1)[0].strip()
        else:
            rack_no = None
    except IndexError:
        dc_no = None
        rack_no = None
    dc, rack = _make_dc_rack(dc_no, rack_no)
    if rack:
        dev.parent = rack
    elif dev.parent == None:
        dev.parent = rack or dc
    else:
        return 'Already has better info.'

    stack = [dev]
    while stack:
        dev = stack.pop()
        for child in dev.child_set.all():
            stack.append(child)
        if rack:
            dev.rack = rack.name
        if dc_no:
            dev.dc = dc_no
        dev.save()
    return '%s %s' % (dc_no, rack.name if rack else '?')
Exemple #14
0
def scan_address(address, plugins):
    """Queue manual discovery on the specified address."""

    try:
        network = Network.from_ip(address)
    except IndexError:
        raise NoQueueError(
            "Address {0} doesn't belong to any configured "
            "network.".format(address), )
    if not network.queue:
        raise NoQueueError(
            "The network {0} has no discovery queue.".format(network), )
    ipaddress, created = IPAddress.objects.get_or_create(address=address)
    queue_name = network.queue.name
    queue = django_rq.get_queue(queue_name)
    job = queue.enqueue_call(
        func=_scan_address,
        args=(
            address,
            plugins,
        ),
        kwargs={
            'snmp_community': ipaddress.snmp_community,
            'snmp_version': ipaddress.snmp_version,
            'http_family': ipaddress.http_family,
            'snmp_name': ipaddress.snmp_name,
        },
        timeout=60,
        result_ttl=3600,
    )
    return job
Exemple #15
0
 def test_validate_network_name(self):
     with self.assertRaises(forms.ValidationError):
         _validate_network_name('wroom', 0)
     dc = DataCenter(name='dc')
     dc.save()
     Network(name='wroom', address='127.0.0.1/24', data_center=dc).save()
     _validate_network_name('wroom', 0)
 def test_validate_ip_address(self):
     dc = DataCenter(name='dc')
     dc.save()
     net = Network(
         name='wroom',
         address='127.0.0.1/24',
         data_center=dc
     )
     net.save()
     _validate_ip_address('127.0.0.1', net, [], 0)
     with self.assertRaises(forms.ValidationError):
         _validate_ip_address('127.0.0.1/24', net, [], 0)
     with self.assertRaises(forms.ValidationError):
         _validate_ip_address('127.1.0.1', net, [], 0)
     with self.assertRaises(forms.ValidationError):
         _validate_ip_address('127.0.0.1', net, ['127.0.0.1'], 0)
Exemple #17
0
 def test_other_datacenter_entry(self):
     dc = DataCenter(name='dc1')
     dc.save()
     dc2 = DataCenter(name='dc2')
     dc2.save()
     net = Network(name='net', address='127.0.0.0/24', data_center=dc)
     net.save()
     entry = DHCPEntry(ip='127.0.0.1', mac='deadbeefcafe')
     entry.save()
     config = generate_dhcp_config(dc=dc2)
     # remove first line with the date and last line
     config = '\n'.join(config.splitlines()[1:-1])
     self.assertEqual(
         config,
         '',
     )
Exemple #18
0
def _connect_dc(ip, dev):
    try:
        network = Network.from_ip(ip)
    except IndexError:
        dc_no = None
        rack = None
    else:
        dc_no = network.data_center.name if network.data_center else None
        rack = None
        for rack in network.racks.all()[:1]:
            break

    dc = _make_dc(dc_no)
    if rack:
        dev.parent = rack
    elif dev.parent is None:
        dev.parent = rack or dc
    else:
        return 'Already has better info.'

    stack = [dev]
    while stack:
        dev = stack.pop()
        for child in dev.child_set.all():
            stack.append(child)
        if rack:
            dev.rack = rack.sn if rack.sn else None
        if dc_no:
            dev.dc = dc_no
        dev.save()
    return '%s %s' % (dc_no, rack.name if rack else '?')
    def setUp(self):
        self.dc = DataCenter(name="test_dc")
        self.dc.save()
        self.net1 = Network(
            name="test1",
            data_center=self.dc,
            address="192.168.0.1/16",
        )
        self.net1.save()
        self.net2 = Network(
            name="test2",
            data_center=self.dc,
            address="192.168.0.1/17",
        )
        self.net2.save()
        self.net3 = Network(
            name="test3",
            data_center=self.dc,
            address="192.168.128.1/17",
            reserved=5,
            reserved_top_margin=5,
        )
        self.net3.save()
        self.net4 = Network(
            name="test4",
            data_center=self.dc,
            address="192.168.133.1/24",
        )
        self.net4.save()
        self.net5 = Network(
            name="test5",
            data_center=self.dc,
            address="192.169.133.1/24",
        )
        self.net5.save()

        self.ip1 = IPAddress(address="192.168.128.10")
        self.ip1.save()
        self.ip2 = IPAddress(address="192.168.133.10")
        self.ip2.save()
        self.ip3 = IPAddress(address="192.168.128.11")
        self.ip3.save()
Exemple #20
0
    def setUp(self):
        self.dc = DataCenter(name="test_dc")
        self.dc.save()
        self.net1 = Network(
            name="test1",
            data_center=self.dc,
            address="192.168.0.1/16",
        )
        self.net1.save()
        self.net2 = Network(
            name="test2",
            data_center=self.dc,
            address="192.168.0.1/17",
        )
        self.net2.save()
        self.net3 = Network(
            name="test3",
            data_center=self.dc,
            address="192.168.128.1/17",
            reserved=5,
            reserved_top_margin=5,
        )
        self.net3.save()
        self.net4 = Network(
            name="test4",
            data_center=self.dc,
            address="192.168.133.1/24",
        )
        self.net4.save()
        self.net5 = Network(
            name="test5",
            data_center=self.dc,
            address="192.169.133.1/24",
        )
        self.net5.save()

        self.ip1 = IPAddress(address="192.168.128.10")
        self.ip1.save()
        self.ip2 = IPAddress(address="192.168.133.10")
        self.ip2.save()
        self.ip3 = IPAddress(address="192.168.128.11")
        self.ip3.save()
Exemple #21
0
 def step2_initial(self):
     addresses = [
         [ip.address for ip in self.form._get_address_candidates(a)]
         for a in self.form.cleaned_data['addresses'].split()
     ]
     for a in addresses:
         yield {
             'address': a[0],
             'network': Network.from_ip(a[0]).id,
             'candidates': a,
         }
Exemple #22
0
def autoscan_address(address):
    """Queues a scan of a single address on the right worker."""

    try:
        network = Network.from_ip(address)
    except IndexError:
        raise NoQueueError("Address {0} doesn't belong to any configured " "network.".format(address))
    if not network.queue:
        raise NoQueueError("The network {0} has no discovery queue.".format(network))
    queue_name = network.queue.name
    queue = django_rq.get_queue(queue_name)
    queue.enqueue_call(func=_autoscan_group, args=([address],), timeout=60, result_ttl=0)
Exemple #23
0
 def route_for_task(self, task, args=None, kwargs=None):
     if task != "ralph.discovery.tasks.discover_single":
         return "celery"
     try:
         queue = args[0]["queue"]
     except KeyError:
         try:
             net = Network.from_ip(args[0]["ip"])
             queue = net.queue or net.data_center.name
         except (IndexError, KeyError):
             queue = "celery"
         args[0]["queue"] = queue
     return queue
Exemple #24
0
def _find_network_ip(network_name, reserved_ip_addresses, device=None):
    """Find the network and IP address to be used for deployment.
    If ``device`` is specified, re-use an IP of that device that matches
    the specified network. If no network is specified, any IP matches.
    If no suitable network is found, ``Network.DoesNotExist`` is raised.
    If no suitable IP address is found, "" is returned for the IP.
    Never uses an IP that is in ``reserved_ip_addresses``. When an IP is
    found, it is added to ``reserved_ip_addresses``.
    """
    if network_name:
        network = Network.objects.get(name=network_name)
        if device:
            for ipaddress in device.ipaddress_set.filter(
                    is_management=False,
                    network=network,
            ).order_by('hostname', 'address'):
                ip = ipaddress.address
                if ip in reserved_ip_addresses:
                    continue
                reserved_ip_addresses.append(ip)
                return network, ip
        ip = get_first_free_ip(network.name, reserved_ip_addresses) or ''
        if ip:
            reserved_ip_addresses.append(ip)
        return network, ip
    if device:
        for ipaddress in device.ipaddress_set.filter(
                is_management=False, ).order_by('hostname', 'address'):
            ip = ipaddress.address
            if ip in reserved_ip_addresses:
                continue
            try:
                network = Network.from_ip(ip)
            except IndexError:
                continue
            reserved_ip_addresses.append(ip)
            return network, ip
    raise Network.DoesNotExist("No default network for this device")
Exemple #25
0
def set_queue(context):
    """Route the discovery tasks to the right data center for them.
    Use the default queue if no network matches the IP address.
    """
    try:
        queue = context['queue']
    except KeyError:
        try:
            net = Network.from_ip(context['ip'])
        except KeyError:
            queue = 'default'
        else:
            queue = net.queue.name if net.queue else 'default'
        context['queue'] = queue
Exemple #26
0
def set_queue(context):
    """Route the discovery tasks to the right data center for them.
    Use the default queue if no network matches the IP address.
    """
    try:
        queue = context['queue']
    except KeyError:
        try:
            net = Network.from_ip(context['ip'])
        except KeyError:
            queue = 'default'
        else:
            queue = net.queue.name if net.queue else 'default'
        context['queue'] = queue
Exemple #27
0
 def route_for_task(self, task, args=None, kwargs=None):
     if task == 'ralph.discovery.tasks.run_chain':
         return args[1] or 'celery'
     if task != 'ralph.discovery.tasks.discover_single':
         return 'celery'
     try:
         queue = args[0]['queue']
     except KeyError:
         try:
             net = Network.from_ip(args[0]['ip'])
             queue = net.queue.name or net.data_center.name
         except (IndexError, KeyError):
             queue = 'celery'
         args[0]['queue'] = queue
     return queue
Exemple #28
0
 def route_for_task(self, task, args=None, kwargs=None):
     if task == 'ralph.discovery.tasks.run_chain':
         return args[1] or 'celery'
     if task != 'ralph.discovery.tasks.discover_single':
         return 'celery'
     try:
         queue = args[0]['queue']
     except KeyError:
         try:
             net = Network.from_ip(args[0]['ip'])
             queue = net.queue.name or net.data_center.name
         except (IndexError, KeyError):
             queue = 'celery'
         args[0]['queue'] = queue
     return queue
Exemple #29
0
def scan_address(
    ip_address, plugins, queue_name=None, automerge=AUTOMERGE_MODE,
    called_from_ui=False,
):
    """Queue scan on the specified address."""

    if not queue_name:
        try:
            network = Network.from_ip(ip_address)
        except IndexError:
            raise NoQueueError(
                "Address {0} doesn't belong to any configured "
                "network.".format(ip_address),
            )
        else:
            if network.environment and network.environment.queue:
                queue_name = network.environment.queue.name
            else:
                raise NoQueueError(
                    "The IP address {0} has no discovery queue. "
                    "Set the queue in the environments admin panel.".format(
                        ip_address,
                    ),
                )
    if all((
        called_from_ui,
        '%s_%s' % (UI_CALLS_QUEUE_PREFIX, queue_name) in RQ_QUEUES_LIST
    )):
        queue_name = '%s_%s' % (UI_CALLS_QUEUE_PREFIX, queue_name)
    queue = django_rq.get_queue(queue_name)
    job = queue.enqueue_call(
        func=scan_address_job,
        args=(
            ip_address,
            plugins,
        ),
        kwargs={
            'automerge': automerge,
        },
        timeout=300,
        result_ttl=86400,
    )
    return job
Exemple #30
0
def autoscan_address(address):
    """Queues a scan of a single address on the right worker."""

    try:
        network = Network.from_ip(address)
    except IndexError:
        raise NoQueueError(
            "Address {0} doesn't belong to any configured "
            "network.".format(address), )
    if not network.queue:
        raise NoQueueError(
            "The network {0} has no discovery queue.".format(network), )
    queue_name = network.queue.name
    queue = django_rq.get_queue(queue_name)
    queue.enqueue_call(
        func=_autoscan_group,
        args=([address], ),
        timeout=60,
        result_ttl=0,
    )
Exemple #31
0
def discover_address(address, requirements=None, interactive=True, queue=None):
    if queue is None:
        try:
            net = Network.from_ip(address)
        except IndexError:
            raise NoQueueError(
                "Address {0} doesn't belong to any configured "
                "network.".format(address),
            )
        if not net.queue:
            raise NoQueueError(
                "The network {0} has no discovery queue.".format(net),
            )
        queue = net.queue.name
    run_next_plugin(
        {'ip': address, 'queue': queue},
        ('discovery', 'postprocess'),
        requirements=requirements,
        interactive=interactive,
    )
Exemple #32
0
def discover_address(address, requirements=None, interactive=True, queue=None):
    if queue is None:
        try:
            net = Network.from_ip(address)
        except IndexError:
            raise NoQueueError(
                "Address {0} doesn't belong to any configured "
                "network.".format(address), )
        if not net.queue:
            raise NoQueueError(
                "The network {0} has no discovery queue.".format(net), )
        queue = net.queue.name
    run_next_plugin(
        {
            'ip': address,
            'queue': queue
        },
        ('discovery', 'postprocess'),
        requirements=requirements,
        interactive=interactive,
    )
Exemple #33
0
def _find_network_ip(network_name, reserved_ip_addresses, device=None):
    """Find the network and IP address to be used for deployment.
    If ``device`` is specified, re-use an IP of that device that matches
    the specified network. If no network is specified, any IP matches.
    If no suitable network is found, ``Network.DoesNotExist`` is raised.
    If no suitable IP address is found, "" is returned for the IP.
    Never uses an IP that is in ``reserved_ip_addresses``. When an IP is
    found, it is added to ``reserved_ip_addresses``.
    """
    if network_name:
        network = Network.objects.get(name=network_name)
        if device:
            for ipaddress in device.ipaddress_set.filter(
                is_management=False,
                network=network,
            ).order_by('hostname', 'address'):
                ip = ipaddress.address
                if ip in reserved_ip_addresses:
                    continue
                reserved_ip_addresses.append(ip)
                return network, ip
        ip = get_first_free_ip(network.name, reserved_ip_addresses) or ''
        if ip:
            reserved_ip_addresses.append(ip)
        return network, ip
    if device:
        for ipaddress in device.ipaddress_set.filter(
            is_management=False,
        ).order_by('hostname', 'address'):
            ip = ipaddress.address
            if ip in reserved_ip_addresses:
                continue
            try:
                network = Network.from_ip(ip)
            except IndexError:
                continue
            reserved_ip_addresses.append(ip)
            return network, ip
    raise Network.DoesNotExist("No default network for this device")
Exemple #34
0
def _generate_entries(filter_ips, dc):
    for macaddr, in DHCPEntry.objects.values_list('mac').distinct():
        ips = list(
            filter_ips(ip for (ip, ) in DHCPEntry.objects.filter(
                mac=macaddr).values_list('ip')))
        if not ips:
            continue
        if Deployment.objects.filter(mac=macaddr).exists():
            data_center = dc
            if not data_center:
                for net in Network.all_from_ip(ips[0]):
                    data_center = net.data_center
                    if data_center:
                        break
            if data_center:
                next_server = data_center.next_server
        else:
            next_server = ''
        name = _get_first_rev(ips)
        address = ', '.join(ips)
        mac = ':'.join('%s%s' % c
                       for c in zip(macaddr[::2], macaddr[1::2])).upper()
        yield name, address, mac, next_server
Exemple #35
0
def _generate_entries(filter_ips, dc):
    for macaddr, in DHCPEntry.objects.values_list('mac').distinct():
        ips = list(filter_ips(
            ip for (ip,) in
            DHCPEntry.objects.filter(mac=macaddr).values_list('ip')
        ))
        if not ips:
            continue
        if Deployment.objects.filter(mac=macaddr).exists():
            data_center = dc
            if not data_center:
                for net in Network.all_from_ip(ips[0]):
                    data_center = net.data_center
                    if data_center:
                        break
            if data_center:
                next_server = data_center.next_server
        else:
            next_server = ''
        name = _get_first_rev(ips)
        address = ', '.join(ips)
        mac = ':'.join('%s%s' % c for c in zip(macaddr[::2],
                                                macaddr[1::2])).upper()
        yield name, address, mac, next_server
class ModelsNetworkTest(TestCase):
    def setUp(self):
        self.dc = DataCenter(name="test_dc")
        self.dc.save()
        self.net1 = Network(
            name="test1",
            data_center=self.dc,
            address="192.168.0.1/16",
        )
        self.net1.save()
        self.net2 = Network(
            name="test2",
            data_center=self.dc,
            address="192.168.0.1/17",
        )
        self.net2.save()
        self.net3 = Network(
            name="test3",
            data_center=self.dc,
            address="192.168.128.1/17",
            reserved=5,
            reserved_top_margin=5,
        )
        self.net3.save()
        self.net4 = Network(
            name="test4",
            data_center=self.dc,
            address="192.168.133.1/24",
        )
        self.net4.save()
        self.net5 = Network(
            name="test5",
            data_center=self.dc,
            address="192.169.133.1/24",
        )
        self.net5.save()

        self.ip1 = IPAddress(address="192.168.128.10")
        self.ip1.save()
        self.ip2 = IPAddress(address="192.168.133.10")
        self.ip2.save()
        self.ip3 = IPAddress(address="192.168.128.11")
        self.ip3.save()

    def test_get_netmask(self):
        self.assertEquals(self.net1.get_netmask(), 16)
        self.assertEquals(self.net2.get_netmask(), 17)

    def test_get_subnetworks(self):
        res = self.net1.get_subnetworks()
        correct = [self.net2, self.net3]
        self.assertEquals(res, correct)

        res = self.net3.get_subnetworks()
        correct = [self.net4]
        self.assertEquals(res, correct)

    def test_get_address_summary(self):
        ret = self.net3.get_total_ips()
        self.assertEquals(ret, 32767)
        ret = self.net3.get_free_ips()
        self.assertEquals(ret, 32500)
        ret = self.net3.get_ip_usage_range()
        correct_range = [self.ip1, self.ip3, self.net4]
        self.assertEquals(ret, correct_range)

    def test_get_ip_usage_aggegated(self):
        ret = self.net3.get_ip_usage_aggegated()
        correct = [
            {
                'amount': 10,
                'range_end': '192.168.128.9',
                'range_start': '192.168.128.0',
                'type': 'free',
            },
            {
                'amount': 2,
                'range_end': '192.168.128.11',
                'range_start': '192.168.128.10',
                'type': 'addr',
            },
            {
                'amount': 1268,
                'range_end': '192.168.132.255',
                'range_start': '192.168.128.12',
                'type': 'free',
            },
            {
                'amount': 256,
                'range_end': '192.168.133.255',
                'range_start': '192.168.133.0',
                'type': self.net4,
            },
            {
                'amount': 31232,
                'range_end': '192.168.255.255',
                'range_start': '192.168.134.0',
                'type': 'free',
            },
        ]
        self.assertEquals(ret, correct)

    def test_get_network_tree(self):
        res = get_network_tree()
        correct = [{
            'network':
            self.net1,
            'subnetworks': [
                {
                    'network': self.net2,
                    'subnetworks': [],
                },
                {
                    'network': self.net3,
                    'subnetworks': [{
                        'network': self.net4,
                        'subnetworks': [],
                    }]
                },
            ]
        }, {
            'network': self.net5,
            'subnetworks': [],
        }]
        self.assertEquals(res, correct)

    def test_ip_is_public_or_no(self):
        ip_list = [
            ('92.143.123.123', True),
            ('10.168.123.123', False),
        ]
        for ip, is_public in ip_list:
            new_ip_address = IPAddress(address=ip)
            new_ip_address.save()
            self.assertEquals(new_ip_address.is_public, is_public)
Exemple #37
0
class ModelsNetworkTest(TestCase):

    def setUp(self):
        self.dc = DataCenter(name="test_dc")
        self.dc.save()
        self.net1 = Network(
            name="test1",
            data_center=self.dc,
            address="192.168.0.1/16",
        )
        self.net1.save()
        self.net2 = Network(
            name="test2",
            data_center=self.dc,
            address="192.168.0.1/17",
        )
        self.net2.save()
        self.net3 = Network(
            name="test3",
            data_center=self.dc,
            address="192.168.128.1/17",
            reserved=5,
            reserved_top_margin=5,
        )
        self.net3.save()
        self.net4 = Network(
            name="test4",
            data_center=self.dc,
            address="192.168.133.1/24",
        )
        self.net4.save()
        self.net5 = Network(
            name="test5",
            data_center=self.dc,
            address="192.169.133.1/24",
        )
        self.net5.save()

        self.ip1 = IPAddress(address="192.168.128.10")
        self.ip1.save()
        self.ip2 = IPAddress(address="192.168.133.10")
        self.ip2.save()
        self.ip3 = IPAddress(address="192.168.128.11")
        self.ip3.save()

    def test_get_netmask(self):
        self.assertEquals(self.net1.get_netmask(), 16)
        self.assertEquals(self.net2.get_netmask(), 17)

    def test_get_subnetworks(self):
        res = self.net1.get_subnetworks()
        correct = [self.net2, self.net3]
        self.assertEquals(res, correct)

        res = self.net3.get_subnetworks()
        correct = [self.net4]
        self.assertEquals(res, correct)

    def test_get_address_summary(self):
        ret = self.net3.get_total_ips()
        self.assertEquals(ret, 32767)
        ret = self.net3.get_free_ips()
        self.assertEquals(ret, 32500)
        ret = self.net3.get_ip_usage_range()
        correct_range = [self.ip1, self.ip3, self.net4]
        self.assertEquals(ret, correct_range)

    def test_get_ip_usage_aggegated(self):
        ret = self.net3.get_ip_usage_aggegated()
        correct = [
            {
                'amount': 10,
                'range_end': '192.168.128.9',
                'range_start': '192.168.128.0',
                'type': 'free',
            },
            {
                'amount': 2,
                'range_end': '192.168.128.11',
                'range_start': '192.168.128.10',
                'type': 'addr',
            },
            {
                'amount': 1268,
                'range_end': '192.168.132.255',
                'range_start': '192.168.128.12',
                'type': 'free',
            },
            {
                'amount': 256,
                'range_end': '192.168.133.255',
                'range_start': '192.168.133.0',
                'type': self.net4,
            },
            {
                'amount': 31232,
                'range_end': '192.168.255.255',
                'range_start': '192.168.134.0',
                'type': 'free',
            },
        ]
        self.assertEquals(ret, correct)

    def test_get_network_tree(self):
        res = get_network_tree()
        correct = [
            {
                'network': self.net1,
                'subnetworks': [
                    {
                        'network': self.net2,
                        'subnetworks': [],
                    },
                    {
                        'network': self.net3,
                        'subnetworks': [
                            {
                                'network': self.net4,
                                'subnetworks': [],
                            }
                        ]
                    },
                ]
            },
            {
                'network': self.net5,
                'subnetworks': [],
            }
        ]
        self.assertEquals(res, correct)

    def test_ip_is_public_or_no(self):
        ip_list = [
            ('92.143.123.123', True),
            ('10.168.123.123', False),
        ]
        for ip, is_public in ip_list:
            new_ip_address = IPAddress(address=ip)
            new_ip_address.save()
            self.assertEquals(new_ip_address.is_public, is_public)