Пример #1
0
def get_vm_snapshots(request, vm):
    """
    Return list of all snapshots and counts.
    """
    user_order_by, order_by = get_order_by(request,
                                           api_view=VmSnapshotList,
                                           db_default=('-id', ),
                                           user_default=('-created', ))
    snapshots = get_pager(request,
                          Snapshot.objects.select_related(
                              'vm',
                              'define').filter(vm=vm).order_by(*order_by),
                          per_page=50)

    return {
        'order_by':
        user_order_by,
        'pager':
        snapshots,
        'snapshots':
        snapshots,
        'snapshots_count':
        snapshots.paginator.count,
        'snapshots_count_manual':
        Snapshot.objects.filter(
            vm=vm, type=Snapshot.MANUAL).count(),  # TODO: check indexes
        'snapshots_count_auto':
        Snapshot.objects.filter(vm=vm, type=Snapshot.AUTO).count(),
    }
Пример #2
0
def dc_subnet_ip_list(request, network, netmask, vlan_id):
    context = collect_view_data(request, 'dc_network_list')
    context['is_staff'] = request.user.is_staff

    try:
        context['ip_network'] = ip_network = Subnet.get_ip_network(network, netmask)  # Invalid IPv4 network
        context['vlan_id'] = int(vlan_id)
    except ValueError:
        raise Http404

    network, netmask = ip_network.with_netmask.split('/')
    context['netinfo'] = Subnet.get_ip_network_hostinfo(ip_network)
    nets = Subnet.objects.filter(network=network, netmask=netmask, vlan_id=vlan_id)
    context['num_networks'] = num_networks = nets.count()

    if not num_networks:
        raise Http404  # Invalid user input - made-up IPv4network

    context['order_by'], order_by = get_order_by(request, api_view=NetworkIPPlanView)
    ips = IPAddress.objects.select_related('vm', 'vm__dc', 'subnet')\
                           .prefetch_related('vms')\
                           .filter(subnet__in=nets)\
                           .order_by(*order_by).distinct()
    context['ips'] = context['pager'] = pager = get_pager(request, ips, per_page=50)
    context['total'] = pager.paginator.count
    context['free'] = ips.filter(usage=IPAddress.VM, vm__isnull=True, vms=None).count()

    return render(request, 'gui/dc/subnet_ip_list.html', context)
Пример #3
0
def dc_domain_record_list(request):
    """
    List/filter DNS records for a DNS domain (domain parameter in querystring).
    """
    context = collect_view_data(request, 'dc_domain_list', dc_dns_only=True)
    context['is_staff'] = is_staff = request.user.is_staff
    qs = request.GET.copy()
    name = qs.get('flt-domain', None)
    context['all'] = _all = is_staff and request.GET.get(
        'all', request.GET.get('flt-all', False))
    qs['flt-all'] = '1' if _all else ''

    if not name:
        raise PermissionDenied

    context['domain'] = domain = get_domain(request, name)
    context['filters'] = filter_form = DnsRecordFilterForm(request,
                                                           qs,
                                                           _all=_all,
                                                           prefix='flt')
    context['qs'] = qs.urlencode()
    context['order_by'], order_by = get_order_by(request,
                                                 api_view=RecordView,
                                                 db_default=('-id', ),
                                                 user_default=('-id', ))
    records = domain.record_set.order_by(*order_by)

    if filter_form.is_valid() and filter_form.has_changed():
        q = filter_form.get_filters()

        if q:
            records = records.filter(q)

    context['records'] = context['pager'] = get_pager(request,
                                                      records,
                                                      per_page=50)
    context['form_record'] = DnsRecordForm(request,
                                           domain,
                                           None,
                                           initial={
                                               'prio': Record.PRIO,
                                               'ttl': Record.TTL,
                                               'type': Record.A,
                                               'id': 0,
                                               'disabled': False,
                                               'name': '.%s' % domain.name
                                           })
    context['form_records'] = MultiDnsRecordForm(request, domain, None)
    context['url_form_record'] = reverse('domain_record_form',
                                         name,
                                         query_string=qs)

    return render(request, 'gui/dc/domain_record_list.html', context)
Пример #4
0
def get_vm_backups(request, vm):
    """
    Return QuerySet of all VM backups.
    """
    user_order_by, order_by = get_order_by(request, api_view=VmBackupList,
                                           db_default=('-id',), user_default=('-created',))
    bkps = get_pager(request, Backup.objects.select_related('node', 'vm', 'define').filter(vm=vm).order_by(*order_by),
                     per_page=50)

    return {
        'order_by': user_order_by,
        'pager': bkps,
        'backups': bkps,
        'backups_count': bkps.paginator.count,
    }
