Pārlūkot izejas kodu

实现在快照中的磁盘禁止删除操作

James Iter 8 gadi atpakaļ
vecāks
revīzija
68b1ea018f
5 mainītis faili ar 69 papildinājumiem un 11 dzēšanām
  1. 12 6
      README.md
  2. 24 0
      api/snapshot.py
  3. 2 0
      api_route_table.py
  4. 1 1
      templates/disks_show.html
  5. 30 4
      views/disk.py

+ 12 - 6
README.md

@@ -24,11 +24,15 @@
 
 ## 项目描述
 
-> 计算机硬件越趋便宜,性能更为强劲,企业电子信息化方面的业务加重,"互联网+"、大数据的浪潮已经掀起,物联网、AI的趋势正在形成。
-> 因为上述的一切,虚拟化技术被处于一个软化硬件,揉和硬件与业务系统这么一个核心角色。
-> 虚拟化技术虽然已经被普及了很久,但多数企业依然仅仅是把它当做独立的虚拟硬件来使用。在资源的科学分配、高效利用、自动化管理方面,还差些许。
-> JimV 是一个,结构清晰简单,易于部署、维护、使用的,低门槛企业私有云管理平台。
-> 相比于业界知名的 OpenStack、OpenNebula...,JimV 没有很多的零部件,不需要庞大的维护团队。
+计算机硬件越趋便宜,性能更为强劲,企业电子信息化方面的业务加重,"互联网+"、大数据的浪潮已经掀起,物联网、AI的趋势正在形成。
+
+因为上述的一切,虚拟化技术被处于一个软化硬件,揉和硬件与业务系统这么一个核心角色。
+
+虚拟化技术虽然已经被普及了很久,但多数企业依然仅仅是把它当做独立的虚拟硬件来使用。在资源的科学分配、高效利用、自动化管理方面,还差些许。
+
+JimV 是一个,结构清晰简单,易于部署、维护、使用的,低门槛企业私有云管理平台。
+
+相比于业界知名的 OpenStack、OpenNebula...,JimV 没有很多的零部件,不需要庞大的维护团队。
 
 
 ## 功能指标
@@ -59,6 +63,8 @@
 |Guest 暂停/恢复|✓|
 |Guest 在线重置密码|✓|
 |SSH 公钥管理、在线注入功能|✓|
+|基于 Guest 实例的快照|✓|
+|从快照磁盘创建模板镜像|✓|
 
 
 ## 未来计划
@@ -75,10 +81,10 @@
 >* 用户操作轨迹
 >* 用户管理功能
 >* 参照 gitlab,打包出 CentOS yum 一语安装仓库
->* 支持快照
 >* 支持在线镜像商城
 >* 国际化
 >* 加入移动端的支持
+>* 指定 Guest 是否随计算节点自动启动
 
 
 ## 安装

+ 24 - 0
api/snapshot.py

@@ -268,6 +268,30 @@ def r_get_disks(snapshot_id):
         return json.loads(e.message)
 
 
+@Utils.dumps2response
+def r_get_snapshots_by_disks_uuid(disks_uuid):
+
+    args_rules = [
+        Rules.UUIDS.value
+    ]
+
+    try:
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        ret['data'] = list()
+
+        ji.Check.previewing(args_rules, {'uuids': disks_uuid})
+
+        rows, _ = SnapshotDiskMapping.get_by_filter(filter_str=':'.join(['disk_uuid', 'in', disks_uuid]))
+
+        ret['data'] = rows
+
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
 @Utils.dumps2response
 def r_convert_to_os_template_image(snapshot_id, disk_uuid):
 

+ 2 - 0
api_route_table.py

