async def api_delete_comments(id, request): check_admin(request) c = await Comment.find(id) if c is None: raise APIResourceNotFoundError('Comment') await c.remove() return dict(id=id)
def api_update_vg(id, request, *, name): ''' Update volume group. Request url [POST /api/vgs/{id}] Post data: id: volume group id name: volume group name ''' if not name or not name.strip(): raise APIValueError('name:%s' % name) if not re.match(r'^[a-z_A-Z0-9]{1,20}', name): raise APIValueError("name") vg = yield from VG.find(id) if not vg: raise APIResourceNotFoundError('vg %s' % id) yield from _vg_rename(vg.name, name) vg.name = name yield from vg.update() yield from log_event(logging.INFO, event_vg, event_action_mod, 'Update volume group name to %s.' % (vg.name)) return dict(retcode=0, vg=vg)
def api_get_array(*, id): ''' Get array by id. Request url[GET /api/arrays/{id}] ''' array = yield from Array.find(id) if array is None: raise APIResourceNotFoundError('array %s not found' % id) array = yield from _array_detail(array) return dict(retcode=0, array=array)
def api_delete_user(*, id): ''' Delete user by id. Request url [POST /api/users/{id}/delete ''' user = yield from User.find(id) if user is None: raise APIResourceNotFoundError(id) if user.name == 'admin': raise APIError(errors.EUSER_CANNOT_DELETE_ADMIN, 'User %s can not be deleted' % user.name) yield from user.remove() yield from log_event(logging.INFO, event_user, event_action_del, 'Delete user %s' % user.name) return dict(retcode=0, id=id)
async def api_create_comment(id, request, *, content): user = request.__user__ if user is None: raise APIPermissionError('Please signin first.') if not content or not content.strip(): raise APIValueError('content') blog = await Blog.find(id) if blog is None: raise APIResourceNotFoundError('Blog') comment = Comment(blog_id=blog.id, user_id=user.id, user_name=user.name, user_image=user.image, content=content.strip()) await comment.save() return comment
def api_get_target(*, id): ''' Get target by id. Request url[GET /api/targets/{id}] ''' target = yield from Target.find(id) if target is None: raise APIResourceNotFoundError('target %s' % id) targets = yield from _get_targets() for target_cur in targets: if target_cur.iqn == target.iqn: target_cur.id = target.id return dict(retcode=0, target=target_cur) target.state = _target_state['inactive'] yield from target.update() return dict(retcode=0, target=target)
def api_delete_lvm(*, id): ''' Delete lvm. Request url:[POST /api/lvms/{id}/delete] ''' lvm = yield from LVM.find(id) if not lvm: raise APIResourceNotFoundError('lvm %s' % id) lvms = yield from _lvm_display() for l in lvms: if l.id == id: r = yield from _lvm_delete(lvm) if r is None: return dict(retcode=605, message='delete lvm failure') yield from lvm.remove() yield from log_event(logging.INFO, event_lvm, event_action_del, 'Delete LVM %s.' % (lvm.name)) return dict(retcode=0, id=id)
def api_update_user(id, request, *, password): ''' Update user. Request url: [POST /api/users/{id}] Post data: password: user new password ''' user = yield from User.find(id) if user is None: raise APIResourceNotFoundError(id) if not password or not password.strip(): raise APIValueError('Password can not be empty') user.password = hashlib.sha1(password.encode('utf-8')).hexdigest() yield from user.update() yield from log_event(logging.INFO, event_user, event_action_mod, 'Update user %s password' % user.name) return dict(retcode=0, user=user)
def api_lvm_create(*, name, vgname, size): ''' Create lvm. Request url:[POST /api/lvms] Post data: name: lvm name vgname: volume group name. reference:/api/vgs size: lvm size ends with unit, lvm size unit. [K, M, G, T, P]. example: 3.5T ''' if not name or not name.strip(): raise APIValueError('name') if not re.match(r'^[a-z_A-Z0-9]{1,20}', name): raise APIValueError("name") if not size or not size.strip(): raise APIValueError('size') if not size[-1] in ['K', 'M', 'G', 'T', 'P']: raise APIValueError('size unit value should be [K,M,G,T,P]') # validate vg vgs = yield from _vg_display() vgs_name = [vg.name for vg in vgs] if vgname not in vgs_name: raise APIResourceNotFoundError("volumne group '%s' not found" % vgname) lvms = yield from _lvm_create(name, vgname, size) if lvms is None or len(lvms) == 0: return dict(retcode=604, message='create lvm failure') for lvm in lvms: if lvm.name != name: continue # save lvm yield from lvm.save() yield from log_event(logging.INFO, event_lvm, event_action_add, 'Create LVM %s, size:%s.' % (lvm.name, size)) return dict(retcode=0, lvm=lvm) return dict(retcode=604, message='create lvm failure')
def api_delete_vg(*, id): ''' Delete volume group. Request url:[POST /api/vgs/{id}/delete] ''' vg = yield from VG.find(id) if not vg: raise APIResourceNotFoundError('vg %s' % id) vgs_current = yield from _vg_display() vg_id = None for v in vgs_current: if v.id == id: r = yield from _vg_delete(vg) if r is None: return dict(retcode=505, message='delete vg failure') break yield from vg.remove() yield from log_event(logging.INFO, event_vg, event_action_del, 'Delete volume group %s.' % (vg.name)) return dict(retcode=0, id=id)
def api_delete_target(*, id): ''' Delete target. Request url[POST /api/targets/{id}/delete] ''' target = yield from Target.find(id) if target is None: raise APIResourceNotFoundError('target %s' % id) targets = yield from _get_targets() target_names = [target.name for target in targets] if target.name in target_names: cmd = _tgtadm_del_target % (target.tid) try: subprocess.check_output(cmd.split(' ')) except subprocess.CalledProcessError as e: logging.exception(e) return dict(retcode=704, message='delete target error') # delete from db luns = yield from LUN.findall(where="tid='%s'" % target.id) for lun in luns: yield from lun.remove() yield from target.remove() yield from log_event(logging.INFO, event_target, event_action_del, 'Delete target %s.' % (target.iqn)) # reset disk user information disks = yield from Disk.findall(where="used_by='%s'" % id) if disks and len(disks) > 0: for disk in disks: disk.used_by = '' disk.used_for = 0 yield from disk.update() target_conf_file = os.path.join('/etc/tgt/conf.d', '%s.conf' % target.iqn) if os.path.exists(target_conf_file): os.remove(target_conf_file) return dict(retcode=0, id=id)
def api_delete_array(*, id): ''' Delete array. Request url:[POST /api/arrays/{id}/delete] ''' array = yield from Array.find(id) if array is None: raise APIResourceNotFoundError('array %s' % id) disks = yield from Disk.findall(where="used_by='%s'" % id) r = yield from _array_destroy(array, disks) if not r: return dict(retcode=406, message='delete array %s failure' % id) yield from array.remove() for disk in disks: disk.used_by = '' disk.used_for = 0 disk.state = 0 yield from disk.update() yield from log_event(logging.INFO, event_array, event_action_del, "Delete array %s" % array.name) return dict(retcode=0, id=id)
def api_update_lvm(id, request, *, name): ''' Update lvm. Request url [POST /api/lvms/{id}] Post data: id: lvm id name: lvm name ''' if not name or not name.strip(): raise APIValueError('name:%s' % name) if not re.match(r'^[a-z_A-Z0-9]{1,20}', name): raise APIValueError("name") lvm = yield from LVM.find(id) if not lvm: raise APIResourceNotFoundError('vg %s' % id) yield from _lvm_rename(lvm.path, name) lvm.name = name yield from lvm.update() yield from log_event(logging.INFO, event_lvm, event_action_mod, 'Update LVM name to %s.' % (lvm.name)) return dict(retcode=0, lvm=lvm)
def api_create_array(*, name, level, chunk, disk, spare): ''' Create array. Request url[POST /api/arrays] Post data: name: array name. level: array level. support RAID0, RAID1, RAID5, RAID6, RAID10. chunk: array chunk size. such as 64K,128K, 256K,512K. power of 2. disks: disk device array in json format. such as [/dev/sdb, /dev/sdc, /dev/sdd...] spares: spare disk device array in json format. ''' if not re.match(r'^[a-z_A-Z0-9]{1,20}', name): raise APIValueError("name") array = yield from Array.findall(where="name='%s'" % name) if array: return dict(retcode=401, message='Array %s already exists' % name) data_devname= json.loads(disk) spare_devname = json.loads(spare) disks = [] spares = [] # valid disk for dev in data_devname: r = yield from Disk.findall(where="device='%s'" % dev) if not r or len(r) == 0: raise APIResourceNotFoundError('%s' % dev) disks.append(r[0]) for dev in spares: r = yield from Disk.findall(where="device='%s'" % dev) if not r or len(r) == 0: raise APIResourceNotFoundError('%s' % dev) spares.append(r[0]) if len(disks) == 0: return dict(retcode=403, message='No available data disk') if not level.isnumeric(): raise APIValueError('level') at_least_disk = {0: 2, 1: 2, 5: 3, 6: 3, 10: 2} level = int(level) if level not in at_least_disk: return dict(retcode=402, message='Invalid raid level %s' % level) if len(disks) < at_least_disk[level]: return dict(retcode=404, message='Raid %s need at least %s disks' % (level, at_least_disk[level])) array_device = yield from _array_create(level, data_devname, chunk, spare_devname) if array_device is None: return dict(retcode=405, message='Create array failure.No available device') array = Array(name=name, device=array_device, level=level, chunk_size=chunk, created_at=int(time.time())) array = yield from _array_detail(array) yield from array.save() # update array id of each array disk for disk in disks: disk.used_by = array.id disk.used_for = 1 # 1 for raid yield from disk.update() yield from log_event(logging.INFO, event_array, event_action_add, 'Create array %s.level:%s,data disk:%s,spare:%s' % (name, level, ','.join(data_devname), ','.join(spare_devname))) return dict(retcode=0, array=array)