Пример #5
0
def get_node_backups(request, queryset):
    """
    Return dict with backups attribute.
    """
    user_order_by, order_by = get_order_by(request,
                                           api_view=VmBackupList,
                                           db_default=('-id', ),
                                           user_default=('-created', ))
    bkps = get_pager(request, queryset.order_by(*order_by), per_page=50)

    return {
        'order_by':
        user_order_by,
        'pager':
        bkps,
        'backups':
        bkps,
        'backups_count':
        bkps.paginator.count,
        'backups_size':
        queryset.exclude(size__isnull=True).aggregate(
            Sum('size')).get('size__sum'),
    }
Пример #6
0
def get_tasklog(request,
                context,
                form_cls=BaseTaskLogFilterForm,
                base_query=None,
                **kwargs):
    """
    Task log with filters.
    """
    context['filters'] = form = form_cls(request.GET.copy())

    if form.is_valid() and form.has_changed():
        q = form.get_filters(pending_tasks=context['pending_tasks'])

        if base_query:
            q = base_query & q
    else:
        q = base_query

    context['order_by'], order_by = get_order_by(request,
                                                 api_view=TaskLogView,
                                                 db_default=('-time', ),
                                                 user_default=('-time', ))

    return _get_tasklog(request, q=q, order_by=order_by, **kwargs)
Пример #7
0
def dc_network_ip_list(request, name):
    """
    List IP addresses in network.
    DC admin can only see server IP addresses of VMs used in current DC.
    SuperAdmin user is able to see all IP addresses, including not used and reserved for other devices.
    """
    context = collect_view_data(request, 'dc_network_list')
    context['is_staff'] = is_staff = request.user.is_staff
    net_filter = {'name': name}
    dc = request.dc

    if not is_staff:
        net_filter['dc'] = dc

    try:
        context['net'] = net = Subnet.objects.select_related('owner', 'dc_bound').get(**net_filter)
    except Subnet.DoesNotExist:
        raise Http404

    context['networks'] = Subnet.objects.filter(network=net.network, netmask=net.netmask, vlan_id=net.vlan_id).count()

    context['can_edit'] = can_edit = is_staff or (net.dc_bound and
                                                  request.user.has_permission(request, NetworkAdminPermission.name))
    context['all'] = _all = can_edit and request.GET.get('all', False)
    qs = get_query_string(request, all=_all, used=can_edit)
    qs['ips'] = 1
    context['qs'] = qs.urlencode()
    ips_used = Q(usage__in=[IPAddress.VM, IPAddress.VM_REAL])
    ips_vm = (Q(vm__isnull=False) | ~Q(vms=None))
    ips_vm_dc = (Q(vm__dc=dc) | Q(vms__dc=dc))

    if can_edit:
        if is_staff:
            ips_other = Q(usage__in=[IPAddress.OTHER, IPAddress.NODE])
        else:
            ips_other = Q(usage=IPAddress.OTHER)

        ips_node = Q(usage=IPAddress.NODE)
        ip_filter = [Q(subnet=net)]
        context['used'] = used = bool(request.GET.get('used', False))

        if _all:
            if used:
                ip_filter.append((ips_used & ips_vm) | ips_other)
            elif not is_staff:
                ip_filter.append(~ips_node)
        else:
            if used:
                ip_filter.append((ips_used & ips_vm & ips_vm_dc) | ips_other)
            else:
                ip_filter.append(ips_vm_dc)

        context['netinfo'] = netinfo = net.ip_network_hostinfo
        context['form_ip'] = NetworkIPForm(request, net, None, initial={'usage': IPAddress.VM, 'count': 1,
                                                                        'ip': netinfo['min']})
        context['form_ips'] = MultiNetworkIPForm(request, net, None)
        context['form_admin'] = AdminNetworkForm(request, None, prefix='adm', initial=net.web_data_admin)
        context['url_form_admin'] = reverse('admin_network_form', query_string=qs)
        context['url_form_ip'] = reverse('network_ip_form', name, query_string=qs)
        context['colspan'] = 8
        # Complex query according to user filter
        ip_filter = reduce(and_, ip_filter)

    else:
        context['colspan'] = 6
        # No manual filtering - we have to display only DC related objects and only VMs have a DC relationship
        ip_filter = Q(subnet=net) & ips_vm_dc & ips_used & ips_vm

    context['order_by'], order_by = get_order_by(request, api_view=NetworkIPView, db_default=('ip',))
    ips = IPAddress.objects.select_related('vm', 'vm__dc', 'subnet')\
                           .prefetch_related('vms')\
                           .filter(ip_filter)\
                           .order_by(*order_by).distinct()
    context['ips'] = context['pager'] = pager = get_pager(request, ips, per_page=50)
    context['free'] = net.ipaddress_set.filter(usage=IPAddress.VM, vm__isnull=True, vms=None).count()

    if can_edit:
        context['total'] = net.ipaddress_set.count()
    else:
        context['total'] = pager.paginator.count + context['free']

    return render(request, 'gui/dc/network_ip_list.html', context)