Пример #1
0
def volumemanager(request):

    if request.method == "POST":
        form = forms.VolumeManagerForm(request.POST)
        if form.is_valid() and form.save():
            events = []
            form.done(request, events)
            return JsonResp(
                request,
                message=_("Volume successfully added."),
                events=events,
            )
        else:
            return JsonResp(request,
                            form=form,
                            formsets={'layout': {
                                'instance': form._formset,
                            }})

    _n = notifier()
    disks = []
    # Grab disk list
    # Root device already ruled out
    for disk, info in list(_n.get_disks().items()):
        disks.append(
            forms.Disk(info['devname'],
                       info['capacity'],
                       serial=info.get('ident')))
    disks = sorted(disks, key=cmp_to_key(_diskcmp))

    # Exclude what's already added
    used_disks = []
    for v in models.Volume.objects.all():
        used_disks.extend(v.get_disks())

    qs = iSCSITargetExtent.objects.filter(iscsi_target_extent_type='Disk')
    used_disks.extend([i.get_device()[5:] for i in qs])

    bysize = dict()
    for d in list(disks):
        if d.dev in used_disks:
            continue
        hsize = forms.humanize_number_si(d.size)
        if hsize not in bysize:
            bysize[hsize] = []
        display_name = d.dev
        if '/' in display_name:
            display_name = display_name.split('/')[-1]
        bysize[hsize].append({
            'dev': d.dev,
            'name': str(d),
            'displayName': display_name,
            'size': d.size,
            'serial': d.serial,
        })

    bysize = OrderedDict(sorted(iter(bysize.items()), reverse=True))

    swap = Advanced.objects.latest('id').adv_swapondrive

    encwarn = (
        '<span style="color: red; font-size:110%%;">%s</span>'
        '<p>%s</p>'
        '<p>%s</p>'
        '<p>%s</p>'
    ) % (
        _('WARNING!'),
        _('Always backup the key! If the key is lost, the data on the disks '
          'will also be lost with no hope of recovery.'),
        _('This type of encryption is primarily targeted at users who are '
          'storing sensitive data and want the ability to remove disks from '
          'the pool and dispose of/re-use them without concern for erasure.'),
        _('iXsystems, Inc. can not be held responsible for any lost '
          'or unrecoverable data as a consequence of using this feature.'),
    )

    extend = [{'value': '', 'label': '-----'}]
    qs = models.Volume.objects.all()
    for vol in qs:
        if not vol.is_decrypted():
            continue
        try:
            _n.zpool_parse(vol.vol_name)
        except:
            continue
        extend.append({
            'label': vol.vol_name,
            'value': vol.vol_name,
            'enc': vol.vol_encrypt > 0
        })

    return render(
        request, "storage/volumemanager.html", {
            'disks': json.dumps(bysize),
            'dedup_warning': forms.DEDUP_WARNING,
            'encryption_warning': encwarn,
            'swap_size': swap * 1024 * 1024 * 1024,
            'manual_url': reverse('storage_volumemanager_zfs'),
            'extend': json.dumps(extend),
        })
Пример #2
0
def volumemanager(request):

    if request.method == "POST":
        form = forms.VolumeManagerForm(request.POST)
        if form.is_valid() and form.save():
            return JsonResp(request, message=_("Volume successfully added."))
        else:
            return JsonResp(request,
                            form=form,
                            formsets={'layout': form._formset})
    disks = []

    # Grab disk list
    # Root device already ruled out
    for disk, info in notifier().get_disks().items():
        disks.append(
            forms.Disk(info['devname'],
                       info['capacity'],
                       serial=info.get('ident')))
    disks = sorted(disks, key=lambda x: (x.size, x.dev), cmp=_diskcmp)

    # Exclude what's already added
    used_disks = []
    for v in models.Volume.objects.all():
        used_disks.extend(v.get_disks())

    qs = iSCSITargetExtent.objects.filter(iscsi_target_extent_type='Disk')
    used_disks.extend([i.get_device()[5:] for i in qs])

    bysize = dict()
    for d in list(disks):
        if d.dev in used_disks:
            continue
        hsize = forms.humanize_number_si(d.size)
        if hsize not in bysize:
            bysize[hsize] = []
        bysize[hsize].append({
            'dev': d.dev,
            'name': str(d),
            'size': d.size,
            'serial': d.serial,
        })

    bysize = OrderedDict(sorted(bysize.iteritems(), reverse=True))

    qs = models.Volume.objects.filter(vol_fstype='ZFS')
    swap = Advanced.objects.latest('id').adv_swapondrive

    return render(
        request, "storage/volumemanager.html", {
            'disks':
            json.dumps(bysize),
            'dedup_warning':
            forms.DEDUP_WARNING,
            'swap_size':
            swap * 1024 * 1024 * 1024,
            'extend':
            json.dumps([{
                'value': '',
                'label': '-----'
            }] + [{
                'label': x.vol_name,
                'value': x.vol_name,
                'enc': x.vol_encrypt > 0
            } for x in qs]),
        })