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), )
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")