Kaynağa Gözat

磁盘的扩容、更新、删除测试通过

James Iter 9 yıl önce
ebeveyn
işleme
66a074070c
4 değiştirilmiş dosya ile 252 ekleme ve 10 silme
  1. 1 0
      models/rules.py
  2. 3 0
      route_table.py
  3. 52 8
      tests/test_disk.py
  4. 196 2
      views/disk.py

+ 1 - 0
models/rules.py

@@ -51,6 +51,7 @@ class Rules(Enum):
     DESTINATION_HOST = (basestring, 'destination_host', (5, 64))
     DISK_UUID = (basestring, 'disk_uuid', (36, 36))
     DISK_SIZE = (int, 'size')
+    DISK_SIZE_STR = ('regex:^\d{1,17}$', 'size')
 
     REMARK = (basestring, 'remark')
     LABEL = (basestring, 'label')

+ 3 - 0
route_table.py

@@ -63,6 +63,9 @@ add_rule(guest.blueprints, '/<uuids>', view_func='guest.r_delete', methods=['DEL
 add_rule(disk.blueprint, '', view_func='disk.r_create', methods=['POST'])
 add_rule(disk.blueprint, '/_disk_resize/<uuid>/<size>', view_func='disk.r_resize', methods=['PUT'])
 add_rule(disk.blueprint, '/<uuid>', view_func='disk.r_delete', methods=['DELETE'])
+add_rule(disk.blueprint, '/<uuid>', view_func='disk.r_update', methods=['PATCH'])
+add_rule(disk.blueprints, '', view_func='disk.r_get_by_filter', methods=['GET'])
+add_rule(disk.blueprints, '/_search', view_func='disk.r_content_search', methods=['GET'])
 
 # 日志查询
 # 系统模板操作

+ 52 - 8
tests/test_disk.py

@@ -17,6 +17,8 @@ class TestDisk(unittest.TestCase):
 
     base_url = 'http://127.0.0.1:8008/api'
     uuid = ''
+    new_size = 200
+    uuid_list = list()
 
     def setUp(self):
         pass
@@ -38,19 +40,61 @@ class TestDisk(unittest.TestCase):
         self.assertEqual('200', j_r['state']['code'])
 
     def test_12_get(self):
-        pass
+        url = TestDisk.base_url + '/disks'
+        headers = {'content-type': 'application/json'}
+        r = requests.get(url, headers=headers)
+        j_r = json.loads(r.content)
+        print json.dumps(j_r, ensure_ascii=False)
+        TestDisk.uuid = j_r['data'][0]['uuid']
+        self.assertEqual('200', j_r['state']['code'])
 
-    def test_13_update(self):
-        pass
+    # @unittest.skip('skip resize disk')
+    def test_13_disk_resize(self):
+        url = TestDisk.base_url + '/disk/_disk_resize/' + TestDisk.uuid + '/' + TestDisk.new_size.__str__()
+        headers = {'content-type': 'application/json'}
+        r = requests.put(url, headers=headers)
+        j_r = json.loads(r.content)
+        print json.dumps(j_r, ensure_ascii=False)
+        self.assertEqual('200', j_r['state']['code'])
+
+    # @unittest.skip('skip update disk')
+    def test_14_update(self):
+        payload = {
+            "label": "Hello-disk"
+        }
+
+        url = TestDisk.base_url + '/disk/' + TestDisk.uuid
+        headers = {'content-type': 'application/json'}
+        r = requests.patch(url, data=json.dumps(payload), headers=headers)
+        j_r = json.loads(r.content)
+        print json.dumps(j_r, ensure_ascii=False)
+        self.assertEqual('200', j_r['state']['code'])
 
     # 校验更新结果
-    def test_14_get(self):
-        pass
+    # @unittest.skip('skip get disk')
+    def test_15_get(self):
+        url = TestDisk.base_url + '/disks'
+        headers = {'content-type': 'application/json'}
+        r = requests.get(url, headers=headers)
+        j_r = json.loads(r.content)
+        print json.dumps(j_r, ensure_ascii=False)
+        self.assertEqual('200', j_r['state']['code'])
+        self.assertEqual(TestDisk.new_size, j_r['data'][0]['size'])
+        self.assertEqual('Hello-disk', j_r['data'][0]['label'])
+        for disk in j_r['data']:
+            TestDisk.uuid_list.append(disk['uuid'])
 
     # 删除Guest
-    # @unittest.skip('skip delete guest')
-    def test_15_delete(self):
-        pass
+    # @unittest.skip('skip delete disk')
+    def test_16_delete(self):
+        for uuid in TestDisk.uuid_list:
+            TestDisk.uuid = uuid
+            url = TestDisk.base_url + '/disk/' + TestDisk.uuid
+            headers = {'content-type': 'application/json'}
+            r = requests.delete(url, headers=headers)
+            j_r = json.loads(r.content)
+            print json.dumps(j_r, ensure_ascii=False)
+            self.assertEqual('200', j_r['state']['code'])
 
 
 if __name__ == '__main__':

+ 196 - 2
views/disk.py

@@ -86,7 +86,7 @@ def r_resize(uuid, size):
 
     args_rules = [
         Rules.UUID.value,
-        Rules.DISK_SIZE.value
+        Rules.DISK_SIZE_STR.value
     ]
 
     try:
@@ -104,7 +104,7 @@ def r_resize(uuid, size):
         ret = dict()
         ret['state'] = ji.Common.exchange_state(20000)
 
-        if guest_disk.size <= size:
+        if guest_disk.size >= size:
             ret['state'] = ji.Common.exchange_state(41257)
             return ret
 
@@ -170,3 +170,197 @@ def r_delete(uuid):
 
     except ji.PreviewingError, e:
         return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_get_by_filter():
+    page = str(request.args.get('page', 1))
+    page_size = str(request.args.get('page_size', 50))
+
+    args_rules = [
+        Rules.PAGE.value,
+        Rules.PAGE_SIZE.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+    page = int(page)
+    page_size = int(page_size)
+
+    # 把page和page_size换算成offset和limit
+    offset = (page - 1) * page_size
+    # offset, limit将覆盖page及page_size的影响
+    offset = str(request.args.get('offset', offset))
+    limit = str(request.args.get('limit', page_size))
+
+    order_by = request.args.get('order_by', 'id')
+    order = request.args.get('order', 'asc')
+    filter_str = request.args.get('filter', '')
+
+    args_rules = [
+        Rules.OFFSET.value,
+        Rules.LIMIT.value,
+        Rules.ORDER_BY.value,
+        Rules.ORDER.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
+        offset = int(offset)
+        limit = int(limit)
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        ret['data'] = list()
+        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
+                         'next': '', 'prev': '', 'first': '', 'last': ''}
+
+        ret['data'], ret['paging']['total'] = GuestDisk.get_by_filter(offset=offset, limit=limit, order_by=order_by,
+                                                                      order=order, filter_str=filter_str)
+
+        host_url = request.host_url.rstrip('/')
+        other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
+        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
+
+        if page <= 1:
+            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + page_size.__str__() + \
+                                    other_str
+        else:
+            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=' + str(page-1) + '&page_size=' + \
+                                    page_size.__str__() + other_str
+
+        if page >= last_pagination:
+            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + \
+                                    '&page_size=' + page_size.__str__() + other_str
+        else:
+            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + str(page+1) + '&page_size=' + \
+                                    page_size.__str__() + other_str
+
+        ret['paging']['first'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + \
+            page_size.__str__() + other_str
+        ret['paging']['last'] = \
+            host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
+            page_size.__str__() + other_str
+
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_content_search():
+    page = str(request.args.get('page', 1))
+    page_size = str(request.args.get('page_size', 50))
+
+    args_rules = [
+        Rules.PAGE.value,
+        Rules.PAGE_SIZE.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+    page = int(page)
+    page_size = int(page_size)
+
+    # 把page和page_size换算成offset和limit
+    offset = (page - 1) * page_size
+    # offset, limit将覆盖page及page_size的影响
+    offset = str(request.args.get('offset', offset))
+    limit = str(request.args.get('limit', page_size))
+
+    order_by = request.args.get('order_by', 'id')
+    order = request.args.get('order', 'asc')
+    keyword = request.args.get('keyword', '')
+
+    args_rules = [
+        Rules.OFFSET.value,
+        Rules.LIMIT.value,
+        Rules.ORDER_BY.value,
+        Rules.ORDER.value,
+        Rules.KEYWORD.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order,
+                                         'keyword': keyword})
+        offset = int(offset)
+        limit = int(limit)
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        ret['data'] = list()
+        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size}
+
+        ret['data'], ret['paging']['total'] = GuestDisk.content_search(offset=offset, limit=limit, order_by=order_by,
+                                                                       order=order, keyword=keyword)
+
+        host_url = request.host_url.rstrip('/')
+        other_str = '&keyword=' + keyword + '&order=' + order + '&order_by=' + order_by
+        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
+
+        if page <= 1:
+            ret['paging']['prev'] = host_url + blueprints.url_prefix + '/_search?page=1&page_size=' + \
+                                    page_size.__str__() + other_str
+        else:
+            ret['paging']['prev'] = host_url + blueprints.url_prefix + '/_search?page=' + str(page-1) + \
+                                    '&page_size=' + page_size.__str__() + other_str
+
+        if page >= last_pagination:
+            ret['paging']['next'] = host_url + blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + \
+                                    '&page_size=' + page_size.__str__() + other_str
+        else:
+            ret['paging']['next'] = host_url + blueprints.url_prefix + '/_search?page=' + str(page+1) + \
+                                    '&page_size=' + page_size.__str__() + other_str
+
+        ret['paging']['first'] = host_url + blueprints.url_prefix + '/_search?page=1&page_size=' + \
+            page_size.__str__() + other_str
+        ret['paging']['last'] = \
+            host_url + blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + '&page_size=' + \
+            page_size.__str__() + other_str
+
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_update(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    if 'label' in request.json:
+        args_rules.append(
+            Rules.LABEL.value,
+        )
+
+    if args_rules.__len__() < 2:
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    request.json['uuid'] = uuid
+
+    try:
+        ji.Check.previewing(args_rules, request.json)
+        guest_disk = GuestDisk()
+        guest_disk.uuid = uuid
+        guest_disk.get_by('uuid')
+
+        guest_disk.label = request.json.get('label', guest_disk.label)
+
+        guest_disk.update()
+        guest_disk.get()
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        ret['data'] = guest_disk.__dict__
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+