Exemple #1
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 #2
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 #3
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 #4
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 #5
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 #6
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 #7
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 #8
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 #9
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 #10
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 #11
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 #12
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 #13
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 #14
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 #15
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 #16
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 #17
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 #18
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 #19
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 #20
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")