class CephVolumeAPI(object): def __init__(self, manager=None, storage_api=None, vm_api=None, group_api=None, quota=None): if not manager: self.manager = CephManager() else: self.manager = manager if not storage_api: self.storage_api = CephStorageAPI() else: self.storage_api = storage_api if not vm_api: self.vm_api = VmAPI() else: self.vm_api = vm_api if not group_api: self.group_api = GroupAPI() else: self.group_api = group_api if not quota: self.quota = CephQuota() else: self.quota = quota super().__init__() def create(self, group_id, size): group = self.group_api.get_group_by_id(group_id) if not self.quota.group_quota_validate(group_id, size): raise Error(ERR_VOLUME_QUOTA_G) if not self.quota.volume_quota_validate(group_id, size): raise Error(ERR_VOLUME_QUOTA_V) cephpool = self.storage_api.get_volume_pool_by_center_id(group.center_id) if not cephpool: raise Error(ERR_VOLUME_CREATE_NOPOOL) if type(size) != int or size <= 0: raise Error(ERR_INT_VOLUME_SIZE) return self.manager.create_volume(cephpool, size, group_id) def delete(self, volume_id, force=False): volume = self.get_volume_by_id(volume_id) if volume.vm: raise Error(ERR_DEL_MOUNTED_VOLUME) cephpool_id = volume.cephpool_id tmp_volume_name = 'x_' + volume_id if self.storage_api.mv(cephpool_id, volume_id, tmp_volume_name): if not volume.delete(): self.storage_api.mv(cephpool_id, tmp_volume_name, volume_id) return False if force == True: if not self.storage_api.rm(cephpool_id, tmp_volume_name): print(ERR_CEPH_RM) else: raise Error(ERR_CEPH_MV) return True def resize(self, volume_id, size): volume = self.get_volume_by_id(volume_id) if not self.quota.group_quota_validate(volume.group_id, size, volume.size): raise Error(ERR_VOLUME_QUOTA_G) if not self.quota.volume_quota_validate(volume.group_id, size): raise Error(ERR_VOLUME_QUOTA_V) if self.storage_api.resize(volume.cephpool_id, volume.id, size): return volume.resize(size) else: raise Error(ERR_CEPH_RESIZE) def _get_disk_xml(self, volume, dev): cephpool = self.storage_api.get_pool_by_id(volume.cephpool_id) xml = volume.xml_tpl % { 'type': 'network', 'device': 'disk', 'driver': 'qemu', 'auth_user': cephpool.username, 'auth_type': 'ceph', 'auth_uuid': cephpool.uuid, 'source_protocol': 'rbd', 'pool': cephpool.pool, 'name': volume.id, 'host': cephpool.host, 'port': cephpool.port, 'dev': dev } return xml def mount(self, vm_uuid, volume_id): volume = self.get_volume_by_id(volume_id) vm = self.vm_api.get_vm_by_uuid(vm_uuid) if vm.group_id != volume.group_id: return False disk_list = vm.get_disk_list() mounted_volume_list = self.get_volume_list(vm_uuid=vm_uuid) for v in mounted_volume_list: disk_list.append(v.dev) print(disk_list) i = 0 while True: j = i d = '' while True: d += chr(ord('a') + j % 26) j //= 26 if j <= 0: break if not 'vd' + d in disk_list: dev = 'vd' + d break i+=1 xml = self._get_disk_xml(volume, dev) print(xml) if volume.mount(vm_uuid, dev): try: if self.vm_api.attach_device(vm_uuid, xml): return True except Error as e: volume.umount() raise e return False def umount(self, volume_id): volume = self.get_volume_by_id(volume_id) vm_uuid = volume.vm if self.vm_api.vm_uuid_exists(vm_uuid): vm = self.vm_api.get_vm_by_uuid(vm_uuid) disk_list = vm.get_disk_list() if not volume.dev in disk_list: if volume.umount(): return True return False xml = self._get_disk_xml(volume, volume.dev) if self.vm_api.detach_device(vm_uuid, xml): try: if volume.umount(): return True except Error as e: self.vm_api.attach_device(vm_uuid, xml) raise e else: if volume.umount(): return True return False def set_remark(self, volume_id, content): volume = self.get_volume_by_id(volume_id) return volume.set_remark(content) def get_volume_list_by_pool_id(self, cephpool_id): cephpool = self.storage_api.get_pool_by_id(cephpool_id) return self.manager.get_volume_list(cephpool_id=cephpool_id) def get_volume_list_by_user_id(self, user_id): return self.manager.get_volume_list(user_id=user_id) def get_volume_list_by_group_id(self, group_id): return self.manager.get_volume_list(group_id=group_id) def get_volume_list_by_vm_uuid(self, vm_uuid): return self.manager.get_volume_list(vm_uuid=vm_uuid) def get_volume_list(self, user_id=None, creator=None, cephpool_id=None, group_id=None, vm_uuid=None): return self.manager.get_volume_list(user_id=user_id, creator=creator, cephpool_id=cephpool_id, group_id=group_id, vm_uuid=vm_uuid) def get_volume_by_id(self, volume_id): return self.manager.get_volume_by_id(volume_id) def set_user_id(self, volume_id, user_id): volume = self.get_volume_by_id(volume_id) return volume.set_user_id(user_id) def set_group_id(self, volume_id, group_id): volume = self.get_volume_by_id(volume_id) return volume.set_group_id(group_id)
class GPUAPI(object): def __init__(self, manager=None, vm_api=None, host_api=None, group_api=None): if manager: self.manager = manager else: self.manager = GPUManager() if vm_api: self.vm_api = vm_api else: self.vm_api = VmAPI() if host_api: self.host_api = host_api else: self.host_api = HostAPI() if group_api: self.group_api = group_api else: self.group_api = GroupAPI() def get_gpu_list_by_host_id(self, host_id): host = self.host_api.get_host_by_id(host_id) return self.manager.get_gpu_list(host_id = host_id) def get_gpu_list_by_group_id(self, group_id): group = self.group_api.get_group_by_id(group_id) return self.manager.get_gpu_list(group_id=group_id) def get_gpu_by_id(self, gpu_id): return self.manager.get_gpu_by_id(gpu_id) def get_gpu_by_address(self, address): return self.manager.get_gpu_by_address(address) def get_gpu_list_by_vm_uuid(self, vm_uuid): return self.manager.get_gpu_list(vm_uuid=vm_uuid) def set_remarks(self, gpu_id, content): gpu = self.manager.get_gpu_by_id(gpu_id) return gpu.set_remarks(content) def mount(self, vm_id, gpu_id): gpu = self.manager.get_gpu_by_id(gpu_id) vm = self.vm_api.get_vm_by_uuid(vm_id) if vm.host_id != gpu.host_id: return False if gpu.mount(vm_id): if self.vm_api.attach_device(vm_id, gpu.xml_desc): return True gpu.umount() return False def umount(self, gpu_id): gpu = self.manager.get_gpu_by_id(gpu_id) if self.vm_api.vm_uuid_exists(gpu.vm): vm = self.vm_api.get_vm_by_uuid(gpu.vm) if vm and vm.host_id != gpu.host_id: return False if self.vm_api.detach_device(vm.uuid, gpu.xml_desc): if gpu.umount(): return True self.vm_api.attach_device(vm.uuid, gpu.xml_desc) else: if gpu.umount(): return True return False
class VolumeAPI(object): def __init__(self, manager=None, storage_api=None, vm_api=None, group_api=None, quota=None): if not manager: self.manager = CephManager() else: self.manager = manager if not storage_api: self.storage_api = StorageAPI() else: self.storage_api = storage_api if not vm_api: self.vm_api = VmAPI() else: self.vm_api = vm_api if not group_api: self.group_api = GroupAPI() else: self.group_api = group_api if not quota: self.quota = CephQuota() else: self.quota = quota super().__init__() def create(self, pool_id, size, group_id=None): cephpool = self.storage_api.get_pool_by_id(pool_id) if not cephpool: raise Error(ERR_VOLUME_CREATE_NOPOOL) if type(size) != int or size <= 0: raise Error(ERR_INT_VOLUME_SIZE) return self.manager.create_volume(cephpool, size, group_id) def delete(self, volume_id, force=False): volume = self.get_volume_by_id(volume_id) if volume.vm: raise Error(ERR_DEL_MOUNTED_VOLUME) cephpool_id = volume.cephpool_id tmp_volume_name = 'x_{}_{}'.format( datetime.now().strftime("%Y%m%d%H%M%S"), volume_id) if self.storage_api.mv(cephpool_id, volume_id, tmp_volume_name): if not volume.delete(): self.storage_api.mv(cephpool_id, tmp_volume_name, volume_id) return False if force == True: if not self.storage_api.rm(cephpool_id, tmp_volume_name): print(ERR_CEPH_RM) else: raise Error(ERR_CEPH_MV) return True def resize(self, volume_id, size): volume = self.get_volume_by_id(volume_id) #if not self.quota.group_quota_validate(volume.group_id, size, volume.size): if not self.quota.group_pool_quota_validate( volume.group_id, volume.cephpool_id, size, volume.size): raise Error(ERR_VOLUME_QUOTA_G) # if not self.quota.volume_quota_validate(volume.group_id, size): if not self.quota.volume_pool_quota_validate(volume.group_id, volume.cephpool_id, size): raise Error(ERR_VOLUME_QUOTA_V) if self.storage_api.resize(volume.cephpool_id, volume.id, size): return volume.resize(size) else: raise Error(ERR_CEPH_RESIZE) def _get_disk_xml(self, volume, dev): cephpool = self.storage_api.get_pool_by_id(volume.cephpool_id) xml = volume.xml_tpl % { 'driver': 'qemu', 'auth_user': cephpool.username, 'auth_type': 'ceph', 'auth_uuid': cephpool.uuid, 'source_protocol': 'rbd', 'pool': cephpool.pool, 'name': volume.id, 'host': cephpool.host, 'port': cephpool.port, 'dev': dev } return xml def mount(self, vm_uuid, volume_id): volume = self.get_volume_by_id(volume_id) vm = self.vm_api.get_vm_by_uuid(vm_uuid) if vm.group_id != volume.group_id: return False disk_list = vm.get_disk_list() mounted_volume_list = self.get_volume_list(vm_uuid=vm_uuid) for v in mounted_volume_list: disk_list.append(v.dev) print(disk_list) i = 0 while True: j = i d = '' while True: d += chr(ord('a') + j % 26) j //= 26 if j <= 0: break if not 'vd' + d in disk_list: dev = 'vd' + d break i += 1 xml = self._get_disk_xml(volume, dev) print(xml) if volume.mount(vm_uuid, dev): try: if self.vm_api.attach_device(vm_uuid, xml): return True except Error as e: volume.umount() raise e return False def umount(self, volume_id): volume = self.get_volume_by_id(volume_id) vm_uuid = volume.vm if self.vm_api.vm_uuid_exists(vm_uuid): vm = self.vm_api.get_vm_by_uuid(vm_uuid) disk_list = vm.get_disk_list() if not volume.dev in disk_list: if volume.umount(): return True return False xml = self._get_disk_xml(volume, volume.dev) if self.vm_api.detach_device(vm_uuid, xml): try: if volume.umount(): return True except Error as e: self.vm_api.attach_device(vm_uuid, xml) raise e else: if volume.umount(): return True return False def set_remark(self, volume_id, content): volume = self.get_volume_by_id(volume_id) return volume.set_remark(content) def get_volume_list_by_pool_id(self, cephpool_id): cephpool = self.storage_api.get_pool_by_id(cephpool_id) return self.manager.get_volume_list(cephpool_id=cephpool_id) def get_volume_list_by_user_id(self, user_id): return self.manager.get_volume_list(user_id=user_id) def get_volume_list_by_group_id(self, group_id): return self.manager.get_volume_list(group_id=group_id) def get_volume_list_by_vm_uuid(self, vm_uuid): return self.manager.get_volume_list(vm_uuid=vm_uuid) def get_volume_list(self, user_id=None, creator=None, cephpool_id=None, group_id=None, vm_uuid=None): return self.manager.get_volume_list(user_id=user_id, creator=creator, cephpool_id=cephpool_id, group_id=group_id, vm_uuid=vm_uuid) def get_volume_by_id(self, volume_id): return self.manager.get_volume_by_id(volume_id) def set_user_id(self, volume_id, user_id): volume = self.get_volume_by_id(volume_id) return volume.set_user_id(user_id) def set_group_id(self, volume_id, group_id): volume = self.get_volume_by_id(volume_id) return volume.set_group_id(group_id)
class GPUAPI(object): def __init__(self, manager=None, vm_api=None, host_api=None): if manager: self.manager = manager else: self.manager = GPUManager() if vm_api: self.vm_api = vm_api else: self.vm_api = VmAPI() if host_api: self.host_api = host_api else: self.host_api = HostAPI() def get_gpu_list_by_host_id(self, host_id): host = self.host_api.get_host_by_id(host_id) db_list = DBGPU.objects.filter(host_id = host_id) ret_list = [] for db in db_list: ret_list.append(GPU(db=db)) return ret_list def get_gpu_list_by_group_id(self, group_id): db_list = DBGPU.objects.filter(host__group_id = group_id) ret_list = [] for db in db_list: ret_list.append(GPU(db=db)) return ret_list def get_gpu_by_id(self, gpu_id): db = DBGPU.objects.filter(pk = gpu_id) if not db.exists(): raise Error(ERR_GPU_ID) return GPU(db=db[0]) def get_gpu_by_address(self, address): db = DBGPU.objects.filter(address = address) if not db.exists(): raise Error(ERR_GPU_ADDRESS) return GPU(db=db[0]) def get_gpu_list_by_vm_uuid(self, vm_uuid): db_list = DBGPU.objects.filter(vm = vm_uuid) ret_list = [] for db in db_list: ret_list.append(GPU(db=db)) return ret_list def set_remarks(self, gpu_id, content): gpu = self.get_gpu_by_id(gpu_id) return gpu.set_remarks(content) def mount(self, vm_id, gpu_id): gpu = self.get_gpu_by_id(gpu_id) vm = self.vm_api.get_vm_by_uuid(vm_id) if vm.host_id != gpu.host_id: return False if gpu.mount(vm_id): if self.vm_api.attach_device(vm_id, gpu.xml_desc): return True gpu.umount() return False def umount(self, gpu_id): gpu = self.get_gpu_by_id(gpu_id) if self.vm_api.vm_uuid_exists(gpu.vm): vm = self.vm_api.get_vm_by_uuid(gpu.vm) if vm and vm.host_id != gpu.host_id: return False if self.vm_api.detach_device(vm.uuid, gpu.xml_desc): if gpu.umount(): return True self.vm_api.attach_device(vm.uuid, gpu.xml_desc) else: if gpu.umount(): return True return False