예제 #1
0
def hvm_delete_image(id):
    host_port = config.AGENT_PORT
    vhd_Name = db_session.query(GnVmImages).filter(GnVmImages.id == id).first()
    #image_pool = db_session.query(GnImagesPool).filter(GnImagesPool.host_id == vhd_Name.host_id).first()
    host_machine = db_session.query(GnHostMachines).filter(
        GnHostMachines.id == vhd_Name.host_id).first()
    if host_machine.ip.find(':') >= 0:
        host_ip = host_machine.ip.split(':')[0]
        host_port = host_machine.ip.split(':')[1]
    else:
        host_ip = host_machine.ip

    ps = PowerShell(host_ip, host_port, config.AGENT_REST_URI)
    image_delete = ps.delete_vm_Image(vhd_Name.filename, config.NAS_PATH)

    json_obj = json.dumps(image_delete)
    json_size = len(json_obj)
    if json_size <= 2:  #json 크기는 '{}' 포함
        #delete_vm = db_session.query(GnVmImages).filter(GnVmImages.id == id).update({"status": "Removed"})
        delete_vm = db_session.query(GnVmImages).filter(
            GnVmImages.id == id).delete()
        db_session.commit()
        #update 완료시 리턴값은 1
        if delete_vm == 1:
            return jsonify(status=True, message="image delete complete")
        else:
            logger.debug('delete hyperv images error')
            return jsonify(status=False, message="DB update fail")
    else:
        logger.debug('delete hyperv images error = %s' % json_obj)
        return jsonify(status=False, message="image delete fail")
예제 #2
0
def hvm_snapshot():
    host_port = config.AGENT_PORT
    vm_info = db_session.query(GnVmImages).filter(
        GnVmImages.id == request.json['vm_id']).first()
    org_id = db_session.query(GnVmMachines).filter(
        GnVmMachines.id == request.json['ord_id']).first()
    host_machine = db_session.query(GnHostMachines).filter(
        GnHostMachines.id == org_id.host_id).first()
    # image_pool = db_session.query(GnImagesPool).filter(GnImagesPool.host_id == org_id.host_id).first()
    if host_machine.ip.find(':') >= 0:
        host_ip = host_machine.ip.split(':')[0]
        host_port = host_machine.ip.split(':')[1]
    else:
        host_ip = host_machine.ip

    try:
        ps = PowerShell(host_ip, host_port, config.AGENT_REST_URI)
        create_snap = ps.create_snap(org_id.internal_id, config.MANAGER_PATH,
                                     config.NAS_PATH)
        if create_snap['Name'] is not None:
            filename = create_snap['Name']
            icon = 'gn_icon_windows.png'

            vm_info.filename = filename
            vm_info.icon = icon
            vm_info.status = "Running"
            vm_info.os_ver = org_id.os_ver
            vm_info.host_id = host_machine.id
            db_session.commit()

            start_vm = ps.start_vm(org_id.internal_id)
            if start_vm['State'] is 2:
                return jsonify(status=True)
            else:
                logger.debug('snapshot create Error = %s' % start_vm)
                error_hist = GnErrorHist(type=vm_info.type,
                                         action="Snap-create",
                                         team_code=vm_info.team_code,
                                         author_id=vm_info.author_id,
                                         vm_id=vm_info.id,
                                         vm_name=vm_info.name,
                                         cause=start_vm)
                db_session.add(error_hist)
                vm_info.status = "Error"
                db_session.commit()
                return jsonify(status=False)
    except Exception as e:
        logger.debug('snapshot create Error = %s' % e.message)
        error_hist = GnErrorHist(type=vm_info.type,
                                 action="Snap-create",
                                 team_code=vm_info.team_code,
                                 author_id=vm_info.author_id,
                                 vm_id=vm_info.id,
                                 vm_name=vm_info.name,
                                 cause=e.message)
        db_session.add(error_hist)
        vm_info.status = "Error"
        db_session.commit()
        return jsonify(status=False)
예제 #3
0
def hvm_image_list(type):
    list_get_query = db_session.query(GnVmImages).filter(
        GnVmImages.sub_type == type).all()
    get_items_to_json = json.dumps(list_get_query, cls=AlchemyEncoder)
    json.loads(get_items_to_json)
    return jsonify(status=True,
                   message="success",
                   list=json.loads(get_items_to_json))
예제 #4
0
def hvm_vm_list():
    host_port = config.AGENT_PORT
    host_machine = db_session.query(GnHostMachines).filter(
        GnHostMachines.name == 'hyperv').first()
    if host_machine.ip.find(':') >= 0:
        host_ip = host_machine.ip.split(':')[0]
        host_port = host_machine.ip.split(':')[1]
    else:
        host_ip = host_machine.ip

    ps = PowerShell(host_ip, host_port, config.AGENT_REST_URI)
    vm_list = ps.get_vm()
    # todo get-vm. VM 정보를 DB에서 가져온다.
    return jsonify(list=vm_list, message="", status=True)
