James Iter 7 лет назад
Родитель
Сommit
3247586f02

+ 4 - 0
jimvc/__init__.py

@@ -52,6 +52,8 @@ from jimvc.api.guest import blueprints as guest_blueprints
 from jimvc.api.disk import blueprint as disk_blueprint
 from jimvc.api.disk import blueprints as disk_blueprints
 from jimvc.api.config import blueprint as config_blueprint
+from jimvc.api.ip_pool import blueprint as ip_pool_blueprint
+from jimvc.api.ip_pool import blueprints as ip_pool_blueprints
 from jimvc.api.log import blueprint as log_blueprint
 from jimvc.api.log import blueprints as log_blueprints
 from jimvc.api.host import blueprint as host_blueprint
@@ -261,6 +263,8 @@ try:
     app.register_blueprint(disk_blueprint)
     app.register_blueprint(disk_blueprints)
     app.register_blueprint(config_blueprint)
+    app.register_blueprint(ip_pool_blueprint)
+    app.register_blueprint(ip_pool_blueprints)
     app.register_blueprint(log_blueprint)
     app.register_blueprint(log_blueprints)
     app.register_blueprint(host_blueprint)

+ 176 - 0
jimvc/api/ip_pool.py

@@ -2,8 +2,184 @@
 # -*- coding: utf-8 -*-
 
 
+from flask import Blueprint, request
+import json
+import jimit as ji
+
+from jimvc.models import Utils
+from jimvc.models import Rules
+from jimvc.models import IPPool
+
+from base import Base
+
+
 __author__ = 'James Iter'
 __date__ = '2018-12-15'
 __contact__ = 'james.iter.cn@gmail.com'
 __copyright__ = '(c) 2018 by James Iter.'
 
