Beispiel #1
0
def dc_template_list(request):
    """
    VmTemplate<->Dc management.
    """
    user, dc = request.user, request.dc
    vmts = VmTemplate.objects.order_by('name')
    context = collect_view_data(request, 'dc_template_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(request, TemplateAdminPermission.name)
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get('deleted', False)
    context['qs'] = get_query_string(request, all=_all, deleted=_deleted).urlencode()

    if _deleted:
        vmts = vmts.exclude(access=VmTemplate.INTERNAL)
    else:
        vmts = vmts.exclude(access__in=VmTemplate.INVISIBLE)

    if _all:
        context['templates'] = vmts.select_related('owner', 'dc_bound').prefetch_related('dc').all()
    else:
        context['templates'] = vmts.select_related('owner', 'dc_bound').filter(dc=dc)

    if is_staff:
            context['form'] = TemplateForm(request, vmts)

            if _all:  # Uses set() because of optimized membership ("in") checking
                context['can_add'] = set(vmts.exclude(dc=dc).values_list('pk', flat=True))
            else:
                context['can_add'] = vmts.exclude(dc=dc).count()

    return render(request, 'gui/dc/template_list.html', context)
Beispiel #2
0
def dc_storage_list(request):
    """
    Storage management.
    """
    context = collect_view_data(request, 'dc_storage_list')
    context['can_edit'] = can_edit = request.user.is_staff  # DC owners have read-only rights
    context['all'] = _all = can_edit and request.GET.get('all', False)
    context['qs'] = get_query_string(request, all=_all).urlencode()
    nss = NodeStorage.objects.select_related(*SR).order_by(*OB)
    dc_nodes = dict([(dn.node.hostname, dn) for dn in DcNode.objects.select_related('node').filter(dc=request.dc)])

    if _all:
        context['storages'] = storages = nss.prefetch_related('dc')
        # Uses set() because of optimized membership ("in") checking
        context['dc_storages'] = set(nss.exclude(dc=request.dc).values_list('pk', flat=True))
    else:
        context['storages'] = storages = nss.filter(dc=request.dc)

    # Bug #chili-525
    for ns in storages:
        ns.set_dc_node(dc_nodes.get(ns.node.hostname, None))
        ns.set_dc(request.dc)

    if can_edit:
        context['form'] = form = StorageForm(request, storages)
        context['node_zpool'] = form.node_zpool
    else:
        context['node_zpool'] = {}

    return render(request, 'gui/dc/storage_list.html', context)
Beispiel #3
0
def dc_node_list(request):
    """
    Compute node <-> Datacenter associations.
    """
    context = collect_view_data(request,
                                'dc_node_list',
                                mb_addon=SIZE_FIELD_MB_ADDON)
    context[
        'can_edit'] = can_edit = request.user.is_staff  # DC owners have read-only rights
    context['all'] = _all = can_edit and request.GET.get('all', False)
    context['qs'] = get_query_string(request, all=_all).urlencode()
    context['dc_nodes'] = get_dc_nodes(request,
                                       prefetch_dc=_all,
                                       prefetch_vms_count=True)

    if can_edit:
        context['form'] = DcNodeForm(request,
                                     None,
                                     initial={
                                         'strategy': DcNode.SHARED,
                                         'priority': DcNode.PRIORITY
                                     })
        if _all:
            context['can_add'] = Node.objects.exclude(dc=request.dc)
        else:
            context['can_add'] = Node.objects.exclude(dc=request.dc).exists()

    return render(request, 'gui/dc/node_list.html', context)
Beispiel #4
0
def dc_domain_list(request):
    """
    DNS Domain/Record <-> Dc management.
    """
    user, dc = request.user, request.dc
    domains = Domain.objects.order_by('name')
    dc_domain_ids = list(
        request.dc.domaindc_set.values_list('domain_id', flat=True))
    context = collect_view_data(request, 'dc_domain_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(
        request, DnsAdminPermission.name)
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get(
        'deleted', False)
    qs = get_query_string(request, all=_all, deleted=_deleted)
    qs.pop('domain', None)
    context['qs'] = qs = qs.urlencode()

    if _deleted:
        domains = domains.exclude(access=Domain.INTERNAL)
    else:
        domains = domains.exclude(access__in=Domain.INVISIBLE)

    if can_edit:
        domains = domains.annotate(records=Count('record', distinct=True))

    if _all:
        context['domains'] = prefetch_domain_dcs(
            prefetch_domain_owner(domains))
    else:
        context['domains'] = prefetch_domain_owner(
            domains.filter(id__in=dc_domain_ids))

    if is_staff:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(
                Domain.objects.exclude(id__in=dc_domain_ids).values_list(
                    'id', flat=True))
        else:
            context['can_add'] = Domain.objects.exclude(
                id__in=dc_domain_ids).count()

        # Only SuperAdmins can create and edit domains
        context['form_dc'] = DcDomainForm(request, domains)
        context['form_admin'] = AdminDomainForm(request,
                                                None,
                                                prefix='adm',
                                                initial={
                                                    'owner': user.username,
                                                    'access': Domain.PRIVATE,
                                                    'dc_bound': not is_staff
                                                })
        context['url_form_dc'] = reverse('dc_domain_form', query_string=qs)
        context['url_form_admin'] = reverse('admin_domain_form',
                                            query_string=qs)

    return render(request, 'gui/dc/domain_list.html', context)
Beispiel #5
0
def dc_image_list(request):
    """
    Image<->Dc management + Image management.
    """
    user, dc = request.user, request.dc
    imgs = Image.objects.order_by('name')
    context = collect_view_data(request, 'dc_image_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(
        request, ImageAdminPermission.name)
    context['can_import'] = is_staff or (can_edit and user.has_permission(
        request, ImageImportAdminPermission.name))
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get(
        'deleted', False)
    context['qs'] = qs = get_query_string(request, all=_all,
                                          deleted=_deleted).urlencode()
    context['task_id'] = request.GET.get('task_id', '')
    context['image_vm'] = ImageVm.get_uuid()

    if _deleted:
        imgs = imgs.exclude(access=Image.INTERNAL)
    else:
        imgs = imgs.exclude(access__in=Image.INVISIBLE)

    if _all:
        context['images'] = imgs.select_related(
            'owner', 'dc_bound').prefetch_related('dc').all()
    else:
        context['images'] = imgs.select_related('owner',
                                                'dc_bound').filter(dc=dc)

    if is_staff:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(
                imgs.exclude(dc=dc).values_list('pk', flat=True))
        else:
            context['can_add'] = imgs.exclude(dc=dc).count()

        context['form_dc'] = ImageForm(request, imgs)
        context['url_form_dc'] = reverse('dc_image_form', query_string=qs)

    if can_edit:
        context['url_form_admin'] = reverse('admin_image_form',
                                            query_string=qs)
        context['form_admin'] = AdminImageForm(request,
                                               None,
                                               prefix='adm',
                                               initial={
                                                   'owner': user.username,
                                                   'access': Image.PRIVATE,
                                                   'dc_bound': not is_staff
                                               })

    return render(request, 'gui/dc/image_list.html', context)
Beispiel #6
0
def dc_user_list(request):
    """
    User -> Dc group management.
    """
    user, dc = request.user, request.dc
    users = User.objects.order_by('username').filter(ExcludeInternalUsers)
    context = collect_view_data(request, 'dc_user_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(
        request, UserAdminPermission.name)
    context['all'] = _all = can_edit and request.GET.get('all', False)
    context['active'] = _active = not (can_edit
                                       and request.GET.get('inactive', False))
    context['qs'] = qs = get_query_string(request, all=_all,
                                          inactive=_active).urlencode()

    if _all or dc.access == dc.PUBLIC:
        if _all:
            pr = ('roles', 'roles__dc_set')
        else:
            pr = ('roles', )

        context['users'] = users.select_related('dc_bound').filter(
            is_active=_active).prefetch_related(*pr)

        if dc.access == dc.PUBLIC:
            context['dc_users'] = AllIn()
        else:
            # Uses set() because of optimized membership ("in") checking
            context['dc_users'] = set(
                users.filter(
                    (Q(id=dc.owner.id)
                     | Q(roles__in=dc.roles.all()))).values_list('pk',
                                                                 flat=True))
    else:
        context['users'] = users.select_related('dc_bound')\
                                .filter(is_active=_active)\
                                .filter(Q(id=dc.owner.id) | Q(roles__in=dc.roles.all()) | Q(dc_bound=dc))\
                                .prefetch_related('roles').distinct()

    if can_edit:
        context['url_form_admin'] = reverse('dc_user_modal_form',
                                            query_string=qs)
        context['form_admin'] = AdminUserModalForm(request,
                                                   None,
                                                   prefix='adm',
                                                   initial={
                                                       'dc_bound':
                                                       not is_staff,
                                                       'is_active': True
                                                   })

    return render(request, 'gui/dc/user_list.html', context)
Beispiel #7
0
def _dc_settings_table(request, data=None):
    """Create basic context for rendering dc_settings_table.html"""
    dc = request.dc
    _all = bool(request.GET.get('all', False))

    if _all:
        form_class = DefaultDcSettingsForm
    else:
        form_class = DcSettingsForm

    form = form_class(request, dc, data=data, init=True, table=True, disable_globals=_all and not dc.is_default())

    return {
        'all': _all,
        'form': form,
        'qs': get_query_string(request, all=_all).urlencode(),
        'msg_global_setting': _('Global setting')
    }
Beispiel #8
0
def dc_group_list(request):
    """
    Group -> Dc group management.
    """
    user, dc = request.user, request.dc
    groups = Role.objects.order_by('name')
    context = collect_view_data(request, 'dc_group_list')
    context['is_staff'] = is_staff = user.is_staff
    context[
        'can_edit'] = can_edit = is_staff  # No permission for edit (only staff) as other might promote himself
    context['all'] = _all = can_edit and request.GET.get('all', False)
    context['qs'] = qs = get_query_string(
        request,
        all=_all,
    ).urlencode()

    if _all:
        context['colspan'] = 5
        context['groups'] = Role.objects.select_related('dc_bound').all()\
                                .prefetch_related('user_set', 'permissions', 'dc_set').order_by('name')
    else:
        context['colspan'] = 4
        context['groups'] = dc.roles.select_related('dc_bound').all()\
                              .prefetch_related('user_set', 'permissions', 'dc_set').order_by('name')

    if can_edit:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(
                groups.exclude(dc=dc).values_list('pk', flat=True))
        else:  # No need for item list
            context['can_add'] = groups.exclude(dc=dc).count()

        context['url_form_admin'] = reverse('admin_group_form',
                                            query_string=qs)
        context['form_admin'] = AdminGroupForm(request,
                                               None,
                                               prefix='adm',
                                               initial={'dc_bound': True})

        context['form_dc'] = DcGroupForm(request, groups)
        context['url_form_dc'] = reverse('dc_group_form', query_string=qs)

    return render(request, 'gui/dc/group_list.html', context)
Beispiel #9
0
def dc_network_list(request):
    """
    Network/IP<->Dc management and Network management.
    """
    user, dc = request.user, request.dc
    nets = Subnet.objects.order_by('name')
    context = collect_view_data(request, 'dc_network_list')
    context['is_staff'] = is_staff = user.is_staff
    context['can_edit'] = can_edit = is_staff or user.has_permission(request, NetworkAdminPermission.name)
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['deleted'] = _deleted = can_edit and request.GET.get('deleted', False)
    context['qs'] = qs = get_query_string(request, all=_all, deleted=_deleted).urlencode()

    if _deleted:
        nets = nets.exclude(access=Subnet.INTERNAL)
    else:
        nets = nets.exclude(access__in=Subnet.INVISIBLE)

    if _all:
        _nets = nets.select_related('owner', 'dc_bound').prefetch_related('dc').all()
    else:
        _nets = nets.select_related('owner', 'dc_bound').filter(dc=dc)

    context['networks'] = _nets.extra(select=ExtendedNetworkSerializer.extra_select)

    if is_staff:
        if _all:  # Uses set() because of optimized membership ("in") checking
            context['can_add'] = set(nets.exclude(dc=dc).values_list('pk', flat=True))
        else:
            context['can_add'] = nets.exclude(dc=dc).count()

        context['form_dc'] = DcNetworkForm(request, nets)
        context['url_form_dc'] = reverse('dc_network_form', query_string=qs)

    if can_edit:
        context['url_form_admin'] = reverse('admin_network_form', query_string=qs)
        context['form_admin'] = AdminNetworkForm(request, None, prefix='adm', initial={'owner': user.username,
                                                                                       'access': Subnet.PRIVATE,
                                                                                       'dc_bound': not is_staff})

    return render(request, 'gui/dc/network_list.html', context)
Beispiel #10
0
def dc_list(request):
    """
    Datacenter management.
    """
    context = collect_view_data(request, 'dc_list')
    context['can_edit'] = can_edit = request.user.is_staff  # DC owners have read-only rights

    if can_edit:
        pr = ('roles',)
        context['all'] = _all = bool(request.GET.get('all', False))
        context['form'] = DcForm(request, None, initial={'access': Dc.PRIVATE, 'owner': request.user.username})
        context['settings_form'] = DcSettingsForm(request, None)
        context['can_add'] = settings.VMS_DC_ENABLED
        context['colspan'] = 9
    else:
        _all = False
        pr = None  # Groups are only visible by SuperAdmins
        context['colspan'] = 8

    context['qs'] = get_query_string(request, all=_all).urlencode()
    context['dcs'] = get_dcs_extended(request, pr=pr)

    return render(request, 'gui/dc/dc_list.html', context)
Beispiel #11
0
def imagestore_list(request, repo=None):
    user = request.user
    context = collect_view_data(request, 'dc_image_list')
    context['image_vm'] = ImageVm.get_uuid()
    context['is_staff'] = is_staff = user.is_staff
    context['all'] = _all = is_staff and request.GET.get('all', False)
    context['qs'] = qs = get_query_string(request, all=_all).urlencode()
    context['url_form_admin'] = reverse('admin_image_form', query_string=qs)
    context['form_admin'] = AdminImageForm(request,
                                           None,
                                           prefix='adm',
                                           initial={
                                               'owner': user.username,
                                               'access': Image.PRIVATE,
                                               'dc_bound': True
                                           })
    qs_image_filter = request.GET.copy()
    qs_image_filter.pop('created_since', None)
    qs_image_filter.pop('last', None)
    context['qs_image_filter'] = qs_image_filter.urlencode()
    context['default_limit'] = default_limit = 30
    context['image_uuids'] = set(Image.objects.all().values_list('uuid',
                                                                 flat=True))

    try:
        created_since_days = int(request.GET.get('created_since', 0))
    except (ValueError, TypeError):
        created_since_days = None

    if created_since_days:
        limit = None
    else:
        created_since_days = None

        try:
            limit = int(request.GET.get('last', default_limit))
        except (ValueError, TypeError):
            limit = default_limit

    repositories = ImageStore.get_repositories(
        include_image_vm=request.user.is_staff)
    context['imagestores'] = imagestores = ImageStore.all(repositories)
    context['created_since'] = created_since_days
    context['limit'] = limit

    if repositories:
        if repo and repo in repositories:
            context['imagestore'] = imagestore = ImageStore(
                repo, url=repositories[repo])
        else:  # Choose the first one
            context['imagestore'] = imagestore = imagestores[0]

        if created_since_days:
            created_since = make_aware(datetime.now() -
                                       timedelta(days=created_since_days))
        else:
            created_since = None

        context['images'] = imagestore.images_filter(
            created_since=created_since, limit=limit)
    else:
        context['imagestore'] = None
        context['images'] = []

    return render(request, 'gui/dc/imagestore_list.html', context)
Beispiel #12
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)