James Iter 9 år sedan
förälder
incheckning
0934202688
3 ändrade filer med 343 tillägg och 84 borttagningar
  1. 196 2
      docs/guest.md
  2. 145 81
      tests/test_guest.py
  3. 2 1
      views/guest.py

+ 196 - 2
docs/guest.md

@@ -1,12 +1,13 @@
 # Guest
 # Guest
 
 
 
 
-## 创建
-### 创建 Guest
+## 创建 Guest
+> 创建 Guest
 
 
 ``` http
 ``` http
 POST https://$domain
 POST https://$domain
   /api/guest
   /api/guest
+Body:
 {
 {
     "cpu": 4,
     "cpu": 4,
     "memory": 4,
     "memory": 4,
@@ -178,5 +179,198 @@ GET https://$domain
 Guest 信息字段描述参见 [获取 Guest 信息](guest.md#获取-guest-信息)
 Guest 信息字段描述参见 [获取 Guest 信息](guest.md#获取-guest-信息)
 
 
 
 
+## 更改 Guest 信息
+> 更改指定 uuid 的 Guest 信息
+
+``` http
+PATCH https://$domain
+  /api/guest/{uuid}
+Body:
+{
+    "remark": "desc"
+}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|remark|N|String|备注|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    },
+    "data": {
+        "status": 1,
+        "xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n            <domain type=\"kvm\">\n            \n            <features>\n                <acpi/>\n                <apic/>\n            </features>\n        \n            <name>4hd3Dop4</name>\n            <uuid>01ee4d15-7165-4859-b8d4-d2c3c0ea22c3</uuid>\n            <vcpu>4</vcpu>\n            <memory unit=\"GiB\">4</memory>\n            \n            <os>\n                <boot dev=\"hd\"/>\n                <type arch=\"x86_64\">hvm</type>\n                <bootmenu timeout=\"3000\" enable=\"yes\"/>\n            </os>\n        \n            \n            <devices>\n                \n            <interface type='network'>\n                <source network='net-br0'/>\n                <model type='virtio'/>\n            </interface>\n        \n                \n                <disk type='network' device='disk'>\n                    <driver name='qemu' type='qcow2' cache='none'/>\n                    <source protocol='gluster' name='gv0/VMs/4hd3Dop4/f0f76139-d909-4270-a9fa-678b34aa01f7.qcow2'>\n                        <host name='127.0.0.1' port='24007'/>\n                    </source>\n                    <target dev='vda' bus='virtio'/>\n                </disk>\n        \n                \n            <graphics passwd=\"eg9nEWNanoPMBdFz\" keymap=\"en-us\" port=\"16004\" type=\"vnc\">\n                <listen network=\"net-br0\" type=\"network\"/>\n            </graphics>\n        \n                \n            <serial type='pty'>\n                <target port='0'/>\n            </serial>\n            <console type='pty'>\n                <target type='serial' port='0'/>\n            </console>\n        \n            </devices>\n        \n            </domain>\n        ",
+        "remark": "zabbix",
+        "name": "4hd3Dop4",
+        "os_template_id": 1,
+        "ip": "10.10.6.78",
+        "vnc_port": 16004,
+        "uuid": "01ee4d15-7165-4859-b8d4-d2c3c0ea22c3",
+        "id": 19,
+        "cpu": 4,
+        "create_time": 1495005882742821,
+        "manage_network": "net-br0",
+        "memory": 4,
+        "password": "pswd.com",
+        "on_host": "10k01.jkser.com",
+        "vnc_password": "eg9nEWNanoPMBdFz",
+        "network": "net-br0"
+    }
+}
+```
+
+Guest 信息字段描述参见 [获取 Guest 信息](guest.md#获取-guest-信息)
+
+
+## 重启 Guest
+> 重启 Guest,uuids以逗号间隔
+
+``` http
+PUT https://$domain
+  /api/guests/_reboot/{uuids}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|uuids|Y|String|uuids可为多个或单个uuid。多个实例的uuid以逗号间隔。|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    }
+}
+```
+
+
+## 关闭 Guest
+> 关闭 Guest,uuids以逗号间隔
+
+``` http
+PUT https://$domain
+  /api/guests/_shutdown/{uuids}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|uuids|Y|String|uuids可为多个或单个uuid。多个实例的uuid以逗号间隔。|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    }
+}
+```
+
+
+## 强制关闭 Guest
+> 强制关闭 Guest,uuids以逗号间隔
+
+``` http
+PUT https://$domain
+  /api/guests/_force_shutdown/{uuids}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|uuids|Y|String|uuids可为多个或单个uuid。多个实例的uuid以逗号间隔。|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    }
+}
+```
+
+
+## 启动 Guest
+> 启动 Guest,uuids以逗号间隔
+
+``` http
+PUT https://$domain
+  /api/guests/_boot/{uuids}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|uuids|Y|String|uuids可为多个或单个uuid。多个实例的uuid以逗号间隔。|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    }
+}
+```
+
+
+## 暂停 Guest
+> 暂停 Guest,uuids以逗号间隔
+
+``` http
+PUT https://$domain
+  /api/guests/_suspend/{uuids}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|uuids|Y|String|uuids可为多个或单个uuid。多个实例的uuid以逗号间隔。|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    }
+}
+```
+
+
+## 恢复 Guest
+> 恢复被暂停的 Guest,uuids以逗号间隔
+
+``` http
+PUT https://$domain
+  /api/guests/_resume/{uuids}
+```
+
+|参数名称|必须|类型|说明|
+|:--|:--:|:--:|:--|
+|uuids|Y|String|uuids可为多个或单个uuid。多个实例的uuid以逗号间隔。|
+
+响应示例
+``` json
+{
+    "state": {
+        "en-us": "OK",
+        "zh-cn": "成功",
+        "code": "200"
+    }
+}
+```
+
+
 [返回上一级](../README.md)
 [返回上一级](../README.md)
 ===
 ===

+ 145 - 81
tests/test_guest.py

@@ -27,26 +27,26 @@ class TestGuest(unittest.TestCase):
 
 
     # 创建Guest
     # 创建Guest
     # @unittest.skip('skip create guest')
     # @unittest.skip('skip create guest')
-    def test_11_create(self):
-        payload = {
-            "cpu": 4,
-            "memory": 4,
-            "os_template_id": 1,
-            "quantity": 1,
-            "name": "",
-            "password": "pswd.com",
-            "lease_term": 100
-        }
-
-        url = TestGuest.base_url + '/guest'
-        headers = {'content-type': 'application/json'}
-        r = requests.post(url, data=json.dumps(payload), headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        self.assertEqual('200', j_r['state']['code'])
+    # def test_11_create(self):
+    #     payload = {
+    #         "cpu": 4,
+    #         "memory": 4,
+    #         "os_template_id": 1,
+    #         "quantity": 1,
+    #         "name": "",
+    #         "password": "pswd.com",
+    #         "lease_term": 100
+    #     }
+    #
+    #     url = TestGuest.base_url + '/guest'
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.post(url, data=json.dumps(payload), headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
 
 
-    # 获取Guest列表
-    def test_12_get(self):
+    # 获取 Guest 列表
+    def test_12_get_list(self):
         url = TestGuest.base_url + '/guests'
         url = TestGuest.base_url + '/guests'
         headers = {'content-type': 'application/json'}
         headers = {'content-type': 'application/json'}
         r = requests.get(url, headers=headers)
         r = requests.get(url, headers=headers)
@@ -55,69 +55,78 @@ class TestGuest(unittest.TestCase):
         TestGuest.uuid = j_r['data'][-1]['uuid']
         TestGuest.uuid = j_r['data'][-1]['uuid']
         self.assertEqual('200', j_r['state']['code'])
         self.assertEqual('200', j_r['state']['code'])
 
 
-    # 更新Guest属性
-    def test_13_update(self):
-        payload = {
-            "remark": "zabbix",
-        }
-
-        url = TestGuest.base_url + '/guest/' + TestGuest.uuid
-        headers = {'content-type': 'application/json'}
-        r = requests.patch(url, data=json.dumps(payload), headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        self.assertEqual('200', j_r['state']['code'])
-
-    # 校验更新结果
-    def test_14_get(self):
-        url = TestGuest.base_url + '/guests'
-        headers = {'content-type': 'application/json'}
-        r = requests.get(url, headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        self.assertEqual('200', j_r['state']['code'])
-        self.assertEqual('zabbix', j_r['data'][-1]['remark'])
-
-    # 创建 Disk
-    def test_21_create_disk(self):
-        payload = {
-            "size": 10
-        }
-
-        url = TestGuest.base_url + '/disk'
-        headers = {'content-type': 'application/json'}
-        r = requests.post(url, data=json.dumps(payload), headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        self.assertEqual('200', j_r['state']['code'])
-
-    def test_22_get_disks(self):
-        url = TestGuest.base_url + '/disks'
-        headers = {'content-type': 'application/json'}
-        r = requests.get(url, headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        TestGuest.disk_uuid = j_r['data'][-1]['uuid']
-        self.assertEqual('200', j_r['state']['code'])
-
-    # @unittest.skip('skip resize disk')
-    def test_23_disk_resize(self):
-        url = TestGuest.base_url + '/disk/_disk_resize/' + TestGuest.disk_uuid + '/2000'
-        headers = {'content-type': 'application/json'}
-        r = requests.put(url, headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        self.assertEqual('200', j_r['state']['code'])
+    # # 获取指定 Guest
+    # def test_13_get(self):
+    #     url = TestGuest.base_url + '/guest/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.get(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # # 更新Guest属性
+    # def test_14_update(self):
+    #     payload = {
+    #         "remark": "zabbix",
+    #     }
+    #
+    #     url = TestGuest.base_url + '/guest/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.patch(url, data=json.dumps(payload), headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # # 校验更新结果
+    # def test_15_get(self):
+    #     url = TestGuest.base_url + '/guest/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.get(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+    #     self.assertEqual('zabbix', j_r['data']['remark'])
 
 
-    def test_31_attach_disk(self):
-        # TestGuest.uuid = '97eb8d05-0939-4b0e-afa9-21dc77a9ba89'
-        # TestGuest.disk_uuid = '88b1dd46-621a-4b29-8eab-1024a94c4653'
-        url = TestGuest.base_url + '/guest/_attach_disk/' + TestGuest.uuid + '/' + TestGuest.disk_uuid
-        headers = {'content-type': 'application/json'}
-        r = requests.put(url, headers=headers)
-        j_r = json.loads(r.content)
-        print json.dumps(j_r, ensure_ascii=False)
-        self.assertEqual('200', j_r['state']['code'])
+    # # 创建 Disk
+    # def test_21_create_disk(self):
+    #     payload = {
+    #         "size": 10
+    #     }
+    #
+    #     url = TestGuest.base_url + '/disk'
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.post(url, data=json.dumps(payload), headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # def test_22_get_disks(self):
+    #     url = TestGuest.base_url + '/disks'
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.get(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     TestGuest.disk_uuid = j_r['data'][-1]['uuid']
+    #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # # @unittest.skip('skip resize disk')
+    # def test_23_disk_resize(self):
+    #     url = TestGuest.base_url + '/disk/_disk_resize/' + TestGuest.disk_uuid + '/2000'
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # def test_31_attach_disk(self):
+    #     TestGuest.uuid = 'ba102b41-4e7a-4d5b-a9e0-43d162695e4a'
+    #     TestGuest.disk_uuid = 'c5881400-4f98-49a8-b5cf-afb5956a5a4b'
+    #     url = TestGuest.base_url + '/guest/_attach_disk/' + TestGuest.uuid + '/' + TestGuest.disk_uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
 
 
     # def test_32_detach_disk(self):
     # def test_32_detach_disk(self):
     #     url = TestGuest.base_url + '/guest/_detach_disk/' + TestGuest.disk_uuid
     #     url = TestGuest.base_url + '/guest/_detach_disk/' + TestGuest.disk_uuid
@@ -144,6 +153,61 @@ class TestGuest(unittest.TestCase):
     #     j_r = json.loads(r.content)
     #     j_r = json.loads(r.content)
     #     print json.dumps(j_r, ensure_ascii=False)
     #     print json.dumps(j_r, ensure_ascii=False)
     #     self.assertEqual('200', j_r['state']['code'])
     #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # def test_51_reboot(self):
+    #     url = TestGuest.base_url + '/guests/_reboot/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+    #
+    # def test_52_force_reboot(self):
+    #     url = TestGuest.base_url + '/guests/_force_reboot/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+
+    # def test_53_shutdown(self):
+    #     url = TestGuest.base_url + '/guests/_shutdown/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+
+    # def test_54_force_shutdown(self):
+    #     url = TestGuest.base_url + '/guests/_force_shutdown/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+
+    # def test_55_boot(self):
+    #     url = TestGuest.base_url + '/guests/_boot/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+
+    # def test_56_suspend(self):
+    #     url = TestGuest.base_url + '/guests/_suspend/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
+    #     self.assertEqual('200', j_r['state']['code'])
+
+    # def test_57_resume(self):
+    #     url = TestGuest.base_url + '/guests/_resume/' + TestGuest.uuid
+    #     headers = {'content-type': 'application/json'}
+    #     r = requests.put(url, headers=headers)
+    #     j_r = json.loads(r.content)
+    #     print json.dumps(j_r, ensure_ascii=False)
 
 
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':

+ 2 - 1
views/guest.py

@@ -258,6 +258,7 @@ def r_force_shutdown(uuids):
 
 
 @Utils.dumps2response
 @Utils.dumps2response
 def r_boot(uuids):
 def r_boot(uuids):
+    # TODO: 做好关系依赖判断,比如boot不可以对suspend的实例操作。
 
 
     args_rules = [
     args_rules = [
         Rules.UUIDS.value
         Rules.UUIDS.value
@@ -344,7 +345,7 @@ def r_delete(uuids):
         Rules.UUIDS.value
         Rules.UUIDS.value
     ]
     ]
 
 
-    # TODO: 加入是否删除使用的数据磁盘开关
+    # TODO: 加入是否删除使用的数据磁盘开关,如果为True,则顺便删除使用的磁盘。否则解除该磁盘被使用的状态。
     try:
     try:
         ji.Check.previewing(args_rules, {'uuids': uuids})
         ji.Check.previewing(args_rules, {'uuids': uuids})