コード例 #1
0
def listStorage(request):
    if request.method == "GET":
        vMserverId = request.GET.get('id')
        vmServer = VMServer.selectOneHost(id=vMserverId)
        try:
            VMS = LibvirtManage(uri=vmServer.uri)
            SERVER = VMS.genre(model='server')
            if SERVER:
                storageList = SERVER.getVmStorageInfo()
                VMS.close()
            else:
                return render_to_response(
                    '404.html', context_instance=RequestContext(request))
        except Exception, e:
            return render_to_response('404.html',
                                      context_instance=RequestContext(request))
        return render_to_response('vmStorage/list_storage.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "虚拟机实例",
                "url": '#'
            }, {
                "name": "存储池管理",
                "url": "/listStorage/?id=%d" % vmServer.id
            }],
            "vmServer":
            vmServer,
            "storageList":
            storageList
        },
                                  context_instance=RequestContext(request))
コード例 #2
0
def configNetwork(request):
    if request.method == "GET":
        vmServerId = request.GET.get('id')
        vmServer = VMServer.selectOneHost(id=vmServerId)
        try:
            VMS = LibvirtManage(uri=vmServer.uri)
            NETWORK = VMS.genre(model='network')
            if NETWORK:
                netList = NETWORK.listNetwork()
                insList = NETWORK.listInterface()
            else:
                return render_to_response(
                    '404.html', context_instance=RequestContext(request))
        except Exception, e:
            netList = None
        return render_to_response('vmNetwork/add_network.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "网络管理",
                "url": '/addNetwork'
            }],
            "vmServer":
            vmServer,
            "netList":
            netList,
            "insList":
            insList
        },
                                  context_instance=RequestContext(request))
コード例 #3
0
ファイル: vNetwork.py プロジェクト: zeus911/VManagePlatform
def handleNetwork(request):
    if request.method == "POST":
        op = request.POST.get('op')
        server_id = request.POST.get('server_id')
        netkName = request.POST.get('netkName')
        if op in ['delete'] 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)
                SSH = BRManage(hostname=vmServer.server_ip,port=22)
                OVS = SSH.genre(model='ovs')
                BRCTL = SSH.genre(model='brctl')                
            except Exception,e:
                return  JsonResponse({"code":500,"msg":"服务器连接失败。。","data":e})             
            try:
                NETWORK = VMS.genre(model='network')
                netk = NETWORK.getNetwork(netk_name=netkName)
                if op == 'delete':
                    try:
                        if netkName.startswith('ovs'):OVS.ovsDelBr(brName=netkName)
                        elif netkName.startswith('br'):
                            BRCTL.brctlDownBr(brName=netkName)
#                             BRCTL.brctlDelBr(brName=netkName)
                        SSH.close()
                    except:
                        pass
                    status = NETWORK.deleteNetwork(netk)
                    VMS.close() 
                    if status == 0:return JsonResponse({"code":200,"data":None,"msg":"网络删除成功"})  
                    else:return JsonResponse({"code":500,"data":None,"msg":"网络删除失败"})     
            except Exception,e:
                return JsonResponse({"code":500,"msg":"获取网络失败。","data":e}) 
コード例 #4
0
ファイル: tasks.py プロジェクト: lynlon/VManagePlatform
def updateVMserver():
    serverList = VMServer.listVmServer()    
    for server in  serverList: 
        VMS = LibvirtManage(server.uri)
        SERVER = VMS.genre(model='server')    
        server_id = server.id
        if SERVER:
            if server.status == 0:
                data = SERVER.getVmServerInfo()
                VMServer.updateVmServer(server_id=server_id,instance=data.get('ins'),
                                              mem=data.get('mem'),cpu_total=data.get('cpu_total'),
                                              mem_per=data.get('mem_per'))
            elif server.status == 1:
                result = VMServer.updateVmServerStatus(server_id=server_id, status=0)
                if isinstance(result, str):return result                       
            VMS.close()
        else:
            result = VMServer.updateVmServerStatus(server_id=server_id, status=1)
            if isinstance(result, str):return result 