예제 #5
0
def hvm_delete(id):
    host_port = config.AGENT_PORT
    vmid = db_session.query(GnVmMachines).filter(GnVmMachines.id == id).first()
    host_machine = db_session.query(GnHostMachines).filter(
        GnHostMachines.id == vmid.host_id).first()
    if host_machine.ip.find(':') >= 0:
        host_ip = host_machine.ip.split(':')[0]
        host_port = host_machine.ip.split(':')[1]
    else:
        host_ip = host_machine.ip

    #image_pool = db_session.query(GnImagesPool).filter(GnImagesPool.host_id == vmid.host_id).first()

    try:
        ps = PowerShell(host_ip, host_port, config.AGENT_REST_URI)
        vm_info = ps.get_vm_one(vmid.internal_id)
        #  REST hvm_delete 1. Powershell Script를 통해 VM을 정지한다.
        stop_vm = ps.stop_vm(vmid.internal_id)
        if stop_vm['State'] is 3:
            delete_vm = ps.delete_vm(vmid.internal_id, config.LOCAL_PATH,
                                     config.MANAGER_PATH)
            update_vm_machines = db_session.query(GnVmMachines).filter(
                GnVmMachines.id == id).delete()
            update_instance_status = db_session.query(GnInstanceStatus).filter(GnInstanceStatus.vm_id == vmid.id) \
                .update({"delete_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S')})

            backup_hist_list = db_session.query(GnBackupHist).filter(
                GnBackupHist.vm_id == id).all()
            filename = ''
            for hist in backup_hist_list:
                ps.delete_backup(hist.filename, config.BACKUP_PATH)

            db_session.query(GnBackupHist).filter(
                GnBackupHist.vm_id == id).delete()
            db_session.query(GnBackup).filter(GnBackup.vm_id == id).delete()

            db_session.commit()
            # REST hvm_delete 2. VM을 삭제한다.
            # todo REST hvm_delete 3. 삭제된 VM DB 데이터를 삭제 상태로 업데이트한다.
            return jsonify(message="Remove success", status=True)
        else:
            logger.debug("delete vm error: %s" % stop_vm)
            error_hist = GnErrorHist(type=vmid.type,
                                     action="Delete",
                                     team_code=vmid.team_code,
                                     author_id=vmid.author_id,
                                     vm_id=vmid.id,
                                     vm_name=vmid.name,
                                     cause=stop_vm)
            db_session.add(error_hist)
            db_session.commit()
            return jsonify(message="Remove failure", status=False)
    except Exception as e:
        logger.debug("delete vm error: %s" % e.message)
        error_hist = GnErrorHist(type=vmid.type,
                                 action="Delete",
                                 team_code=vmid.team_code,
                                 author_id=vmid.author_id,
                                 vm_id=vmid.id,
                                 vm_name=vmid.name,
                                 cause=e.message)
        db_session.add(error_hist)
        db_session.commit()
        return jsonify(message="Remove failure", status=False)
예제 #6
0
def hvm_state(id):
    host_port = config.AGENT_PORT
    vmid = db_session.query(GnVmMachines).filter(GnVmMachines.id == id).first()
    host_machine = db_session.query(GnHostMachines).filter(
        GnHostMachines.id == vmid.host_id).first()

    if host_machine.ip.find(':') >= 0:
        host_ip = host_machine.ip.split(':')[0]
        host_port = host_machine.ip.split(':')[1]
    else:
        host_ip = host_machine.ip

    ps = PowerShell(host_ip, host_port, config.AGENT_REST_URI)

    type = request.json['type']
    #print vmid.internal_id
    #    vm = GnVmMachines.query.filter_by().first
    start_vm = ''
    if type == "Resume":
        try:
            # VM 시작
            # 1. 가상머신을 시작한다. (Start-VM)
            start_vm = ps.start_vm(vmid.internal_id)
            # start_vm
            # print id
            # 2. 가상머신 상태를 체크한다. (Get-VM)

            if start_vm['State'] is 2:
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == start_vm['Id'])\
                        .update({"status": "Running", "start_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S')})
                db_session.commit()
                # print start_vm['Id']
                return jsonify(status=True, message="success VM starting")
            else:
                error_hist = GnErrorHist(type=vmid.type,
                                         action=type,
                                         team_code=vmid.team_code,
                                         author_id=vmid.author_id,
                                         vm_id=vmid.id,
                                         vm_name=vmid.name,
                                         cause=start_vm)
                db_session.add(error_hist)
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == start_vm['Id'])\
                        .update({"status": "error"})
                db_session.commit()
                return jsonify(status=False, message="정상적인 결과가 아닙니다.")
        except Exception as err:
            logger.error('hyperv status change error = %s' % err.message)
            error_hist = GnErrorHist(type=vmid.type,
                                     action=type,
                                     team_code=vmid.team_code,
                                     author_id=vmid.author_id,
                                     vm_id=vmid.id,
                                     vm_name=vmid.name,
                                     cause=start_vm)
            db_session.add(error_hist)
            db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == start_vm['Id']) \
                .update({"status": "error"})
            db_session.commit()
            return jsonify(status=False, message="정상적인 결과가 아닙니다.")

    elif type == "stop" or type == "shutdown":
        stop = ''
        try:
            # stop 1. 가상머신을 정지한다. (Stop-VM)
            stop = ps.stop_vm(vmid.internal_id)
            # stop 2. 가상머신 상태를 체크한다. (Get-VM)
            if stop['State'] is 3:
                # stop 3. 변경된 가상머신 상태를 DB에 업데이트한다.
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == stop['Id'])\
                        .update({"status": "Stop", "stop_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S')})
                db_session.commit()
                return jsonify(status=True, message="VM Stop")
            else:
                logger.error('hyperv status change error(%s) = %s' %
                             (type, stop))
                error_hist = GnErrorHist(type=vmid.type,
                                         action=type,
                                         team_code=vmid.team_code,
                                         author_id=vmid.author_id,
                                         vm_id=vmid.id,
                                         vm_name=vmid.name,
                                         cause=stop)
                db_session.add(error_hist)
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == stop['Id']) \
                        .update({"status": "error"})
                db_session.commit()
                return jsonify(status=False, message="정상적인 결과값이 아닙니다.")
                # return jsonify(status=False, message="상태 미완성")
        except Exception as err:
            logger.error(err)
            error_hist = GnErrorHist(type=vmid.type,
                                     action=type,
                                     team_code=vmid.team_code,
                                     author_id=vmid.author_id,
                                     vm_id=vmid.id,
                                     vm_name=vmid.name,
                                     cause=err.message)
            db_session.add(error_hist)
            db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == stop['Id']) \
                .update({"status": "error"})
            db_session.commit()
            return jsonify(status=False, message="정상적인 결과가 아닙니다.")

    elif type == "Reboot":
        restart = ''
        try:
            restart = ps.restart_vm(vmid.internal_id)
            # resume 1. 가상머신을 재시작한다. (Restart-VM)
            if restart['State'] is 2:
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == restart['Id'])\
                    .update({"start_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
                             "stop_time": datetime.datetime.now().strftime('%Y%m%d%H%M%S')})
                db_session.commit()
                return jsonify(status=True, message="VM Restart")
            else:
                logger.debug('restart error = %s' % restart)
                error_hist = GnErrorHist(type=vmid.type,
                                         action=type,
                                         team_code=vmid.team_code,
                                         author_id=vmid.author_id,
                                         vm_id=vmid.id,
                                         vm_name=vmid.name,
                                         cause=restart)
                db_session.add(error_hist)
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == restart['Id']) \
                    .update({"status": "error"})
                db_session.commit()
                return jsonify(status=False, message="정상적인 결과값이 아닙니다.")
        except Exception as err:
            error_hist = GnErrorHist(type=vmid.type,
                                     action=type,
                                     team_code=vmid.team_code,
                                     author_id=vmid.author_id,
                                     vm_id=vmid.id,
                                     vm_name=vmid.name,
                                     cause=err.message)
            db_session.add(error_hist)
            logger.error(err)
            db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == restart['Id']) \
                .update({"status": "error"})
            db_session.commit()
            return jsonify(status=False, message="정상적인 결과가 아닙니다.")

    elif type == "Suspend":
        suspend = ''
        try:
            suspend = ps.suspend_vm(vmid.internal_id)
            if suspend['State'] is 9:
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == suspend['Id'])\
                    .update({"status": "Suspend"})
                db_session.commit()
                return jsonify(status=True, message="가상머신이 일시정지되었습니다.")
            else:
                error_hist = GnErrorHist(type=vmid.type,
                                         action=type,
                                         team_code=vmid.team_code,
                                         author_id=vmid.author_id,
                                         vm_id=vmid.id,
                                         vm_name=vmid.name,
                                         cause=suspend)
                db_session.add(error_hist)
                db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == suspend['Id']) \
                    .update({"status": "error"})
                db_session.commit()
                return jsonify(status=False, message="정상적인 결과값이 아닙니다.")
        except Exception as err:
            error_hist = GnErrorHist(type=vmid.type,
                                     action=type,
                                     team_code=vmid.team_code,
                                     author_id=vmid.author_id,
                                     vm_id=vmid.id,
                                     vm_name=vmid.name,
                                     cause=suspend)
            db_session.add(error_hist)
            logger.error(err)
            db_session.query(GnVmMachines).filter(GnVmMachines.internal_id == suspend['Id']) \
                .update({"status": "error"})
            db_session.commit()
            return jsonify(status=False, message="정상적인 결과가 아닙니다.")

    elif type == "powerdown":
        return jsonify(status=False, message="상태 미완성")
    else:
        logger.debug('undefined status = %s' % type)
        return jsonify(status=False, message="정상적인 상태 정보를 받지 못했습니다.")