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")
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)
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))
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)
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)
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="정상적인 상태 정보를 받지 못했습니다.")