Przeglądaj źródła

实现创建快照

James Iter 8 lat temu
rodzic
commit
ba23ca5f2c

+ 1 - 1
api_route_table.py

@@ -145,7 +145,7 @@ add_rule_api(ssh_key.blueprint, '/_unbind/<ssh_key_id>/<uuids>', api_func='ssh_k
 # 快照操作
 add_rule_api(snapshot.blueprint, '', api_func='snapshot.r_create', methods=['POST'])
 add_rule_api(snapshot.blueprints, '/<snapshots_id>', api_func='snapshot.r_delete', methods=['DELETE'])
-add_rule_api(snapshot.blueprints, '/<snapshot_id>', api_func='snapshot.r_update', methods=['PATCH'])
+add_rule_api(snapshot.blueprint, '/<snapshot_id>', api_func='snapshot.r_update', methods=['PATCH'])
 add_rule_api(snapshot.blueprints, '/<snapshots_id>', api_func='snapshot.r_get', methods=['GET'])
 add_rule_api(snapshot.blueprints, '', api_func='snapshot.r_get_by_filter', methods=['GET'])
 add_rule_api(snapshot.blueprints, '/_search', api_func='snapshot.r_content_search', methods=['GET'])

+ 4 - 4
models/__init__.py

@@ -95,10 +95,6 @@ from host_performance import (
     HostDiskUsageIO
 )
 
-from event_processor import (
-    EventProcessor
-)
-
 from snapshot import (
     Snapshot
 )
@@ -107,6 +103,10 @@ from snapshot_disk_mapping import (
     SnapshotDiskMapping
 )
 
+from event_processor import (
+    EventProcessor
+)
+
 
 __author__ = 'James Iter'
 __date__ = '2017/3/21'

+ 3 - 1
models/event_processor.py

@@ -250,8 +250,10 @@ class EventProcessor(object):
 
         elif _object == 'snapshot':
             if action == 'create':
+                cls.snapshot.id = cls.message['message']['passback_parameters']['id']
+                cls.snapshot.get()
+
                 if state == ResponseState.success.value:
-                    cls.snapshot.id = cls.message['message']['passback_parameters']['id']
                     cls.snapshot.snapshot_id = data['snapshot_id']
                     cls.snapshot.parent_id = data['parent_id']
                     cls.snapshot.xml = data['xml']

+ 1 - 1
models/snapshot.py

@@ -29,7 +29,7 @@ class Snapshot(ORM):
         self.status = None
         self.progress = None
         self.create_time = ji.Common.tus()
-        self.xml = None
+        self.xml = ''
 
     @staticmethod
     def get_filter_keywords():

+ 53 - 5
templates/guests_show.html

@@ -329,6 +329,25 @@
         });
     }
 
+    function create_snapshot(uuid, label) {
+        $.ajax({
+            url : '/api/snapshot',
+            type : 'POST',
+            contentType: "application/json; charset=utf-8",
+            dataType: "json",
+            data : JSON.stringify({guest_uuid: uuid, label: label}),
+            error : function(data, textStatus, xhr) {
+                alter_danger('实例创建快照指令发送失败!');
+            },
+            success : function(data, textStatus, xhr) {
+                alter_success('实例创建快照指令发送成功!');
+                setTimeout(function() {
+                    window.location.href="/snapshots";
+                }, 1000);
+            }
+        });
+    }
+
     function suspend(uuids) {
         $.ajax({
             url : '/api/guests/_suspend/' + uuids.join(','),
@@ -429,6 +448,13 @@
         $('#force_shutdown_modal').modal('hide');
     }
 
+    function create_snapshot_at(me) {
+        var uuid = $('#instance_uuid').val();
+        var label = $('#snapshot_label').val();
+        create_snapshot(uuid, label);
+        $('#create_snapshot_modal').modal('hide');
+    }
+
     function suspend_at(me) {
         var uuid = $('#instance_uuid').val();
         suspend([uuid]);
@@ -664,7 +690,6 @@
                                        启动
                                     </a>
                                 </li>
-                                </li>
                                 <li class="{% if item.status not in [1] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#reboot_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
@@ -679,7 +704,6 @@
                                        强制重启
                                     </a>
                                 </li>
-                                </li>
                                 <li class="{% if item.status not in [1] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#shutdown_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
@@ -687,7 +711,6 @@
                                        停止
                                     </a>
                                 </li>
-                                </li>
                                 <li class="{% if item.status not in [1] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#force_shutdown_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
@@ -695,6 +718,13 @@
                                        强制停止
                                     </a>
                                 </li>
+                                <li class="divider"></li>
+                                <li class="">
+                                    <a href="javascript:;" data-toggle="modal" data-target="#create_snapshot_modal"
+                                       onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
+                                                $('#create_snapshot_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="divider"></li>
                                 <li class="{% if item.status not in [1] %} disabled {% endif %}">
@@ -704,7 +734,6 @@
                                        暂停
                                     </a>
                                 </li>
-                                </li>
                                 <li class="{% if item.status not in [3] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#resume_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
@@ -712,7 +741,6 @@
                                        恢复
                                     </a>
                                 </li>
-                                </li>
                                 <li class="divider"></li>
                                 <li class="">
                                     <a href="/guest/vnc/{{ item.uuid }}" target="_blank">远程连接</a>
@@ -1073,6 +1101,26 @@
     </div>
 </div>
 
+<div class="modal" id="create_snapshot_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">创建快照:</h4>
+            </div>
+            <div class="modal-body">
+                <p>你确定要为该虚拟机创建快照吗?</p>
+                <h3 style="color: orangered;" id="create_snapshot_instance_desc"></h3>
+                <p></p>
+                <input id="snapshot_label" title="快照名称" class="form-control" name="snapshot_label" placeholder="快照名称">
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-primary" onclick="create_snapshot_at();">确定</button>
+                <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 <div class="modal" id="suspend_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
     <div class="modal-dialog">
         <div class="modal-content">

+ 1 - 1
templates/snapshots_show.html

@@ -307,7 +307,7 @@
                                 <div class="col-sm-6">
                                 </div>
                                 <div class="col-sm-3" style="font-size: 12px; padding-top: 5px; text-align: right;">
-                                    共有{{ os_templates_image_ret.paging.total }}条,每页显示:
+                                    共有{{ snapshots_ret.paging.total }}条,每页显示:
                                     <select id="page_size" name="datatable-row-highlight_length" title="page_size" class="form-control" style="height: 22px; vertical-align: baseline;">
                                         <option value="10" {% if page_size == 10 %} selected {% endif %}>10</option>
                                         <option value="20" {% if page_size == 20 %} selected {% endif %}>20</option>