def index(request): vmRun = 0 vmStop = 0 serRun = 0 serStop = 0 try: logList = VmLogs.objects.all().order_by("-id")[0:20] vmList = VmInstance.countInstnace() serList = VMServer.countServer() for vm in vmList: if vm.status == 1: vmRun = vmRun + 1 else: vmStop = vmStop + 1 for ser in serList: if ser.status == 0: serRun = serRun + 1 else: serStop = serStop + 1 except: logList = None vmList = [] serList = [] totalInfo = { "vmRun": vmRun, "vmStop": vmStop, "serTotal": len(serList), "serStop": serStop, "vmTotal": len(vmList), "serRun": serRun } return render_to_response('index.html', { "user": request.user, "localtion": [{ "name": "首页", "url": '/' }], "logList": logList, "totalInfo": totalInfo, "msgTotal": serStop + vmStop }, context_instance=RequestContext(request))
def handleInstance(request): if request.method == "POST": op = request.POST.get('op') server_id = request.POST.get('server_id') insName = request.POST.get('vm_name') if op in [ 'start', 'reboot', 'shutdown', 'halt', 'suspend', 'resume', 'xml', 'migrate', 'delete', 'mount', 'umount', 'clone' ] and request.user.has_perm('VManagePlatform.change_vmserverinstance'): try: vMserver = VMServer.selectOneHost(id=server_id) except: return JsonResponse({ "code": 500, "data": None, "msg": "主机不存在。" }) try: VMS = LibvirtManage(uri=vMserver.uri) except Exception, e: return JsonResponse({ "code": 500, "msg": "服务器连接失败。。", "data": e }) try: INSTANCE = VMS.genre(model='instance') instance = INSTANCE.queryInstance(name=str(insName)) except Exception, e: return JsonResponse({ "code": 500, "msg": "虚拟机强制关闭失败。。", "data": e }) if op == 'halt': result = INSTANCE.destroy(instance) elif op == 'start': result = INSTANCE.start(instance) elif op == 'reboot': result = INSTANCE.reboot(instance) elif op == 'shutdown': result = INSTANCE.shutdown(instance) elif op == 'suspend': result = INSTANCE.suspend(instance) elif op == 'resume': result = INSTANCE.resume(instance) elif op == 'delete': INSTANCE.delDisk(instance) VmInstance.deleteInstance(server=vMserver, name=insName) result = INSTANCE.delete(instance) elif op == 'migrate': migrateInstace.delay(request.POST) VMS.close() return JsonResponse({ "code": 200, "data": None, "msg": "迁移任务提交成功." }) elif op == 'umount': result = INSTANCE.umountIso(instance, dev=request.POST.get('dev'), image=request.POST.get('iso')) elif op == 'mount': result = INSTANCE.mountIso(instance, dev=request.POST.get('dev'), image=request.POST.get('iso')) elif op == 'clone': cloneInstace.delay(data=request.POST, user=request.user) VMS.close() return JsonResponse({ "code": 200, "data": None, "msg": "克隆任务提交成功." }) elif op == 'xml': try: result = INSTANCE.defineXML(xml=request.POST.get('xml')) except Exception, e: result = e
def addInstance(request): if request.method == "GET": try: vMserverId = request.GET.get('id') vmServer = VMServer.selectOneHost(id=vMserverId) userList = User.objects.all() tempList = TempInstance.listVmTemp() VMS = LibvirtManage(vmServer.uri) SERVER = VMS.genre(model='server') NETWORK = VMS.genre(model='network') if SERVER: vStorage = SERVER.getVmStorageInfo() else: return render_to_response( '404.html', context_instance=RequestContext(request)) except: vStorage = None vMImages = SERVER.getVmIsoList() netkList = NETWORK.listNetwork() VMS.close() return render_to_response('vmInstance/add_instance.html', { "user": request.user, "localtion": [{ "name": "首页", "url": '/' }, { "name": "虚拟机实例", "url": '#' }, { "name": "添加虚拟机", "url": "/addInstance" }], "vmServer": vmServer, "vStorage": vStorage, "vMImages": vMImages, "netkList": netkList, "tempList": tempList, "userList": userList }, context_instance=RequestContext(request)) elif request.method == "POST": op = request.POST.get('op') if op in [ 'custom', 'xml', 'template' ] and request.user.has_perm('VManagePlatform.add_vmserverinstance'): try: vMserver = VMServer.selectOneHost( id=request.POST.get('server_id')) VMS = LibvirtManage(uri=vMserver.uri) INSTANCE = VMS.genre(model='instance') SERVER = VMS.genre(model='server') STORAGE = VMS.genre(model='storage') NETWORK = VMS.genre(model='network') except Exception, e: return JsonResponse({ "code": 500, "msg": "虚拟服务器连接失败,请注意连通性。", "data": e }) if SERVER: if op == 'custom': netks = [ str(i) for i in request.POST.get('netk').split(',') ] if INSTANCE: instance = INSTANCE.queryInstance( name=str(request.POST.get('vm_name'))) if instance: return JsonResponse({ "code": 500, "msg": "虚拟机已经存在", "data": None }) else: networkXml = '' radStr = CommTools.radString(4) for nt in netks: netkType = NETWORK.getNetworkType(nt) netXml = Const.CreateNetcard(nkt_br=nt, ntk_name=nt + '-' + radStr, mode=netkType) networkXml = netXml + networkXml pool = STORAGE.getStoragePool( pool_name=request.POST.get('storage')) volume_name = request.POST.get('vm_name') + '.img' if pool: volume = STORAGE.createVolumes( pool, volume_name=volume_name, volume_capacity=request.POST.get('disk')) if volume: disk_path = volume.path() volume_name = volume.name() disk_xml = Const.CreateDisk( volume_path=disk_path) else: return JsonResponse({ "code": 500, "msg": "添加虚拟机失败,存储池里面以存在以主机名命名的磁盘", "data": None }) else: return JsonResponse({ "code": 500, "msg": "添加虚拟机失败,存储池已经被删除掉", "data": None }) dom_xml = Const.CreateIntanceConfig( dom_name=request.POST.get('vm_name'), maxMem=int(SERVER.getServerInfo().get('mem')), mem=int(request.POST.get('mem')), cpu=request.POST.get('cpu'), disk=disk_xml, iso_path=request.POST.get('system'), network=networkXml) dom = SERVER.createInstance(dom_xml) recordLogs.delay( user=request.user, action=op, status=dom, vm_name=request.POST.get('vm_name')) if dom == 0: VMS.close() VmInstance.insertInstance( dict( server=vMserver, name=request.POST.get('vm_name'), cpu=request.POST.get('cpu'), mem=request.POST.get('mem'), owner=request.POST.get('owner'), status=1, )) return JsonResponse({ "code": 200, "data": None, "msg": "虚拟主机添加成功。" }) else: STORAGE.deleteVolume(pool, volume_name) VMS.close() return JsonResponse({ "code": 500, "data": None, "msg": "虚拟主机添加失败。" }) elif op == 'xml': domXml = request.POST.get('xml') dom = SERVER.defineXML(xml=domXml) VMS.close() recordLogs.delay(user=request.user, action=op, status=dom, vm_name=request.POST.get('vm_name')) if dom: return JsonResponse({ "code": 200, "data": None, "msg": "虚拟主机添加成功。" }) else: return JsonResponse({ "code": 500, "data": None, "msg": "虚拟主机添加失败。" }) elif op == 'template': try: temp = TempInstance.selectVmTemp( id=request.POST.get('temp')) if INSTANCE: instance = INSTANCE.queryInstance( name=str(request.POST.get('vm_name'))) if instance: return JsonResponse({ "code": 500, "msg": "虚拟机已经存在", "data": None }) else: pool = STORAGE.getStoragePool( pool_name=request.POST.get('storage')) volume_name = request.POST.get('vm_name') + '.img' if pool: volume = STORAGE.createVolumes( pool, volume_name=volume_name, volume_capacity=temp.disk) if volume: disk_path = volume.path() volume_name = volume.name() disk_xml = Const.CreateDisk( volume_path=disk_path) else: return JsonResponse({ "code": 500, "msg": "添加虚拟机失败,存储池里面以存在以主机名命名的磁盘", "data": None }) else: return JsonResponse({ "code": 500, "msg": "添加虚拟机失败,存储池已经被删除掉", "data": None }) dom_xml = Const.CreateIntanceConfig( dom_name=request.POST.get('vm_name'), maxMem=int(SERVER.getServerInfo().get('mem')), mem=temp.mem, cpu=temp.cpu, disk=disk_xml, iso_path=request.POST.get('system'), network=None) dom = SERVER.createInstance(dom_xml) recordLogs.delay( user=request.user, action=op, status=dom, vm_name=request.POST.get('vm_name')) if dom == 0: VMS.close() return JsonResponse({ "code": 200, "data": None, "msg": "虚拟主机添加成功。" }) else: STORAGE.deleteVolume(pool, volume_name) VMS.close() return JsonResponse({ "code": 500, "data": None, "msg": "虚拟主机添加失败。" }) except: return JsonResponse({ "code": 500, "data": None, "msg": "虚拟主机添加失败。" }) else: return JsonResponse({ "code": 500, "data": None, "msg": "虚拟服务器连接失败,请注意连通性。" }) else: return JsonResponse({ "code": 500, "data": None, "msg": "不支持的操作或者您没有权限添加虚拟机" })