コード例 #5
0
def addStorage(request):
    if request.method == "POST" and request.user.has_perm(
            'VManagePlatform.add_vmserverinstance'):
        pool_xml = StorageTypeXMLConfig(
            pool_type=request.POST.get('pool_type'),
            pool_name=request.POST.get('pool_name'),
            pool_spath=request.POST.get('pool_spath'),
            pool_tpath=request.POST.get('pool_tpath'),
            pool_host=request.POST.get('pool_host'))
        if pool_xml:
            try:
                vMserver = VMServer.selectOneHost(
                    id=request.POST.get('pool_server'))
                try:
                    VMS = LibvirtManage(uri=vMserver.uri)
                except:
                    return JsonResponse({
                        "code": 500,
                        "msg": "连接虚拟服务器失败。",
                        "data": None
                    })
                STORAGE = VMS.genre(model='storage')
                pool = STORAGE.getStoragePool(
                    pool_name=request.POST.get('pool_name'))
                if pool is False:
                    storage = STORAGE.createStoragePool(pool_xml)
                    VMS.close()
                    if storage:
                        return JsonResponse({
                            "code": 200,
                            "msg": "存储池添加成功",
                            "data": None
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "msg": "创建存储池失败。",
                            "data": None
                        })
                else:
                    VMS.close()
                    return JsonResponse({
                        "code": 400,
                        "msg": "存储池已经存在。",
                        "data": None
                    })
            except Exception, e:
                return JsonResponse({"code": 500, "msg": "找到主机资源", "data": e})
        else:
            return JsonResponse({
                "code": 500,
                "msg": "不支持的存储类型或者您没有权限操作此项",
                "data": None
            })
コード例 #6
0
def cloneInstace(data, user=None):
    server_id = data.get('server_id')
    insName = data.get('vm_name')
    try:
        vMserver = VMServer.selectOneHost(id=server_id)
    except:
        return False
    try:
        VMS = LibvirtManage(uri=vMserver.uri)
    except Exception, e:
        return False
コード例 #7
0
ファイル: tasks.py プロジェクト: lynlon/VManagePlatform
def updateVMinstance(host=None):
    if host is None:
        serverList = VMServer.listVmServer()    
        for server in  serverList:
            if server.status == 0: 
                VMS = LibvirtManage(server.uri)
                SERVER = VMS.genre(model='server')    
                if SERVER:
                    dataList = SERVER.getVmInstanceBaseInfo(server_ip=server.server_ip,server_id=server.id)
                    for ds in dataList:
                        result = VmServerInstance.objects.filter(server=server,name=ds.get('name'))
                        if result:VmServerInstance.objects.filter(server=server,name=ds.get('name')).update(server=server,cpu=ds.get('cpu'),
                                                                                                            mem=ds.get('mem'),status=ds.get('status'),
                                                                                                            name=ds.get('name'),token=ds.get('token'),
                                                                                                            vnc=ds.get('vnc'),
                                                                                                            )
                        else:VmServerInstance.objects.create(server=server,cpu=ds.get('cpu'),
                                                             mem=ds.get('mem'),vnc=ds.get('vnc'),
                                                             status=ds.get('status'),name=ds.get('name'),
                                                             token=ds.get('token'))
                    VMS.close()
                    
    else:
        server =  VMServer.selectOneHostBy(host)
        if server and server.status == 0:
            VMS = LibvirtManage(server.uri)
            SERVER = VMS.genre(model='server')    
            if SERVER:
                dataList = SERVER.getVmInstanceBaseInfo(server_ip=server.server_ip,server_id=server.id)
                for ds in dataList:                            
                    result = VmServerInstance.objects.filter(server=server,name=ds.get('name'))
                    if result:VmServerInstance.objects.filter(server=server,name=ds.get('name')).update(server=server,cpu=ds.get('cpu'),
                                                                                                        mem=ds.get('mem'),vnc=ds.get('vnc'),
                                                                                                        status=ds.get('status'),name=ds.get('name'),
                                                                                                        token=ds.get('token'))
                    else:VmServerInstance.objects.create(server=server,cpu=ds.get('cpu'),
                                                         mem=ds.get('mem'),status=ds.get('status'),
                                                         name=ds.get('name'),token=ds.get('token'),
                                                         vnc=ds.get('vnc'))
                VMS.close()   
