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)
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)
def backups(request, hostname): """ List of server backups stored on this node. """ context = collect_view_data(request, 'node_list') context['node'] = node = get_node(request, hostname) context['nodes'] = (node, ) context['node_online'] = node.is_online() context['submenu_auto'] = '' context['lastbkp'] = [] context['can_edit'] = True context['bkp_node'] = True context['last_bkpid'] = request.GET.get('last_bkpid', None) # This could change the current DC _backup_list_context(request, node, context) context['bkpform_update'] = UpdateBackupForm(None, prefix='snap_update') context['bkpform_restore'] = RestoreBackupForm( get_vms(request, sr=(), prefetch_tags=False)) context['update_mod_source'] = reverse('node_backup_form', node.hostname, query_string=context['qs']) return render(request, 'gui/node/backups.html', context)
def _backup_list_context(request, node, context, vm_hostname=None): """Helper of returning list of backups including filters""" context['filters'] = filter_form = BackupFilterForm( request, node, request.GET) bkps = node.backup_set.select_related('vm', 'dc') qs = QueryDict('', mutable=True) if filter_form.is_valid() and filter_form.has_changed(): q = filter_form.get_filters() if q: qs = request.GET bkps = bkps.filter(q) if filter_form.vm: dc_switch(request, filter_form.vm.dc.name) if filter_form.all_vm: qs_novm = qs.copy() qs_novm.pop('hostname', None) context['node_vm_backup_url'] = reverse('node_backups', node.hostname, query_string=qs_novm) else: qs_nopage = qs.copy() qs_nopage.pop('page', None) context['qs_nopage'] = qs_nopage.urlencode() context['qs'] = qs context['vm'] = filter_form.vm context['no_vm'] = filter_form.no_vm context.update(get_node_backups(request, bkps)) return context
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)
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)
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)
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)
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)
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)