def insts_status(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') errors = [] instances = [] compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as msg_error: errors.append(msg_error.message) for instance in get_instances: instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'uuid': conn.get_uuid(instance), 'host': host_id, 'dump': conn.get_instance_managed_save_image(instance) }) data = json.dumps(instances) response = HttpResponse() response['Content-Type'] = "text/javascript" response.write(data) return response
def insts_status(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect("/login") errors = [] instances = [] compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: instances.append( { "name": instance, "status": conn.get_instance_status(instance), "memory": conn.get_instance_memory(instance), "vcpu": conn.get_instance_vcpu(instance), "uuid": conn.get_uuid(instance), "host": host_id, "dump": conn.get_instance_managed_save_image(instance), } ) data = json.dumps(instances) response = HttpResponse() response["Content-Type"] = "text/javascript" response.write(data) return response
def insts_status(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') errors = [] instances = [] compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as msg_error: errors.append(msg_error.message) for instance in get_instances: instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'uuid': conn.get_uuid(instance), 'host': host_id, 'dump': conn.get_instance_managed_save_image(instance) }) data = json.dumps(instances) response = HttpResponse() response['Content-Type'] = "text/javascript" response.write(data) return response
def insts_status(request, host_id): if not request.user.is_authenticated(): return redirect('login') errors = [] instances = [] compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: instances.append({ 'name': instance, 'status': conn.get_instance_status(instance), 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'uuid': conn.get_uuid(instance), 'host': host_id, 'dump': conn.get_instance_managed_save_image(instance) }) data = json.dumps(instances) return HttpResponse(data, 'text/javascript')
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') errors = [] instances = [] compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as msg_error: errors.append(msg_error.message) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance)}) try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response('instances.html', locals(), context_instance=RequestContext(request))
def migrate_instance( new_compute, instance, user, live=False, unsafe=False, xml_del=False, offline=False, autoconverge=False, compress=False, postcopy=False, ): status = connection_manager.host_is_up(new_compute.type, new_compute.hostname) if not status: return if new_compute == instance.compute: return try: conn_migrate = wvmInstances( new_compute.hostname, new_compute.login, new_compute.password, new_compute.type, ) autostart = instance.autostart conn_migrate.moveto( instance.proxy, instance.name, live, unsafe, xml_del, offline, autoconverge, compress, postcopy, ) finally: conn_migrate.close() try: conn_new = wvmInstance( new_compute.hostname, new_compute.login, new_compute.password, new_compute.type, instance.name, ) if autostart: conn_new.set_autostart(1) finally: conn_new.close() instance.compute = new_compute instance.save()
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect("/login") errors = [] instances = [] compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as msg_error: errors.append(msg_error.message) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = None instances.append({"name": instance, "status": conn.get_instance_status(instance), "uuid": uuid}) try: if request.method == "POST": name = request.POST.get("name", "") if "start" in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if "shutdown" in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if "destroy" in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if "suspend" in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if "resume" in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response("instances.html", locals(), context_instance=RequestContext(request))
def VM_actions(request): log_msg = "" if request.method == 'POST': token = str(request.POST.get('token')) action = str(request.POST.get('action')) try: temptoken = token.split('-', 1) host = int(temptoken[0]) uuid = temptoken[1] instance = Instance.objects.get(compute_id=host, uuid=uuid) conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if action =='poweron': log_msg = "Power On" conn.start(instance.name) if action == 'poweroff': log_msg = "Power Off" conn.shutdown(instance.name) if action == 'forcepoweroff': log_msg = "Force Power Off" conn.force_shutdown(instance.name) if action == 'restart': log_msg = "Restart" conn.force_shutdown(instance.name) conn.start(instance.name) if action == 'suspend': log_msg = "Suspend" conn.suspend(instance.name) if action == 'resume': log_msg = "Resume" conn.resume(instance.name) except libvirtError as lib_err: log_msg = "Error" else: log_msg = "Request is failed" return render(request,'action.html',locals())
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append({'dev': disk['dev'], 'storage': disk['storage'], 'image': image}) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() vnc_port = conn.get_vnc() vnc_keymap = conn.get_vnc_keymap snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) except libvirtError as msg_error: errors.append(msg_error.message) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path()) if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() finally: conn.delete() return HttpResponseRedirect('/instances/%s/' % host_id) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') clear = request.POST.get('clear_pass', False) if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path() + '#vnc_pass') if 'set_vnc_keymap' in request.POST: keymap = request.POST.get('vnc_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_vnc_keymap('') else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#vnc_keymap') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/instance/%s/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect('/instance/%s/%s' % (host_id, clone_data['name'])) conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))
def instance(request, compute_id, vname): """ :param request: :return: """ error_messages = [] #messages = [] compute = get_object_or_404(Compute, pk=compute_id) computes = Compute.objects.all().order_by('name') computes_count = computes.count() users = User.objects.all().order_by('username') publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = settings.QEMU_KEYMAPS console_types = settings.QEMU_CONSOLE_TYPES console_listen_addresses = settings.QEMU_CONSOLE_LISTEN_ADDRESSES try: userinstance = UserInstance.objects.get(instance__compute_id=compute_id, instance__name=vname, user__id=request.user.id) except UserInstance.DoesNotExist: userinstance = None if not request.user.is_superuser: if not userinstance: return HttpResponseRedirect(reverse('index')) def show_clone_disk(disks, vname=''): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count("-") and disk['image'].rsplit("-", 1)[0] == vname: name, suffix = disk['image'].rsplit("-", 1) image = name + "-clone" + "-" + suffix elif disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk def filesizefstr(size_str): if size_str == '': return 0 size_str = size_str.encode('ascii', 'ignore').upper().translate(None, " B") if 'K' == size_str[-1]: return long(float(size_str[:-1]))<<10 elif 'M' == size_str[-1]: return long(float(size_str[:-1]))<<20 elif 'G' == size_str[-1]: return long(float(size_str[:-1]))<<30 elif 'T' == size_str[-1]: return long(float(size_str[:-1]))<<40 elif 'P' == size_str[-1]: return long(float(size_str[:-1]))<<50 else: return long(float(size_str)) def get_clone_free_names(size=10): prefix = settings.CLONE_INSTANCE_DEFAULT_PREFIX free_names = [] existing_names = [i.name for i in Instance.objects.filter(name__startswith=prefix)] index = 1 while len(free_names) < size: new_name = prefix + str(index) if new_name not in existing_names: free_names.append(new_name) index += 1 return free_names def check_user_quota(instance, cpu, memory, disk_size): user_instances = UserInstance.objects.filter(user_id=request.user.id, instance__is_template=False) instance += user_instances.count() for usr_inst in user_instances: if connection_manager.host_is_up(usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmInstance(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type, usr_inst.instance.name) cpu += int(conn.get_vcpu()) memory += int(conn.get_memory()) for disk in conn.get_disk_device(): if disk['size']: disk_size += int(disk['size'])>>30 ua = request.user.userattributes msg = "" if ua.max_instances > 0 and instance > ua.max_instances: msg = "instance" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (instance, ua.max_instances) if ua.max_cpus > 0 and cpu > ua.max_cpus: msg = "cpu" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (cpu, ua.max_cpus) if ua.max_memory > 0 and memory > ua.max_memory: msg = "memory" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (memory, ua.max_memory) if ua.max_disk_size > 0 and disk_size > ua.max_disk_size: msg = "disk" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (disk_size, ua.max_disk_size) return msg def get_new_disk_dev(disks, bus): if bus == "virtio": dev_base = "vd" else: dev_base = "sd" existing_devs = [ disk['dev'] for disk in disks ] for l in string.lowercase: dev = dev_base + l if dev not in existing_devs: return dev raise Exception(_('None available device name')) def get_network_tuple(network_source_str): network_source_pack = network_source_str.split(":", 1) if len(network_source_pack) > 1: return (network_source_pack[1], network_source_pack[0]) else: return (network_source_pack[0], 'net') try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) compute_networks = sorted(conn.get_networks()) compute_interfaces = sorted(conn.get_ifaces()) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() title = conn.get_title() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() if len(media) != 0: media_iso = sorted(conn.get_iso_media()) else: media_iso = [] vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() console_listen_address = conn.get_console_listen_addr() snapshots = sorted(conn.get_snapshot(), reverse=True, key=lambda k:k['date']) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks, vname) console_passwd = conn.get_console_passwd() clone_free_names = get_clone_free_names() user_quota_msg = check_user_quota(0, 0, 0, 0) storages = sorted(conn.get_storages()) cache_modes = sorted(conn.get_cache_modes().items()) default_cache = settings.INSTANCE_VOLUME_DEFAULT_CACHE default_format = settings.INSTANCE_VOLUME_DEFAULT_FORMAT formats = conn.get_image_formats() busses = conn.get_busses() default_bus = settings.INSTANCE_VOLUME_DEFAULT_BUS show_access_root_password = settings.SHOW_ACCESS_ROOT_PASSWORD show_access_ssh_keys = settings.SHOW_ACCESS_SSH_KEYS clone_instance_auto_name = settings.CLONE_INSTANCE_AUTO_NAME try: instance = Instance.objects.get(compute_id=compute_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=compute_id, name=vname, uuid=uuid) instance.save() userinstances = UserInstance.objects.filter(instance=instance).order_by('user__username') if request.method == 'POST': if 'poweron' in request.POST: conn.start() msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweron') if 'powercycle' in request.POST: conn.force_shutdown() conn.start() msg = _("Power Cycle") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powercycle') if 'poweroff' in request.POST: conn.shutdown() msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweroff') if 'powerforce' in request.POST: conn.force_shutdown() msg = _("Force Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powerforce') if 'delete' in request.POST and (request.user.is_superuser or userinstance.is_delete): if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): for snap in snapshots: conn.snapshot_delete(snap['name']) conn.delete_disk() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) instance_name = instance.name instance.delete() try: del_userinstance = UserInstance.objects.filter(instance__compute_id=compute_id, instance__name=vname) del_userinstance.delete() except UserInstance.DoesNotExist: pass msg = _("Destroy") addlogmsg(request.user.username, instance_name, msg) return HttpResponseRedirect(reverse('instances')) if 'rootpasswd' in request.POST: passwd = request.POST.get('passwd', '') passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy') data = {'action': 'password', 'passwd': passwd_hash, 'vname': vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.success(request, msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if 'addpublickey' in request.POST: sshkeyid = request.POST.get('sshkeyid', '') publickey = UserSSHKey.objects.get(id=sshkeyid) data = {'action': 'publickey', 'key': publickey.keypublic, 'vname': vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Installed new ssh public key %s" % publickey.keyname) addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.success(request, msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if 'resize' in request.POST and (request.user.is_superuser or request.user.is_staff or userinstance.is_change): new_vcpu = request.POST.get('vcpu', '') new_cur_vcpu = request.POST.get('cur_vcpu', '') new_memory = request.POST.get('memory', '') new_memory_custom = request.POST.get('memory_custom', '') if new_memory_custom: new_memory = new_memory_custom new_cur_memory = request.POST.get('cur_memory', '') new_cur_memory_custom = request.POST.get('cur_memory_custom', '') if new_cur_memory_custom: new_cur_memory = new_cur_memory_custom disks_new = [] for disk in disks: input_disk_size = filesizefstr(request.POST.get('disk_size_' + disk['dev'], '')) if input_disk_size > disk['size']+(64<<20): disk['size_new'] = input_disk_size disks_new.append(disk) disk_sum = sum([disk['size']>>30 for disk in disks_new]) disk_new_sum = sum([disk['size_new']>>30 for disk in disks_new]) quota_msg = check_user_quota(0, int(new_vcpu)-vcpu, int(new_memory)-memory, disk_new_sum-disk_sum) if not request.user.is_superuser and quota_msg: msg = _("User %s quota reached, cannot resize '%s'!" % (quota_msg, instance.name)) error_messages.append(msg) else: cur_memory = new_cur_memory memory = new_memory cur_vcpu = new_cur_vcpu vcpu = new_vcpu conn.resize(cur_memory, memory, cur_vcpu, vcpu, disks_new) msg = _("Resize") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'addvolume' in request.POST and (request.user.is_superuser or userinstance.is_change): connCreate = wvmCreate(compute.hostname, compute.login, compute.password, compute.type) storage = request.POST.get('storage', '') name = request.POST.get('name', '') format = request.POST.get('format', '') size = request.POST.get('size', 0) meta_prealloc = request.POST.get('meta_prealloc', False) bus = request.POST.get('bus', '') cache = request.POST.get('cache', '') target = get_new_disk_dev(disks, bus) path = connCreate.create_volume(storage, name, size, format, meta_prealloc) conn.attach_disk(path, target, subdriver=format, cache=cache, targetbus=bus) msg = _('Attach new disk') addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) msg = _("Mount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) msg = _("Umount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("New snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) msg = _("Delete snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.success(request, msg) msg = _("Revert snapshot") addlogmsg(request.user.username, instance.name, msg) if request.user.is_superuser: if 'suspend' in request.POST: conn.suspend() msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resume') if 'resume' in request.POST: conn.resume() msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'set_autostart' in request.POST: conn.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'unset_autostart' in request.POST: conn.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'change_xml' in request.POST: exit_xml = request.POST.get('inst_xml', '') if exit_xml: conn._defineXML(exit_xml) msg = _("Edit XML") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#xmledit') if request.user.is_superuser or userinstance.is_vnc: if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = randomPasswd() else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _("Enter the console password or select Generate") error_messages.append(msg) if not error_messages: if not conn.set_console_passwd(passwd): msg = _("Error setting console password. You should check that your instance have an graphic device.") error_messages.append(msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) msg = _("Set VNC keymap") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_listen_address' in request.POST: console_type = request.POST.get('console_listen_address', '') conn.set_console_listen_addr(console_type) msg = _("Set VNC listen address") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if request.user.is_superuser: if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) offline = request.POST.get('offline_migrate', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del, offline) instance.compute = new_compute instance.save() conn_migrate.close() if autostart: conn_new = wvmInstance(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type, vname) conn_new.set_autostart(1) conn_new.close() msg = _("Migrate to %s" % new_compute.hostname) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(reverse('instance', args=[compute_id, vname])) if 'change_network' in request.POST: network_data = {} for post in request.POST: if post.startswith('net-source-'): (source, source_type) = get_network_tuple(request.POST.get(post)) network_data[post] = source network_data[post + '-type'] = source_type elif post.startswith('net-'): network_data[post] = request.POST.get(post, '') conn.change_network(network_data) msg = _("Edit network") addlogmsg(request.user.username, instance.name, msg) msg = _("Network Devices are changed. Please reboot instance to activate.") messages.success(request, msg) return HttpResponseRedirect(request.get_full_path() + '#network') if 'add_network' in request.POST: mac = request.POST.get('add-net-mac') (source, source_type) = get_network_tuple(request.POST.get('add-net-network')) conn.add_network(mac, source, source_type) msg = _("Edit network") addlogmsg(request.user.username, instance.name, msg) msg = _("Network Devices are changed. Please reboot instance to activate.") messages.success(request, msg) return HttpResponseRedirect(request.get_full_path() + '#network') if 'add_owner' in request.POST: user_id = int(request.POST.get('user_id', '')) if settings.ALLOW_INSTANCE_MULTIPLE_OWNER: check_inst = UserInstance.objects.filter(instance=instance, user_id=user_id) else: check_inst = UserInstance.objects.filter(instance=instance) if check_inst: msg = _("Owner already added") error_messages.append(msg) else: add_user_inst = UserInstance(instance=instance, user_id=user_id) add_user_inst.save() msg = _("Added owner %d" % user_id) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#users') if 'del_owner' in request.POST: userinstance_id = int(request.POST.get('userinstance', '')) userinstance = UserInstance.objects.get(pk=userinstance_id) userinstance.delete() msg = _("Deleted owner %d" % userinstance_id) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#users') if request.user.is_superuser or request.user.userattributes.can_clone_instances: if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') disk_sum = sum([disk['size']>>30 for disk in disks]) quota_msg = check_user_quota(1, vcpu, memory, disk_sum) check_instance = Instance.objects.filter(name=clone_data['name']) for post in request.POST: clone_data[post] = request.POST.get(post, '').strip() if clone_instance_auto_name and not clone_data['name']: auto_vname = clone_free_names[0] clone_data['name'] = auto_vname clone_data['clone-net-mac-0'] = _get_dhcp_mac_address(auto_vname) for post in clone_data.keys(): if post.startswith('disk-'): disk_name = clone_data[post] if "-" in disk_name: suffix = disk_name.split("-")[-1] disk_name = '-'.join((auto_vname, suffix)) else: suffix = disk_name.split(".")[-1] disk_name = '.'.join((auto_vname, suffix)) clone_data[post] = disk_name if not request.user.is_superuser and quota_msg: msg = _("User %s quota reached, cannot create '%s'!" % (quota_msg, clone_data['name'])) error_messages.append(msg) elif check_instance: msg = _("Instance '%s' already exists!" % clone_data['name']) error_messages.append(msg) elif not re.match(r'^[a-zA-Z0-9-]+$', clone_data['name']): msg = _("Instance name '%s' contains invalid characters!" % clone_data['name']) error_messages.append(msg) elif not re.match(r'^([0-9A-F]{2})(\:?[0-9A-F]{2}){5}$', clone_data['clone-net-mac-0'], re.IGNORECASE): msg = _("Instance mac '%s' invalid format!" % clone_data['clone-net-mac-0']) error_messages.append(msg) else: new_uuid = conn.clone_instance(clone_data) new_instance = Instance(compute_id=compute_id, name=clone_data['name'], uuid=new_uuid) new_instance.save() userinstance = UserInstance(instance_id=new_instance.id, user_id=request.user.id, is_delete=True) userinstance.save() msg = _("Clone of '%s'" % instance.name) addlogmsg(request.user.username, new_instance.name, msg) return HttpResponseRedirect(reverse('instance', args=[compute_id, clone_data['name']])) if 'change_options' in request.POST: instance.is_template = request.POST.get('is_template', False) instance.save() options = {} for post in request.POST: if post in ['title', 'description']: options[post] = request.POST.get(post, '') conn.set_options(options) msg = _("Edit options") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#options') conn.close() except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, vname, lib_err.message) return render(request, 'instance.html', locals())
def nwfilters(request, compute_id): """ :param request: :param compute_id: :return: """ nwfilters_all = [] compute = get_object_or_404(Compute, pk=compute_id) try: conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type) for nwf in conn.get_nwfilters(): nwfilters_all.append(conn.get_nwfilter_info(nwf)) if request.method == "POST": if "create_nwfilter" in request.POST: xml = request.POST.get("nwfilter_xml", "") if xml: try: util.etree.fromstring(xml) name = util.get_xml_path(xml, "/filter/@name") uuid = util.get_xml_path(xml, "/filter/uuid") except util.etree.ParseError: name = None for nwf in nwfilters_all: if name == nwf["name"]: error_msg = _( "A network filter with this name already exists" ) raise Exception(error_msg) if uuid == nwf["uuid"]: error_msg = _( "A network filter with this UUID already exists" ) raise Exception(error_msg) else: try: msg = _("%(filter)s network filter is created") % { "filter": name } conn.create_nwfilter(xml) addlogmsg(request.user.username, compute.hostname, msg) except libvirtError as lib_err: messages.error(request, lib_err) addlogmsg(request.user.username, compute.hostname, lib_err) if "del_nwfilter" in request.POST: name = request.POST.get("nwfiltername", "") msg = _("%(filter)s network filter is deleted") % { "filter": name } in_use = False nwfilter = conn.get_nwfilter(name) is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) instances = is_conn.get_instances() for inst in instances: i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst) dom_filterrefs = i_conn.get_filterrefs() if name in dom_filterrefs: in_use = True msg = _( "NWFilter is in use by %(instance)s. Cannot be deleted." ) % { "instance": inst } messages.error(request, msg) addlogmsg(request.user.username, compute.hostname, msg) i_conn.close() break is_conn.close() if nwfilter and not in_use: nwfilter.undefine() addlogmsg(request.user.username, compute.hostname, msg) if "cln_nwfilter" in request.POST: name = request.POST.get("nwfiltername", "") cln_name = request.POST.get("cln_name", name + "-clone") conn.clone_nwfilter(name, cln_name) msg = _("Cloning NWFilter %(name)s as %(clone)s") % { "name": name, "clone": cln_name } addlogmsg(request.user.username, compute.hostname, msg) conn.close() except libvirtError as lib_err: messages.error(request, lib_err) addlogmsg(request.user.username, compute.hostname, lib_err) except Exception as err: messages.error(request, err) addlogmsg(request.user.username, compute.hostname, err) return render( request, "nwfilters.html", { "nwfilters": nwfilters_all, "compute": compute, }, )
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) errors = [] instances = [] time_refresh = 8000 get_instances = [] cnt_max = settings.vf_cnt_max conn = None meta_prealloc = False compute = Compute.objects.get(id=host_id) memory_range = [2048, 4096, 6144, 8192, 16384] ifaces_all = util.get_free_vfs() ifaces_all = sorted(ifaces_all.iteritems(),key=lambda ax:ax[0]) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) conn_create = wvmCreate(compute.hostname, compute.login, compute.password, compute.type) conn_storage = wvmStorage(compute.hostname, compute.login, compute.password, compute.type, 'Images') state = conn_storage.is_active() if state: conn_storage.refresh() volumes = conn_storage.update_volumes() conn_storage.close() else: volumes = None get_images = volumes get_instances = conn.get_instances() except libvirtError as err: pass # errors.append(err) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'has_managed_save_image': conn.get_instance_managed_save_image(instance)}) if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'managedsave' in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) if 'create' in request.POST: volumes = {} interfaces = [] vm_vfs_info = {} form = NewVMForm(request.POST) if form.is_valid(): data = form.cleaned_data if instances: if data['name'] in instances: msg = _("A virtual machine with this name already exists") errors.append(msg) if not errors: if data['hdd_size']: try: path = conn.create_volume(data['storage'], data['name'], data['hdd_size'], metadata=meta_prealloc) volumes[path] = conn.get_volume_type(path) except libvirtError as msg_error: errors.append(msg_error.message) elif data['template']: templ_path = conn_create.get_volume_path(data['template']) clone_path = conn_create.clone_from_template(data['name'], templ_path, metadata=meta_prealloc) volumes[clone_path] = conn_create.get_volume_type(clone_path) ifaces_all = request.POST.getlist('interfaces') else: if not data['images']: msg = _("First you need to create or select an image") errors.append(msg) else: for vol in data['images'].split(','): try: path = conn.get_volume_path(vol) volumes[path] = conn.get_volume_type(path) except libvirtError as msg_error: errors.append(msg_error.message) if not errors: uuid = util.randomUUID() try: template_ver3_flag = True if data['template'].find("WiseGrid_V3") == -1: template_ver3_flag = False conn_create.create_instance(data['name'], data['cur_memory'], data['cur_vcpu'], uuid, volumes, ifaces_all, False, True, template_ver3_flag) create_instance = Instance(compute_id=host_id, name=data['name'], uuid=uuid) create_instance.save() vm_vfs_info[data['name']] = ifaces_all if not errors: util.update_vfs_fro_vm(vm_vfs_info) return HttpResponseRedirect(reverse('instance', args=[host_id, data['name']])) except libvirtError as err: if data['hdd_size']: conn_create.delete_volume(volumes.keys()[0]) errors.append(err) else: print form.errors errors.append(form.errors) conn.close() conn_create.close() except libvirtError as err: errors.append(err) hd_resources = util.load_hd_resources() mem_left = hd_resources["mem"] vcpu_left = hd_resources["vcpu"] memory_range = [ memory for memory in memory_range if memory/1024 <= mem_left ] vcpu_range = xrange(1, int(vcpu_left) + 1) vcpu_memory_left_flag = True if len(list(vcpu_range)) == 0 or len(memory_range) == 0: vcpu_memory_left_flag = False return render_to_response('instances.html', locals(), context_instance=RequestContext(request))
def instance(request, host_id, vname): """ Instance block """ def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() vnc_port = conn.get_vnc_port() vnc_keymap = conn.get_vnc_keymap() vnc_password = conn.get_vnc_passwd() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) cpu_usage = conn.cpu_usage()['cpu'] except libvirtError as err: errors.append(err) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): print 'yeah' conn.delete_disk() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() finally: conn.delete() return HttpResponseRedirect('/%s/instances' % host_id) if 'assign_volume' in request.POST: file = request.POST.get('file', '') device = request.POST.get('device', '') conn.assign_volume(file, device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'unassign_volume' in request.POST: device = request.POST.get('device', '') conn.unassign_volume(device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'external_storage_snapshot' in request.POST: name = request.POST.get('name', '') conn.create_external_storage_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') first_cd = media[0]['dev'] if len(media) > 0 else request.POST.get('umount_iso', '') dev = request.POST.get('device', first_cd) conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') first_cd = media[0]['dev'] if len(media) > 0 else '' print first_cd dev = request.POST.get('device', first_cd) conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') clear = request.POST.get('clear_pass', False) if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path() + '#vnc_pass') if 'set_vnc_keymap' in request.POST: keymap = request.POST.get('vnc_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_vnc_keymap('') else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#vnc_keymap') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/%s/instance/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect('/%s/instance/%s' % (host_id, clone_data['name'])) conn.close() except libvirtError as err: errors.append(err) object = { 'errors': [str(error) for error in errors], 'response': { 'name': vname, 'status': status, 'autostart': autostart, 'vcpu': vcpu, 'cur_vcpu': cur_vcpu, 'uuid': uuid, 'memory': memory, 'cur_memory': cur_memory, 'description': description, 'disks': disks, 'media': media, 'networks': networks, 'media_iso': media_iso, 'vcpu_range': vcpu_range.__len__(), 'memory_host': memory_host, 'vcpu_host': vcpu_host, 'telnet_port': telnet_port, 'vnc_port': vnc_port, 'vnc_keymap': vnc_keymap, 'snapshots': snapshots, 'inst_xml': inst_xml.__str__(), 'has_managed_save_image': has_managed_save_image, 'clone_disks': clone_disks, 'cpu_usage': cpu_usage, 'vnc_password': vnc_password } } return render(object, 'instance.html', locals(), request)
def instance(request, compute_id, vname): """ :param request: :return: """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('index')) error_messages = [] messages = [] compute = get_object_or_404(Compute, pk=compute_id) computes = Compute.objects.all() computes_count = len(computes) publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: userinstace = UserInstance.objects.get(instance__compute_id=compute_id, instance__name=vname, user__id=request.user.id) except UserInstance.DoesNotExist: userinstace = None if not request.user.is_superuser: if not userinstace: return HttpResponseRedirect(reverse('index')) def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) console_passwd = conn.get_console_passwd() try: instance = Instance.objects.get(compute_id=compute_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=compute_id, name=vname, uuid=uuid) instance.save() if request.method == 'POST': if 'poweron' in request.POST: conn.start() msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweron') if 'powercycle' in request.POST: conn.force_shutdown() conn.start() msg = _("Power Cycle") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powercycle') if 'poweroff' in request.POST: conn.shutdown() msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweroff') if 'powerforce' in request.POST: conn.force_shutdown() msg = _("Force Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powerforce') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) instance_name = instance.name instance.delete() if not request.user.is_superuser: del_userinstance = UserInstance.objects.get(id=userinstace.id) del_userinstance.delete() else: try: del_userinstance = UserInstance.objects.filter(instance__compute_id=compute_id, instance__name=vname) del_userinstance.delete() except UserInstance.DoesNotExist: pass msg = _("Destroy") addlogmsg(request.user.username, instance_name, msg) return HttpResponseRedirect(reverse('instances')) if 'rootpasswd' in request.POST: passwd = request.POST.get('passwd', '') passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy') data = {'action': 'password', 'passwd': passwd_hash, 'vname': vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if 'addpublickey' in request.POST: sshkeyid = request.POST.get('sshkeyid', '') publickey = UserSSHKey.objects.get(id=sshkeyid) data = {'action': 'publickey', 'key': publickey.keypublic, 'vname': vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Installed new ssh public key %s" % publickey.keyname) addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if 'resize' in request.POST: vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') memory_custom = request.POST.get('memory_custom', '') if memory_custom: memory = memory_custom cur_memory = request.POST.get('cur_memory', '') cur_memory_custom = request.POST.get('cur_memory_custom', '') if cur_memory_custom: cur_memory = cur_memory_custom conn.resize(cur_memory, memory, cur_vcpu, vcpu) msg = _("Resize") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) msg = _("Mount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) msg = _("Umount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("New snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) msg = _("Delete snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) msg = _("Revert snapshot") addlogmsg(request.user.username, instance.name, msg) if request.user.is_superuser: if 'suspend' in request.POST: conn.suspend() msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resume') if 'resume' in request.POST: conn.resume() msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'set_autostart' in request.POST: conn.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'unset_autostart' in request.POST: conn.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'change_xml' in request.POST: exit_xml = request.POST.get('inst_xml', '') if exit_xml: conn._defineXML(exit_xml) msg = _("Edit XML") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#xmledit') if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = randomPasswd() else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _("Enter the console password or select Generate") error_messages.append(msg) if not error_messages: if not conn.set_console_passwd(passwd): msg = _("Error setting console password. You should check that your instance have an graphic device.") error_messages.append(msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) msg = _("Set VNC keymap") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() msg = _("Migrate") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(reverse('instance', args=[compute_id, vname])) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) msg = _("Clone") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(reverse('instance', args=[compute_id, clone_data['name']])) conn.close() except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, vname, lib_err.message) return render(request, 'instance.html', locals())
def instance(request, compute_id, vname): """ :param request: :return: """ error_messages = [] messages = [] compute = get_object_or_404(Compute, pk=compute_id) computes = Compute.objects.all().order_by('name') computes_count = computes.count() users = User.objects.all().order_by('username') publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = settings.QEMU_KEYMAPS console_types = settings.QEMU_CONSOLE_TYPES console_listen_addresses = settings.QEMU_CONSOLE_LISTEN_ADDRESSES try: userinstace = UserInstance.objects.get(instance__compute_id=compute_id, instance__name=vname, user__id=request.user.id) except UserInstance.DoesNotExist: userinstace = None if not request.user.is_superuser: if not userinstace: return HttpResponseRedirect(reverse('index')) def show_clone_disk(disks, vname=''): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count("-") and disk['image'].rsplit( "-", 1)[0] == vname: name, suffix = disk['image'].rsplit("-", 1) image = name + "-clone" + "-" + suffix elif disk['image'].count(".") and len(disk['image'].rsplit( ".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append({ 'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format'] }) return clone_disk def filesizefstr(size_str): if size_str == '': return 0 size_str = size_str.encode('ascii', 'ignore').upper().translate(None, " B") if 'K' == size_str[-1]: return long(float(size_str[:-1])) << 10 elif 'M' == size_str[-1]: return long(float(size_str[:-1])) << 20 elif 'G' == size_str[-1]: return long(float(size_str[:-1])) << 30 elif 'T' == size_str[-1]: return long(float(size_str[:-1])) << 40 elif 'P' == size_str[-1]: return long(float(size_str[:-1])) << 50 else: return long(float(size_str)) def get_clone_free_names(size=10): prefix = settings.CLONE_INSTANCE_DEFAULT_PREFIX free_names = [] existing_names = [ i.name for i in Instance.objects.filter(name__startswith=prefix) ] index = 1 while len(free_names) < size: new_name = prefix + str(index) if new_name not in existing_names: free_names.append(new_name) index += 1 return free_names def check_user_quota(instance, cpu, memory, disk_size): user_instances = UserInstance.objects.filter( user_id=request.user.id, instance__is_template=False) instance += user_instances.count() for usr_inst in user_instances: if connection_manager.host_is_up( usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmInstance(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type, usr_inst.instance.name) cpu += int(conn.get_vcpu()) memory += int(conn.get_memory()) for disk in conn.get_disk_device(): if disk['size']: disk_size += int(disk['size']) >> 30 ua = request.user.userattributes msg = "" if ua.max_instances > 0 and instance > ua.max_instances: msg = "instance" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (instance, ua.max_instances) if ua.max_cpus > 0 and cpu > ua.max_cpus: msg = "cpu" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (cpu, ua.max_cpus) if ua.max_memory > 0 and memory > ua.max_memory: msg = "memory" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (memory, ua.max_memory) if ua.max_disk_size > 0 and disk_size > ua.max_disk_size: msg = "disk" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (disk_size, ua.max_disk_size) return msg def get_new_disk_dev(disks, bus): if bus == "virtio": dev_base = "vd" else: dev_base = "sd" existing_devs = [disk['dev'] for disk in disks] for l in string.lowercase: dev = dev_base + l if dev not in existing_devs: return dev raise Exception(_('None available device name')) try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() title = conn.get_title() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() if len(media) != 0: media_iso = sorted(conn.get_iso_media()) else: media_iso = [] vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True, key=lambda k: k['date']) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks, vname) console_passwd = conn.get_console_passwd() clone_free_names = get_clone_free_names() user_quota_msg = check_user_quota(0, 0, 0, 0) storages = sorted(conn.get_storages()) cache_modes = sorted(conn.get_cache_modes().items()) default_cache = settings.INSTANCE_VOLUME_DEFAULT_CACHE default_format = settings.INSTANCE_VOLUME_DEFAULT_FORMAT formats = conn.get_image_formats() busses = conn.get_busses() default_bus = settings.INSTANCE_VOLUME_DEFAULT_BUS show_access_root_password = settings.SHOW_ACCESS_ROOT_PASSWORD show_access_ssh_keys = settings.SHOW_ACCESS_SSH_KEYS try: instance = Instance.objects.get(compute_id=compute_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=compute_id, name=vname, uuid=uuid) instance.save() userinstances = UserInstance.objects.filter( instance=instance).order_by('user__username') if request.method == 'POST': if 'poweron' in request.POST: conn.start() msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweron') if 'powercycle' in request.POST: conn.force_shutdown() conn.start() msg = _("Power Cycle") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powercycle') if 'poweroff' in request.POST: conn.shutdown() msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweroff') if 'powerforce' in request.POST: conn.force_shutdown() msg = _("Force Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powerforce') if 'delete' in request.POST and (request.user.is_superuser or userinstace.is_delete): if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): for snap in snapshots: conn.snapshot_delete(snap['name']) conn.delete_disk() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) instance_name = instance.name instance.delete() try: del_userinstance = UserInstance.objects.filter( instance__compute_id=compute_id, instance__name=vname) del_userinstance.delete() except UserInstance.DoesNotExist: pass msg = _("Destroy") addlogmsg(request.user.username, instance_name, msg) return HttpResponseRedirect(reverse('instances')) if 'rootpasswd' in request.POST: passwd = request.POST.get('passwd', '') passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy') data = { 'action': 'password', 'passwd': passwd_hash, 'vname': vname } if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _( "Please shutdow down your instance and then try again") error_messages.append(msg) if 'addpublickey' in request.POST: sshkeyid = request.POST.get('sshkeyid', '') publickey = UserSSHKey.objects.get(id=sshkeyid) data = { 'action': 'publickey', 'key': publickey.keypublic, 'vname': vname } if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Installed new ssh public key %s" % publickey.keyname) addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _( "Please shutdow down your instance and then try again") error_messages.append(msg) if 'resize' in request.POST and (request.user.is_superuser or request.user.is_staff or userinstace.is_change): new_vcpu = request.POST.get('vcpu', '') new_cur_vcpu = request.POST.get('cur_vcpu', '') new_memory = request.POST.get('memory', '') new_memory_custom = request.POST.get('memory_custom', '') if new_memory_custom: new_memory = new_memory_custom new_cur_memory = request.POST.get('cur_memory', '') new_cur_memory_custom = request.POST.get( 'cur_memory_custom', '') if new_cur_memory_custom: new_cur_memory = new_cur_memory_custom disks_new = [] for disk in disks: input_disk_size = filesizefstr( request.POST.get('disk_size_' + disk['dev'], '')) if input_disk_size > disk['size'] + (64 << 20): disk['size_new'] = input_disk_size disks_new.append(disk) disk_sum = sum([disk['size'] >> 30 for disk in disks_new]) disk_new_sum = sum( [disk['size_new'] >> 30 for disk in disks_new]) quota_msg = check_user_quota(0, int(new_vcpu) - vcpu, int(new_memory) - memory, disk_new_sum - disk_sum) if not request.user.is_superuser and quota_msg: msg = _("User %s quota reached, cannot resize '%s'!" % (quota_msg, instance.name)) error_messages.append(msg) else: cur_memory = new_cur_memory memory = new_memory cur_vcpu = new_cur_vcpu vcpu = new_vcpu conn.resize(cur_memory, memory, cur_vcpu, vcpu, disks_new) msg = _("Resize") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'addvolume' in request.POST and (request.user.is_superuser or userinstace.is_change): connCreate = wvmCreate(compute.hostname, compute.login, compute.password, compute.type) storage = request.POST.get('storage', '') name = request.POST.get('name', '') extension = request.POST.get('extension', '') format = request.POST.get('format', '') size = request.POST.get('size', 0) meta_prealloc = request.POST.get('meta_prealloc', False) bus = request.POST.get('bus', '') cache = request.POST.get('cache', '') target = get_new_disk_dev(disks, bus) path = connCreate.create_volume(storage, name, size, format, meta_prealloc, extension) conn.attach_disk(path, target, subdriver=format, cache=cache, targetbus=bus) msg = _('Attach new disk') addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) msg = _("Mount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) msg = _("Umount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("New snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) msg = _("Delete snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) msg = _("Revert snapshot") addlogmsg(request.user.username, instance.name, msg) if request.user.is_superuser: if 'suspend' in request.POST: conn.suspend() msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resume') if 'resume' in request.POST: conn.resume() msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'set_autostart' in request.POST: conn.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'unset_autostart' in request.POST: conn.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'change_xml' in request.POST: exit_xml = request.POST.get('inst_xml', '') if exit_xml: conn._defineXML(exit_xml) msg = _("Edit XML") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#xmledit') if request.user.is_superuser or userinstace.is_vnc: if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = randomPasswd() else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _( "Enter the console password or select Generate" ) error_messages.append(msg) if not error_messages: if not conn.set_console_passwd(passwd): msg = _( "Error setting console password. You should check that your instance have an graphic device." ) error_messages.append(msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect( request.get_full_path() + '#vncsettings') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) msg = _("Set VNC keymap") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_listen_address' in request.POST: console_type = request.POST.get('console_listen_address', '') conn.set_console_listen_addr(console_type) msg = _("Set VNC listen address") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if request.user.is_superuser: if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) offline = request.POST.get('offline_migrate', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del, offline) instance.compute = new_compute instance.save() conn_migrate.close() if autostart: conn_new = wvmInstance(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type, vname) conn_new.set_autostart(1) conn_new.close() msg = _("Migrate to %s" % new_compute.hostname) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect( reverse('instance', args=[compute_id, vname])) if 'change_network' in request.POST: network_data = {} for post in request.POST: if post.startswith('net-'): network_data[post] = request.POST.get(post, '') conn.change_network(network_data) msg = _("Edit network") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#network') if 'add_owner' in request.POST: user_id = int(request.POST.get('user_id', '')) if settings.ALLOW_INSTANCE_MULTIPLE_OWNER: check_inst = UserInstance.objects.filter( instance=instance, user_id=user_id) else: check_inst = UserInstance.objects.filter( instance=instance) if check_inst: msg = _("Owner already added") error_messages.append(msg) else: add_user_inst = UserInstance(instance=instance, user_id=user_id) add_user_inst.save() msg = _("Added owner %d" % user_id) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#users') if 'del_owner' in request.POST: userinstance_id = int(request.POST.get('userinstance', '')) userinstance = UserInstance.objects.get(pk=userinstance_id) userinstance.delete() msg = _("Deleted owner %d" % userinstance_id) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#users') if request.user.is_superuser or request.user.userattributes.can_clone_instances: if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') disk_sum = sum([disk['size'] >> 30 for disk in disks]) quota_msg = check_user_quota(1, vcpu, memory, disk_sum) check_instance = Instance.objects.filter( name=clone_data['name']) for post in request.POST: clone_data[post] = request.POST.get(post, '').strip() if not request.user.is_superuser and quota_msg: msg = _("User %s quota reached, cannot create '%s'!" % (quota_msg, clone_data['name'])) error_messages.append(msg) elif check_instance: msg = _("Instance '%s' already exists!" % clone_data['name']) error_messages.append(msg) elif not re.match(r'^[a-zA-Z0-9-]+$', clone_data['name']): msg = _( "Instance name '%s' contains invalid characters!" % clone_data['name']) error_messages.append(msg) elif not re.match(r'^([0-9A-F]{2})(\:?[0-9A-F]{2}){5}$', clone_data['clone-net-mac-0'], re.IGNORECASE): msg = _("Instance mac '%s' invalid format!" % clone_data['clone-net-mac-0']) error_messages.append(msg) else: new_uuid = conn.clone_instance(clone_data) new_instance = Instance(compute_id=compute_id, name=clone_data['name'], uuid=new_uuid) new_instance.save() userinstance = UserInstance( instance_id=new_instance.id, user_id=request.user.id, is_delete=True) userinstance.save() msg = _("Clone of '%s'" % instance.name) addlogmsg(request.user.username, new_instance.name, msg) return HttpResponseRedirect( reverse('instance', args=[compute_id, clone_data['name']])) if 'change_options' in request.POST: instance.is_template = request.POST.get( 'is_template', False) instance.save() options = {} for post in request.POST: if post in ['title', 'description']: options[post] = request.POST.get(post, '') conn.set_options(options) msg = _("Edit options") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#options') conn.close() except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, vname, lib_err.message) return render(request, 'instance.html', locals())
def instances_fast(request, host_id): """ Instances block """ errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) except libvirtError as err: errors.append(err) if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'managedsave' in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as err: errors.append(err) get_instances = conn.get_instances() results = {} def query_machine(hostname): try: conn2 = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, hostname) results[hostname] = ({'name': hostname, #'status': conn.get_instance_status(instance), #'uuid': uuid, #'memory': conn.get_instance_memory(instance), 'description': conn2.get_description(), #'vcpu': conn.get_instance_vcpu(instance), #'storage': conn2.get_disk_device(), #'has_managed_save_image': conn.get_instance_managed_save_image(instance) }) conn2.close() except libvirtError: status = None pool = WorkerPool(min(len(get_instances), 20)) for hostname in get_instances: pool.add_task(query_machine, hostname) pool.run_tasks() for hostname in get_instances: instances.append(results[hostname]) object = { 'response': { 'instances': instances }, 'errors': [str(error) for error in errors] } return render(object, 'instances.html', locals(), request)
def instance(request, host_id, vname): """ Instance block """ def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'].count(".") and len(disk['image'].rsplit( ".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append({ 'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format'] }) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() vnc_port = conn.get_vnc_port() vnc_keymap = conn.get_vnc_keymap() vnc_password = conn.get_vnc_passwd() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) cpu_usage = conn.cpu_usage()['cpu'] except libvirtError as err: errors.append(err) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): print 'yeah' conn.delete_disk() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() finally: conn.delete() return HttpResponseRedirect('/%s/instances' % host_id) if 'assign_volume' in request.POST: file = request.POST.get('file', '') device = request.POST.get('device', '') conn.assign_volume(file, device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'unassign_volume' in request.POST: device = request.POST.get('device', '') conn.unassign_volume(device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'external_storage_snapshot' in request.POST: name = request.POST.get('name', '') conn.create_external_storage_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') first_cd = media[0]['dev'] if len( media) > 0 else request.POST.get('umount_iso', '') dev = request.POST.get('device', first_cd) conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') first_cd = media[0]['dev'] if len(media) > 0 else '' print first_cd dev = request.POST.get('device', first_cd) conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join( [choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') clear = request.POST.get('clear_pass', False) if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path() + '#vnc_pass') if 'set_vnc_keymap' in request.POST: keymap = request.POST.get('vnc_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_vnc_keymap('') else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#vnc_keymap') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/%s/instance/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect('/%s/instance/%s' % (host_id, clone_data['name'])) conn.close() except libvirtError as err: errors.append(err) object = { 'errors': [str(error) for error in errors], 'response': { 'name': vname, 'status': status, 'autostart': autostart, 'vcpu': vcpu, 'cur_vcpu': cur_vcpu, 'uuid': uuid, 'memory': memory, 'cur_memory': cur_memory, 'description': description, 'disks': disks, 'media': media, 'networks': networks, 'media_iso': media_iso, 'vcpu_range': vcpu_range.__len__(), 'memory_host': memory_host, 'vcpu_host': vcpu_host, 'telnet_port': telnet_port, 'vnc_port': vnc_port, 'vnc_keymap': vnc_keymap, 'snapshots': snapshots, 'inst_xml': inst_xml.__str__(), 'has_managed_save_image': has_managed_save_image, 'clone_disks': clone_disks, 'cpu_usage': cpu_usage, 'vnc_password': vnc_password } } return render(object, 'instance.html', locals(), request)
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect("/login") def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk["image"].count(".") and len(disk["image"].rsplit(".", 1)[1]) <= 7: name, suffix = disk["image"].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk["image"] + "-clone" clone_disk.append( {"dev": disk["dev"], "storage": disk["storage"], "image": image, "format": disk["format"]} ) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if not memory in memory_range: insort(memory_range, memory) if not cur_memory in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() vnc_port = conn.get_vnc_port() vnc_keymap = conn.get_vnc_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) vnc_passwd = conn.get_vnc_passwd() except libvirtError as err: errors.append(err) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == "POST": if "start" in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + "#shutdown") if "power" in request.POST: if "shutdown" == request.POST.get("power", ""): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + "#shutdown") if "destroy" == request.POST.get("power", ""): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + "#forceshutdown") if "managedsave" == request.POST.get("power", ""): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + "#managedsave") if "deletesaveimage" in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + "#managedsave") if "suspend" in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + "#suspend") if "resume" in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + "#suspend") if "delete" in request.POST: if conn.get_status() == 1: conn.force_shutdown() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() if request.POST.get("delete_disk", ""): conn.delete_disk() finally: conn.delete() return HttpResponseRedirect("/instances/%s/" % host_id) if "snapshot" in request.POST: name = request.POST.get("name", "") conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + "#istaceshapshosts") if "umount_iso" in request.POST: image = request.POST.get("path", "") dev = request.POST.get("umount_iso", "") conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + "#instancemedia") if "mount_iso" in request.POST: image = request.POST.get("media", "") dev = request.POST.get("mount_iso", "") conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + "#instancemedia") if "set_autostart" in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + "#instancesettings") if "unset_autostart" in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + "#instancesettings") if "change_settings" in request.POST: description = request.POST.get("description", "") vcpu = request.POST.get("vcpu", "") cur_vcpu = request.POST.get("cur_vcpu", "") memory = request.POST.get("memory", "") memory_custom = request.POST.get("memory_custom", "") if memory_custom: memory = memory_custom cur_memory = request.POST.get("cur_memory", "") cur_memory_custom = request.POST.get("cur_memory_custom", "") if cur_memory_custom: cur_memory = cur_memory_custom conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + "#instancesettings") if "change_xml" in request.POST: xml = request.POST.get("inst_xml", "") if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + "#instancexml") if "set_vnc_passwd" in request.POST: if request.POST.get("auto_pass", ""): passwd = "".join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get("vnc_passwd", "") clear = request.POST.get("clear_pass", False) if clear: passwd = "" if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path() + "#vnc_pass") if "set_vnc_keymap" in request.POST: keymap = request.POST.get("vnc_keymap", "") clear = request.POST.get("clear_keymap", False) if clear: conn.set_vnc_keymap("") else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + "#vnc_keymap") if "migrate" in request.POST: compute_id = request.POST.get("compute_id", "") live = request.POST.get("live_migrate", False) unsafe = request.POST.get("unsafe_migrate", False) xml_del = request.POST.get("xml_delete", False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances( new_compute.hostname, new_compute.login, new_compute.password, new_compute.type ) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect("/instance/%s/%s" % (compute_id, vname)) if "delete_snapshot" in request.POST: snap_name = request.POST.get("name", "") conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + "#istaceshapshosts") if "revert_snapshot" in request.POST: snap_name = request.POST.get("name", "") conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if "clone" in request.POST: clone_data = {} clone_data["name"] = request.POST.get("name", "") for post in request.POST: if "disk" or "meta" in post: clone_data[post] = request.POST.get(post, "") conn.clone_instance(clone_data) return HttpResponseRedirect("/instance/%s/%s" % (host_id, clone_data["name"])) conn.close() except libvirtError as err: errors.append(err) return render_to_response("instance.html", locals(), context_instance=RequestContext(request))
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect("/login") errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() instances.append( { "name": instance, "status": conn.get_instance_status(instance), "uuid": uuid, "memory": conn.get_instance_memory(instance), "vcpu": conn.get_instance_vcpu(instance), "has_managed_save_image": conn.get_instance_managed_save_image(instance), } ) if conn: try: if request.method == "POST": name = request.POST.get("name", "") if "start" in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if "shutdown" in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if "destroy" in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if "managedsave" in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if "deletesaveimage" in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if "suspend" in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if "resume" in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as err: errors.append(err) return render_to_response("instances.html", locals(), context_instance=RequestContext(request))
def instances(request): """ :param request: :return: """ error_messages = [] all_host_vms = {} all_user_vms = {} computes = Compute.objects.all() if not request.user.is_superuser: user_instances = UserInstance.objects.filter(user_id=request.user.id) for usr_inst in user_instances: if connection_manager.host_is_up(usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmHostDetails(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type) all_user_vms[usr_inst] = conn.get_user_instances(usr_inst.instance.name) all_user_vms[usr_inst].update({'compute_id': usr_inst.instance.compute.id}) else: for comp in computes: if connection_manager.host_is_up(comp.type, comp.hostname): try: conn = wvmHostDetails(comp, comp.login, comp.password, comp.type) if conn.get_host_instances(): all_host_vms[comp.id, comp.name] = conn.get_host_instances() for vm, info in conn.get_host_instances().items(): try: check_uuid = Instance.objects.get(compute_id=comp.id, name=vm) if check_uuid.uuid != info['uuid']: check_uuid.save() all_host_vms[comp.id, comp.name][vm]['is_template'] = check_uuid.is_template except Instance.DoesNotExist: check_uuid = Instance(compute_id=comp.id, name=vm, uuid=info['uuid']) check_uuid.save() conn.close() except libvirtError as lib_err: error_messages.append(lib_err) if request.method == 'POST': name = request.POST.get('name', '') compute_id = request.POST.get('compute_id', '') instance = Instance.objects.get(compute_id=compute_id, name=name) try: conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if 'poweron' in request.POST: msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'poweroff' in request.POST: msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'powercycle' in request.POST: msg = _("Power Cycle") conn.force_shutdown(name) conn.start(name) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path()) if 'getvvfile' in request.POST: msg = _("Send console.vv file") addlogmsg(request.user.username, instance.name, msg) response = HttpResponse(content='', content_type='application/x-virt-viewer', status=200, reason=None, charset='utf-8') response.writelines('[virt-viewer]\n') response.writelines('type=' + conn.graphics_type(name) + '\n') response.writelines('host=' + conn.graphics_listen(name) + '\n') response.writelines('port=' + conn.graphics_port(name) + '\n') response.writelines('title=' + conn.domain_name(name) + '\n') response.writelines('password='******'\n') response.writelines('enable-usbredir=1\n') response.writelines('disable-effects=all\n') response.writelines('secure-attention=ctrl+alt+ins\n') response.writelines('release-cursor=ctrl+alt\n') response.writelines('fullscreen=1\n') response.writelines('delete-this-file=1\n') response['Content-Disposition'] = 'attachment; filename="console.vv"' return response if request.user.is_superuser: if 'suspend' in request.POST: msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) conn.resume(name) return HttpResponseRedirect(request.get_full_path()) except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, instance.name, lib_err.message) return render(request, 'instances.html', locals())
def instance(request, compute_id, vname): """ :param request: :return: """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('index')) error_messages = [] messages = [] compute = get_object_or_404(Compute, pk=compute_id) computes = Compute.objects.all() computes_count = len(computes) publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: userinstace = UserInstance.objects.get(instance__compute_id=compute_id, instance__name=vname, user__id=request.user.id) except UserInstance.DoesNotExist: userinstace = None if not request.user.is_superuser: if not userinstace: return HttpResponseRedirect(reverse('index')) def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count(".") and len(disk['image'].rsplit( ".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append({ 'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format'] }) return clone_disk try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) console_passwd = conn.get_console_passwd() try: instance = Instance.objects.get(compute_id=compute_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=compute_id, name=vname, uuid=uuid) instance.save() if request.method == 'POST': if 'poweron' in request.POST: conn.start() msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweron') if 'powercycle' in request.POST: conn.force_shutdown() conn.start() msg = _("Power Cycle") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powercycle') if 'poweroff' in request.POST: conn.shutdown() msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweroff') if 'powerforce' in request.POST: conn.force_shutdown() msg = _("Force Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powerforce') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) instance_name = instance.name instance.delete() if not request.user.is_superuser: del_userinstance = UserInstance.objects.get( id=userinstace.id) del_userinstance.delete() else: try: del_userinstance = UserInstance.objects.filter( instance__compute_id=compute_id, instance__name=vname) del_userinstance.delete() except UserInstance.DoesNotExist: pass msg = _("Destroy") addlogmsg(request.user.username, instance_name, msg) return HttpResponseRedirect(reverse('instances')) if 'rootpasswd' in request.POST: passwd = request.POST.get('passwd', '') passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy') data = { 'action': 'password', 'passwd': passwd_hash, 'vname': vname } if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _( "Please shutdow down your instance and then try again") error_messages.append(msg) if 'addpublickey' in request.POST: sshkeyid = request.POST.get('sshkeyid', '') publickey = UserSSHKey.objects.get(id=sshkeyid) data = { 'action': 'publickey', 'key': publickey.keypublic, 'vname': vname } if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Installed new ssh public key %s" % publickey.keyname) addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _( "Please shutdow down your instance and then try again") error_messages.append(msg) if 'resize' in request.POST: vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') memory_custom = request.POST.get('memory_custom', '') if memory_custom: memory = memory_custom cur_memory = request.POST.get('cur_memory', '') cur_memory_custom = request.POST.get('cur_memory_custom', '') if cur_memory_custom: cur_memory = cur_memory_custom conn.resize(cur_memory, memory, cur_vcpu, vcpu) msg = _("Resize") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) msg = _("Mount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) msg = _("Umount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("New snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) msg = _("Delete snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) msg = _("Revert snapshot") addlogmsg(request.user.username, instance.name, msg) if request.user.is_superuser: if 'suspend' in request.POST: conn.suspend() msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resume') if 'resume' in request.POST: conn.resume() msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'set_autostart' in request.POST: conn.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'unset_autostart' in request.POST: conn.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'change_xml' in request.POST: exit_xml = request.POST.get('inst_xml', '') if exit_xml: conn._defineXML(exit_xml) msg = _("Edit XML") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#xmledit') if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join( [choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _( "Enter the console password or select Generate" ) error_messages.append(msg) if not error_messages: if not conn.set_console_passwd(passwd): msg = _( "Error setting console password. You should check that your instance have an graphic device." ) error_messages.append(msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect( request.get_full_path() + '#vncsettings') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) msg = _("Set VNC keymap") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() msg = _("Migrate") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect( reverse('instance', args=[compute_id, vname])) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) msg = _("Clone") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect( reverse('instance', args=[compute_id, clone_data['name']])) conn.close() except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, vname, lib_err.message) return render(request, 'instance.html', locals())
def instance(request, host_id, vname): errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) except libvirtError as err: errors.append(err) try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'shutdown' in request.POST: conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' in request.POST: conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' in request.POST: conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() conn.delete() return HttpResponseRedirect('/%s/instances' % host_id) if 'assign_volume' in request.POST: file = request.POST.get('file', '') device = request.POST.get('device', '') conn.assign_volume(file, device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'unassign_volume' in request.POST: device = request.POST.get('device', '') conn.unassign_volume(device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'external_storage_snapshot' in request.POST: name = request.POST.get('name', '') conn.create_external_storage_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') media = conn.get_media_device() first_cd = media[0]['dev'] if len(media) > 0 else request.POST.get('umount_iso', '') dev = request.POST.get('device', first_cd) conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') media = conn.get_media_device() first_cd = media[0]['dev'] if len(media) > 0 else '' dev = request.POST.get('device', first_cd) conn.mount_iso(dev, image) # return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') clear = request.POST.get('clear_pass', False) if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path() + '#vnc_pass') if 'set_vnc_keymap' in request.POST: keymap = request.POST.get('vnc_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_vnc_keymap('') else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#vnc_keymap') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/%s/instance/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect('/%s/instance/%s' % (host_id, clone_data['name'])) conn.close() except libvirtError as err: errors.append(err) params = { 'status': 'get_status', 'vcpu': 'get_vcpu', 'cur_vcpu': 'get_cur_vcpu', 'uuid': 'get_uuid', 'memory': 'get_memory', 'cur_memory': 'get_cur_memory', 'description': 'get_description', 'disks': 'get_disk_device', 'media': 'get_media_device', 'vcpu_range': 'get_max_cpus', 'max_memory': 'get_max_memory', 'vnc_port': 'get_vnc_port', 'vnc_keymap': 'get_vnc_keymap', 'vnc_passwd': 'get_vnc_passwd', } object = {} def get_param(param, tocall): object[param] = getattr(conn, tocall)() mypool = WorkerPool(5) for param in params: mypool.add_task(get_param, param, params[param]) mypool.run_tasks() # status = conn.get_status() status = object['status'] autostart = 0 #conn.get_autostart() # vcpu = conn.get_vcpu() vcpu = object['vcpu'] # cur_vcpu = conn.get_cur_vcpu() cur_vcpu = object['cur_vcpu'] # uuid = conn.get_uuid() uuid = object['uuid'] # memory = conn.get_memory() memory = object['memory'] # cur_memory = conn.get_cur_memory() cur_memory = object['cur_memory'] # description = conn.get_description() description = object['description'] # disks = conn.get_disk_device() disks = object['disks'] # media = conn.get_media_device() media = object['media'] networks = 0#conn.get_net_device() media_iso = []#sorted(conn.get_iso_media()) # vcpu_range = conn.get_max_cpus() vcpu_range = object['vcpu_range'] memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] # memory_host = conn.get_max_memory() memory_host = object['max_memory'] vcpu_host = len(vcpu_range) telnet_port = 0#conn.get_telnet_port() # vnc_port = conn.get_vnc_port() vnc_port = object['vnc_port'] # vnc_keymap = conn.get_vnc_keymap() vnc_keymap = object['vnc_keymap'] vnc_password = object['vnc_passwd'] snapshots = []#sorted(conn.get_snapshot(), reverse=True) inst_xml = ''#conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = 0#conn.get_managed_save_image() clone_disks = []#show_clone_disk(disks) cpu_usage = conn.raw_cpu_usage() responseObject = { 'name': vname, 'status': status, 'autostart': autostart, 'vcpu': vcpu, 'cur_vcpu': cur_vcpu, 'uuid': uuid, 'memory': memory, 'cur_memory': cur_memory, 'description': description, 'disks': disks, 'media': media, 'networks': networks, 'media_iso': media_iso, 'vcpu_range': vcpu_range.__len__(), 'memory_host': memory_host, 'vcpu_host': vcpu_host, 'telnet_port': telnet_port, 'vnc_port': vnc_port, 'vnc_keymap': vnc_keymap, 'snapshots': snapshots, 'inst_xml': inst_xml.__str__(), 'has_managed_save_image': has_managed_save_image, 'clone_disks': clone_disks, 'cpu_usage': cpu_usage, 'vnc_password': vnc_password } try: responseObject['mac_address'] = conn.desc()['domain']['devices']['interface']['mac']['@address'] except: pass object = { 'errors': [str(error) for error in errors], 'response': responseObject } return render(object, 'instance.html', locals(), request)
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH * 3 compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname, compute.hypervisor) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() networks = conn.get_net_device() vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) if compute.hypervisor == 'qemu': snapshots = sorted(conn.get_snapshot(), reverse=True) has_managed_save_image = conn.get_managed_save_image() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() console_passwd = conn.get_console_passwd() media_iso = sorted(conn.get_iso_media()) media = conn.get_media_device() disks = conn.get_disk_device() clone_disks = show_clone_disk(disks) if compute.hypervisor == 'lxc': fslist=[] disks=[] vm = conn.get_instance(vname) root = ET.fromstring(vm.XMLDesc()) filesystem = root.find('devices').findall('filesystem') for fs in list(filesystem): for child in fs: fslist.append(child.attrib) rootimg = fslist[0]['dir'].split('/')[2]+'.img' disks.append({'mount':'/','image':rootimg}) fslist = fslist[2:] tmp = 0 while tmp<len(fslist): disks.append({'mount':fslist[tmp+1]['dir'],'image':fslist[tmp]['file'].split('/')[2]}) tmp+=2 hypervisor = compute.hypervisor except libvirtError as err: errors.append(err) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() acl = Instance.objects.get(compute_id=host_id, name=vname).acl if request.user not in acl.all() and not request.user.is_staff: raise PermissionDenied try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() if request.POST.get('delete_disk', ''): conn.delete_disk() finally: conn.delete() return HttpResponseRedirect(reverse('instances', args=[host_id])) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') if int(cur_vcpu) > int(vcpu): vcpu = cur_vcpu memory = request.POST.get('memory', '') memory_custom = request.POST.get('memory_custom', '') if memory_custom: memory = memory_custom cur_memory = request.POST.get('cur_memory', '') cur_memory_custom = request.POST.get('cur_memory_custom', '') if cur_memory_custom: cur_memory = cur_memory_custom if int(cur_memory) > int(memory): memory = cur_memory conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _("Enter the console password or select Generate") errors.append(msg) if not errors: if not conn.set_console_passwd(passwd): msg = _("Error setting console password. You should check that your instance have an graphic device.") errors.append(msg) else: return HttpResponseRedirect(request.get_full_path() + '#console_pass') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#console_keymap') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) return HttpResponseRedirect(request.get_full_path() + '#console_type') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type, new_compute.hypervisor) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect(reverse('instance', args=[compute_id, vname])) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect(reverse('instance', args=[host_id, clone_data['name']])) conn.close() except libvirtError as err: errors.append(err) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))
def instance(request, compute_id, vname): """ :param request: :return: """ error_messages = [] messages = [] compute = get_object_or_404(Compute, pk=compute_id) computes = Compute.objects.all() computes_count = len(computes) publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: userinstace = UserInstance.objects.get( instance__compute_id=compute_id, instance__name=vname, user__id=request.user.id ) except UserInstance.DoesNotExist: userinstace = None if not request.user.is_superuser: if not userinstace: return HttpResponseRedirect(reverse("index")) def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk["image"] is None: continue if disk["image"].count(".") and len(disk["image"].rsplit(".", 1)[1]) <= 7: name, suffix = disk["image"].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk["image"] + "-clone" clone_disk.append( {"dev": disk["dev"], "storage": disk["storage"], "image": image, "format": disk["format"]} ) return clone_disk def filesizefstr(size_str): if size_str == "": return 0 size_str = size_str.encode("ascii", "ignore").upper().translate(None, " B") if "K" == size_str[-1]: return long(float(size_str[:-1])) << 10 elif "M" == size_str[-1]: return long(float(size_str[:-1])) << 20 elif "G" == size_str[-1]: return long(float(size_str[:-1])) << 30 elif "T" == size_str[-1]: return long(float(size_str[:-1])) << 40 elif "P" == size_str[-1]: return long(float(size_str[:-1])) << 50 else: return long(float(size_str)) try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) console_passwd = conn.get_console_passwd() try: instance = Instance.objects.get(compute_id=compute_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=compute_id, name=vname, uuid=uuid) instance.save() if request.method == "POST": if "poweron" in request.POST: conn.start() msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#poweron") if "powercycle" in request.POST: conn.force_shutdown() conn.start() msg = _("Power Cycle") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#powercycle") if "poweroff" in request.POST: conn.shutdown() msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#poweroff") if "powerforce" in request.POST: conn.force_shutdown() msg = _("Force Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#powerforce") if "delete" in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get("delete_disk", ""): conn.delete_disk() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) instance_name = instance.name instance.delete() if not request.user.is_superuser: del_userinstance = UserInstance.objects.get(id=userinstace.id) del_userinstance.delete() else: try: del_userinstance = UserInstance.objects.filter( instance__compute_id=compute_id, instance__name=vname ) del_userinstance.delete() except UserInstance.DoesNotExist: pass msg = _("Destroy") addlogmsg(request.user.username, instance_name, msg) return HttpResponseRedirect(reverse("instances")) if "rootpasswd" in request.POST: passwd = request.POST.get("passwd", "") passwd_hash = crypt.crypt(passwd, "$6$kgPoiREy") data = {"action": "password", "passwd": passwd_hash, "vname": vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) if result["return"] == "success": messages.append(msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if "addpublickey" in request.POST: sshkeyid = request.POST.get("sshkeyid", "") publickey = UserSSHKey.objects.get(id=sshkeyid) data = {"action": "publickey", "key": publickey.keypublic, "vname": vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Installed new ssh public key %s" % publickey.keyname) addlogmsg(request.user.username, instance.name, msg) if result["return"] == "success": messages.append(msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if "resize" in request.POST: vcpu = request.POST.get("vcpu", "") cur_vcpu = request.POST.get("cur_vcpu", "") memory = request.POST.get("memory", "") memory_custom = request.POST.get("memory_custom", "") if memory_custom: memory = memory_custom cur_memory = request.POST.get("cur_memory", "") cur_memory_custom = request.POST.get("cur_memory_custom", "") if cur_memory_custom: cur_memory = cur_memory_custom disks_new = [] for disk in disks: input_disk_size = filesizefstr(request.POST.get("disk_size_" + disk["dev"], "")) if input_disk_size > disk["size"] + (64 << 20): disk["size_new"] = input_disk_size disks_new.append(disk) conn.resize(cur_memory, memory, cur_vcpu, vcpu, disks_new) msg = _("Resize") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#resize") if "umount_iso" in request.POST: image = request.POST.get("path", "") dev = request.POST.get("umount_iso", "") conn.umount_iso(dev, image) msg = _("Mount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#media") if "mount_iso" in request.POST: image = request.POST.get("media", "") dev = request.POST.get("mount_iso", "") conn.mount_iso(dev, image) msg = _("Umount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#media") if "snapshot" in request.POST: name = request.POST.get("name", "") conn.create_snapshot(name) msg = _("New snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#restoresnapshot") if "delete_snapshot" in request.POST: snap_name = request.POST.get("name", "") conn.snapshot_delete(snap_name) msg = _("Delete snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#restoresnapshot") if "revert_snapshot" in request.POST: snap_name = request.POST.get("name", "") conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) msg = _("Revert snapshot") addlogmsg(request.user.username, instance.name, msg) if request.user.is_superuser: if "suspend" in request.POST: conn.suspend() msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#resume") if "resume" in request.POST: conn.resume() msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#suspend") if "set_autostart" in request.POST: conn.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#autostart") if "unset_autostart" in request.POST: conn.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#autostart") if "change_xml" in request.POST: exit_xml = request.POST.get("inst_xml", "") if exit_xml: conn._defineXML(exit_xml) msg = _("Edit XML") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#xmledit") if "set_console_passwd" in request.POST: if request.POST.get("auto_pass", ""): passwd = "".join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get("console_passwd", "") clear = request.POST.get("clear_pass", False) if clear: passwd = "" if not passwd and not clear: msg = _("Enter the console password or select Generate") error_messages.append(msg) if not error_messages: if not conn.set_console_passwd(passwd): msg = _( "Error setting console password. You should check that your instance have an graphic device." ) error_messages.append(msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#vncsettings") if "set_console_keymap" in request.POST: keymap = request.POST.get("console_keymap", "") clear = request.POST.get("clear_keymap", False) if clear: conn.set_console_keymap("") else: conn.set_console_keymap(keymap) msg = _("Set VNC keymap") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#vncsettings") if "set_console_type" in request.POST: console_type = request.POST.get("console_type", "") conn.set_console_type(console_type) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + "#vncsettings") if "migrate" in request.POST: compute_id = request.POST.get("compute_id", "") live = request.POST.get("live_migrate", False) unsafe = request.POST.get("unsafe_migrate", False) xml_del = request.POST.get("xml_delete", False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances( new_compute.hostname, new_compute.login, new_compute.password, new_compute.type ) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() msg = _("Migrate") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(reverse("instance", args=[compute_id, vname])) if "clone" in request.POST: clone_data = {} clone_data["name"] = request.POST.get("name", "") for post in request.POST: if "disk" or "meta" in post: clone_data[post] = request.POST.get(post, "") conn.clone_instance(clone_data) msg = _("Clone") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(reverse("instance", args=[compute_id, clone_data["name"]])) conn.close() except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, vname, lib_err.message) return render(request, "instance.html", locals())
def instances(request, host_id): """ Instances block """ errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() conn2 = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, instance) instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'storage': conn2.get_disk_device(), 'has_managed_save_image': conn.get_instance_managed_save_image(instance)}) conn2.close() if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'managedsave' in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as err: errors.append(err) object = { 'response': { 'instances': instances }, 'errors': [str(error) for error in errors] } return render(object, 'instances.html', locals(), request)
def instances(request): """ :param request: :return: """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('index')) error_messages = [] all_host_vms = {} all_user_vms = {} computes = Compute.objects.all() if not request.user.is_superuser: user_instances = UserInstance.objects.filter(user_id=request.user.id) for usr_inst in user_instances: if connection_manager.host_is_up( usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmHostDetails(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type) all_user_vms[usr_inst] = conn.get_user_instances( usr_inst.instance.name) all_user_vms[usr_inst].update( {'compute_id': usr_inst.instance.compute.id}) else: for comp in computes: if connection_manager.host_is_up(comp.type, comp.hostname): try: conn = wvmHostDetails(comp, comp.login, comp.password, comp.type) if conn.get_host_instances(): all_host_vms[comp.id, comp.name] = conn.get_host_instances() for vm, info in conn.get_host_instances().items(): try: check_uuid = Instance.objects.get( compute_id=comp.id, name=vm) if check_uuid.uuid != info['uuid']: check_uuid.save() except Instance.DoesNotExist: check_uuid = Instance(compute_id=comp.id, name=vm, uuid=info['uuid']) check_uuid.save() conn.close() except libvirtError as lib_err: error_messages.append(lib_err) if request.method == 'POST': name = request.POST.get('name', '') compute_id = request.POST.get('compute_id', '') instance = Instance.objects.get(compute_id=compute_id, name=name) try: conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if 'poweron' in request.POST: msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'poweroff' in request.POST: msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'powercycle' in request.POST: msg = _("Power Cycle") conn.force_shutdown(name) conn.start(name) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path()) if 'getvvfile' in request.POST: msg = _("Send console.vv file") addlogmsg(request.user.username, instance.name, msg) response = HttpResponse( content='', content_type='application/x-virt-viewer', status=200, reason=None, charset='utf-8') response.writelines('[virt-viewer]\n') response.writelines('type=' + conn.graphics_type(name) + '\n') response.writelines('host=' + conn.graphics_listen(name) + '\n') response.writelines('port=' + conn.graphics_port(name) + '\n') response.writelines('title=' + conn.domain_name(name) + '\n') response.writelines('password='******'\n') response.writelines('enable-usbredir=1\n') response.writelines('disable-effects=all\n') response.writelines('secure-attention=ctrl+alt+ins\n') response.writelines('release-cursor=ctrl+alt\n') response.writelines('fullscreen=1\n') response.writelines('delete-this-file=1\n') response[ 'Content-Disposition'] = 'attachment; filename="console.vv"' return response if request.user.is_superuser: if 'suspend' in request.POST: msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) conn.resume(name) return HttpResponseRedirect(request.get_full_path()) except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, instance.name, lib_err.message) return render(request, 'instances.html', locals())
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH * 3 compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) console_passwd = conn.get_console_passwd() try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'pmwakeup' in request.POST: conn.pMWakeup() return HttpResponseRedirect(request.get_full_path() + '#pmwakeup') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() if request.POST.get('delete_disk', ''): conn.delete_disk() finally: conn.delete() return HttpResponseRedirect(reverse('instances', args=[host_id])) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'add_cdrom' in request.POST: conn.add_cdrom() return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') memory_custom = request.POST.get('memory_custom', '') if memory_custom: memory = memory_custom cur_memory = request.POST.get('cur_memory', '') cur_memory_custom = request.POST.get('cur_memory_custom', '') if cur_memory_custom: cur_memory = cur_memory_custom conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _("Enter the console password or select Generate") errors.append(msg) if not errors: if not conn.set_console_passwd(passwd): msg = _("Error setting console password. You should check that your instance have an graphic device.") errors.append(msg) else: return HttpResponseRedirect(request.get_full_path() + '#console_pass') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#console_keymap') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) return HttpResponseRedirect(request.get_full_path() + '#console_type') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect(reverse('instance', args=[compute_id, vname])) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect(reverse('instance', args=[host_id, clone_data['name']])) conn.close() except libvirtError as err: errors.append(err) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))
def get_hosts_status(hosts): """ Function return all hosts all vds on host """ all_hosts = [] flag = 0 for host in hosts: # instances errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None all_hosts.append({ 'id': host.id, 'name': host.name, 'hostname': host.hostname, 'status': connection_manager.host_is_up(host.type, host.hostname), 'type': host.type, 'login': host.login, 'password': host.password, 'instances': instances }) compute = Compute.objects.get(id=host.id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host.id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host.id, name=instance, uuid=uuid) inst.save() all_hosts[flag]['instances'].append({ 'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'has_managed_save_image': conn.get_instance_managed_save_image(instance) }) flag = flag + 1 return all_hosts
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH * 3 compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) conn_interfaces = wvmInterfaces(compute.hostname, compute.login, compute.password, compute.type) ifaces = conn_interfaces.get_ifaces() i = 0 ifaces_all = util.get_free_vfs() ifaces_all = sorted(ifaces_all.iteritems(),key=lambda ax:ax[0]) print ifaces_all temp_ifaces = [] hd_resources = [] hd_resources_checked = conn.get_hd_resources_device() if os.path.exists(util.get_hd_resources_conf()): hd_resources = util.load_hd_resources() for vf_filter in hd_resources.keys(): if vf_filter == "mem" or vf_filter == "vcpu": continue if hd_resources[vf_filter]['used'] == 1: del hd_resources[vf_filter] else: hd_resources = util.create_hd_resources() vcpu_left = hd_resources["vcpu"] mem_left = hd_resources["mem"] del hd_resources["vcpu"] del hd_resources["mem"] is_vf = False status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() hd_resources_checked = conn.get_hd_resources_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() vcpu_max = vcpu_range vcpu_range = xrange(1, int(vcpu_left) + 1) memory_range = [2048, 4096, 6144, 8192, 16384] memory_range = [ memory for memory in memory_range if memory/1024 <= mem_left ] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_max) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) console_passwd = conn.get_console_passwd() vf_infos = util.get_pfvf_map(vname) if not vf_infos: vf_infos = { "test_pf1":[("vf1",'1.0.21'),('vf2','1.0.22')], "test_pf2":[("vf2",'1.0.31'),("vf3",'1.0.32')], "test_pf3":[("vf3",'1.0.41'),("vf5",'1.0.42')], } try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() conn.delete_disk() hd_resources_all = util.load_hd_resources() for vf in hd_resources_checked: hd_resources_all[vf]['used'] = 0 hd_resources_all["vcpu"] = int(hd_resources_all["vcpu"]) + vcpu hd_resources_all["mem"] = int(hd_resources_all["mem"]) + cur_memory / 1024 util.save_hd_resources(hd_resources_all) finally: conn.delete() return HttpResponseRedirect(reverse('instances', args=[host_id])) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') cur_vcpu_original = vcpu cur_mem_original = cur_memory vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') memory_custom = request.POST.get('memory_custom', '') if memory_custom: memory = memory_custom cur_memory = request.POST.get('cur_memory', '') cur_memory_custom = request.POST.get('cur_memory_custom', '') hd_resources_set = request.POST.getlist("ethx") if cur_memory_custom: cur_memory = cur_memory_custom conn.change_settings(description, cur_memory, cur_memory, cur_vcpu, cur_vcpu, hd_resources_set) hd_resources_all = util.load_hd_resources() for vf in hd_resources_checked: if vf not in hd_resources_set: hd_resources_all[vf]['used'] = 0 for vf in hd_resources_set: hd_resources_all[vf]['used'] = 1 hd_resources_all["vcpu"] = int(hd_resources_all["vcpu"]) - int(cur_vcpu) + cur_vcpu_original hd_resources_all["mem"] = (int(hd_resources_all["mem"]) * 1024 - int(cur_memory)) / 1024 + int(cur_mem_original)/1024 util.save_hd_resources(hd_resources_all) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _("Enter the console password or select Generate") errors.append(msg) if not errors: if not conn.set_console_passwd(passwd): msg = _("Error setting console password. You should check that your instance have an graphic device.") errors.append(msg) else: return HttpResponseRedirect(request.get_full_path() + '#console_pass') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#console_keymap') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) return HttpResponseRedirect(request.get_full_path() + '#console_type') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect(reverse('instance', args=[compute_id, vname])) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect(reverse('instance', args=[host_id, clone_data['name']])) if 'add_vf' in request.POST: from django.utils.translation import ugettext as _ count_vf = 0 for pf,vfs in vf_infos.items(): for vf in vfs: count_vf = count_vf+1 cnt_max = settings.vf_cnt_max if count_vf>cnt_max: errors.append(_("One instance has amount max VF is:")+str(cnt_max)) return render_to_response('instance.html', locals(), context_instance=RequestContext(request)) vf_data = request.POST.getlist('interfaces') if (len(vf_data)+count_vf)>cnt_max: errors.append(_("One instance has amount max VF is:")+str(cnt_max)) return render_to_response('instance.html', locals(), context_instance=RequestContext(request)) inst_xml = conn.change_nics_settings(True, vf_data) vf_infos = util.get_pfvf_map(vname) if not vf_infos: vf_infos = { "test_pf1":[("vf1",'1.0.21'),('vf2','1.0.22')], "test_pf2":[("vf2",'1.0.31'),("vf3",'1.0.32')], "test_pf3":[("vf3",'1.0.41'),("vf5",'1.0.42')], } return HttpResponseRedirect('/instance/%s/%s'%(host_id,vname)) if 'del_vf' in request.POST: del_vf_id = request.POST.get('vf_id', '') count_vf = 0 for pf,vfs in vf_infos.items(): for vf in vfs: count_vf = count_vf+1 if count_vf == 1: errors.append(_("It is the last Vf. Can't delete !")) return render_to_response('instance.html', locals(), context_instance=RequestContext(request)) inst_xml = conn.change_nics_settings(False, [del_vf_id]) vf_infos = util.get_pfvf_map(vname) is_vf = True if not vf_infos: vf_infos = { "test_pf1":[("vf1",'1.0.21'),('vf2','1.0.22')], "test_pf2":[("vf2",'1.0.31'),("vf3",'1.0.32')], "test_pf3":[("vf3",'1.0.41'),("vf5",'1.0.42')], } return HttpResponseRedirect('/instance/%s/%s'%(host_id,vname)) conn.close() except libvirtError as err: errors.append(err) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))
def instances(request, host_id): """ Instances block """ errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) except libvirtError as err: errors.append(err) if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'managedsave' in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as err: errors.append(err) get_instances = conn.get_instances() for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() conn2 = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, instance) instances.append({ 'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'description': conn2.get_description(), 'vcpu': conn.get_instance_vcpu(instance), 'storage': conn2.get_disk_device(), 'has_managed_save_image': conn.get_instance_managed_save_image(instance) }) conn2.close() object = { 'response': { 'instances': instances }, 'errors': [str(error) for error in errors] } return render(object, 'instances.html', locals(), request)
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'has_managed_save_image': conn.get_instance_managed_save_image(instance)}) if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'init' in request.POST: # print(inst) inst=request.POST.get('name') vmip=str(inst).split('-')[2] varch=str(inst).split('-')[1] vos=str(inst).split('-')[0] arch1=varch.split('_')[1] kvmip=Compute.objects.get(id=host_id) result=Network.objects.filter(ipaddr=vmip).values('netmask','gateway') if len(result) >0: kwargs={ 'ip':'%s' % kvmip, 'port':22, 'user':'******', 'vmip':vmip, 'os':vos[:6], 'version':vos[6:], 'arch':arch1, 'vmnetmask':result[0]['netmask'], 'vmgateway':result[0]['gateway'], } remote.ServerConn(**kwargs).init_vm() remote.ServerConn(**kwargs).template_vm() remote.ServerConn(**kwargs).setting_vm() remote.ServerConn(**kwargs).start_vm() else: msg='数据库内容为空,请检查程序' return HttpResponse(msg) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as err: errors.append(err) return render_to_response('instances.html', locals(), context_instance=RequestContext(request))
def instance(request, host_id, vname): errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) except libvirtError as err: errors.append(err) try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'shutdown' in request.POST: conn.shutdown() return HttpResponseRedirect(request.get_full_path() + '#shutdown') if 'destroy' in request.POST: conn.force_shutdown() return HttpResponseRedirect(request.get_full_path() + '#forceshutdown') if 'managedsave' in request.POST: conn.managedsave() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path() + '#managedsave') if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() conn.delete() return HttpResponseRedirect('/%s/instances' % host_id) if 'assign_volume' in request.POST: file = request.POST.get('file', '') device = request.POST.get('device', '') conn.assign_volume(file, device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'unassign_volume' in request.POST: device = request.POST.get('device', '') conn.unassign_volume(device) return HttpResponseRedirect(request.get_full_path() + '#instancedevice') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'external_storage_snapshot' in request.POST: name = request.POST.get('name', '') conn.create_external_storage_snapshot(name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'umount_iso' in request.POST: image = request.POST.get('path', '') media = conn.get_media_device() first_cd = media[0]['dev'] if len( media) > 0 else request.POST.get('umount_iso', '') dev = request.POST.get('device', first_cd) conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'mount_iso' in request.POST: image = request.POST.get('media', '') media = conn.get_media_device() first_cd = media[0]['dev'] if len(media) > 0 else '' dev = request.POST.get('device', first_cd) conn.mount_iso(dev, image) # return HttpResponseRedirect(request.get_full_path() + '#instancemedia') if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path() + '#instancesettings') if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path() + '#instancexml') if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join( [choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') clear = request.POST.get('clear_pass', False) if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path() + '#vnc_pass') if 'set_vnc_keymap' in request.POST: keymap = request.POST.get('vnc_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_vnc_keymap('') else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path() + '#vnc_keymap') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/%s/instance/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' or 'meta' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect('/%s/instance/%s' % (host_id, clone_data['name'])) conn.close() except libvirtError as err: errors.append(err) params = { 'status': 'get_status', 'vcpu': 'get_vcpu', 'cur_vcpu': 'get_cur_vcpu', 'uuid': 'get_uuid', 'memory': 'get_memory', 'cur_memory': 'get_cur_memory', 'description': 'get_description', 'disks': 'get_disk_device', 'media': 'get_media_device', 'vcpu_range': 'get_max_cpus', 'max_memory': 'get_max_memory', 'vnc_port': 'get_vnc_port', 'vnc_keymap': 'get_vnc_keymap', 'vnc_passwd': 'get_vnc_passwd', } object = {} def get_param(param, tocall): object[param] = getattr(conn, tocall)() mypool = WorkerPool(5) for param in params: mypool.add_task(get_param, param, params[param]) mypool.run_tasks() # status = conn.get_status() status = object['status'] autostart = 0 #conn.get_autostart() # vcpu = conn.get_vcpu() vcpu = object['vcpu'] # cur_vcpu = conn.get_cur_vcpu() cur_vcpu = object['cur_vcpu'] # uuid = conn.get_uuid() uuid = object['uuid'] # memory = conn.get_memory() memory = object['memory'] # cur_memory = conn.get_cur_memory() cur_memory = object['cur_memory'] # description = conn.get_description() description = object['description'] # disks = conn.get_disk_device() disks = object['disks'] # media = conn.get_media_device() media = object['media'] networks = 0 #conn.get_net_device() media_iso = [] #sorted(conn.get_iso_media()) # vcpu_range = conn.get_max_cpus() vcpu_range = object['vcpu_range'] memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] # memory_host = conn.get_max_memory() memory_host = object['max_memory'] vcpu_host = len(vcpu_range) telnet_port = 0 #conn.get_telnet_port() # vnc_port = conn.get_vnc_port() vnc_port = object['vnc_port'] # vnc_keymap = conn.get_vnc_keymap() vnc_keymap = object['vnc_keymap'] vnc_password = object['vnc_passwd'] snapshots = [] #sorted(conn.get_snapshot(), reverse=True) inst_xml = '' #conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = 0 #conn.get_managed_save_image() clone_disks = [] #show_clone_disk(disks) cpu_usage = conn.raw_cpu_usage() responseObject = { 'name': vname, 'status': status, 'autostart': autostart, 'vcpu': vcpu, 'cur_vcpu': cur_vcpu, 'uuid': uuid, 'memory': memory, 'cur_memory': cur_memory, 'description': description, 'disks': disks, 'media': media, 'networks': networks, 'media_iso': media_iso, 'vcpu_range': vcpu_range.__len__(), 'memory_host': memory_host, 'vcpu_host': vcpu_host, 'telnet_port': telnet_port, 'vnc_port': vnc_port, 'vnc_keymap': vnc_keymap, 'snapshots': snapshots, 'inst_xml': inst_xml.__str__(), 'has_managed_save_image': has_managed_save_image, 'clone_disks': clone_disks, 'cpu_usage': cpu_usage, 'vnc_password': vnc_password } try: responseObject['mac_address'] = conn.desc( )['domain']['devices']['interface']['mac']['@address'] except: pass object = { 'errors': [str(error) for error in errors], 'response': responseObject } return render(object, 'instance.html', locals(), request)
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) get_instances = conn.get_instances() except libvirtError as msg_error: errors.append(msg_error.message) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'has_managed_save_image': conn.get_instance_managed_save_image(instance)}) if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'managedsave' in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response('instances.html', locals(), context_instance=RequestContext(request))
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) vnc_port = conn.get_vnc() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() except libvirtError as msg_error: errors.append(msg_error.message) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path()) if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path()) if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path()) if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path()) if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() finally: conn.delete() return HttpResponseRedirect('/instances/%s/' % host_id) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("Snapshot '%s' has been created successful" % name) messages.append(msg) if 'umount_iso' in request.POST: image = request.POST.get('iso_media', '') conn.umount_iso(image) return HttpResponseRedirect(request.get_full_path()) if 'mount_iso' in request.POST: image = request.POST.get('iso_media', '') conn.mount_iso(image) return HttpResponseRedirect(request.get_full_path()) if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path()) if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path()) if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path()) if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path()) if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join( [choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') if not passwd: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path()) if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/instance/%s/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path()) if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))
def instance(request, compute_id, vname): """ :param request: :return: """ error_messages = [] messages = [] compute = get_object_or_404(Compute, pk=compute_id) computes = Compute.objects.all() computes_count = len(computes) publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = QEMU_KEYMAPS console_types = QEMU_CONSOLE_TYPES try: userinstace = UserInstance.objects.get(instance__compute_id=compute_id, instance__name=vname, user__id=request.user.id) except UserInstance.DoesNotExist: userinstace = None if not request.user.is_superuser: if not userinstace: return HttpResponseRedirect(reverse('index')) def show_clone_disk(disks, vname=''): clone_disk = [] for disk in disks: if disk['image'] is None: continue if disk['image'].count("-") and disk['image'].rsplit("-", 1)[0] == vname: name, suffix = disk['image'].rsplit("-", 1) image = name + "-clone" + "-" + suffix elif disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append( {'dev': disk['dev'], 'storage': disk['storage'], 'image': image, 'format': disk['format']}) return clone_disk def filesizefstr(size_str): if size_str == '': return 0 size_str = size_str.encode('ascii', 'ignore').upper().translate(None, " B") if 'K' == size_str[-1]: return long(float(size_str[:-1]))<<10 elif 'M' == size_str[-1]: return long(float(size_str[:-1]))<<20 elif 'G' == size_str[-1]: return long(float(size_str[:-1]))<<30 elif 'T' == size_str[-1]: return long(float(size_str[:-1]))<<40 elif 'P' == size_str[-1]: return long(float(size_str[:-1]))<<50 else: return long(float(size_str)) def get_clone_free_names(size=10): prefix = settings.CLONE_INSTANCE_DEFAULT_PREFIX free_names = [] existing_names = [i.name for i in Instance.objects.filter(name__startswith=prefix)] index = 1 while len(free_names) < size: new_name = prefix + str(index) if new_name not in existing_names: free_names.append(new_name) index += 1 return free_names def check_user_quota(instance, cpu, memory, disk_size): user_instances = UserInstance.objects.filter(user_id=request.user.id, instance__is_template=False) instance += len(user_instances) for usr_inst in user_instances: if connection_manager.host_is_up(usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmInstance(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type, usr_inst.instance.name) cpu += int(conn.get_vcpu()) memory += int(conn.get_memory()) for disk in conn.get_disk_device(): disk_size += int(disk['size'])>>30 ua = request.user.userattributes msg = "" if ua.max_instances > 0 and instance > ua.max_instances: msg = "instance" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (instance, ua.max_instances) if ua.max_cpus > 0 and cpu > ua.max_cpus: msg = "cpu" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (cpu, ua.max_cpus) if ua.max_memory > 0 and memory > ua.max_memory: msg = "memory" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (memory, ua.max_memory) if ua.max_disk_size > 0 and disk_size > ua.max_disk_size: msg = "disk" if settings.QUOTA_DEBUG: msg += " (%s > %s)" % (disk_size, ua.max_disk_size) return msg try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() title = conn.get_title() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384] if memory not in memory_range: insort(memory_range, memory) if cur_memory not in memory_range: insort(memory_range, cur_memory) memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() console_type = conn.get_console_type() console_port = conn.get_console_port() console_keymap = conn.get_console_keymap() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks, vname) console_passwd = conn.get_console_passwd() clone_free_names = get_clone_free_names() user_quota_msg = check_user_quota(0, 0, 0, 0) try: instance = Instance.objects.get(compute_id=compute_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=compute_id, name=vname, uuid=uuid) instance.save() if request.method == 'POST': if 'poweron' in request.POST: conn.start() msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweron') if 'powercycle' in request.POST: conn.force_shutdown() conn.start() msg = _("Power Cycle") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powercycle') if 'poweroff' in request.POST: conn.shutdown() msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#poweroff') if 'powerforce' in request.POST: conn.force_shutdown() msg = _("Force Off") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#powerforce') if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) instance_name = instance.name instance.delete() try: del_userinstance = UserInstance.objects.filter(instance__compute_id=compute_id, instance__name=vname) del_userinstance.delete() except UserInstance.DoesNotExist: pass msg = _("Destroy") addlogmsg(request.user.username, instance_name, msg) return HttpResponseRedirect(reverse('instances')) if 'rootpasswd' in request.POST: passwd = request.POST.get('passwd', '') passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy') data = {'action': 'password', 'passwd': passwd_hash, 'vname': vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if 'addpublickey' in request.POST: sshkeyid = request.POST.get('sshkeyid', '') publickey = UserSSHKey.objects.get(id=sshkeyid) data = {'action': 'publickey', 'key': publickey.keypublic, 'vname': vname} if conn.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((compute.hostname, 16510)) s.send(json.dumps(data)) result = json.loads(s.recv(1024)) s.close() msg = _("Installed new ssh public key %s" % publickey.keyname) addlogmsg(request.user.username, instance.name, msg) if result['return'] == 'success': messages.append(msg) else: error_messages.append(msg) else: msg = _("Please shutdow down your instance and then try again") error_messages.append(msg) if 'resize' in request.POST: new_vcpu = request.POST.get('vcpu', '') new_cur_vcpu = request.POST.get('cur_vcpu', '') new_memory = request.POST.get('memory', '') new_memory_custom = request.POST.get('memory_custom', '') if new_memory_custom: new_memory = new_memory_custom new_cur_memory = request.POST.get('cur_memory', '') new_cur_memory_custom = request.POST.get('cur_memory_custom', '') if new_cur_memory_custom: new_cur_memory = new_cur_memory_custom disks_new = [] for disk in disks: input_disk_size = filesizefstr(request.POST.get('disk_size_' + disk['dev'], '')) if input_disk_size > disk['size']+(64<<20): disk['size_new'] = input_disk_size disks_new.append(disk) disk_sum = sum([disk['size']>>30 for disk in disks_new]) disk_new_sum = sum([disk['size_new']>>30 for disk in disks_new]) quota_msg = check_user_quota(0, int(new_vcpu)-vcpu, int(new_memory)-memory, disk_new_sum-disk_sum) if not request.user.is_superuser and quota_msg: msg = _("User %s quota reached, cannot resize '%s'!" % (quota_msg, instance.name)) error_messages.append(msg) else: cur_memory = new_cur_memory memory = new_memory cur_vcpu = new_cur_vcpu vcpu = new_vcpu conn.resize(cur_memory, memory, cur_vcpu, vcpu, disks_new) msg = _("Resize") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resize') if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) msg = _("Mount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) msg = _("Umount media") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#media') if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("New snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) msg = _("Delete snapshot") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#restoresnapshot') if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) msg = _("Revert snapshot") addlogmsg(request.user.username, instance.name, msg) if request.user.is_superuser: if 'suspend' in request.POST: conn.suspend() msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#resume') if 'resume' in request.POST: conn.resume() msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#suspend') if 'set_autostart' in request.POST: conn.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'unset_autostart' in request.POST: conn.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#autostart') if 'change_xml' in request.POST: exit_xml = request.POST.get('inst_xml', '') if exit_xml: conn._defineXML(exit_xml) msg = _("Edit XML") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#xmledit') if 'set_console_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('console_passwd', '') clear = request.POST.get('clear_pass', False) if clear: passwd = '' if not passwd and not clear: msg = _("Enter the console password or select Generate") error_messages.append(msg) if not error_messages: if not conn.set_console_passwd(passwd): msg = _("Error setting console password. You should check that your instance have an graphic device.") error_messages.append(msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_keymap' in request.POST: keymap = request.POST.get('console_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_console_keymap('') else: conn.set_console_keymap(keymap) msg = _("Set VNC keymap") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'set_console_type' in request.POST: console_type = request.POST.get('console_type', '') conn.set_console_type(console_type) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#vncsettings') if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') live = request.POST.get('live_migrate', False) unsafe = request.POST.get('unsafe_migrate', False) xml_del = request.POST.get('xml_delete', False) new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname, live, unsafe, xml_del) conn_migrate.define_move(vname) conn_migrate.close() msg = _("Migrate") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(reverse('instance', args=[compute_id, vname])) if 'change_network' in request.POST: network_data = {} for post in request.POST: if post.startswith('net-'): network_data[post] = request.POST.get(post, '') conn.change_network(network_data) msg = _("Edit network") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#network') if 'change_options' in request.POST: instance.is_template = request.POST.get('is_template', False) instance.save() options = {} for post in request.POST: if post in ['title', 'description']: options[post] = request.POST.get(post, '') conn.set_options(options) msg = _("Edit options") addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path() + '#options') if request.user.is_superuser or request.user.userattributes.can_clone_instances: if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') disk_sum = sum([disk['size']>>30 for disk in disks]) quota_msg = check_user_quota(1, vcpu, memory, disk_sum) check_instance = Instance.objects.filter(name=clone_data['name']) if not request.user.is_superuser and quota_msg: msg = _("User %s quota reached, cannot create '%s'!" % (quota_msg, clone_data['name'])) error_messages.append(msg) elif check_instance: msg = _("Instance '%s' already exists!" % clone_data['name']) error_messages.append(msg) else: for post in request.POST: clone_data[post] = request.POST.get(post, '') new_uuid = conn.clone_instance(clone_data) new_instance = Instance(compute_id=compute_id, name=clone_data['name'], uuid=new_uuid) new_instance.save() userinstance = UserInstance(instance_id=new_instance.id, user_id=request.user.id, is_delete=True) userinstance.save() msg = _("Clone of '%s'" % instance.name) addlogmsg(request.user.username, new_instance.name, msg) return HttpResponseRedirect(reverse('instance', args=[compute_id, clone_data['name']])) conn.close() except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, vname, lib_err.message) return render(request, 'instance.html', locals())
def instances(request): """ :param request: :return: """ error_messages = [] all_host_vms = {} all_user_vms = {} computes = Compute.objects.all().order_by("name") def get_userinstances_info(instance): info = {} uis = UserInstance.objects.filter(instance=instance) info['count'] = uis.count() if info['count'] > 0: info['first_user'] = uis[0] else: info['first_user'] = None return info def refresh_instance_database(comp, vm, info): instances = Instance.objects.filter(name=vm) if instances.count() > 1: for i in instances: user_instances_count = UserInstance.objects.filter(instance=i).count() if user_instances_count == 0: addlogmsg(request.user.username, i.name, _("Deleting due to multiple records.")) i.delete() try: check_uuid = Instance.objects.get(compute_id=comp["id"], name=vm) if check_uuid.uuid != info['uuid']: check_uuid.save() all_host_vms[comp["id"], comp["name"], comp["status"], comp["cpu"], comp["mem_size"], comp["mem_perc"]][vm]['is_template'] = check_uuid.is_template all_host_vms[comp["id"], comp["name"], comp["status"], comp["cpu"], comp["mem_size"], comp["mem_perc"]][vm]['userinstances'] = get_userinstances_info(check_uuid) except Instance.DoesNotExist: check_uuid = Instance(compute_id=comp["id"], name=vm, uuid=info['uuid']) check_uuid.save() if not request.user.is_superuser: user_instances = UserInstance.objects.filter(user_id=request.user.id) for usr_inst in user_instances: if connection_manager.host_is_up(usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmHostDetails(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type) all_user_vms[usr_inst] = conn.get_user_instances(usr_inst.instance.name) all_user_vms[usr_inst].update({'compute_id': usr_inst.instance.compute.id}) else: for comp in computes: status = connection_manager.host_is_up(comp.type, comp.hostname) if status: try: conn = wvmHostDetails(comp, comp.login, comp.password, comp.type) comp_node_info = conn.get_node_info() comp_mem = conn.get_memory_usage() comp_instances = conn.get_host_instances(True) if comp_instances: comp_info= { "id": comp.id, "name": comp.name, "status": status, "cpu": comp_node_info[3], "mem_size": comp_node_info[2], "mem_perc": comp_mem['percent'] } all_host_vms[comp_info["id"], comp_info["name"], comp_info["status"], comp_info["cpu"], comp_info["mem_size"], comp_info["mem_perc"]] = comp_instances for vm, info in comp_instances.items(): refresh_instance_database(comp_info, vm, info) conn.close() except libvirtError as lib_err: error_messages.append(lib_err) if request.method == 'POST': name = request.POST.get('name', '') compute_id = request.POST.get('compute_id', '') instance = Instance.objects.get(compute_id=compute_id, name=name) try: conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if 'poweron' in request.POST: msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'poweroff' in request.POST: msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'powercycle' in request.POST: msg = _("Power Cycle") conn.force_shutdown(name) conn.start(name) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path()) if 'getvvfile' in request.POST: msg = _("Send console.vv file") addlogmsg(request.user.username, instance.name, msg) response = HttpResponse(content='', content_type='application/x-virt-viewer', status=200, reason=None, charset='utf-8') response.writelines('[virt-viewer]\n') response.writelines('type=' + conn.graphics_type(name) + '\n') response.writelines('host=' + conn.graphics_listen(name) + '\n') response.writelines('port=' + conn.graphics_port(name) + '\n') response.writelines('title=' + conn.domain_name(name) + '\n') response.writelines('password='******'\n') response.writelines('enable-usbredir=1\n') response.writelines('disable-effects=all\n') response.writelines('secure-attention=ctrl+alt+ins\n') response.writelines('release-cursor=ctrl+alt\n') response.writelines('fullscreen=1\n') response.writelines('delete-this-file=1\n') response['Content-Disposition'] = 'attachment; filename="console.vv"' return response if request.user.is_superuser: if 'suspend' in request.POST: msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) conn.resume(name) return HttpResponseRedirect(request.get_full_path()) except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, instance.name, lib_err.message) view_style = settings.VIEW_INSTANCES_LIST_STYLE return render(request, 'instances.html', locals())
def nwfilters(request, compute_id): """ :param request: :return: """ if not request.user.is_superuser: return HttpResponseRedirect(reverse('index')) error_messages = [] nwfilters_all = [] compute = get_object_or_404(Compute, pk=compute_id) try: conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type) if request.method == 'POST': if 'create_nwfilter' in request.POST: xml = request.POST.get('nwfilter_xml', '') if xml: try: util.etree.fromstring(xml) name = util.get_xml_path(xml, '/filter/@name') uuid = util.get_xml_path(xml, '/filter/uuid') except util.etree.ParseError: name = None for nwf in nwfilters: if name == nwf.name(): error_msg = _( "A network filter with this name already exists" ) raise Exception(error_msg) if uuid == nwf.UUIDString(): error_msg = _( "A network filter with this uuid already exists" ) raise Exception(error_msg) else: try: msg = _("Creating NWFilter: %s" % name) conn.create_nwfilter(xml) addlogmsg(request.user.username, compute.hostname, msg) except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, compute.hostname, lib_err.message) if 'del_nwfilter' in request.POST: name = request.POST.get('nwfiltername', '') msg = _("Deleting NWFilter: %s" % name) in_use = False nwfilter = conn.get_nwfilter(name) is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) instances = is_conn.get_instances() for inst in instances: # if in_use: break i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst) dom_filterrefs = i_conn.get_filterrefs() if name in dom_filterrefs: in_use = True msg = _( "NWFilter is in use by %s. Cannot be deleted." % inst) error_messages.append(msg) addlogmsg(request.user.username, compute.hostname, msg) i_conn.close() break is_conn.close() if nwfilter and not in_use: nwfilter.undefine() addlogmsg(request.user.username, compute.hostname, msg) if 'cln_nwfilter' in request.POST: name = request.POST.get('nwfiltername', '') cln_name = request.POST.get('cln_name', name + '-clone') conn.clone_nwfilter(name, cln_name) msg = _("Cloning NWFilter %s as %s" % (name, cln_name)) addlogmsg(request.user.username, compute.hostname, msg) for nwf in conn.get_nwfilters(): nwfilters_all.append(conn.get_nwfilter_info(nwf)) conn.close() except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, compute.hostname, lib_err) except Exception as err: error_messages.append(err) addlogmsg(request.user.username, compute.hostname, err) return render( request, 'nwfilters.html', { 'error_messages': error_messages, 'nwfilters': nwfilters_all, 'compute': compute })
def instances(request, host_id): """ Instances block """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) errors = [] instances = [] time_refresh = 8000 get_instances = [] conn = None compute = Compute.objects.get(id=host_id) try: conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type, compute.hypervisor) get_instances = conn.get_instances() except libvirtError as err: errors.append(err) for instance in get_instances: try: inst = Instance.objects.get(compute_id=host_id, name=instance) uuid = inst.uuid except Instance.DoesNotExist: uuid = conn.get_uuid(instance) inst = Instance(compute_id=host_id, name=instance, uuid=uuid) inst.save() acl = Instance.objects.get(compute_id=host_id, name=instance).acl if request.user in acl.all() or request.user.is_staff: if compute.hypervisor == 'qemu': instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance), 'has_managed_save_image': conn.get_instance_managed_save_image(instance)}) else: instances.append({'name': instance, 'status': conn.get_instance_status(instance), 'uuid': uuid, 'memory': conn.get_instance_memory(instance), 'vcpu': conn.get_instance_vcpu(instance)}) if conn: try: if request.method == 'POST': name = request.POST.get('name', '') if 'start' in request.POST: conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'shutdown' in request.POST: conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'destroy' in request.POST: conn.force_shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'managedsave' in request.POST: conn.managedsave(name) return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove(name) return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume(name) return HttpResponseRedirect(request.get_full_path()) conn.close() except libvirtError as err: errors.append(err) return render_to_response('instances.html', locals(), context_instance=RequestContext(request))
def instances(request): """ :param request: :return: """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('index')) error_messages = [] all_host_vms = {} all_host_vms_bis = {} all_user_vms = {} computes = Compute.objects.all() if not request.user.is_superuser: user_instances = UserInstance.objects.filter(user_id=request.user.id) for usr_inst in user_instances: if connection_manager.host_is_up( usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmHostDetails(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type) all_user_vms[usr_inst] = conn.get_user_instances( usr_inst.instance.name) all_user_vms[usr_inst].update( {'compute_id': usr_inst.instance.compute.id}) else: for comp in computes: if connection_manager.host_is_up(comp.type, comp.hostname): try: conn = wvmHostDetails(comp, comp.login, comp.password, comp.type) if conn.get_host_instances(): all_host_vms[comp.id, comp.name] = conn.get_host_instances() all_host_vms_bis[comp.id, comp.name] = [] for vm, info in all_host_vms[comp.id, comp.name].items(): try: check_uuid = Instance.objects.get( compute_id=comp.id, name=vm) if check_uuid.uuid != info['uuid']: check_uuid.save() except Instance.DoesNotExist: check_uuid = Instance(compute_id=comp.id, name=vm, uuid=info['uuid']) check_uuid.save() all_host_vms_bis[comp.id, comp.name].append( (Instance.objects.get(compute_id=comp.id, name=vm), info)) conn.close() except libvirtError as lib_err: error_messages.append(lib_err) if request.method == 'POST': name = request.POST.get('name', '') compute_id = request.POST.get('compute_id', '') instance = Instance.objects.get(compute_id=compute_id, name=name) try: conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if 'poweron' in request.POST: msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'poweroff' in request.POST: msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'powercycle' in request.POST: msg = _("Power Cycle") conn.force_shutdown(name) conn.start(name) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path()) if request.user.is_superuser: if 'suspend' in request.POST: msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) conn.resume(name) return HttpResponseRedirect(request.get_full_path()) except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, instance.name, lib_err.message) return render(request, 'instances.html', locals())
def instances(request): """ :param request: :return: """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('index')) error_messages = [] all_host_vms = {} all_user_vms = {} computes = Compute.objects.all() if not request.user.is_superuser: user_instances = UserInstance.objects.filter(user_id=request.user.id) for usr_inst in user_instances: if connection_manager.host_is_up(usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmHostDetails(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type) all_user_vms[usr_inst] = conn.get_user_instances(usr_inst.instance.name) all_user_vms[usr_inst].update({'compute_id': usr_inst.instance.compute.id}) else: for comp in computes: if connection_manager.host_is_up(comp.type, comp.hostname): try: conn = wvmHostDetails(comp, comp.login, comp.password, comp.type) if conn.get_host_instances(): all_host_vms[comp.id, comp.name] = conn.get_host_instances() for vm, info in conn.get_host_instances().items(): try: check_uuid = Instance.objects.get(compute_id=comp.id, name=vm) if check_uuid.uuid != info['uuid']: check_uuid.save() except Instance.DoesNotExist: check_uuid = Instance(compute_id=comp.id, name=vm, uuid=info['uuid']) check_uuid.save() conn.close() except libvirtError as lib_err: error_messages.append(lib_err) if request.method == 'POST': name = request.POST.get('name', '') compute_id = request.POST.get('compute_id', '') instance = Instance.objects.get(compute_id=compute_id, name=name) try: conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if 'poweron' in request.POST: msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'poweroff' in request.POST: msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'powercycle' in request.POST: msg = _("Power Cycle") conn.force_shutdown(name) conn.start(name) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path()) if request.user.is_superuser: if 'suspend' in request.POST: msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) conn.resume(name) return HttpResponseRedirect(request.get_full_path()) except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, instance.name, lib_err.message) return render(request, 'instances.html', locals())
def instances(request): """ :param request: :return: """ error_messages = [] all_host_vms = {} all_user_vms = {} computes = Compute.objects.all() def get_userinstances_info(instance): info = {} uis = UserInstance.objects.filter(instance=instance) info['count'] = uis.count() if info['count'] > 0: info['first_user'] = uis[0] else: info['first_user'] = None return info def refresh_instance_database(comp, vm, info): instances = Instance.objects.filter(name=vm) if instances.count() > 1: for i in instances: user_instances_count = UserInstance.objects.filter( instance=i).count() if user_instances_count == 0: addlogmsg(request.user.username, i.name, _("Deleting due to multiple records.")) i.delete() try: check_uuid = Instance.objects.get(compute_id=comp["id"], name=vm) if check_uuid.uuid != info['uuid']: check_uuid.save() all_host_vms[comp_info["id"], comp_info["name"], comp_info["status"], comp_info["cpu"], comp_info["mem_size"], comp_info["mem_perc"]][vm][ 'is_template'] = check_uuid.is_template all_host_vms[comp_info["id"], comp_info["name"], comp_info["status"], comp_info["cpu"], comp_info["mem_size"], comp_info["mem_perc"]][vm][ 'userinstances'] = get_userinstances_info( check_uuid) except Instance.DoesNotExist: check_uuid = Instance(compute_id=comp["id"], name=vm, uuid=info['uuid']) check_uuid.save() if not request.user.is_superuser: user_instances = UserInstance.objects.filter(user_id=request.user.id) for usr_inst in user_instances: if connection_manager.host_is_up( usr_inst.instance.compute.type, usr_inst.instance.compute.hostname): conn = wvmHostDetails(usr_inst.instance.compute, usr_inst.instance.compute.login, usr_inst.instance.compute.password, usr_inst.instance.compute.type) all_user_vms[usr_inst] = conn.get_user_instances( usr_inst.instance.name) all_user_vms[usr_inst].update( {'compute_id': usr_inst.instance.compute.id}) else: for comp in computes: status = connection_manager.host_is_up(comp.type, comp.hostname) if status: try: conn = wvmHostDetails(comp, comp.login, comp.password, comp.type) comp_node_info = conn.get_node_info() comp_mem = conn.get_memory_usage() comp_instances = conn.get_host_instances(True) if comp_instances: comp_info = { "id": comp.id, "name": comp.name, "status": status, "cpu": comp_node_info[3], "mem_size": comp_node_info[2], "mem_perc": comp_mem['percent'] } all_host_vms[comp_info["id"], comp_info["name"], comp_info["status"], comp_info["cpu"], comp_info["mem_size"], comp_info["mem_perc"]] = comp_instances for vm, info in comp_instances.items(): refresh_instance_database(comp_info, vm, info) conn.close() except libvirtError as lib_err: error_messages.append(lib_err) if request.method == 'POST': name = request.POST.get('name', '') compute_id = request.POST.get('compute_id', '') instance = Instance.objects.get(compute_id=compute_id, name=name) try: conn = wvmInstances(instance.compute.hostname, instance.compute.login, instance.compute.password, instance.compute.type) if 'poweron' in request.POST: msg = _("Power On") addlogmsg(request.user.username, instance.name, msg) conn.start(name) return HttpResponseRedirect(request.get_full_path()) if 'poweroff' in request.POST: msg = _("Power Off") addlogmsg(request.user.username, instance.name, msg) conn.shutdown(name) return HttpResponseRedirect(request.get_full_path()) if 'powercycle' in request.POST: msg = _("Power Cycle") conn.force_shutdown(name) conn.start(name) addlogmsg(request.user.username, instance.name, msg) return HttpResponseRedirect(request.get_full_path()) if 'getvvfile' in request.POST: msg = _("Send console.vv file") addlogmsg(request.user.username, instance.name, msg) response = HttpResponse( content='', content_type='application/x-virt-viewer', status=200, reason=None, charset='utf-8') response.writelines('[virt-viewer]\n') response.writelines('type=' + conn.graphics_type(name) + '\n') response.writelines('host=' + conn.graphics_listen(name) + '\n') response.writelines('port=' + conn.graphics_port(name) + '\n') response.writelines('title=' + conn.domain_name(name) + '\n') response.writelines('password='******'\n') response.writelines('enable-usbredir=1\n') response.writelines('disable-effects=all\n') response.writelines('secure-attention=ctrl+alt+ins\n') response.writelines('release-cursor=ctrl+alt\n') response.writelines('fullscreen=1\n') response.writelines('delete-this-file=1\n') response[ 'Content-Disposition'] = 'attachment; filename="console.vv"' return response if request.user.is_superuser: if 'suspend' in request.POST: msg = _("Suspend") addlogmsg(request.user.username, instance.name, msg) conn.suspend(name) return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: msg = _("Resume") addlogmsg(request.user.username, instance.name, msg) conn.resume(name) return HttpResponseRedirect(request.get_full_path()) except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, instance.name, lib_err.message) return render(request, 'instances.html', locals())
def nwfilters(request, compute_id): """ :param request: :return: """ if not request.user.is_superuser: return HttpResponseRedirect(reverse('index')) error_messages = [] nwfilters_all = [] compute = get_object_or_404(Compute, pk=compute_id) try: conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type) if request.method == 'POST': if 'create_nwfilter' in request.POST: xml = request.POST.get('nwfilter_xml', '') if xml: try: util.etree.fromstring(xml) name = util.get_xml_path(xml, '/filter/@name') uuid = util.get_xml_path(xml, '/filter/uuid') except util.etree.ParseError: name = None for nwf in nwfilters: if name == nwf.name(): error_msg = _("A network filter with this name already exists") raise Exception(error_msg) if uuid == nwf.UUIDString(): error_msg = _("A network filter with this uuid already exists") raise Exception(error_msg) else: try: msg = _("Creating NWFilter: %s" % name) conn.create_nwfilter(xml) addlogmsg(request.user.username, compute.hostname, msg) except libvirtError as lib_err: error_messages.append(lib_err.message) addlogmsg(request.user.username, compute.hostname, lib_err.message) if 'del_nwfilter' in request.POST: name = request.POST.get('nwfiltername','') msg = _("Deleting NWFilter: %s" % name) in_use = False nwfilter = conn.get_nwfilter(name) is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type) instances = is_conn.get_instances() for inst in instances: # if in_use: break i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst) dom_filterrefs = i_conn.get_filterrefs() if name in dom_filterrefs: in_use = True msg = _("NWFilter is in use by %s. Cannot be deleted." % inst) error_messages.append(msg) addlogmsg(request.user.username, compute.hostname, msg) i_conn.close() break is_conn.close() if nwfilter and not in_use: nwfilter.undefine() addlogmsg(request.user.username, compute.hostname, msg) if 'cln_nwfilter' in request.POST: name = request.POST.get('nwfiltername','') cln_name = request.POST.get('cln_name', name + '-clone') conn.clone_nwfilter(name,cln_name) msg = _("Cloning NWFilter %s as %s" % (name, cln_name)) addlogmsg(request.user.username, compute.hostname, msg) for nwf in conn.get_nwfilters(): nwfilters_all.append(conn.get_nwfilter_info(nwf)) conn.close() except libvirtError as lib_err: error_messages.append(lib_err) addlogmsg(request.user.username, compute.hostname, lib_err) except Exception as err: error_messages.append(err) addlogmsg(request.user.username, compute.hostname, err) return render(request, 'nwfilters.html', {'error_messages': error_messages, 'nwfilters': nwfilters_all, 'compute': compute})
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') def show_clone_disk(disks): clone_disk = [] for disk in disks: if disk['image'].count(".") and len(disk['image'].rsplit(".", 1)[1]) <= 7: name, suffix = disk['image'].rsplit(".", 1) image = name + "-clone" + "." + suffix else: image = disk['image'] + "-clone" clone_disk.append({'dev': disk['dev'], 'storage': disk['storage'], 'image': image}) return clone_disk errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) keymaps = QEMU_KEYMAPS try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 1024, 2048, 4096, 6144, 8192, 16384] memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) telnet_port = conn.get_telnet_port() vnc_port = conn.get_vnc() vnc_keymap = conn.get_vnc_keymap snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) has_managed_save_image = conn.get_managed_save_image() clone_disks = show_clone_disk(disks) except libvirtError as msg_error: errors.append(msg_error.message) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path()) if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path()) if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path()) if 'managedsave' == request.POST.get('power', ''): conn.managedsave() return HttpResponseRedirect(request.get_full_path()) if 'deletesaveimage' in request.POST: conn.managed_save_remove() return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path()) if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() finally: conn.delete() return HttpResponseRedirect('/instances/%s/' % host_id) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("Snapshot '%s' has been created successful" % name) messages.append(msg) if 'umount_iso' in request.POST: image = request.POST.get('path', '') dev = request.POST.get('umount_iso', '') conn.umount_iso(dev, image) return HttpResponseRedirect(request.get_full_path()) if 'mount_iso' in request.POST: image = request.POST.get('media', '') dev = request.POST.get('mount_iso', '') conn.mount_iso(dev, image) return HttpResponseRedirect(request.get_full_path()) if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path()) if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path()) if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path()) if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path()) if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') clear = request.POST.get('clear_pass', False) if not passwd and not clear: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path()) if 'set_vnc_keymap' in request.POST: keymap = request.POST.get('vnc_keymap', '') clear = request.POST.get('clear_keymap', False) if clear: conn.set_vnc_keymap('') else: conn.set_vnc_keymap(keymap) return HttpResponseRedirect(request.get_full_path()) if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/instance/%s/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path()) if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.append(msg) if 'clone' in request.POST: clone_data = {} clone_data['name'] = request.POST.get('name', '') for post in request.POST: if 'disk' in post: clone_data[post] = request.POST.get(post, '') conn.clone_instance(clone_data) return HttpResponseRedirect('/instance/%s/%s' % (host_id, clone_data['name'])) conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))
def instance(request, host_id, vname): """ Instance block """ if not request.user.is_authenticated(): return HttpResponseRedirect('/login') errors = [] messages = [] time_refresh = TIME_JS_REFRESH compute = Compute.objects.get(id=host_id) computes = Compute.objects.all() computes_count = len(computes) try: conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname) status = conn.get_status() autostart = conn.get_autostart() vcpu = conn.get_vcpu() cur_vcpu = conn.get_cur_vcpu() uuid = conn.get_uuid() memory = conn.get_memory() cur_memory = conn.get_cur_memory() description = conn.get_description() disks = conn.get_disk_device() media = conn.get_media_device() networks = conn.get_net_device() media_iso = sorted(conn.get_iso_media()) vcpu_range = conn.get_max_cpus() memory_range = [256, 512, 1024, 2048, 4096, 8192, 16384] memory_host = conn.get_max_memory() vcpu_host = len(vcpu_range) vnc_port = conn.get_vnc() snapshots = sorted(conn.get_snapshot(), reverse=True) inst_xml = conn._XMLDesc(VIR_DOMAIN_XML_SECURE) except libvirtError as msg_error: errors.append(msg_error.message) try: instance = Instance.objects.get(compute_id=host_id, name=vname) if instance.uuid != uuid: instance.uuid = uuid instance.save() except Instance.DoesNotExist: instance = Instance(compute_id=host_id, name=vname, uuid=uuid) instance.save() try: if request.method == 'POST': if 'start' in request.POST: conn.start() return HttpResponseRedirect(request.get_full_path()) if 'power' in request.POST: if 'shutdown' == request.POST.get('power', ''): conn.shutdown() return HttpResponseRedirect(request.get_full_path()) if 'destroy' == request.POST.get('power', ''): conn.force_shutdown() return HttpResponseRedirect(request.get_full_path()) if 'suspend' in request.POST: conn.suspend() return HttpResponseRedirect(request.get_full_path()) if 'resume' in request.POST: conn.resume() return HttpResponseRedirect(request.get_full_path()) if 'delete' in request.POST: if conn.get_status() == 1: conn.force_shutdown() if request.POST.get('delete_disk', ''): conn.delete_disk() try: instance = Instance.objects.get(compute_id=host_id, name=vname) instance.delete() finally: conn.delete() return HttpResponseRedirect('/instances/%s/' % host_id) if 'snapshot' in request.POST: name = request.POST.get('name', '') conn.create_snapshot(name) msg = _("Snapshot '%s' has been created successful" % name) messages.append(msg) if 'umount_iso' in request.POST: image = request.POST.get('iso_media', '') conn.umount_iso(image) return HttpResponseRedirect(request.get_full_path()) if 'mount_iso' in request.POST: image = request.POST.get('iso_media', '') conn.mount_iso(image) return HttpResponseRedirect(request.get_full_path()) if 'set_autostart' in request.POST: conn.set_autostart(1) return HttpResponseRedirect(request.get_full_path()) if 'unset_autostart' in request.POST: conn.set_autostart(0) return HttpResponseRedirect(request.get_full_path()) if 'change_settings' in request.POST: description = request.POST.get('description', '') vcpu = request.POST.get('vcpu', '') cur_vcpu = request.POST.get('cur_vcpu', '') memory = request.POST.get('memory', '') cur_memory = request.POST.get('cur_memory', '') conn.change_settings(description, cur_memory, memory, cur_vcpu, vcpu) return HttpResponseRedirect(request.get_full_path()) if 'change_xml' in request.POST: xml = request.POST.get('inst_xml', '') if xml: conn._defineXML(xml) return HttpResponseRedirect(request.get_full_path()) if 'set_vnc_passwd' in request.POST: if request.POST.get('auto_pass', ''): passwd = ''.join([choice(letters + digits) for i in xrange(12)]) else: passwd = request.POST.get('vnc_passwd', '') if not passwd: msg = _("Enter the VNC password or select Generate") errors.append(msg) if not errors: conn.set_vnc_passwd(passwd) return HttpResponseRedirect(request.get_full_path()) if 'migrate' in request.POST: compute_id = request.POST.get('compute_id', '') new_compute = Compute.objects.get(id=compute_id) conn_migrate = wvmInstances(new_compute.hostname, new_compute.login, new_compute.password, new_compute.type) conn_migrate.moveto(conn, vname) conn_migrate.define_move(vname) conn_migrate.close() return HttpResponseRedirect('/instance/%s/%s' % (compute_id, vname)) if 'delete_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_delete(snap_name) return HttpResponseRedirect(request.get_full_path()) if 'revert_snapshot' in request.POST: snap_name = request.POST.get('name', '') conn.snapshot_revert(snap_name) message = _("Successful revert snapshot: ") message += snap_name conn.close() except libvirtError as msg_error: errors.append(msg_error.message) return render_to_response('instance.html', locals(), context_instance=RequestContext(request))