예제 #1
0
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))
예제 #2
0
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
예제 #3
0
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": "不支持的操作或者您没有权限添加虚拟机"
            })