コード例 #8
0
def viewVmServer(request):
    if request.GET.get('op') == "view":
        sid = request.GET.get('id')
        vServer = VMServer.selectOneHost(sid)
        VMS = LibvirtManage(vServer.uri)
        SERVER = VMS.genre(model='server')
        if SERVER: vmServer = SERVER.getVmServerInfo()
        else:
            return render_to_response('404.html',
                                      context_instance=RequestContext(request))
        if vmServer:
            vmServer['id'] = vServer.id
            vmServer['server_ip'] = vServer.server_ip
            vmServer['name'] = vServer.hostname
        vmStorage = SERVER.getVmStorageInfo()
        vmInstance = SERVER.getVmInstanceInfo(server_ip=vServer.server_ip)
        vmIns = vmInstance.get('active').get('number') + vmInstance.get(
            'inactice').get('number')
        vmInsList = []
        for vm in vmIns:
            vm['netk'] = ','.join(vm.get('netk'))
            vm['disk'] = vm.get('disks')
            vm.pop('disks')
            vmInsList.append(vm)
        VMS.close()
        return render_to_response('vmServer/index_server.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "虚拟机管理器",
                "url": '#'
            }, {
                "name": "主机列表",
                "url": "/listServer"
            }, {
                "name": vmServer.get('name'),
                "url": "/viewServer?op=view&id=" + str(vServer.id)
            }],
            "vmServer":
            vmServer,
            "model":
            "instance",
            "vmStorage":
            vmStorage,
            "vmInstance":
            vmInsList
        },
                                  context_instance=RequestContext(request))
コード例 #9
0
def addVmServer(request):
    if request.method == "GET":
        return render_to_response('vmServer/add_server.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "虚拟机管理器",
                "url": '#'
            }, {
                "name": "添加主机",
                "url": "/addServer"
            }]
        },
                                  context_instance=RequestContext(request))

    elif request.method == "POST":
        VMS = LibvirtManage(request.POST.get('vm_uri'))
        SERVER = VMS.genre(model='server')
        if SERVER:
            VMS.close()
            server = VMServer.insertVmServer(
                server_ip=request.POST.get('vm_host'),
                uri=request.POST.get('vm_uri'),
                vm_type=request.POST.get('vm_type'),
                hostname=request.POST.get('vm_hostname'),
                status=0,
            )
            if server:
                return JsonResponse({
                    "code": 200,
                    "msg": "服务器添加成功",
                    "data": None
                })
            else:
                return JsonResponse({
                    "code": 500,
                    "msg": "服务器添加失败,写入数据库失败",
                    "data": None
                })

        else:
            return JsonResponse({
                "code": 500,
                "msg": "服务器添加失败,注意URI连通性。",
                "data": None
            })
コード例 #10
0
ファイル: tasks.py プロジェクト: lynlon/VManagePlatform
def revertSnapShot(data,user):
    try:
        vMserver = VMServer.selectOneHost(id=data.get('server_id')) 
        VMS = LibvirtManage(uri=vMserver.uri) 
        INSTANCE = VMS.genre(model='instance')
        instance = INSTANCE.queryInstance(name=str(data.get('vm_name')))
        status = INSTANCE.revertSnapShot(instance, data.get('snap_name'))
        VMS.close()
        desc = u'快照恢复{snap_name}'.format(snap_name=data.get('snap_name'))
        if status==0:status = status
        else:status = 1
        result = VmLogs.objects.create(desc=desc,user=user,status=status,action='revert_snap',object=data.get('vm_name')) 
        if result:return True
        else:return False  
    except Exception,e:
        return e       
