def convert_image_to_volume(self, req):
        cmd = jsonobject.loads(req[http.REQUEST_BODY])
        rsp = VolumeRsp()

        install_abs_path = get_absolute_path_from_install_path(
            cmd.primaryStorageInstallPath)
        lvm.active_lv(install_abs_path)
        lvm.clean_lv_tag(install_abs_path, IMAGE_TAG)
        lvm.add_lv_tag(install_abs_path,
                       "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time()))

        drbdResource = drbd.DrbdResource(
            install_abs_path.split("/")[-1], False)
        drbdResource.config.local_host.hostname = cmd.local_host_name
        drbdResource.config.local_host.disk = install_abs_path
        drbdResource.config.local_host.minor = cmd.local_host_port - DRBD_START_PORT
        drbdResource.config.local_host.address = "%s:%s" % (
            cmd.local_address, cmd.local_host_port)

        drbdResource.config.remote_host.hostname = cmd.remote_host_name
        drbdResource.config.remote_host.disk = install_abs_path
        drbdResource.config.remote_host.minor = cmd.remote_host_port - DRBD_START_PORT
        drbdResource.config.remote_host.address = "%s:%s" % (
            cmd.remote_address, cmd.remote_host_port)

        drbdResource.config.write_config()
        drbdResource.initialize(False, None, skip_clear_bits=cmd.init)

        rsp._init_from_drbd(drbdResource)
        return jsonobject.dumps(rsp)
    def create_empty_volume(self, req):
        cmd = jsonobject.loads(req[http.REQUEST_BODY])
        rsp = VolumeRsp()

        install_abs_path = get_absolute_path_from_install_path(cmd.installPath)
        drbdResource = drbd.DrbdResource(
            self.get_name_from_installPath(cmd.installPath), False)
        drbdResource.config.local_host.hostname = cmd.local_host_name
        drbdResource.config.local_host.disk = install_abs_path
        drbdResource.config.local_host.minor = cmd.local_host_port - DRBD_START_PORT
        drbdResource.config.local_host.address = "%s:%s" % (
            cmd.local_address, cmd.local_host_port)

        drbdResource.config.remote_host.hostname = cmd.remote_host_name
        drbdResource.config.remote_host.disk = install_abs_path
        drbdResource.config.remote_host.minor = cmd.remote_host_port - DRBD_START_PORT
        drbdResource.config.remote_host.address = "%s:%s" % (
            cmd.remote_address, cmd.remote_host_port)

        drbdResource.config.write_config()

        try:
            if cmd.backingFile:
                backing_abs_path = get_absolute_path_from_install_path(
                    cmd.backingFile)
                virtual_size = linux.qcow2_virtualsize(backing_abs_path)

                lvm.create_lv_from_cmd(
                    install_abs_path, virtual_size, cmd,
                    "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time()),
                    False)
                lvm.active_lv(install_abs_path)
                drbdResource.initialize(cmd.init, cmd, backing_abs_path)
            elif not lvm.lv_exists(install_abs_path):
                lvm.create_lv_from_cmd(
                    install_abs_path, cmd.size, cmd,
                    "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time()),
                    False)
                lvm.active_lv(install_abs_path)
                drbdResource.initialize(cmd.init, cmd)
        except Exception as e:
            drbdResource.destroy()
            lvm.delete_lv(install_abs_path)
            logger.debug(
                'failed to create empty volume[uuid:%s, size:%s] at %s' %
                (cmd.volumeUuid, cmd.size, cmd.installPath))
            raise e

        logger.debug(
            'successfully create empty volume[uuid:%s, size:%s] at %s' %
            (cmd.volumeUuid, cmd.size, cmd.installPath))
        rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid)
        rsp._init_from_drbd(drbdResource)
        return jsonobject.dumps(rsp)
    def get_volume_size(self, req):
        cmd = jsonobject.loads(req[http.REQUEST_BODY])
        rsp = GetVolumeSizeRsp()

        install_abs_path = get_absolute_path_from_install_path(cmd.installPath)
        r = drbd.DrbdResource(cmd.installPath.split("/")[-1])
        with drbd.OperateDrbd(r):
            rsp.size = linux.qcow2_virtualsize(r.get_dev_path())
        rsp.actualSize = lvm.get_lv_size(install_abs_path)
        rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid)
        rsp._init_from_drbd(r)
        return jsonobject.dumps(rsp)
 def do_delete_bits(self, path):
     install_abs_path = get_absolute_path_from_install_path(path)
     if lvm.has_lv_tag(install_abs_path, IMAGE_TAG):
         logger.info('deleting lv image: ' + install_abs_path)
         if lvm.lv_exists(install_abs_path):
             lvm.delete_image(install_abs_path, IMAGE_TAG)
     else:
         logger.info('deleting lv volume: ' + install_abs_path)
         r = drbd.DrbdResource(self.get_name_from_installPath(path))
         r.destroy()
         lvm.delete_lv(install_abs_path)
     lvm.delete_snapshots(install_abs_path)
 def deactive_drbd_resouces_on_vg(vgUuid):
     active_lvs = lvm.list_local_active_lvs(vgUuid)
     if len(active_lvs) == 0:
         return
     drbd_resources = [
         drbd.DrbdResource(lv.split("/")[-1]) for lv in active_lvs
     ]
     for r in drbd_resources:
         r.destroy()
     logger.warn("active lvs %s will be deactivate" % active_lvs)
     lvm.deactive_lv(vgUuid)
     active_lvs = lvm.list_local_active_lvs(vgUuid)
     if len(active_lvs) != 0:
         raise RetryException(
             "lvs [%s] still active, retry deactive again" % active_lvs)
    def create_root_volume(self, req):
        cmd = jsonobject.loads(req[http.REQUEST_BODY])
        rsp = VolumeRsp()
        template_abs_path_cache = get_absolute_path_from_install_path(
            cmd.templatePathInCache)
        install_abs_path = get_absolute_path_from_install_path(cmd.installPath)

        drbdResource = drbd.DrbdResource(
            self.get_name_from_installPath(cmd.installPath), False)
        drbdResource.config.local_host.hostname = cmd.local_host_name
        drbdResource.config.local_host.disk = install_abs_path
        drbdResource.config.local_host.minor = cmd.local_host_port - DRBD_START_PORT
        drbdResource.config.local_host.address = "%s:%s" % (
            cmd.local_address, cmd.local_host_port)

        drbdResource.config.remote_host.hostname = cmd.remote_host_name
        drbdResource.config.remote_host.disk = install_abs_path
        drbdResource.config.remote_host.minor = cmd.remote_host_port - DRBD_START_PORT
        drbdResource.config.remote_host.address = "%s:%s" % (
            cmd.remote_address, cmd.remote_host_port)

        drbdResource.config.write_config()
        virtual_size = linux.qcow2_virtualsize(template_abs_path_cache)

        try:
            lvm.qcow2_lv_recursive_active(template_abs_path_cache,
                                          lvm.LvmlockdLockType.SHARE)
            if not lvm.lv_exists(install_abs_path):
                lvm.create_lv_from_cmd(
                    install_abs_path, virtual_size, cmd,
                    "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time()),
                    False)
            lvm.active_lv(install_abs_path)
            drbdResource.initialize(cmd.init, cmd, template_abs_path_cache)
        except Exception as e:
            drbdResource.destroy()
            lvm.delete_lv(install_abs_path)
            raise e

        rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid)
        rsp._init_from_drbd(drbdResource)
        return jsonobject.dumps(rsp)
    def resize_volume(self, req):
        cmd = jsonobject.loads(req[http.REQUEST_BODY])
        install_abs_path = get_absolute_path_from_install_path(cmd.installPath)
        rsp = ResizeVolumeRsp()

        if not cmd.drbd:
            lvm.resize_lv_from_cmd(install_abs_path, cmd.size, cmd)
            return jsonobject.dumps(rsp)

        r = drbd.DrbdResource(cmd.installPath.split("/")[-1])
        r._init_from_disk(install_abs_path)
        with drbd.OperateDrbd(r):
            r.resize()

        with drbd.OperateDrbd(r):
            if not cmd.live:
                shell.call("qemu-img resize %s %s" %
                           (r.get_dev_path(), cmd.size))
            ret = linux.qcow2_virtualsize(r.get_dev_path())
        rsp.size = ret
        rsp._init_from_drbd(r)
        return jsonobject.dumps(rsp)
    def active_lv(self, req):
        cmd = jsonobject.loads(req[http.REQUEST_BODY])
        rsp = ActiveRsp()
        rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(
            cmd.vgUuid, raise_exception=False)

        install_abs_path = get_absolute_path_from_install_path(cmd.installPath)
        if lvm.has_lv_tag(install_abs_path, IMAGE_TAG):
            lvm.qcow2_lv_recursive_active(install_abs_path,
                                          lvm.LvmlockdLockType.SHARE)
            return jsonobject.dumps(rsp)

        drbdResource = drbd.DrbdResource(
            self.get_name_from_installPath(cmd.installPath))
        if cmd.role == drbd.DrbdRole.Secondary:
            drbdResource.demote()
            rsp._init_from_drbd(drbdResource)
            return jsonobject.dumps(rsp)

        if self.test_network_ok_to_peer(drbdResource.config.remote_host.address.split(":")[0]) is False \
                and mini_fencer.test_fencer(cmd.vgUuid, drbdResource.name) is False:
            raise Exception("can not connect storage network or fencer")

        if cmd.checkPeer and drbdResource.get_remote_role(
        ) == drbd.DrbdRole.Primary:
            raise Exception("remote is also in primary role, can not promote")

        if drbdResource.get_dstate() != "UpToDate":
            raise Exception("local data is not uptodate, can not promote")

        lvm.qcow2_lv_recursive_active(install_abs_path,
                                      lvm.LvmlockdLockType.EXCLUSIVE)
        try:
            drbdResource.promote()
        except Exception as e:
            if not cmd.force:
                raise e
            if self.test_network_ok_to_peer(
                    drbdResource.config.remote_host.address.split(":")[0]):
                raise Exception(
                    "storage network address %s still connected, wont force promote"
                    % drbdResource.config.remote_host.address.split(":")[0])
            if cmd.vmNics:
                for vmNic in cmd.vmNics:
                    if self.test_network_ok_to_peer(vmNic.ipAddress,
                                                    vmNic.bridgeName):
                        raise Exception(
                            "could arping %s via %s, it may split brain, wont proceed force promote"
                            % (vmNic.ipAddress, vmNic.bridgeName))
            snap_path = None
            try:
                snap_path = lvm.create_lvm_snapshot(install_abs_path)
                drbdResource.promote(True, 2, 2)
                rsp.snapPath = snap_path
            except Exception as ee:
                if snap_path is not None:
                    lvm.delete_lv(snap_path)
                raise ee

        rsp._init_from_drbd(drbdResource)
        return jsonobject.dumps(rsp)