Example #1
0
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)
Example #2
0
    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)