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)
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)
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)
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 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 _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') }
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_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)
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)