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_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_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)
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, "")
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; }' )
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 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
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 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, '', )
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 '?')
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
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)
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 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, }
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)
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
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")
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
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
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
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, )
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, )
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, )
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
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)
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)