Exemple #1
0
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)
Exemple #2
0
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)
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
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
Exemple #6
0
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)
Exemple #7
0
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)
Exemple #8
0
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)
Exemple #9
0
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')
Exemple #10
0
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)
Exemple #11
0
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)
Exemple #12
0
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)
Exemple #13
0
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)
Exemple #14
0
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)