James Iter пре 7 година
родитељ
комит
94ca22d83a

+ 2 - 0
docs/todo.md

@@ -100,4 +100,6 @@
 - [ ] 邮局设置从配置文件提取到JimV系统配置中
 - [x] 当计算节点失联后,相应的虚拟机状态标识为"未知"状态
 - [ ] 替换热迁移时计算节点的主机名为 IP 地址
+- [ ] IP 黑名单(可用作 VIP 场景)
+- [ ] IP 修正功能
 

+ 0 - 5
jimvc/api/config.py

@@ -81,7 +81,6 @@ def r_create():
             return ret
 
         config.create()
-        config.update_global_config()
 
         config.id = 1
         config.get()
@@ -147,8 +146,6 @@ def r_update():
         config.vm_manage_network = request.json.get('vm_manage_network', config.vm_manage_network)
 
         config.update()
-        config.update_global_config()
-
         config.get()
 
         ret = dict()
@@ -266,8 +263,6 @@ def r_update_quota():
                     Utils.emit_instruction(message=json.dumps(message))
 
         config.update()
-        config.update_global_config()
-
         config.get()
 
         ret = dict()

+ 26 - 0
jimvc/api/guest.py

@@ -1305,6 +1305,32 @@ def r_update(uuids):
         return json.loads(e.message)
 
 
+@Utils.dumps2response
+def r_revise_ip(uuid, ip):
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+
+    args_rules = [
+        Rules.UUID.value,
+        Rules.IP.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid, 'ip': ip})
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+        guest.ip = ip
+        guest.update()
+        guest.get()
+
+        ret['data'] = guest.__dict__
+
+        return ret
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
 @Utils.dumps2response
 def r_reset_password(uuids, password):
 

+ 4 - 2
jimvc/api_route_table.py

@@ -32,13 +32,14 @@ __copyright__ = '(c) 2017 by James Iter.'
 
 # JimV 配置操作
 add_rule_api(config.blueprint, '', api_func='config.r_create', methods=['POST'])
-# JimV 关于操作
-add_rule_api(about.blueprint, '', api_func='about.r_get', methods=['GET'])
 # 只有一条记录,所以不指定 id
 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'])
 
+# JimV 关于操作
+add_rule_api(about.blueprint, '', api_func='about.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'])
@@ -122,6 +123,7 @@ add_rule_api(guest.blueprints, '/<uuids>', api_func='guest.r_get', methods=['GET
 add_rule_api(guest.blueprints, '', api_func='guest.r_get_by_filter', methods=['GET'])
 add_rule_api(guest.blueprints, '/_search', api_func='guest.r_content_search', methods=['GET'])
 add_rule_api(guest.blueprints, '/<uuids>', api_func='guest.r_update', methods=['PATCH'])
+add_rule_api(guest.blueprint, '/_revise_ip/<uuid>/<ip>', api_func='guest.r_revise_ip', methods=['PUT'])
 add_rule_api(guest.blueprints, '/<uuids>', api_func='guest.r_delete', methods=['DELETE'])
 add_rule_api(guest.blueprints, '/_reset_password/<uuids>/<password>', api_func='guest.r_reset_password',
              methods=['PUT'])

+ 0 - 3
jimvc/models/config.py

@@ -52,6 +52,3 @@ class Config(ORM):
     def get_allow_content_search_keywords():
         return []
 
-    def update_global_config(self):
-        db.r.hmset(app_config['global_config'], self.__dict__)
-

+ 0 - 3
jimvc/models/initialize.py

@@ -33,15 +33,12 @@ class Init(object):
         'config_file': '/etc/jimvc.conf',
         'log_cycle': 'D',
         'instruction_channel': 'C:Instruction',
-        'global_config': 'H:GlobalConfig',
         'downstream_queue': 'Q:Downstream',
         'upstream_queue': 'Q:Upstream',
         'ipc_queue': 'Q:IPC',
         'hosts_info': 'H:HostsInfo',
         'global_lock': 'H:GlobalLock',
         'compute_nodes_of_allocation_by_nonrandom': 'S:ComputeNodesOfAllocationByNonrandom',
-        'guest_boot_jobs': 'S:GuestBootJobs',
-        'guest_boot_jobs_wait_time': 600,
         'db_charset': 'utf8',
         'db_pool_size': 10,
         'DEBUG': False,

+ 1 - 0
jimvc/models/rules.py

@@ -53,6 +53,7 @@ class Rules(Enum):
     BANDWIDTH_IN_URL = (REG_NUMBER, 'bandwidth')
     BANDWIDTH_UNIT = (basestring, 'bandwidth_unit', ['k', 'm', 'g'])
 
+    IP = (REG_IP, 'ip')
     START_IP = (REG_IP, 'start_ip')
     END_IP = (REG_IP, 'end_ip')
     START_VNC_PORT = (int, 'start_vnc_port')

+ 54 - 1
jimvc/themes/default/templates/guests_show.html

@@ -798,6 +798,23 @@
         });
     }
 
+    function revise_ip(uuid, ip) {
+        $.ajax({
+            url : '/api/guest/_revise_ip/' + uuid + '/' + ip,
+            type : 'PUT',
+            contentType: "application/json; charset=utf-8",
+            error : function() {
+                alter_danger('实例修正 IP 指令发送失败!');
+            },
+            success : function() {
+                alter_success('实例修正 IP 指令发送成功!');
+                setTimeout(function() {
+                    window.location.reload();
+                }, 1000);
+            }
+        });
+    }
+
     function change_prepared_by(uuids, service_id) {
         $.ajax({
             url : '/api/guests/_change_prepared_by/' + uuids.join(',') + '/' + service_id,
@@ -944,6 +961,13 @@
         $('#project_delete_modal').modal('hide');
     }
 
+    function revise_ip_at(me) {
+        var uuid = $('#instance_uuid').val();
+        var ip = $('#revisional_ip').val();
+        revise_ip(uuid, ip)
+        $('#revise_ip_modal').modal('hide');
+    }
+
     function migrate_go() {
         var do_type = $('#migrate_type').val();
         var uuids = [];
@@ -1776,6 +1800,15 @@
                                                 $('#adjust_ability_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        变更配置
                                     </a>
+                                </li>
+                                <li class="">
+                                    <a href="javascript:;" data-toggle="modal" data-target="#revise_ip_modal"
+                                       onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
+                                                $('#revise_ip_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent);
+                                                $('#revisional_ip').val($($(this).parent().parent().parent().parent().parent().children()[7]).text());">
+                                       修正 IP
+                                    </a>
+                                </li>
                                 <li class="divider"></li>
                                 <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#reset_password_modal"
@@ -1793,7 +1826,7 @@
                                 <li class="{% if item.status not in [5, 6, 7, 255] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#delete_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
-                                                $('#delete_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
+                                                $('#delete_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent);">
                                         删除
                                     </a>
                                 </li>
@@ -2604,6 +2637,26 @@
     </div>
 </div>
 
+<div class="modal" id="revise_ip_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h4 class="modal-title">修正虚拟机 IP 地址:</h4>
+            </div>
+            <div class="modal-body">
+                <p>您确定要为该虚拟机修正 IP 地址吗?</p>
+                <h3 style="color: orangered;" id="revise_ip_instance_desc"></h3>
+                <p></p>
+                <input id="revisional_ip" title="新的 IP 地址" class="form-control" name="revisional_ip" placeholder="新的 IP 地址">
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-primary" onclick="revise_ip_at();">确定</button>
+                <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 <div class="modal" id="service_label_edit_name_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
     <div class="modal-dialog modal-sm">
         <div class="modal-content">