コード例 #11
0
def handleStorage(request):
    if request.method == "POST":
        op = request.POST.get('op')
        server_id = request.POST.get('server_id')
        pool_name = request.POST.get('pool_name')
        if op in [
                'delete', 'disable'
        ] and request.user.has_perm('VManagePlatform.change_vmserverinstance'):
            try:
                vMserver = VMServer.selectOneHost(id=server_id)
                VMS = LibvirtManage(uri=vMserver.uri)
            except Exception, e:
                return JsonResponse({
                    "code": 500,
                    "msg": "服务器连接失败。。",
                    "data": e
                })
            if op == 'delete':
                STORAGE = VMS.genre(model='storage')
                pool = STORAGE.getStoragePool(pool_name=pool_name)
                if pool:
                    result = STORAGE.deleteStoragePool(pool=pool)
                    VMS.close()
                    if result:
                        return JsonResponse({
                            "code": 200,
                            "msg": "存储池删除成功。",
                            "data": None
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "msg": "存储池删除失败。",
                            "data": None
                        })
                else:
                    return JsonResponse({
                        "code": 500,
                        "msg": "存储池不存在。",
                        "data": e
                    })
        else:
            return JsonResponse({
                "code": 500,
                "data": None,
                "msg": "不支持操作或者您没有权限操作此项"
            })
コード例 #12
0
def run_vnc(request):
    '''
        Call the VNC proxy for remote control
    '''
    token = request.GET.get('token', 'false')
    server_id = request.GET.get('vs', 'false')
    vm_name = request.GET.get('vm', 'false')
    vnc = request.GET.get('vnc', 'false')
    if server_id:
        vMserver = VMServer.selectOneHost(id=server_id)
        token_file = vMserver.server_ip + '.' + str(vm_name)
        tokenStr = token + ': ' + vMserver.server_ip + ':' + str(vnc)
        TokenUntils.writeVncToken(filename=token_file, token=tokenStr)
        return render(request, 'vnc/vnc_auto.html', {
            "vnc_port": settings.VNC_PROXY_PORT,
            "vnc_token": token,
        })
コード例 #13
0
def viewStorage(request):
    if request.method == "GET":
        vMserverId = request.GET.get('id')
        pool_name = request.GET.get('pool')
        vmServer = VMServer.selectOneHost(id=vMserverId)
        try:
            VMS = LibvirtManage(uri=vmServer.uri)
            STORAGE = VMS.genre(model='storage')
            if STORAGE:
                storage = STORAGE.getStorageInfo(pool_name)
                VMS.close()
            else:
                return render_to_response(
                    '404.html', context_instance=RequestContext(request))
        except Exception, e:
            return render_to_response('404.html',
                                      context_instance=RequestContext(request))
        return render_to_response('vmStorage/view_storage.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "虚拟机实例",
                "url": '#'
            }, {
                "name": "存储池管理",
                "url": "/listStorage/?id=%d" % vmServer.id
            }, {
                "name":
                "存储池详情",
                "url":
                "/viewStorage/?id=%d&pool={{ ds.pool_name }}" % vmServer.id
            }],
            "vmServer":
            vmServer,
            "storage":
            storage
        },
                                  context_instance=RequestContext(request))
コード例 #14
0
def listVmServer(request):
    hostList = VMServer.listVmServer()
    return render_to_response('vmServer/list_server.html', {
        "user":
        request.user,
        "localtion": [{
            "name": "首页",
            "url": '/'
        }, {
            "name": "虚拟机管理器",
            "url": '#'
        }, {
            "name": "主机列表",
            "url": "/listServer"
        }],
        "dataList":
        hostList,
        "model":
        "server"
    },
                              context_instance=RequestContext(request))
コード例 #15
0
def listInstance(request):
    if request.method == "GET":
        vMserverId = request.GET.get('id')
        vmServer = VMServer.selectOneHost(id=vMserverId)
        try:
            VMS = LibvirtManage(vmServer.uri)
            SERVER = VMS.genre(model='server')
            userList = User.objects.all()
            if SERVER:
                inStanceList = SERVER.getVmInstanceBaseInfo(
                    server_ip=vmServer.server_ip, server_id=vmServer.id)
                VMS.close()
            else:
                return render_to_response(
                    '404.html', context_instance=RequestContext(request))
        except:
            inStanceList = None
        return render_to_response('vmInstance/list_instance.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "虚拟机实例",
                "url": '#'
            }, {
                "name": "虚拟机实例列表",
                "url": "/listInstance?id=%s" % vMserverId
            }],
            "inStanceList":
            inStanceList,
            "vmServer":
            vmServer,
            "userList":
            userList
        },
                                  context_instance=RequestContext(request))
