예제 #1
0
def create(dbg, qemudisk, uri, img_qemu_uri):
    log.debug("%s: xcpng.qemudisk.create: uri: %s " % (dbg, uri))

    vdi_uuid = utils.get_vdi_uuid_by_uri(dbg, uri)
    sr_uuid = utils.get_sr_uuid_by_uri(dbg, uri)
    vdi_type = utils.get_vdi_type_by_uri(dbg, uri)
    if vdi_type not in IMAGE_TYPES:
        raise Exception('Incorrect VDI type')

    utils.mkdir_p(QEMU_DP_SOCKET_DIR, 0o0700)

    nbd_sock = QEMU_DP_SOCKET_DIR + "/qemu-nbd.{}".format(vdi_uuid)
    qmp_sock = QEMU_DP_SOCKET_DIR + "/qmp_sock.{}".format(vdi_uuid)
    qmp_log = QEMU_DP_SOCKET_DIR + "/qmp_log.{}".format(vdi_uuid)
    log.debug("%s: xcpng.qemudisk.create: Spawning qemu process for VDI %s with qmp socket at %s"
              % (dbg, vdi_uuid, qmp_sock))

    cmd = [QEMU_DP, qmp_sock]

    try:
        log_fd = open(qmp_log, 'w+')
        p = subprocess.Popen(cmd, stdout=log_fd, stderr=log_fd)
    except Exception as e:
        log.error("%s: xcpng.qemudisk.create: Failed to create qemu_dp instance: uri %s" %
                  (dbg, uri))
        try:
            log_fd.close()
        except:
            pass
        raise Exception(e)

    log.debug("%s: xcpng.qemudisk.create: New qemu process has pid %d" % (dbg, p.pid))

    return qemudisk(dbg, sr_uuid, vdi_uuid, vdi_type, img_qemu_uri, p.pid, qmp_sock, nbd_sock, qmp_log)
예제 #2
0
    def sr_import(self, dbg, uri, configuration):
        log.debug(
            "%s: xcpng.librbd.sr.SROperations.sr_import: uri: %s configuration %s"
            % (dbg, uri, configuration))

        cluster = ceph_cluster(dbg, get_cluster_name_by_uri(dbg, uri))
        pool_name = get_sr_name_by_uri(dbg, uri)

        try:
            cluster.connect()
            if not cluster.pool_exists(pool_name):
                raise Exception("CEPH pool %s doesn\'t exist" % pool_name)
        except Exception as e:
            log.debug(
                "%s: xcpng.librbd.sr.SROperations.get_vdi_list: uri: Failed to destroy SR: uri: %s"
                % dbg, uri)
            raise Exception(e)
        finally:
            cluster.shutdown()

        mkdir_p("%s/%s" % (SR_PATH_PREFIX, get_sr_uuid_by_uri(dbg, uri)))
예제 #3
0
    def sr_import(self, dbg, uri, configuration):
        log.debug(
            "%s: xcpng.libsbd.sr.SROperations.sr_import: uri: %s configuration %s"
            % (dbg, uri, configuration))

        if 'bindnetaddr' not in configuration:
            raise Exception(
                'Failed to connect to Sheepdog cluster. Parameter \'bindnetaddr\' is not specified'
            )
        elif 'mcastaddr' not in configuration:
            raise Exception(
                'Failed to connect to Sheepdog cluster. Parameter \'mcastaddr\' is not specified'
            )
        elif 'mcastport' not in configuration:
            raise Exception(
                'Failed to connect to Sheepdog cluster. Parameter \'mcastport\' is not specified'
            )

        sr_uuid = get_sr_uuid_by_uri(dbg, uri)

        create_chroot(dbg, sr_uuid)
        set_chroot(dbg, sr_uuid)
        write_corosync_conf(
            dbg, sr_uuid,
            gen_corosync_conf(dbg, configuration['bindnetaddr'],
                              configuration['mcastaddr'],
                              configuration['mcastport']))

        start_sheepdog_gateway(dbg, get_sheep_port(dbg, sr_uuid), sr_uuid)

        mkdir_p("%s/%s" % (SR_PATH_PREFIX, get_sr_uuid_by_uri(dbg, uri)))

        call(dbg, [
            'ln', '-s',
            "%s/%s/var/lib/sheepdog/sock" %
            (CHROOT_BASE, get_sr_uuid_by_uri(dbg, uri)),
            "%s/%s/sock" % (SR_PATH_PREFIX, get_sr_uuid_by_uri(dbg, uri))
        ])