Exemple #1
0
def modify_confirm(request, cluster_slug, instance):
    cluster = get_object_or_404(Cluster, slug=cluster_slug)
    vm = get_object_or_404(VirtualMachine, hostname=instance, cluster=cluster)

    user = request.user
    power = user.is_superuser or user.has_any_perms(vm, ['admin','power'])
    if not (user.is_superuser or user.has_any_perms(vm, ['admin','modify'])
        or user.has_perm('admin', cluster)):
        return render_403(request,
            'You do not have permissions to edit this virtual machine')

    if request.method == "POST":
        form = ModifyConfirmForm(request.POST)
        if form.is_valid():
            data = form.data
            if 'edit' in request.POST:
                return HttpResponseRedirect(
                    reverse("instance-modify",
                    args=[cluster.slug, vm.hostname]))
            elif 'reboot' in request.POST or 'save' in request.POST:
                rapi_dict = json.loads(data['rapi_dict'])
                niclink = rapi_dict.pop('nic_link')
                nicmac = rapi_dict.pop('nic_mac', None)
                vcpus = rapi_dict.pop('vcpus')
                memory = rapi_dict.pop('memory')
                os = rapi_dict.pop('os')
                # Modify Instance rapi call
                if nicmac is None:
                    nics=[(0, {'link':niclink,}),]
                else:
                    nics=[(0, {'link':niclink, 'mac':nicmac,}),]
                job_id = cluster.rapi.ModifyInstance(instance,
                    nics=nics, os_name=os, hvparams=rapi_dict,
                    beparams={'vcpus':vcpus,'memory':memory}
                )
                # Create job and update message on virtual machine detail page
                job = Job.objects.create(job_id=job_id, obj=vm, cluster=cluster)
                VirtualMachine.objects.filter(id=vm.id).update(last_job=job,
                                                           ignore_cache=True)
                # log information about modifying this instance
                log_action('EDIT', user, vm)
                if 'reboot' in request.POST and vm.info['status'] == 'running':
                    if power:
                        # Reboot the vm
                        vm.reboot()
                        log_action('VM_REBOOT', user, vm)
                    else:
                        return render_403(request,
                            "Sorry, but you do not have permission to reboot this machine.")

            # Remove session variables.
            if 'edit_form' in request.session:
                del request.session['edit_form']
            if 'os_list' in request.session:
                del request.session['os_list']
            # Redirect to instance-detail
            return HttpResponseRedirect(
                reverse("instance-detail", args=[cluster.slug, vm.hostname]))

    if request.method == "GET":
        form = ModifyConfirmForm()
        session = request.session

        if not 'edit_form' in request.session:
            return HttpResponseBadRequest('Incorrect Session Data')

        data = session['edit_form']
        info = vm.info
        hvparams = info['hvparams']

        old_set = dict(
            nic_link=info['nic.links'][0],
            nic_mac=info['nic.macs'][0],
            memory=info['beparams']['memory'],
            vcpus=info['beparams']['vcpus'],
            os=info['os'],
        )
        # Add hvparams to the old_set
        old_set.update(hvparams)

        instance_diff = {}
        fields = ModifyVirtualMachineForm(user, None).fields
        for key in data.keys():
            if key == 'memory':
                diff = compare(render_storage(old_set[key]),
                    render_storage(data[key]))
            elif key == 'os':
                oses = os_prettify([old_set[key], data[key]])[0][1]
                diff = compare(oses[0][1], oses[1][1])
            elif key not in old_set.keys():
                diff = ""
                instance_diff[key] = 'Key missing'
            else:
                diff = compare(old_set[key], data[key])

            if diff != "":
                label = fields[key].label
                instance_diff[label] = diff

        # Remove NIC MAC from data if it does not change
        if fields['nic_mac'].label not in instance_diff:
            del data['nic_mac']
        # Repopulate form with changed values
        form.fields['rapi_dict'] = CharField(widget=HiddenInput,
            initial=json.dumps(data))

    return render_to_response('virtual_machine/edit_confirm.html', {
        'cluster': cluster,
        'form': form,
        'instance': vm,
        'instance_diff': instance_diff,
        'power':power,
        },
        context_instance=RequestContext(request),
    )
Exemple #2
0
Fichier : tags.py Projet : bsu/GWM
 def test_render_storage(self):
     self.assertEqual(tags.render_storage(1), "1 MiB")
     self.assertEqual(tags.render_storage(1025), "1.00 GiB")
     self.assertEqual(tags.render_storage(1049600), "1.0010 TiB")