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) 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 _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 _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 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 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 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 _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")