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)