def found_new_qdisk(domid, devid, vdi_uuid): qmp_sock = QEMU_DP_SOCKET_DIR + "/qmp_sock.{}".format(vdi_uuid) _qmp_ = qmp.QEMUMonitorProtocol(qmp_sock) path = "%s/%s" % (VAR_RUN_PREFIX, vdi_uuid) with open(path, 'w') as fd: fd.write("/local/domain/%s/device/vbd/%s/state" % (domid, devid)) params = {} params['domid'] = domid params['devid'] = devid params['type'] = 'qdisk' params['blocknode'] = 'qemu_node' params['devicename'] = vdi_uuid connected = False count = 0 while not connected: try: _qmp_.connect() connected = True except: if count > QMP_CONNECT_MAX_ATTEMPTS: log.debug( "%s: ERROR: qemu-dp on socket %s couldn't be connected for vdi_uuid" % (sys.argv[0], qmp_sock)) return sleep(1) count += 1 _qmp_.command('xen-watch-device', **params)
def relink(self, dbg, top, base): log.debug( "%s: xcpng.qemudisk.Qemudisk.relink: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() # Commit args = { "job-id": "relink-{}".format(self.vdi_uuid), "device": LEAF_NODE_NAME, "top": top, "base": base, "backing-file": base } _qmp_.command('relink-chain', **args) for i in range(50): res = _qmp_.command(dbg, "query-block-jobs") if len(res) == 0: break time.sleep(0.1) _qmp_.close() except Exception as e: log.error( "%s: xcpng.qemudisk.Qemudisk.relink: Failed to relink chain for image in qemu_dp instance: " "uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) try: _qmp_.close() except: pass raise Exception(e)
def snap(self, dbg, snap_uri): log.debug("%s: xcpng.qemudisk.Qemudisk.snap: vdi_uuid %s pid %d qmp_sock %s snap_uri %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock, snap_uri)) if self.vdi_type != 'qcow2': raise Exception('Incorrect VDI type') _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() args = {'driver': 'qcow2', 'cache': {'direct': True, 'no-flush': True}, # 'discard': 'unmap', 'file': self._parse_image_uri(dbg), 'node-name': SNAP_NODE_NAME, 'backing': ''} _qmp_.command('blockdev-add', **args) args = {'node': LEAF_NODE_NAME, 'overlay': SNAP_NODE_NAME} _qmp_.command('blockdev-snapshot', **args) _qmp_.close() except Exception as e: log.error("%s: xcpng.qemudisk.Qemudisk.snap: Failed to set backing file for image in qemu_dp instance: " "uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) try: _qmp_.close() except: pass raise Exception(e)
def open(self, dbg): log.debug("%s: xcpng.qemudisk.Qemudisk.open: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) log.debug("%s: xcpng.qemudisk.Qemudisk.open: args: %s" % (dbg, self.open_args)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() _qmp_.command("blockdev-add", **self.open_args) # Start an NBD server exposing this blockdev _qmp_.command("nbd-server-start", addr={'type': 'unix', 'data': {'path': self.nbd_sock}}) _qmp_.command("nbd-server-add", device=LEAF_NODE_NAME, writable=True) log.debug("%s: xcpng.qemudisk.Qemudisk.open: Image opened: %s" % (dbg, self.open_args)) except Exception as e: log.error("%s: xcpng.qemudisk.Qemudisk.open: Failed to open image in qemu_dp instance: uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) try: _qmp_.close() except: pass raise Exception(e)
def close(self, dbg): log.debug( "%s: xcpng.qemudisk.Qemudisk.close: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() if platform.linux_distribution()[1] == '7.5.0': try: path = "{}/{}".format(utils.VAR_RUN_PREFIX, self.vdi_uuid) with open(path, 'r') as f: line = f.readline().strip() utils.call(dbg, ["/usr/bin/xenstore-write", line, "5"]) os.unlink(path) except Exception: log.debug( "%s: xcpng.qemudisk.Qemudisk.close: There was no xenstore setup" % dbg) elif platform.linux_distribution()[1] == '7.6.0' or \ platform.linux_distribution()[1] == '8.0.0' or \ platform.linux_distribution()[1] == '8.1.0' or \ platform.linux_distribution()[1] == '8.2.0' or \ platform.linux_distribution()[1] == '8.2.1': path = "{}/{}".format(utils.VAR_RUN_PREFIX, self.vdi_uuid) try: with open(path, 'r') as f: line = f.readline().strip() os.unlink(path) args = { 'type': 'qdisk', 'domid': int(re.search('domain/(\d+)/', line).group(1)), 'devid': int(re.search('vbd/(\d+)/', line).group(1)) } _qmp_.command(dbg, "xen-unwatch-device", **args) except Exception: log.debug( "%s: xcpng.qemudisk.Qemudisk.close: There was no xenstore setup" % dbg) # Stop the NBD server _qmp_.command("nbd-server-stop") # Remove the block device args = {"node-name": LEAF_NODE_NAME} _qmp_.command("blockdev-del", **args) except Exception as e: log.error( "%s: xcpng.qemudisk.Qemudisk.close: Failed to close image in qemu_dp instance: uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) log.error(traceback.format_exc()) try: _qmp_.close() except: pass raise Exception(e)
def quit(self, dbg): log.debug("%s: xcpng.qemudisk.Qemudisk.quit: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() _qmp_.command('quit') _qmp_.close() except Exception as e: log.error("%s: xcpng.qemudisk.Qemudisk.quit: Failed to destroy qemu_dp instance: pid %s" % (dbg, self.pid)) try: _qmp_.close() except: pass raise Exception(e)
def resume(self, dbg): log.debug("%s: xcpng.qemudisk.Qemudisk.resume: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() # Resume IO on blockdev args = {"device": LEAF_NODE_NAME} _qmp_.command("x-blockdev-resume", **args) except Exception as e: log.error("%s: xcpng.qemudisk.Qemudisk.resume: Failed to resume IO for image in qemu_dp instance: " "uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) try: _qmp_.close() except: pass raise Exception(e)
def commit(self, dbg, top, base): log.debug( "%s: xcpng.qemudisk.Qemudisk.commit: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() # Commit args = { "job-id": "commit-{}".format(self.vdi_uuid), "device": LEAF_NODE_NAME, "top": top, "base": base } _qmp_.command('block-commit', **args) for i in range(50): res = _qmp_.command(dbg, "query-block-jobs") if len(res) == 0: if self.img_uri == top: args = {"device": "commit-{}".format(self.vdi_uuid)} _qmp_.command('block-job-complete', **args) else: break time.sleep(0.1) _qmp_.close() except Exception as e: log.error( "%s: xcpng.qemudisk.Qemudisk.commit: Failed to commit changes for image in qemu_dp instance: " "uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) log.error(traceback.format_exc()) try: _qmp_.close() except: pass raise Exception(e)
def suspend(self, dbg): log.debug( "%s: xcpng.qemudisk.Qemudisk.suspend: vdi_uuid %s pid %d qmp_sock %s" % (dbg, self.vdi_uuid, self.pid, self.qmp_sock)) _qmp_ = qmp.QEMUMonitorProtocol(self.qmp_sock) try: _qmp_.connect() # Suspend IO on blockdev args = {"device": LEAF_NODE_NAME} _qmp_.command("x-blockdev-suspend", **args) except Exception as e: log.error( "%s: xcpng.qemudisk.Qemudisk.suspend: Failed to suspend IO for image in qemu_dp instance: " "uuid: %s pid %s" % (dbg, self.vdi_uuid, self.pid)) log.error(traceback.format_exc()) try: _qmp_.close() except: pass raise Exception(e)