diff --git a/doc/api_samples/os-hypervisors/hypervisors-detail-resp.json b/doc/api_samples/os-hypervisors/hypervisors-detail-resp.json
new file mode 100644
index 000000000000..b124901ea80c
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-detail-resp.json
@@ -0,0 +1,26 @@
+{
+ "hypervisors": [
+ {
+ "cpu_info": "?",
+ "current_workload": 0,
+ "disk_available_least": null,
+ "free_disk_gb": 1028,
+ "free_ram_mb": 7680,
+ "hypervisor_hostname": "fake-mini",
+ "hypervisor_type": "fake",
+ "hypervisor_version": 1,
+ "id": 1,
+ "local_gb": 1028,
+ "local_gb_used": 0,
+ "memory_mb": 8192,
+ "memory_mb_used": 512,
+ "running_vms": 0,
+ "service": {
+ "host": "1e0d7892083548cfb347e782d3b20342",
+ "id": 2
+ },
+ "vcpus": 1,
+ "vcpus_used": 0
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-detail-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-detail-resp.xml
new file mode 100644
index 000000000000..709f4fcd6ddc
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-detail-resp.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-list-resp.json b/doc/api_samples/os-hypervisors/hypervisors-list-resp.json
new file mode 100644
index 000000000000..8d94021274fb
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-list-resp.json
@@ -0,0 +1,8 @@
+{
+ "hypervisors": [
+ {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-list-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-list-resp.xml
new file mode 100644
index 000000000000..8a784c592f8b
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-list-resp.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-search-resp.json b/doc/api_samples/os-hypervisors/hypervisors-search-resp.json
new file mode 100644
index 000000000000..8d94021274fb
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-search-resp.json
@@ -0,0 +1,8 @@
+{
+ "hypervisors": [
+ {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-search-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-search-resp.xml
new file mode 100644
index 000000000000..8a784c592f8b
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-search-resp.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-servers-resp.json b/doc/api_samples/os-hypervisors/hypervisors-servers-resp.json
new file mode 100644
index 000000000000..8d94021274fb
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-servers-resp.json
@@ -0,0 +1,8 @@
+{
+ "hypervisors": [
+ {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-servers-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-servers-resp.xml
new file mode 100644
index 000000000000..950a5ab11fd2
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-servers-resp.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-show-resp.json b/doc/api_samples/os-hypervisors/hypervisors-show-resp.json
new file mode 100644
index 000000000000..c0feecd02c68
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-show-resp.json
@@ -0,0 +1,24 @@
+{
+ "hypervisor": {
+ "cpu_info": "?",
+ "current_workload": 0,
+ "disk_available_least": null,
+ "free_disk_gb": 1028,
+ "free_ram_mb": 7680,
+ "hypervisor_hostname": "fake-mini",
+ "hypervisor_type": "fake",
+ "hypervisor_version": 1,
+ "id": 1,
+ "local_gb": 1028,
+ "local_gb_used": 0,
+ "memory_mb": 8192,
+ "memory_mb_used": 512,
+ "running_vms": 0,
+ "service": {
+ "host": "5641188ab2964f88a21042b493585ff8",
+ "id": 2
+ },
+ "vcpus": 1,
+ "vcpus_used": 0
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-show-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-show-resp.xml
new file mode 100644
index 000000000000..04feef067181
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-show-resp.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-statistics-resp.json b/doc/api_samples/os-hypervisors/hypervisors-statistics-resp.json
new file mode 100644
index 000000000000..2cfb51e7030a
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-statistics-resp.json
@@ -0,0 +1,16 @@
+{
+ "hypervisor_statistics": {
+ "count": 1,
+ "current_workload": 0,
+ "disk_available_least": 0,
+ "free_disk_gb": 1028,
+ "free_ram_mb": 7680,
+ "local_gb": 1028,
+ "local_gb_used": 0,
+ "memory_mb": 8192,
+ "memory_mb_used": 512,
+ "running_vms": 0,
+ "vcpus": 1,
+ "vcpus_used": 0
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-statistics-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-statistics-resp.xml
new file mode 100644
index 000000000000..5d10411e3aef
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-statistics-resp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-uptime-resp.json b/doc/api_samples/os-hypervisors/hypervisors-uptime-resp.json
new file mode 100644
index 000000000000..f5f9d19e7ccd
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-uptime-resp.json
@@ -0,0 +1,7 @@
+{
+ "hypervisor": {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1,
+ "uptime": " 08:32:11 up 93 days, 18:25, 12 users, load average: 0.20, 0.12, 0.14"
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-hypervisors/hypervisors-uptime-resp.xml b/doc/api_samples/os-hypervisors/hypervisors-uptime-resp.xml
new file mode 100644
index 000000000000..5c1b2cd7dd98
--- /dev/null
+++ b/doc/api_samples/os-hypervisors/hypervisors-uptime-resp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-detail-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-detail-resp.json.tpl
new file mode 100644
index 000000000000..88eb4ad86e58
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-detail-resp.json.tpl
@@ -0,0 +1,26 @@
+{
+ "hypervisors": [
+ {
+ "cpu_info": "?",
+ "current_workload": 0,
+ "disk_available_least": null,
+ "free_disk_gb": 1028,
+ "free_ram_mb": 7680,
+ "hypervisor_hostname": "fake-mini",
+ "hypervisor_type": "fake",
+ "hypervisor_version": 1,
+ "id": 1,
+ "local_gb": 1028,
+ "local_gb_used": 0,
+ "memory_mb": 8192,
+ "memory_mb_used": 512,
+ "running_vms": 0,
+ "service": {
+ "host": "%(host_name)s",
+ "id": 2
+ },
+ "vcpus": 1,
+ "vcpus_used": 0
+ }
+ ]
+}
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-detail-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-detail-resp.xml.tpl
new file mode 100644
index 000000000000..f0c20662d4e7
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-detail-resp.xml.tpl
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-list-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-list-resp.json.tpl
new file mode 100644
index 000000000000..8d94021274fb
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-list-resp.json.tpl
@@ -0,0 +1,8 @@
+{
+ "hypervisors": [
+ {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-list-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-list-resp.xml.tpl
new file mode 100644
index 000000000000..6b7d9d7ca1aa
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-list-resp.xml.tpl
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-search-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-search-resp.json.tpl
new file mode 100644
index 000000000000..8d94021274fb
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-search-resp.json.tpl
@@ -0,0 +1,8 @@
+{
+ "hypervisors": [
+ {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-search-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-search-resp.xml.tpl
new file mode 100644
index 000000000000..6b7d9d7ca1aa
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-search-resp.xml.tpl
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-servers-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-servers-resp.json.tpl
new file mode 100644
index 000000000000..8d94021274fb
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-servers-resp.json.tpl
@@ -0,0 +1,8 @@
+{
+ "hypervisors": [
+ {
+ "hypervisor_hostname": "fake-mini",
+ "id": 1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-servers-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-servers-resp.xml.tpl
new file mode 100644
index 000000000000..7782732ba6ea
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-servers-resp.xml.tpl
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.json.tpl
new file mode 100644
index 000000000000..4eaded8d7530
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.json.tpl
@@ -0,0 +1,24 @@
+{
+ "hypervisor": {
+ "cpu_info": "?",
+ "current_workload": 0,
+ "disk_available_least": null,
+ "free_disk_gb": 1028,
+ "free_ram_mb": 7680,
+ "hypervisor_hostname": "fake-mini",
+ "hypervisor_type": "fake",
+ "hypervisor_version": 1,
+ "id": %(hypervisor_id)s,
+ "local_gb": 1028,
+ "local_gb_used": 0,
+ "memory_mb": 8192,
+ "memory_mb_used": 512,
+ "running_vms": 0,
+ "service": {
+ "host": "%(host_name)s",
+ "id": 2
+ },
+ "vcpus": 1,
+ "vcpus_used": 0
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.xml.tpl
new file mode 100644
index 000000000000..336f23be2921
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.xml.tpl
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-statistics-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-statistics-resp.json.tpl
new file mode 100644
index 000000000000..2cfb51e7030a
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-statistics-resp.json.tpl
@@ -0,0 +1,16 @@
+{
+ "hypervisor_statistics": {
+ "count": 1,
+ "current_workload": 0,
+ "disk_available_least": 0,
+ "free_disk_gb": 1028,
+ "free_ram_mb": 7680,
+ "local_gb": 1028,
+ "local_gb_used": 0,
+ "memory_mb": 8192,
+ "memory_mb_used": 512,
+ "running_vms": 0,
+ "vcpus": 1,
+ "vcpus_used": 0
+ }
+}
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-statistics-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-statistics-resp.xml.tpl
new file mode 100644
index 000000000000..5d10411e3aef
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-statistics-resp.xml.tpl
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-uptime-resp.json.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-uptime-resp.json.tpl
new file mode 100644
index 000000000000..8a36c65f232a
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-uptime-resp.json.tpl
@@ -0,0 +1,7 @@
+{
+ "hypervisor": {
+ "hypervisor_hostname": "fake-mini",
+ "id": %(hypervisor_id)s,
+ "uptime": " 08:32:11 up 93 days, 18:25, 12 users, load average: 0.20, 0.12, 0.14"
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-uptime-resp.xml.tpl b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-uptime-resp.xml.tpl
new file mode 100644
index 000000000000..04219f5b5dd3
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-hypervisors/hypervisors-uptime-resp.xml.tpl
@@ -0,0 +1,2 @@
+
+
diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py
index 05d528ec2931..8282990f9170 100644
--- a/nova/tests/integrated/test_api_samples.py
+++ b/nova/tests/integrated/test_api_samples.py
@@ -383,7 +383,6 @@ class ApiSamplesTrap(ApiSampleTestBase):
# removed) soon.
do_not_approve_additions = []
do_not_approve_additions.append('os-create-server-ext')
- do_not_approve_additions.append('os-hypervisors')
do_not_approve_additions.append('os-volumes')
tests = self._get_extensions_tested()
@@ -3333,6 +3332,66 @@ class FlavorAccessSampleJsonTests(ApiSampleTestBase):
class FlavorAccessSampleXmlTests(FlavorAccessSampleJsonTests):
+ ctype = 'xml'
+
+
+class HypervisorsSampleJsonTests(ApiSampleTestBase):
+ extension_name = ("nova.api.openstack.compute.contrib.hypervisors."
+ "Hypervisors")
+
+ def test_hypervisors_list(self):
+ response = self._do_get('os-hypervisors')
+ self.assertEqual(response.status, 200)
+ return self._verify_response('hypervisors-list-resp',
+ {}, response)
+
+ def test_hypervisors_search(self):
+ response = self._do_get('os-hypervisors/fake/search')
+ self.assertEqual(response.status, 200)
+ return self._verify_response('hypervisors-search-resp',
+ {}, response)
+
+ def test_hypervisors_servers(self):
+ response = self._do_get('os-hypervisors/fake/servers')
+ self.assertEqual(response.status, 200)
+ return self._verify_response('hypervisors-servers-resp',
+ {}, response)
+
+ def test_hypervisors_show(self):
+ hypervisor_id = 1
+ subs = {
+ 'hypervisor_id': hypervisor_id
+ }
+ response = self._do_get('os-hypervisors/%s' % hypervisor_id)
+ self.assertEqual(response.status, 200)
+ subs.update(self._get_regexes())
+ return self._verify_response('hypervisors-show-resp',
+ subs, response)
+
+ def test_hypervisors_statistics(self):
+ response = self._do_get('os-hypervisors/statistics')
+ self.assertEqual(response.status, 200)
+ return self._verify_response('hypervisors-statistics-resp',
+ {}, response)
+
+ def test_hypervisors_uptime(self):
+ def fake_get_host_uptime(self, context, hyp):
+ return (" 08:32:11 up 93 days, 18:25, 12 users, load average:"
+ " 0.20, 0.12, 0.14")
+
+ self.stubs.Set(compute_api.HostAPI,
+ 'get_host_uptime', fake_get_host_uptime)
+ hypervisor_id = 1
+ response = self._do_get('os-hypervisors/%s/uptime' % hypervisor_id)
+ self.assertEqual(response.status, 200)
+ subs = {
+ 'hypervisor_id': hypervisor_id,
+ }
+ return self._verify_response('hypervisors-uptime-resp',
+ subs, response)
+
+
+class HypervisorsSampleXmlTests(HypervisorsSampleJsonTests):
ctype = "xml"