Browse Source

创建虚拟机接口支持 vlan 参数

James Iter 7 years ago
parent
commit
0a2d3fdfe0

+ 29 - 3
jimvc/api/guest.py

@@ -36,6 +36,7 @@ from jimvc.models import SSHKeyGuestMapping
 from jimvc.models import SSHKey
 from jimvc.models import Snapshot
 from jimvc.models import status
+from jimvc.models import VLAN
 
 
 __author__ = 'James Iter'
@@ -97,6 +98,11 @@ def r_create():
             Rules.AUTOSTART.value
         )
 
+    if 'vlan_id' in request.json:
+        args_rules.append(
+            Rules.VLAN_ID.value
+        )
+
     try:
         ret = dict()
         ret['state'] = ji.Common.exchange_state(20000)
@@ -214,6 +220,18 @@ def r_create():
         guest_ip_generator = ip_pool.ip_generator(occupied_ips=occupied_ips)
         guest_vnc_port_generator = ip_pool.vnc_port_generator(occupied_vnc_ports=occupied_vnc_ports)
 
+        vlans, _ = VLAN.get_all()
+        vlans_id = [-1]
+        vlan_id = request.json.get('vlan_id', -1)
+
+        for vlan in vlans:
+            vlans_id.append(vlan['vlan_id'])
+
+        if vlan_id not in vlans_id:
+            ret['state'] = ji.Common.exchange_state(41263)
+            ret['state']['sub']['zh-cn'] = ''.join([ret['state']['sub']['zh-cn'], ': vlan_id: ', vlan_id.__str__()])
+            return ret
+
         while quantity:
             quantity -= 1
             guest = Guest()
@@ -233,8 +251,14 @@ def r_create():
 
             guest.ip = guest_ip_generator.next()
             guest.vnc_port = guest_vnc_port_generator.next()
+            guest.vlan_id = vlan_id
+
+            if guest.vlan_id == -1:
+                guest.network = config.vm_network
+
+            else:
+                guest.network = 'vlan' + guest.vlan_id.__str__()
 
-            guest.network = config.vm_network
             guest.manage_network = config.vm_manage_network
             guest.vnc_password = ji.Common.generate_random_code(length=16)
 
@@ -898,6 +922,8 @@ def r_change_vlan(uuids, vlan_id):
     try:
         ji.Check.previewing(args_rules, {'uuids': uuids, 'vlan_id': vlan_id})
 
+        vlan_id = int(vlan_id)
+
         ret = dict()
         ret['state'] = ji.Common.exchange_state(20000)
 
@@ -919,9 +945,9 @@ def r_change_vlan(uuids, vlan_id):
                 'action': 'change_vlan',
                 'uuid': uuid,
                 'node_id': guest.node_id,
-                'vlan_id': guest.vlan_id,
+                'vlan_id': vlan_id,
                 'vm_network': config.vm_network,
-                'passback_parameters': {'vlan_id': guest.vlan_id}
+                'passback_parameters': {'vlan_id': vlan_id}
             }
 
             Utils.emit_instruction(message=json.dumps(message))

+ 1 - 0
jimvc/models/event_processor.py

@@ -265,6 +265,7 @@ class EventProcessor(object):
                     cls.guest.uuid = uuid
                     cls.guest.get_by('uuid')
                     cls.guest.vlan_id = cls.message['message']['passback_parameters']['vlan_id']
+                    cls.guest.network = 'vlan' + cls.guest.vlan_id.__str__()
                     cls.guest.update()
 
         elif _object == 'disk':

+ 1 - 1
jimvc/models/rules.py

@@ -135,6 +135,6 @@ class Rules(Enum):
     SERVICE_ID_IN_URL = (REG_NUMBER, 'service_id')
     SERVICES_ID = (REG_NUMBERS, 'services_id')
 
-    VLAN_ID = (int, 'vlan_id')
+    VLAN_ID = (int, 'vlan_id', (1, 4094))
     VLAN_ID_IN_URL = (REG_NUMBER, 'vlan_id')
     VLANS_ID = (REG_NUMBERS, 'vlans_id')

+ 4 - 0
jimvc/state_code.py

@@ -70,6 +70,10 @@ own_state_branch = {
         'code': '41262',
         'zh-cn': u'仍有 Guest 在此 Vlan 中,期望该 Vlan 中不存在任何 Guest'
     },
+    '41263': {
+        'code': '41263',
+        'zh-cn': u'无效的 vlan id 或目标网桥,请检查目标 vlan id 或网桥是否存在'
+    },
     '50050': {
         'code': '50050',
         'zh-cn': u'MySQL 链接或执行出错'

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

@@ -1674,7 +1674,7 @@
                 <div class="row" style="padding: 10px 10px 10px 0; width: 100%;">
                     <div class="col-sm-12" style="padding-right: 0;">
                         <div id="datatable-row-highlight_filter" class="dataTables_filter" style="display: inline-block;">
-                            <input id="content_search" type="search" class="form-control" placeholder="模糊搜索..." value="{%- if keyword -%} {{ keyword }} {%- endif -%}" style="margin-left: 0; border-radius: 0;">
+                            <input id="content_search" type="search" autocomplete="off" class="form-control" placeholder="模糊搜索..." value="{%- if keyword -%} {{ keyword }} {%- endif -%}" style="margin-left: 0; border-radius: 0;">
                         </div>
                         <div class="pull-right">
                             <button class="btn btn-default" onclick="refresh()" style="border-radius: 0;"><span class="glyph-icon icon-elusive-arrows-cw"></span></button>