コード例 #16
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))
コード例 #17
0
         }, {
             "name": "网络管理",
             "url": '/addNetwork'
         }],
         "vmServer":
         vmServer,
         "netList":
         netList,
         "insList":
         insList
     },
                               context_instance=RequestContext(request))
 elif request.method == "POST" and request.user.has_perm(
         'VManagePlatform.change_vmserverinstance'):
     try:
         vmServer = VMServer.selectOneHost(id=request.POST.get('server_id'))
     except:
         return JsonResponse({"code": 500, "data": None, "msg": "主机不存在。"})
     try:
         VMS = LibvirtManage(uri=vmServer.uri)
         NETWORK = VMS.genre(model='network')
         if request.POST.get('network-mode') == 'bridge':
             SSH = BRManage(hostname=vmServer.server_ip, port=22)
             OVS = SSH.genre(model='ovs')
             BRCTL = SSH.genre(model='brctl')
             if NETWORK and OVS:
                 status = NETWORK.getNetwork(
                     netk_name=request.POST.get('bridge-name'))
                 if status:
                     VMS.close()
                     return JsonResponse({
コード例 #18
0
def viewInstance(request):
    if request.method == "GET":
        vMserverId = request.GET.get('id')
        vmServer = VMServer.selectOneHost(id=vMserverId)
        serverList = VMServer.listVmServer()
        try:
            VMS = LibvirtManage(vmServer.uri)
            INSTANCE = VMS.genre(model='instance')
            SERVER = VMS.genre(model='server')
            NETWORK = VMS.genre(model='network')
            if INSTANCE:
                instance = INSTANCE.queryInstance(
                    name=str(request.GET.get('vm_name')))
                '''获取存储池'''
                poolInfo = SERVER.getVmStorageInfo()
                '''获取网络设备'''
                netkInfo = NETWORK.listNetwork()
                '''获取cdrom设备'''
                imgList = INSTANCE.getMediaDevice(instance)
                '''获取iso存储池的iso列表'''
                isoList = SERVER.getVmIsoList()
                '''获取实例的xml文件'''
                insXml = INSTANCE.getInsXMLDesc(instance, flag=0)
                '''获取实例信息'''
                insInfo = INSTANCE.getVmInstanceInfo(
                    instance,
                    server_ip=vmServer.server_ip,
                    vMname=request.GET.get('vm_name'))
                insInfo['cpu_per'] = INSTANCE.getCpuUsage(instance)
                snapList = INSTANCE.snapShotList(instance)
                VMS.close()
            else:
                return render_to_response(
                    '404.html', context_instance=RequestContext(request))
        except Exception, e:
            snapList = None
            insInfo = None
        return render_to_response('vmInstance/view_instance.html', {
            "user":
            request.user,
            "localtion": [{
                "name": "首页",
                "url": '/'
            }, {
                "name": "虚拟机实例",
                "url": '#'
            }, {
                "name": "虚拟机实例列表",
                "url": "/listInstance"
            }],
            "inStance":
            insInfo,
            "vmServer":
            vmServer,
            "snapList":
            snapList,
            "poolInfo":
            poolInfo,
            "netkInfo":
            netkInfo,
            "imgList":
            imgList,
            "isoList":
            isoList,
            "serverList":
            serverList,
            "insXml":
            insXml
        },
                                  context_instance=RequestContext(request))
コード例 #19
0
def modfInstance(request):
    if request.method == "POST":
        if CommTools.argsCkeck(args=['op', 'server_id', 'vm_name'],
                               data=request.POST) and request.user.has_perm(
                                   'VManagePlatform.change_vmserverinstance'):
            vMserver = VMServer.selectOneHost(id=request.POST.get('server_id'))
            LIBMG = LibvirtManage(uri=vMserver.uri)
            SERVER = LIBMG.genre(model='server')
            STROAGE = LIBMG.genre(model='storage')
            INSTANCE = LIBMG.genre(model='instance')
            NETWORK = LIBMG.genre(model='network')
            if SERVER:
                instance = INSTANCE.queryInstance(
                    name=str(request.POST.get('vm_name')))
                if instance is False:
                    LIBMG.close()
                    return JsonResponse({
                        "code": 404,
                        "data": None,
                        "msg": "虚拟机不存在,或者已经被删除。"
                    })
            else:
                return JsonResponse({
                    "code": 500,
                    "data": None,
                    "msg": "虚拟主机链接失败。"
                })
            #调整磁盘
            if request.POST.get('device') == 'disk':
                if request.POST.get('op') == 'attach':
                    if instance.state()[0] == 5:
                        return JsonResponse({
                            "code": 500,
                            "data": None,
                            "msg": "请先启动虚拟机。"
                        })
                    storage = STROAGE.getStoragePool(
                        pool_name=request.POST.get('pool_name'))
                    if storage:
                        volume = STROAGE.createVolumes(
                            pool=storage,
                            volume_name=request.POST.get('vol_name'),
                            drive=request.POST.get('vol_drive'),
                            volume_capacity=request.POST.get('vol_size'))
                        if volume:
                            volPath = volume.path()
                            volume_name = volume.name()
                        else:
                            LIBMG.close()
                            return JsonResponse({
                                "code": 500,
                                "data": None,
                                "msg": "卷已经存在。"
                            })
                        status = INSTANCE.addInstanceDisk(instance, volPath)
                        LIBMG.close()
                        if status:
                            recordLogs.delay(
                                user=request.user,
                                action='attach_disk',
                                status=0,
                                vm_name=request.POST.get('vm_name'))
                            return JsonResponse({
                                "code": 200,
                                "data": None,
                                "msg": "操作成功。"
                            })
                        else:
                            STROAGE.deleteVolume(storage, volume_name)
                            recordLogs.delay(
                                user=request.user,
                                action='attach_disk',
                                status=1,
                                vm_name=request.POST.get('vm_name'))
                            return JsonResponse({
                                "code": 500,
                                "data": None,
                                "msg": "操作失败。"
                            })
                    else:
                        LIBMG.close()
                        return JsonResponse({
                            "code": 404,
                            "data": None,
                            "msg": "存储池不存在,或者已经被删除。"
                        })
                elif request.POST.get('op') == 'detach':
                    status = INSTANCE.delInstanceDisk(
                        instance, volPath=request.POST.get('disk'))
                    LIBMG.close()
                    recordLogs.delay(user=request.user,
                                     action='detach_disk',
                                     status=status,
                                     vm_name=request.POST.get('vm_name'))
                    if status == 0:
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "操作成功。"
                        })
                    else:
                        LIBMG.close()
                        return JsonResponse({
                            "code": 500,
                            "data": status,
                            "msg": "操作失败。"
                        })
            #调整网卡
            elif request.POST.get('device') == 'netk':
                if request.POST.get('op') == 'attach':
                    result = INSTANCE.addInstanceInterface(
                        instance, brName=request.POST.get('netk_name'))
                    recordLogs.delay(user=request.user,
                                     action='attach_netk',
                                     status=result,
                                     vm_name=request.POST.get('vm_name'))
                    if result == 0:
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "操作成功。"
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": status,
                            "msg": "添加失败。"
                        })
                elif request.POST.get('op') == 'detach':
                    result = INSTANCE.delInstanceInterface(
                        instance, interName=request.POST.get('netk_name'))
                    recordLogs.delay(user=request.user,
                                     action='detach_netk',
                                     status=result,
                                     vm_name=request.POST.get('vm_name'))
                    if result == 0:
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "操作成功。"
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": status,
                            "msg": "添加失败。"
                        })
            #调整内存大小
            elif request.POST.get('device') == 'mem':
                if request.POST.get('op') == 'attach':
                    result = INSTANCE.setMem(instance,
                                             mem=int(request.POST.get('mem')))
                    recordLogs.delay(user=request.user,
                                     action='attach_mem',
                                     status=result,
                                     vm_name=request.POST.get('vm_name'))
                    if result == 0:
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "操作成功。"
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": None,
                            "msg": "不能设置虚拟机内存超过宿主机机器的物理内存"
                        })
            #调整cpu个数
            elif request.POST.get('device') == 'cpu':
                if request.POST.get('op') == 'attach':
                    result = INSTANCE.setVcpu(instance,
                                              cpu=int(request.POST.get('cpu')))
                    LIBMG.close()
                    recordLogs.delay(user=request.user,
                                     action='attach_cpu',
                                     status=result,
                                     vm_name=request.POST.get('vm_name'))
                    if result == 0:
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "操作成功。"
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": None,
                            "msg": "不能设置虚拟机CPU超过宿主机机器的物理CPU个数"
                        })
            #调整带宽
            elif request.POST.get('device') == 'bandwidth':
                SSH = BRManage(hostname=vMserver.server_ip, port=22)
                OVS = SSH.genre(model='ovs')
                BRCTL = SSH.genre(model='brctl')
                mode = INSTANCE.getInterFace(instance,
                                             request.POST.get('netk_name'))
                if request.POST.get('op') == 'attach':
                    if mode.get('type') == 'openvswitch':
                        if int(request.POST.get('bandwidth')) == 0:
                            result = OVS.ovsCleanBandwidth(
                                port=request.POST.get('netk_name'))
                        else:
                            result = OVS.ovsConfBandwidth(
                                port=request.POST.get('netk_name'),
                                bandwidth=request.POST.get('bandwidth'))
                    else:
                        if int(request.POST.get('bandwidth')) == 0:
                            result = INSTANCE.cleanInterfaceBandwidth(
                                instance, request.POST.get('netk_name'))
                        result = INSTANCE.setInterfaceBandwidth(
                            instance,
                            port=request.POST.get('netk_name'),
                            bandwidth=request.POST.get('bandwidth'))
                    SSH.close()
                    LIBMG.close()
                    if result.get('status') == 'success':
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "操作成功。"
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": None,
                            "msg": "未设置带宽,不需要清除"
                        })

            LIBMG.close()
        else:
            return JsonResponse({
                "code": 500,
                "data": None,
                "msg": "暂时不支持的操作或者您没有权限操作操作此项。"
            })