@@ -151,6 +151,8 @@ add_rule_api(snapshot.blueprints, '', api_func='snapshot.r_get_by_filter', metho
 add_rule_api(snapshot.blueprints, '/_search', api_func='snapshot.r_content_search', methods=['GET'])
 add_rule_api(snapshot.blueprint, '/_revert/<snapshot_id>', api_func='snapshot.r_revert', methods=['PUT'])
 add_rule_api(snapshot.blueprint, '/_disks/<snapshot_id>', api_func='snapshot.r_get_disks', methods=['GET'])
+add_rule_api(snapshot.blueprints, '/_mapping_by_disks_uuid/<disks_uuid>',
+             api_func='snapshot.r_get_snapshots_by_disks_uuid', methods=['GET'])
 add_rule_api(snapshot.blueprint, '/_convert_to_os_template_image/<snapshot_id>/<disk_uuid>',
              api_func='snapshot.r_convert_to_os_template_image', methods=['PUT'])
 

+ 1 - 1
templates/disks_show.html

@@ -699,7 +699,7 @@
                                     </a>
                                 </li>
                                 <li class="divider" style="{% if item.sequence == 0 %} display: none; {% endif %}"></li>
-                                <li class="{% if item.state not in [1, 255] %} disabled {% endif %}" style="{% if item.sequence == 0 %} display: none; {% endif %}">
+                                <li class="{% if item.state not in [1, 255] or 'snapshot' in item %} disabled {% endif %}" style="{% if item.sequence == 0 %} display: none; {% 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($('#instance_uuid').val().split('-')[0] + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">

+ 30 - 4
views/disk.py

@@ -110,14 +110,17 @@ def show():
     disks_ret = requests.get(url=disks_url, cookies=request.cookies)
     disks_ret = json.loads(disks_ret.content)
 
-    guest_uuids = list()
+    guests_uuid = list()
+    disks_uuid = list()
 
     for disk in disks_ret['data']:
+        disks_uuid.append(disk['uuid'])
+
         if disk['guest_uuid'].__len__() == 36:
-            guest_uuids.append(disk['guest_uuid'])
+            guests_uuid.append(disk['guest_uuid'])
 
-    if guest_uuids.__len__() > 0:
-        guests_url = host_url + url_for('api_guests.r_get_by_filter', filter='uuid:in:' + ','.join(guest_uuids))
+    if guests_uuid.__len__() > 0:
+        guests_url = host_url + url_for('api_guests.r_get_by_filter', filter='uuid:in:' + ','.join(guests_uuid))
         guests_ret = requests.get(url=guests_url, cookies=request.cookies)
         guests_ret = json.loads(guests_ret.content)
 
@@ -129,6 +132,29 @@ def show():
             if disk['guest_uuid'].__len__() == 36:
                 disks_ret['data'][i]['guest'] = guests_uuid_mapping[disk['guest_uuid']]
 
+    if disks_uuid.__len__() > 0:
+        snapshots_id_mapping_by_disks_uuid_url = host_url + url_for('api_snapshots.r_get_snapshots_by_disks_uuid',
+                                                                    disks_uuid=','.join(disks_uuid))
+        snapshots_id_mapping_by_disks_uuid_ret = requests.get(url=snapshots_id_mapping_by_disks_uuid_url,
+                                                              cookies=request.cookies)
+        snapshots_id_mapping_by_disks_uuid_ret = json.loads(snapshots_id_mapping_by_disks_uuid_ret.content)
+
+        snapshots_id_mapping_by_disk_uuid = dict()
+
+        for snapshot_id_mapping_by_disk_uuid in snapshots_id_mapping_by_disks_uuid_ret['data']:
+
+            disk_uuid = snapshot_id_mapping_by_disk_uuid['disk_uuid']
+            snapshot_id = snapshot_id_mapping_by_disk_uuid['snapshot_id']
+
+            if disk_uuid not in snapshots_id_mapping_by_disk_uuid:
+                snapshots_id_mapping_by_disk_uuid[disk_uuid] = list()
+
+            snapshots_id_mapping_by_disk_uuid[disk_uuid].append(snapshot_id)
+
+        for i, disk in enumerate(disks_ret['data']):
+            if disk['uuid'] in snapshots_id_mapping_by_disk_uuid:
+                disks_ret['data'][i]['snapshot'] = snapshots_id_mapping_by_disk_uuid[disk['uuid']]
+
     config_ret = requests.get(url=config_url, cookies=request.cookies)
     config_ret = json.loads(config_ret.content)