Răsfoiți Sursa

实现 保留的 IP API 接口

James Iter 7 ani în urmă
părinte
comite
79d5f1d7bb

+ 1 - 1
docs/todo.md

@@ -101,5 +101,5 @@
 - [x] 当计算节点失联后,相应的虚拟机状态标识为"未知"状态
 - [ ] 替换热迁移时计算节点的主机名为 IP 地址
 - [ ] IP 黑名单(可用作 VIP 场景)
-- [ ] IP 修正功能
+- [x] IP 修正功能
 

+ 82 - 0
jimvc/api/reserved_ip.py

@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# -*- 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 ReservedIP
+
+from base import Base
+
+
+__author__ = 'James Iter'
+__date__ = '2018-12-25'
+__contact__ = 'james.iter.cn@gmail.com'
+__copyright__ = '(c) 2018 by James Iter.'
+
+
+blueprint = Blueprint(
+    'api_reserved_ip',
+    __name__,
+    url_prefix='/api/reserved_ip'
+)
+
+blueprints = Blueprint(
+    'api_reserved_ips',
+    __name__,
+    url_prefix='/api/reserved_ips'
+)
+
+
+reserved_ip_base = Base(the_class=ReservedIP, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
+@Utils.dumps2response
+def r_create():
+
+    args_rules = [
+        Rules.IP.value
+    ]
+
+    reserved_ip = ReservedIP()
+    reserved_ip.ip = request.json.get('ip', '')
+
+    try:
+        ji.Check.previewing(args_rules, reserved_ip.__dict__)
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+
+        reserved_ip.create()
+
+        reserved_ip.get()
+        ret['data'] = reserved_ip.__dict__
+
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_get(ids):
+    return reserved_ip_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
+
+
+@Utils.dumps2response
+def r_get_by_filter():
+    return reserved_ip_base.get_by_filter()
+
+
+@Utils.dumps2response
+def r_content_search():
+    return reserved_ip_base.content_search()
+
+
+@Utils.dumps2response
+def r_delete(ids):
+    return reserved_ip_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
+

+ 8 - 0
jimvc/api_route_table.py

@@ -5,6 +5,7 @@
 from jimvc.models import add_rule_api
 from jimvc.api import config
 from jimvc.api import ip_pool
+from jimvc.api import reserved_ip
 from jimvc.api import os_template_profile
 from jimvc.api import snapshot
 from jimvc.api import os_template_initialize_operate
@@ -49,6 +50,13 @@ add_rule_api(ip_pool.blueprints, '', api_func='ip_pool.r_get_by_filter', methods
 add_rule_api(ip_pool.blueprints, '/_search', api_func='ip_pool.r_content_search', methods=['GET'])
 add_rule_api(ip_pool.blueprint, '/<_id>', api_func='ip_pool.r_activity', methods=['PUT'])
 
+# 保留的 IP 操作
+add_rule_api(reserved_ip.blueprint, '', api_func='reserved_ip.r_create', methods=['POST'])
+add_rule_api(reserved_ip.blueprints, '/<ids>', api_func='reserved_ip.r_delete', methods=['DELETE'])
+add_rule_api(reserved_ip.blueprints, '/<ids>', api_func='reserved_ip.r_get', methods=['GET'])
+add_rule_api(reserved_ip.blueprints, '', api_func='reserved_ip.r_get_by_filter', methods=['GET'])
+add_rule_api(reserved_ip.blueprints, '/_search', api_func='reserved_ip.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

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

+ 42 - 0
jimvc/models/reserved_ip.py

@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+import jimit as ji
+
+from jimvc.models import FilterFieldType
+from jimvc.models import ORM
+
+
+__author__ = 'James Iter'
+__date__ = '2018-12-25'
+__contact__ = 'james.iter.cn@gmail.com'
+__copyright__ = '(c) 2018 by James Iter.'
+
+
+class ReservedIP(ORM):
+
+    _table_name = 'reserved_ip'
+    _primary_key = 'id'
+
+    def __init__(self):
+        super(ReservedIP, self).__init__()
+        self.id = 0
+        self.ip = ''
+        self.create_time = ji.Common.tus()
+
+    @staticmethod
+    def get_filter_keywords():
+        return {
+            'id': FilterFieldType.INT.value,
+            'ip': FilterFieldType.STR.value,
+        }
+
+    @staticmethod
+    def get_allow_update_keywords():
+        return ['']
+
+    @staticmethod
+    def get_allow_content_search_keywords():
+        return ['ip']
+

+ 40 - 0
jimvc/themes/default/templates/config_show.html

@@ -343,6 +343,7 @@
                 '        <div class="pull-right">\n' +
                 '            <button class="btn btn-default" onclick="window.location.reload();" style="border-radius: 0;"><span class="glyph-icon icon-elusive-arrows-cw"></span></button>\n' +
                 '            <a class="btn btn-info" href="javascript:;" data-toggle="modal" data-target="#add_ip_pool_modal" style="border-radius: 0; padding-left: 40px; padding-right: 40px;">添加 IP 池</a>\n' +
+                '            <a class="btn btn-black" href="javascript:;" data-toggle="modal" data-target="#ip_black_list_modal" style="border-radius: 0; padding-left: 40px; padding-right: 40px; color: white;">保留 IP</a>\n' +
                 '        </div>\n' +
                 '    </div>\n' +
                 '</div>';
@@ -748,4 +749,43 @@
         </div>
     </div>
 </div>
+
+<div class="modal" id="ip_black_list_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
+    <div class="modal-dialog modal-sm">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h4 class="modal-title">保留 IP:</h4>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body" style="padding-top: 0; padding-bottom: 0;">
+                <div class="example-box-wrapper">
+                    <form id="ssh_key_bind_form" class="form-horizontal bordered-row" action="javascript;">
+                        <div class="form-group">
+                            <div class="col-sm-1"></div>
+                            <div class="col-sm-10">
+                                <div id="reserved_ip_list" class="list-group" style="text-align: center;">
+                                    <a href="#" class="list-group-item list-group-item-action">192.168.1.1</a>
+                                    <a href="#" class="list-group-item list-group-item-action">192.168.1.1</a>
+                                    <a href="#" class="list-group-item list-group-item-action">192.168.1.1</a>
+                                    <a href="#" class="list-group-item list-group-item-action">192.168.1.1</a>
+                                    <a href="#" class="list-group-item list-group-item-action">192.168.1.1</a>
+                                </div>
+                            </div>
+                            <div class="col-sm-1"></div>
+                        </div>
+                        <div class="form-group">
+                            <div class="col-sm-1"></div>
+                            <div class="col-sm-10">
+                                <input class="form-control" style="text-align: center;" type="text" placeholder="将要保留的 IP">
+                            </div>
+                            <div class="col-sm-1"></div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
 {% endblock content %}

+ 11 - 0
misc/init.sql

@@ -460,6 +460,17 @@ CREATE TABLE IF NOT EXISTS ip_pool(
 ALTER TABLE ip_pool ADD INDEX (name);
 
 
+CREATE TABLE IF NOT EXISTS reserved_ip(
+    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
+    ip CHAR(15) NOT NULL,
+    create_time BIGINT UNSIGNED NOT NULL,
+    PRIMARY KEY (id))
+    ENGINE=Innodb
+    DEFAULT CHARSET=utf8;
+
+ALTER TABLE reserved_ip ADD INDEX (ip);
+
+
 INSERT INTO project (name, description, create_time) VALUES ('我的项目', '由 JimV 创建的默认项目。', UNIX_TIMESTAMP(NOW()) * 1000000);
 INSERT INTO service (project_id, name, description, create_time) VALUES (1, '服务组', '由 JimV 创建的默认服务组。', UNIX_TIMESTAMP(NOW()) * 1000000);
 

+ 10 - 0
misc/v0.7_to_v0.8/update.sql

@@ -29,3 +29,13 @@ ALTER TABLE config
     DROP COLUMN dns1,
     DROP COLUMN dns2;
 
+
+CREATE TABLE IF NOT EXISTS reserved_ip(
+    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
+    ip CHAR(15) NOT NULL,
+    create_time BIGINT UNSIGNED NOT NULL,
+    PRIMARY KEY (id))
+    ENGINE=Innodb
+    DEFAULT CHARSET=utf8;
+
+ALTER TABLE reserved_ip ADD INDEX (ip);