コード例 #20
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
コード例 #21
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": "不支持的操作或者您没有权限添加虚拟机"
            })
コード例 #22
0
def handleVolume(request):
    if request.method == "POST":
        op = request.POST.get('op')
        server_id = request.POST.get('server_id')
        pool_name = request.POST.get('pool_name')
        if op in [
                'delete', 'add'
        ] and request.user.has_perm('VManagePlatform.change_vmserverinstance'):
            try:
                vmServer = VMServer.selectOneHost(id=server_id)
            except:
                return JsonResponse({
                    "code": 500,
                    "data": None,
                    "msg": "主机不存在。"
                })
            VMS = LibvirtManage(uri=vmServer.uri)
            STORAGE = VMS.genre(model='storage')
            if STORAGE:
                pool = STORAGE.getStoragePool(pool_name=pool_name)
                if pool:
                    volume = STORAGE.getStorageVolume(
                        pool=pool, volume_name=request.POST.get('vol_name'))
                    if op == 'add':
                        if volume:
                            return JsonResponse({
                                "code": 500,
                                "data": None,
                                "msg": "卷已经存在"
                            })
                        else:
                            status = STORAGE.createVolumes(
                                pool=pool,
                                volume_name=request.POST.get('vol_name'),
                                flags=0,
                                volume_capacity=int(
                                    request.POST.get('vol_size')),
                                drive=request.POST.get('vol_drive'))
                            VMS.close()
                            if status:
                                return JsonResponse({
                                    "code": 200,
                                    "data": None,
                                    "msg": "卷创建成功。"
                                })
                            else:
                                return JsonResponse({
                                    "code": 500,
                                    "data": None,
                                    "msg": "卷创建失败。"
                                })
                    elif op == 'delete':
                        if volume:
                            status = STORAGE.deleteVolume(
                                pool=pool,
                                volume_name=request.POST.get('vol_name'))
                            VMS.close()
                            if isinstance(status, str):
                                return JsonResponse({
                                    "code": 500,
                                    "data": status,
                                    "msg": "卷删除失败。"
                                })
                            else:
                                return JsonResponse({
                                    "code": 200,
                                    "data": None,
                                    "msg": "卷删除成功。"
                                })
                        else:
                            return JsonResponse({
                                "code": 500,
                                "data": None,
                                "msg": "卷删除失败,卷不存在。"
                            })
                else:
                    return JsonResponse({
                        "code": 500,
                        "data": None,
                        "msg": "存储池不存在。"
                    })
            else:
                return JsonResponse({
                    "code": 500,
                    "data": None,
                    "msg": "主机连接失败。"
                })
        else:
            return JsonResponse({"code": 500, "data": None, "msg": "不支持操作。"})
    else:
        return JsonResponse({"code": 500, "data": None, "msg": "不支持的HTTP操作。"})