+
+blueprint = Blueprint(
+    'api_ip_pool',
+    __name__,
+    url_prefix='/api/ip_pool'
+)
+
+blueprints = Blueprint(
+    'api_ip_pools',
+    __name__,
+    url_prefix='/api/ip_pools'
+)
+
+
+ip_pool_base = Base(the_class=IPPool, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
+@Utils.dumps2response
+def r_create():
+
+    args_rules = [
+        Rules.START_IP.value,
+        Rules.END_IP.value,
+        Rules.NETMASK.value,
+        Rules.GATEWAY.value,
+        Rules.DNS1.value,
+        Rules.DNS2.value,
+        Rules.NAME.value,
+        Rules.DESCRIPTION.value
+    ]
+
+    ip_pool = IPPool()
+    ip_pool.start_ip = request.json.get('start_ip')
+    ip_pool.end_ip = request.json.get('end_ip')
+    ip_pool.netmask = request.json.get('netmask')
+    ip_pool.gateway = request.json.get('gateway')
+    ip_pool.dns1 = request.json.get('dns1')
+    ip_pool.dns2 = request.json.get('dns2')
+    ip_pool.name = request.json.get('name', '')
+    ip_pool.description = request.json.get('description', '')
+
+    try:
+        ji.Check.previewing(args_rules, ip_pool.__dict__)
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+
+        ip_pool.check_ip()
+        ip_pool.create()
+
+        ip_pool.get()
+        ret['data'] = ip_pool.__dict__
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_update(ids):
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+    ret['data'] = list()
+
+    args_rules = [
+        Rules.IDS.value
+    ]
+
+    if 'start_ip' in request.json:
+        args_rules.append(
+            Rules.START_IP.value,
+        )
+
+    if 'end_ip' in request.json:
+        args_rules.append(
+            Rules.END_IP.value,
+        )
+
+    if 'netmask' in request.json:
+        args_rules.append(
+            Rules.NETMASK.value,
+        )
+
+    if 'gateway' in request.json:
+        args_rules.append(
+            Rules.GATEWAY.value,
+        )
+
+    if 'dns1' in request.json:
+        args_rules.append(
+            Rules.DNS1.value,
+        )
+
+    if 'dns2' in request.json:
+        args_rules.append(
+            Rules.DNS2.value,
+        )
+
+    if 'name' in request.json:
+        args_rules.append(
+            Rules.NAME.value,
+        )
+
+    if 'description' in request.json:
+        args_rules.append(
+            Rules.DESCRIPTION.value,
+        )
+
+    if args_rules.__len__() < 2:
+        return ret
+
+    request.json['ids'] = ids
+
+    try:
+        ji.Check.previewing(args_rules, request.json)
+
+        ip_pool = IPPool()
+
+        # 检测所指定的 UUDIs 磁盘都存在
+        for _id in ids.split(','):
+            ip_pool.id = _id
+            ip_pool.get()
+
+        for _id in ids.split(','):
+            ip_pool.id = _id
+            ip_pool.get()
+            ip_pool.start_ip = request.json.get('start_ip', ip_pool.start_ip)
+            ip_pool.end_ip = request.json.get('end_ip', ip_pool.end_ip)
+            ip_pool.netmask = request.json.get('netmask', ip_pool.netmask)
+            ip_pool.gateway = request.json.get('gateway', ip_pool.gateway)
+            ip_pool.dns1 = request.json.get('dns1', ip_pool.dns1)
+            ip_pool.dns2 = request.json.get('dns2', ip_pool.dns2)
+            ip_pool.name = request.json.get('name', ip_pool.name)
+            ip_pool.description = request.json.get('description', ip_pool.description)
+
+            ip_pool.check_ip()
+            ip_pool.update()
+            ip_pool.get()
+
+            ret['data'].append(ip_pool.__dict__)
+
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_get(ids):
+    return ip_pool_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
+
+
+@Utils.dumps2response
+def r_get_by_filter():
+    return ip_pool_base.get_by_filter()
+
+
+@Utils.dumps2response
+def r_content_search():
+    return ip_pool_base.content_search()
+
+
+@Utils.dumps2response
+def r_delete(ids):
+    return ip_pool_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
+

+ 9 - 0
jimvc/api_route_table.py

@@ -4,6 +4,7 @@
 
 from jimvc.models import add_rule_api
 from jimvc.api import config
+from jimvc.api import ip_pool
 from jimvc.api import os_template_profile
 from jimvc.api import snapshot
 from jimvc.api import os_template_initialize_operate
@@ -38,6 +39,14 @@ add_rule_api(config.blueprint, '', api_func='config.r_update', methods=['PATCH']
 add_rule_api(config.blueprint, '/_quota', api_func='config.r_update_quota', methods=['PATCH'])
 add_rule_api(config.blueprint, '', api_func='config.r_get', methods=['GET'])
 
+# IP 池操作
+add_rule_api(ip_pool.blueprint, '', api_func='ip_pool.r_create', methods=['POST'])
+add_rule_api(ip_pool.blueprints, '/<ids>', api_func='ip_pool.r_update', methods=['PATCH'])
+add_rule_api(ip_pool.blueprints, '/<ids>', api_func='ip_pool.r_delete', methods=['DELETE'])
+add_rule_api(ip_pool.blueprints, '/<ids>', api_func='ip_pool.r_get', methods=['GET'])
+add_rule_api(ip_pool.blueprints, '', api_func='ip_pool.r_get_by_filter', methods=['GET'])
+add_rule_api(ip_pool.blueprints, '/_search', api_func='ip_pool.r_content_search', methods=['GET'])
+
 # JimV 配置操作
 add_rule_api(dashboard.blueprint, '/_show', api_func='dashboard.r_show', methods=['GET'])
 

+ 5 - 1
jimvc/models/__init__.py

@@ -102,6 +102,10 @@ from guest_performance import (
     GuestDiskIO
 )
 
+from ip_pool import (
+    IPPool
+)
+
 from host import (
     Host
 )
@@ -138,6 +142,6 @@ __all__ = [
     'OSTemplateInitializeOperate', 'EventProcessor', 'ResponseState', 'GuestCPUMemory', 'GuestTraffic', 'GuestDiskIO',
     'HostCPUMemory', 'HostTraffic', 'HostDiskUsageIO', 'Host', 'Snapshot', 'SnapshotDiskMapping', 'OSTemplateImageKind',
     'GuestMigrateInfo', 'GuestCollectionPerformanceDataKind', 'HostCollectionPerformanceDataKind', 'StorageMode',
-    'OSTemplateInitializeOperateKind', 'dev_table', 'Project', 'Service'
+    'OSTemplateInitializeOperateKind', 'dev_table', 'Project', 'Service', 'IPPool'
 ]
 

+ 1 - 0
jimvc/models/event_processor.py

@@ -53,6 +53,7 @@ class EventProcessor(object):
                     full_message='' if cls.message['message'].__len__() < 255 else cls.message['message'])
 
         cls.log.create()
+        pass
 
     @classmethod
     def guest_event_processor(cls):

+ 1 - 0
jimvc/models/orm.py

@@ -35,6 +35,7 @@ class ORM(object):
         cursor = cnx.cursor(dictionary=True, buffered=True)
         try:
             cursor.execute(sql_stmt, self.__dict__)
+            self.__setattr__(self._primary_key, cursor.lastrowid)
             cnx.commit()
         except errors.IntegrityError, e:
             ret = dict()