瀏覽代碼

磁盘接口支持配额更新。磁盘接口支持批量更新。

James Iter 8 年之前
父節點
當前提交
798e3c29fa
共有 3 個文件被更改,包括 85 次插入14 次删除
  1. 82 13
      api/disk.py
  2. 1 1
      api_route_table.py
  3. 2 0
      models/rules.py

+ 82 - 13
api/disk.py

@@ -265,10 +265,14 @@ def r_content_search():
 
 
 @Utils.dumps2response
-def r_update(uuid):
+def r_update(uuids):
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+    ret['data'] = list()
 
     args_rules = [
-        Rules.UUID.value
+        Rules.UUIDS.value
     ]
 
     if 'remark' in request.json:
@@ -276,28 +280,93 @@ def r_update(uuid):
             Rules.REMARK.value
         )
 
+    if 'iops' in request.json:
+        args_rules.append(
+            Rules.IOPS.value
+        )
+
+    if 'iops_max' in request.json:
+        args_rules.append(
+            Rules.IOPS_MAX.value
+        )
+
+    if 'iops_max_length' in request.json:
+        args_rules.append(
+            Rules.IOPS_MAX_LENGTH.value
+        )
+
+    if 'bps' in request.json:
+        args_rules.append(
+            Rules.BPS.value
+        )
+
+    if 'bps_max' in request.json:
+        args_rules.append(
+            Rules.BPS_MAX.value
+        )
+
+    if 'bps_max_length' in request.json:
+        args_rules.append(
+            Rules.BPS_MAX_LENGTH.value
+        )
+
     if args_rules.__len__() < 2:
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
         return ret
 
-    request.json['uuid'] = uuid
+    request.json['uuids'] = uuids
 
     try:
         ji.Check.previewing(args_rules, request.json)
+
         disk = Disk()
-        disk.uuid = uuid
-        disk.get_by('uuid')
 
-        disk.remark = request.json.get('remark', disk.remark)
+        # 检测所指定的 UUDIs 磁盘都存在
+        for uuid in uuids.split(','):
+            disk.uuid = uuid
+            disk.get_by('uuid')
 
-        disk.update()
-        disk.get()
+        for uuid in uuids.split(','):
+            disk.uuid = uuid
+            disk.get_by('uuid')
+            disk.remark = request.json.get('remark', disk.remark)
+            disk.iops = request.json.get('iops', disk.iops)
+            disk.iops_rd = request.json.get('iops_rd', disk.iops_rd)
+            disk.iops_wr = request.json.get('iops_wr', disk.iops_wr)
+            disk.iops_max = request.json.get('iops_max', disk.iops_max)
+            disk.iops_max_length = request.json.get('iops_max_length', disk.iops_max_length)
+            disk.bps = request.json.get('bps', disk.bps)
+            disk.bps_rd = request.json.get('bps_rd', disk.bps_rd)
+            disk.bps_wr = request.json.get('bps_wr', disk.bps_wr)
+            disk.bps_max = request.json.get('bps_max', disk.bps_max)
+            disk.bps_max_length = request.json.get('bps_max_length', disk.bps_max_length)
+            disk.update()
+            disk.get()
+
+            if disk.sequence >= 0:
+                message = {
+                    '_object': 'disk',
+                    'action': 'quota',
+                    'guest_uuid': disk.guest_uuid,
+                    'hostname': disk.on_host,
+                    'sequence': disk.sequence,
+                    'iops': disk.iops,
+                    'iops_rd': disk.iops_rd,
+                    'iops_wr': disk.iops_wr,
+                    'iops_max': disk.iops_max,
+                    'iops_max_length': disk.iops_max_length,
+                    'bps': disk.bps,
+                    'bps_rd': disk.bps_rd,
+                    'bps_wr': disk.bps_wr,
+                    'bps_max': disk.bps_max,
+                    'bps_max_length': disk.bps_max_length
+                }
+
+                Guest.emit_instruction(message=json.dumps(message))
+
+            ret['data'].append(disk.__dict__)
 
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = disk.__dict__
         return ret
+
     except ji.PreviewingError, e:
         return json.loads(e.message)
 

+ 1 - 1
api_route_table.py

@@ -90,7 +90,7 @@ add_rule_api(guest.blueprints, '/_distribute_count', api_func='guest.r_distribut
 add_rule_api(disk.blueprint, '', api_func='disk.r_create', methods=['POST'])
 add_rule_api(disk.blueprint, '/_disk_resize/<uuid>/<size>', api_func='disk.r_resize', methods=['PUT'])
 add_rule_api(disk.blueprints, '/<uuids>', api_func='disk.r_delete', methods=['DELETE'])
-add_rule_api(disk.blueprint, '/<uuid>', api_func='disk.r_update', methods=['PATCH'])
+add_rule_api(disk.blueprints, '/<uuids>', api_func='disk.r_update', methods=['PATCH'])
 add_rule_api(disk.blueprints, '/<uuids>', api_func='disk.r_get', methods=['GET'])
 add_rule_api(disk.blueprints, '', api_func='disk.r_get_by_filter', methods=['GET'])
 add_rule_api(disk.blueprints, '/_search', api_func='disk.r_content_search', methods=['GET'])

+ 2 - 0
models/rules.py

@@ -74,6 +74,8 @@ class Rules(Enum):
     DISK_SIZE = (int, 'size')
     DISK_SIZE_STR = (REG_NUMBER, 'size')
     DISK_ON_HOST = (basestring, 'on_host', (1, 128))
+    IOPS = (int, 'iops')
+    BPS = (int, 'bps')
 
     REMARK = (basestring, 'remark')
     USE_FOR = (int, 'use_for')