コード例 #23
0
def migrateInstace(data):
    try:
        vMserver = VMServer.selectOneHost(id=data.get('server_id'))
    except Exception, e:
        return e
コード例 #24
0
 try:
     vMserver = VMServer.selectOneHost(id=data.get('server_id'))
 except Exception, e:
     return e
 try:
     VMS = LibvirtManage(uri=vMserver.uri)
     #获取要迁移的虚拟机硬盘情况
     INSTANCE = VMS.genre(model='instance')
     instance = INSTANCE.queryInstance(name=str(data.get('vm_name')))
     source_instance = INSTANCE.getVmInstanceInfo(
         server_ip=vMserver.server_ip, vm_name=data.get('vm_name'))
 except Exception, e:
     return e
 try:
     #连接远程宿主机,获取存储池,然后在存储池里面创建跟迁移的虚拟机相同的硬盘
     vMTargetserver = VMServer.selectOneHost(id=data.get('server_tid'))
 except Exception, e:
     return e
 targetUri = str(vMTargetserver.uri).replace('qemu+',
                                             '').replace('/system', '')
 TargetVMS = LibvirtManage(uri=vMTargetserver.uri)
 TargetStorage = TargetVMS.genre(model='storage')
 #获取被迁移的虚拟机磁盘配置,并且到远程服务器上创建,相同的磁盘配置
 for volume in source_instance.get('disks'):
     if volume.get('disk_sn').startswith('vd'):
         pool_name = volume.get('disk_pool')
         if pool_name:
             #判断远程服务器上是否存在相同的存储池
             pool = TargetStorage.getStoragePool(pool_name=pool_name)
             if pool:
                 volume_name = volume.get('disk_path')
コード例 #25
0
def handleSnapshot(request):
    if request.method == "POST":
        op = request.POST.get('op')
        server_id = request.POST.get('server_id')
        insName = request.POST.get('vm_name')
        snapName = request.POST.get('snap_name')
        if op in [
                'view', 'resume', 'delete', 'add'
        ] 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))
                if op == 'view':
                    snap = INSTANCE.snapShotView(instance, snapName)
                    VMS.close()
                    if snap:
                        return JsonResponse({
                            "code":
                            200,
                            "data":
                            snap.replace('<', '&lt;').replace('>', '&gt;'),
                            "msg":
                            "查询成功."
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": "查无结果",
                            "msg": "查无结果"
                        })
                elif op == 'resume':
                    revertSnapShot.delay(request.POST, str(request.user))
                    VMS.close()
                    return JsonResponse({
                        "code": 200,
                        "data": None,
                        "msg": "快照恢复任务提交成功。"
                    })
                elif op == 'add':
                    snapInstace.delay(request.POST, str(request.user))
                    VMS.close()
                    return JsonResponse({
                        "code": 200,
                        "data": None,
                        "msg": "快照任务提交成功."
                    })
                elif op == 'delete':
                    snap = INSTANCE.snapShotDelete(instance, snapName)
                    VMS.close()
                    recordLogs.delay(user=str(request.user),
                                     action=op + '_snap',
                                     status=snap,
                                     vm_name=insName)
                    if snap == 0:
                        return JsonResponse({
                            "code": 200,
                            "data": None,
                            "msg": "快照删除成功"
                        })
                    else:
                        return JsonResponse({
                            "code": 500,
                            "data": None,
                            "msg": "快照删除失败"
                        })
            except Exception, e:
                return JsonResponse({
                    "code": 500,
                    "msg": "虚拟机快照操作失败。。",
                    "data": e
                })