diff --git a/cloudcafe/compute/hypervisors_api/client.py b/cloudcafe/compute/hypervisors_api/client.py
index 3d45766d..59e7cb38 100644
--- a/cloudcafe/compute/hypervisors_api/client.py
+++ b/cloudcafe/compute/hypervisors_api/client.py
@@ -15,7 +15,8 @@ limitations under the License.
"""
from cafe.engine.clients.rest import AutoMarshallingRestClient
-from cloudcafe.compute.hypervisors_api.model.hypervisors import Hypervisor
+from cloudcafe.compute.hypervisors_api.model.hypervisor\
+ import HypervisorsMin, Hypervisors
class HypervisorsClient(AutoMarshallingRestClient):
@@ -50,7 +51,19 @@ class HypervisorsClient(AutoMarshallingRestClient):
"""
url = "{url}/os-hypervisors".format(url=self.url)
hypervisor_res = self.request('GET', url,
- response_entity_type=Hypervisor,
+ response_entity_type=HypervisorsMin,
+ requestslib_kwargs=requestslib_kwargs)
+ return hypervisor_res
+
+ def list_hypervisors_with_detail(self, requestslib_kwargs=None):
+ """
+ @summary: Returns a list of hypervisors
+ @return: List of hypervisors
+ @rtype: C{list}
+ """
+ url = "{url}/os-hypervisors/detail".format(url=self.url)
+ hypervisor_res = self.request('GET', url,
+ response_entity_type=Hypervisors,
requestslib_kwargs=requestslib_kwargs)
return hypervisor_res
@@ -64,6 +77,6 @@ class HypervisorsClient(AutoMarshallingRestClient):
url = "{url}/os-hypervisors/{hypervisor_hostname}/servers".\
format(url=self.url, hypervisor_hostname=hypervisor_hostname)
hypervisor_res = self.request('GET', url,
- response_entity_type=Hypervisor,
+ response_entity_type=HypervisorsMin,
requestslib_kwargs=requestslib_kwargs)
return hypervisor_res
diff --git a/cloudcafe/compute/hypervisors_api/model/hypervisor.py b/cloudcafe/compute/hypervisors_api/model/hypervisor.py
new file mode 100644
index 00000000..a6c64c87
--- /dev/null
+++ b/cloudcafe/compute/hypervisors_api/model/hypervisor.py
@@ -0,0 +1,264 @@
+"""
+Copyright 2013 Rackspace
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+import json
+import xml.etree.ElementTree as ET
+
+from cafe.engine.models.base import AutoMarshallingModel, AutoMarshallingListModel
+from cloudcafe.compute.common.equality_tools import EqualityTools
+from cloudcafe.compute.servers_api.models.servers import Server
+
+
+class Service(AutoMarshallingModel):
+
+ def __init__(self, host=None, id_=None):
+ super(Service, self).__init__()
+ self.host = host
+ self.id_ = id_
+
+ @classmethod
+ def _dict_to_obj(cls, json_dict):
+ return Service(host=json_dict.get('host'),
+ id_=json_dict.get('id'))
+
+
+class Hypervisor(AutoMarshallingModel):
+
+ def __init__(self, id_=None, hypervisor_hostname=None,
+ servers=None, cpu_info=None, free_disk_gb=None,
+ hypervisor_version=None, disk_available_least=None,
+ local_gb=None, free_ram_mb=None, vcpus_used=None,
+ hypervisor_type=None, local_gb_used=None,
+ memory_mb_used=None, memory_mb=None,
+ current_workload=None, vcpus=None,
+ running_vms=None, service=None):
+ super(Hypervisor, self).__init__()
+ self.id_ = id_
+ self.hypervisor_hostname = hypervisor_hostname
+ self.servers = servers
+ self.cpu_info = cpu_info
+ self.free_disk_gb = free_disk_gb
+ self.hypervisor_version = hypervisor_version
+ self.disk_available_least = disk_available_least
+ self.local_gb = local_gb
+ self.free_ram_mb = free_ram_mb
+ self.vcpus_used = vcpus_used
+ self.hypervisor_type = hypervisor_type
+ self.local_gb_used = local_gb_used
+ self.memory_mb_used = memory_mb_used
+ self.memory_mb = memory_mb
+ self.current_workload = current_workload
+ self.vcpus = vcpus
+ self.running_vms = running_vms
+ self.service = service
+
+ def __eq__(self, other):
+ """
+ @summary: Overrides the default equals
+ @param other: Hypervisor object to compare with
+ @type other: Hypervisor
+ @return: True if Host objects are equal, False otherwise
+ @rtype: bool
+ """
+ return EqualityTools.are_objects_equal(self, other)
+
+ def __ne__(self, other):
+ """
+ @summary: Overrides the default not-equals
+ @param other: Hypervisor object to compare with
+ @type other: Hypervisor
+ @return: True if Hypervisor objects are not equal, False otherwise
+ @rtype: bool
+ """
+ return not self.__eq__(other)
+
+ @classmethod
+ def _dict_to_obj(cls, hypervisor_dict):
+ args = {
+ 'id_': hypervisor_dict.get('id'),
+ 'hypervisor_hostname': hypervisor_dict.get('hypervisor_hostname'),
+ 'cpu_info': hypervisor_dict.get('cpu_info'),
+ 'free_disk_gb': hypervisor_dict.get('free_disk_gb'),
+ 'hypervisor_version': hypervisor_dict.get('hypervisor_version'),
+ 'disk_available_least': hypervisor_dict.get(
+ 'disk_available_least'),
+ 'local_gb': hypervisor_dict.get('local_gb'),
+ 'free_ram_mb': hypervisor_dict.get('free_ram_mb'),
+ 'vcpus_used': hypervisor_dict.get('vcpus_used'),
+ 'hypervisor_type': hypervisor_dict.get('hypervisor_type'),
+ 'local_gb_used': hypervisor_dict.get('local_gb_used'),
+ 'memory_mb_used': hypervisor_dict.get('memory_mb_used'),
+ 'memory_mb': hypervisor_dict.get('memory_mb'),
+ 'current_workload': hypervisor_dict.get('current_workload'),
+ 'vcpus': hypervisor_dict.get('vcpus'),
+ 'running_vms': hypervisor_dict.get('running_vms'),
+ 'service': Service._dict_to_obj(hypervisor_dict.get('service'))
+ }
+
+ return Hypervisor(**args)
+
+ @classmethod
+ def _int_to_version_str(cls, version_int):
+ """
+ @param version_int: The version in munge form of integer
+ ex: 6000000
+ @type version_int: Integer
+ @return: dot seperated version string
+ ex: '6.0.0'
+ """
+ if isinstance(version_int, str):
+ version_int = int(version_int)
+ major = version_int // 1000000
+ minor = (version_int - major * 1000000) // 1000
+ patch = (version_int - major * 1000000 - minor * 1000)
+ return '{0}.{1}.{2}'.format(major, minor, patch)
+
+
+class Hypervisors(AutoMarshallingListModel):
+
+ @classmethod
+ def _json_to_obj(cls, serialized_str):
+ """
+ @summary: Returns an instance of a Hypervisor
+ based on the json serialized_str
+ passed in.
+ @param serialized_str: JSON serialized string
+ @type serialized_str: String
+ @return: List of Hypervisor
+ @rtype: List
+ """
+ json_dict = json.loads(serialized_str)
+
+ hypervisors = Hypervisors()
+ for hypervisor_dict in json_dict.get('hypervisors'):
+ hypervisors.append(Hypervisor._dict_to_obj(hypervisor_dict))
+
+ ret = hypervisors
+ return ret
+
+ @classmethod
+ def _xml_to_obj(cls, serialized_str):
+ """
+ @summary: Returns an instance of a Hypervisor
+ based on the xml serialized_str
+ passed in.
+ @param serialized_str: XML serialized string
+ @type serialized_str: String
+ @return: List of Hypervisors
+ @rtype: List
+ """
+ element = ET.fromstring(serialized_str)
+ hypervisors = Hypervisors()
+ for hypervisor_ele in element.findall('hypervisor'):
+ hypervisor_dict = hypervisor_ele.attrib
+ hypervisor_dict['service'] = hypervisor_ele.find('service').attrib
+ hyp_obj = Hypervisor._dict_to_obj(hypervisor_dict)
+ hypervisors.append(hyp_obj)
+
+ return hypervisors
+
+
+class HypervisorMin(AutoMarshallingModel):
+
+ def __init__(self, id=None, hypervisor_hostname=None,
+ servers=None):
+ super(HypervisorMin, self).__init__()
+ self.id = int(id)
+ self.hypervisor_hostname = hypervisor_hostname
+ self.servers = servers
+
+ def __eq__(self, other):
+ """
+ @summary: Overrides the default equals
+ @param other: HypervisorMin object to compare with
+ @type other: HypervisorMin
+ @return: True if HypervisorMin objects are equal, False otherwise
+ @rtype: bool
+ """
+ return EqualityTools.are_objects_equal(self, other)
+
+ def __ne__(self, other):
+ """
+ @summary: Overrides the default not-equals
+ @param other: HypervisorMin object to compare with
+ @type other: HypervisorMin
+ @return: True if HypervisorMin objects are not equal, False otherwise
+ @rtype: bool
+ """
+ return not self.__eq__(other)
+
+
+class HypervisorsMin(AutoMarshallingListModel):
+
+ @classmethod
+ def _json_to_obj(cls, serialized_str):
+ """
+ @summary: Returns a list of a HypervisorMin
+ based on the json serialized_str
+ passed in.
+ @param serialized_str: JSON serialized string
+ @type serialized_str: String
+ @return: List of HypervisorMin
+ @rtype: List
+ """
+ json_dict = json.loads(serialized_str)
+ hypervisors = HypervisorsMin()
+ for hypervisor_dict in json_dict['hypervisors']:
+ id = hypervisor_dict['id']
+ hypervisor_hostname = hypervisor_dict['hypervisor_hostname']
+ if 'servers' in hypervisor_dict.keys():
+ servers = []
+ for server_dict in hypervisor_dict['servers']:
+ servers.append(Server._dict_to_obj(server_dict))
+ hypervisors.append(HypervisorMin(id, hypervisor_hostname,
+ servers))
+ else:
+ servers = None
+ hypervisor_dict.update({"servers": servers})
+ hypervisors.append(HypervisorMin(id, hypervisor_hostname,
+ servers))
+ return hypervisors
+
+ @classmethod
+ def _xml_to_obj(cls, serialized_str):
+ """
+ @summary: Returns a list of a HypervisorMin
+ based on the xml serialized_str
+ passed in.
+ @param serialized_str: XML serialized string
+ @type serialized_str: String
+ @return: List of HypervisorMin
+ @rtype: List
+ """
+ element = ET.fromstring(serialized_str)
+ hypervisors = HypervisorsMin()
+ for hypervisor in element.findall('hypervisor'):
+ hypervisor_dict = hypervisor.attrib
+ id = hypervisor_dict['id']
+ hypervisor_hostname = hypervisor_dict['hypervisor_hostname']
+ if "servers" in [elem.tag for elem in hypervisor.iter()]:
+ servers = []
+ for server in hypervisor.iter('server'):
+ servers.append(Server._dict_to_obj(server.attrib))
+ hypervisors.append(HypervisorMin(id, hypervisor_hostname,
+ servers))
+ else:
+ servers = None
+ hypervisor.attrib.update({"servers": servers})
+ hypervisors.append(HypervisorMin(id, hypervisor_hostname,
+ servers))
+ return hypervisors
+
diff --git a/cloudcafe/compute/hypervisors_api/model/hypervisors.py b/cloudcafe/compute/hypervisors_api/model/hypervisors.py
deleted file mode 100644
index 4a537d25..00000000
--- a/cloudcafe/compute/hypervisors_api/model/hypervisors.py
+++ /dev/null
@@ -1,109 +0,0 @@
-"""
-Copyright 2013 Rackspace
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-"""
-
-import json
-import xml.etree.ElementTree as ET
-
-from cafe.engine.models.base import AutoMarshallingModel
-from cloudcafe.compute.common.equality_tools import EqualityTools
-from cloudcafe.compute.servers_api.models.servers import Server
-
-
-class Hypervisor(AutoMarshallingModel):
-
- def __init__(self, id=None, hypervisor_hostname=None,
- servers=None):
- super(Hypervisor, self).__init__()
- self.id = id
- self.hypervisor_hostname = hypervisor_hostname
- self.servers = servers
-
- def __eq__(self, other):
- """
- @summary: Overrides the default equals
- @param other: Hypervisor object to compare with
- @type other: Hypervisor
- @return: True if Host objects are equal, False otherwise
- @rtype: bool
- """
- return EqualityTools.are_objects_equal(self, other)
-
- def __ne__(self, other):
- """
- @summary: Overrides the default not-equals
- @param other: Hypervisor object to compare with
- @type other: Hypervisor
- @return: True if Hypervisor objects are not equal, False otherwise
- @rtype: bool
- """
- return not self.__eq__(other)
-
- @classmethod
- def _json_to_obj(cls, serialized_str):
- """
- @summary: Returns an instance of a Hypervisor
- based on the json serialized_str
- passed in.
- @param serialized_str: JSON serialized string
- @type serialized_str: String
- @return: List of Hypervisors
- @rtype: List
- """
- json_dict = json.loads(serialized_str)
- hypervisors = []
- for hypervisor_dict in json_dict['hypervisors']:
- id = hypervisor_dict['id']
- hypervisor_hostname = hypervisor_dict['hypervisor_hostname']
- if 'servers' in hypervisor_dict.keys():
- servers = []
- for server_dict in hypervisor_dict['servers']:
- servers.append(Server._dict_to_obj(server_dict))
- return Hypervisor(id, hypervisor_hostname, servers)
- else:
- servers = None
- hypervisor_dict.update({"servers": servers})
- hypervisors.append(Hypervisor(id, hypervisor_hostname,
- servers))
- return hypervisors
-
- @classmethod
- def _xml_to_obj(cls, serialized_str):
- """
- @summary: Returns an instance of a Hypervisor
- based on the xml serialized_str
- passed in.
- @param serialized_str: XML serialized string
- @type serialized_str: String
- @return: List of Hypervisors
- @rtype: List
- """
- element = ET.fromstring(serialized_str)
- hypervisors = []
- for hypervisor in element.findall('hypervisor'):
- hypervisor_dict = hypervisor.attrib
- id = hypervisor_dict['id']
- hypervisor_hostname = hypervisor_dict['hypervisor_hostname']
- if "servers" in [elem.tag for elem in hypervisor.iter()]:
- servers = []
- for server in hypervisor.iter('server'):
- servers.append(Server._dict_to_obj(server.attrib))
- return Hypervisor(id, hypervisor_hostname, servers)
- else:
- servers = None
- hypervisor.attrib.update({"servers": servers})
- hypervisors.append(Hypervisor(id, hypervisor_hostname,
- servers))
- return hypervisors
diff --git a/cloudcafe/compute/servers_api/models/servers.py b/cloudcafe/compute/servers_api/models/servers.py
index e81082e9..24ad7033 100644
--- a/cloudcafe/compute/servers_api/models/servers.py
+++ b/cloudcafe/compute/servers_api/models/servers.py
@@ -52,6 +52,7 @@ class Server(AutoMarshallingModel):
self.task_state = task_state or ComputeTaskStates.NONE
self.vm_state = vm_state
self.name = name
+ self.hypervisor_name = hypervisor_name
self.id = id
self.tenant_id = tenant_id
self.status = status
@@ -76,16 +77,24 @@ class Server(AutoMarshallingModel):
self.key_name = key_name
self.host = host
self.instance_name = instance_name
- self.hypervisor_name = hypervisor_name
@classmethod
def _json_to_obj(cls, serialized_str):
+ """
+ Returns an instance of a Server based on the json serialized_str
+ passed in
+ """
+ ret = None
json_dict = json.loads(serialized_str)
ret = cls._dict_to_obj(json_dict['server'])
return ret
@classmethod
def _xml_to_obj(cls, serialized_str):
+ """
+ Returns an instance of a Server based on the xml serialized_str
+ passed in
+ """
element = ET.fromstring(serialized_str)
cls._remove_xml_etree_namespace(
element, Constants.XML_API_NAMESPACE)
@@ -100,6 +109,7 @@ class Server(AutoMarshallingModel):
@classmethod
def _xml_ele_to_obj(cls, element):
+ """Helper method to turn ElementTree instance to Server instance."""
server = element.attrib
addresses = None
@@ -128,7 +138,7 @@ class Server(AutoMarshallingModel):
power_state=server.get('power_state'), progress=progress,
task_state=server.get('task_state').lower(),
vm_state=server.get('vm_state'), name=server.get('name'),
- tenant_id=server.get('tenantId'), status=server.get('status'),
+ tenant_id=server.get('tenant_id'), status=server.get('status'),
updated=server.get('updated'), created=server.get('created'),
host_id=server.get('hostId'), user_id=server.get('userId'),
accessIPv4=server.get('accessIPv4'),
@@ -144,6 +154,7 @@ class Server(AutoMarshallingModel):
@classmethod
def _dict_to_obj(cls, server_dict):
+ """Helper method to turn dictionary into Server instance."""
addresses = None
flavor = None
@@ -263,10 +274,37 @@ class Servers(AutoMarshallingListModel):
return servers
-class ServerMins(Servers):
+class ServerMins(AutoMarshallingListModel):
server_type = ServerMin
+ @classmethod
+ def _json_to_obj(cls, serialized_str):
+ json_dict = json.loads(serialized_str)
+ return cls._list_to_obj(json_dict.get('servers'))
+
+ @classmethod
+ def _list_to_obj(cls, server_dict_list):
+ servers = ServerMin()
+ for server_dict in server_dict_list:
+ server = cls.server_type._dict_to_obj(server_dict)
+ servers.append(server)
+ return servers
+
+ @classmethod
+ def _xml_to_obj(cls, serialized_str):
+ element = ET.fromstring(serialized_str)
+ if element.tag != 'servers':
+ return None
+ return cls._xml_list_to_obj(element.findall('server'))
+
+ @classmethod
+ def _xml_list_to_obj(cls, xml_list):
+ servers = ServerMin()
+ for ele in xml_list:
+ servers.append(cls.server_type._xml_ele_to_obj(ele))
+ return servers
+
class Addresses(AutoMarshallingModel):
diff --git a/metatests/cloudcafe/compute/hypervisors/client/responses.py b/metatests/cloudcafe/compute/hypervisors/client/responses.py
index d52980e8..062a861c 100644
--- a/metatests/cloudcafe/compute/hypervisors/client/responses.py
+++ b/metatests/cloudcafe/compute/hypervisors/client/responses.py
@@ -34,3 +34,34 @@ class HypervisorsClientMockResponse(object):
'"name": "instance-00000003"},'
'{"uuid": "9327b134-b1f5-43ec-a8f1-2b6eb153c739",'
'"name": "instance-00000005"}}]}]}')
+
+ @classmethod
+ def list_hypervisors_in_detail(cls):
+ return """
+ {
+ "hypervisors":[
+ {
+ "service":
+ {
+ "host":"parentcell",
+ "id":7
+ },
+ "vcpus_used":2,
+ "hypervisor_type":"xen",
+ "local_gb_used":21,
+ "hypervisor_hostname":"hypervisor_test",
+ "memory_mb_used":4608,
+ "memory_mb":12285,
+ "current_workload":0,
+ "vcpus":0,
+ "cpu_info": 2,
+ "running_vms":2,
+ "free_disk_gb":888,
+ "hypervisor_version":6000,
+ "disk_available_least":"None",
+ "local_gb":909,
+ "free_ram_mb":7677,
+ "id":1
+ }
+ ]
+ }"""
diff --git a/metatests/cloudcafe/compute/hypervisors/client/test_hypervisor_client.py b/metatests/cloudcafe/compute/hypervisors/client/test_hypervisor_client.py
index b16f0051..6824c7f1 100644
--- a/metatests/cloudcafe/compute/hypervisors/client/test_hypervisor_client.py
+++ b/metatests/cloudcafe/compute/hypervisors/client/test_hypervisor_client.py
@@ -34,11 +34,13 @@ class HypervisorsClientTest(ClientTestFixture):
auth_token=cls.AUTH_TOKEN,
serialize_format=cls.FORMAT,
deserialize_format=cls.FORMAT)
- cls.hypervisors_uri = "{0}/os-hypervisors".\
- format(cls.COMPUTE_API_ENDPOINT)
- cls.hypervisor_servers_uri = "{0}/{1}/servers".\
- format(cls.hypervisors_uri,
- HYPERVISOR_HOSTNAME)
+ cls.hypervisors_uri = ("{0}/os-hypervisors".
+ format(cls.COMPUTE_API_ENDPOINT))
+ cls.hypervisors_in_detail_uri = ("{0}/os-hypervisors/detail".
+ format(cls.COMPUTE_API_ENDPOINT))
+ cls.hypervisor_servers_uri = ("{0}/{1}/servers".
+ format(cls.hypervisors_uri,
+ HYPERVISOR_HOSTNAME))
cls.mock_response = HypervisorsClientMockResponse()
def test_list_hypervisors(self):
@@ -51,6 +53,17 @@ class HypervisorsClientTest(ClientTestFixture):
self.assertEqual(HypervisorsClientMockResponse.list_hypervisors(),
response.content)
+ def test_list_hypervisors_in_detail(self):
+ HTTPretty.register_uri(HTTPretty.GET, self.hypervisors_in_detail_uri,
+ body=self.mock_response.
+ list_hypervisors_in_detail())
+ response = self.hypervisor_client.list_hypervisors_with_detail()
+ self.assertEqual(200, response.status_code)
+ self._assert_default_headers_in_request(HTTPretty.last_request)
+ self.assertEqual(
+ response.content,
+ HypervisorsClientMockResponse.list_hypervisors_in_detail())
+
def test_list_hypervisor_servers(self):
HTTPretty.register_uri(HTTPretty.GET, self.hypervisor_servers_uri,
body=self.mock_response.
diff --git a/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors.py b/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors.py
index 261a7734..7507ca68 100644
--- a/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors.py
+++ b/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors.py
@@ -15,91 +15,84 @@ limitations under the License.
"""
import unittest2 as unittest
-from cloudcafe.compute.hypervisors_api.model.hypervisors import Hypervisor
+from cloudcafe.compute.hypervisors_api.model.hypervisor import Hypervisors
-class HypervisorDomainTest(object):
+class HypervisorsDomainTest(object):
def test_hypervisor_attr(self):
- self.assertEqual(self.hypervisor[0].id, "1")
- self.assertEqual(self.hypervisor[0].hypervisor_hostname,
+ self.assertEqual(self.hypervisors[0].id_, '1')
+ self.assertEqual(self.hypervisors[0].hypervisor_hostname,
"hypervisor_test")
+ self.assertEqual(self.hypervisors[0].vcpus_used, '2')
+ self.assertEqual(self.hypervisors[0].hypervisor_type, 'xen')
+ self.assertEqual(self.hypervisors[0].local_gb_used, '21')
+ self.assertEqual(self.hypervisors[0].memory_mb_used, '4608')
+ self.assertEqual(self.hypervisors[0].memory_mb, '12285')
+ self.assertEqual(self.hypervisors[0].current_workload, '0')
+ self.assertEqual(self.hypervisors[0].vcpus, '0')
+ self.assertEqual(self.hypervisors[0].cpu_info, '2')
+ self.assertEqual(self.hypervisors[0].running_vms, '2')
+ self.assertEqual(self.hypervisors[0].free_disk_gb, '888')
+ self.assertEqual(self.hypervisors[0].hypervisor_version, '6000000')
+ self.assertEqual(self.hypervisors[0].disk_available_least, 'None')
+ self.assertEqual(self.hypervisors[0].local_gb, '909')
+ self.assertEqual(self.hypervisors[0].free_ram_mb, '7677')
+ self.assertEqual(self.hypervisors[0].service.host, "parentcell")
+ self.assertEqual(self.hypervisors[0].service.id_, '7')
-class HypervisorDomainJSONTest(unittest.TestCase, HypervisorDomainTest):
+class HypervisorsDomainJSONTest(unittest.TestCase, HypervisorsDomainTest):
@classmethod
def setUp(cls):
- cls.hypervisor_json = ('{"hypervisors": [{'
- '"id": "1", '
- '"hypervisor_hostname": "hypervisor_test"}]}')
- cls.hypervisor = Hypervisor.deserialize(cls.hypervisor_json, "json")
+ cls.hypervisor_json = """
+ {
+ "hypervisors":[
+ {
+ "service":
+ {
+ "host":"parentcell",
+ "id":"7"
+ },
+ "vcpus_used":"2",
+ "hypervisor_type":"xen",
+ "local_gb_used":"21",
+ "hypervisor_hostname":"hypervisor_test",
+ "memory_mb_used":"4608",
+ "memory_mb":"12285",
+ "current_workload":"0",
+ "vcpus":"0",
+ "cpu_info": "2",
+ "running_vms":"2",
+ "free_disk_gb":"888",
+ "hypervisor_version":"6000000",
+ "disk_available_least":"None",
+ "local_gb":"909",
+ "free_ram_mb":"7677",
+ "id":"1"
+ }
+ ]
+ }"""
+
+ cls.hypervisors = Hypervisors.deserialize(cls.hypervisor_json, "json")
-class HypervisorDomainXMLTest(unittest.TestCase, HypervisorDomainTest):
+class HypervisorsDomainXMLTest(unittest.TestCase, HypervisorsDomainTest):
@classmethod
def setUp(cls):
- cls.hypervisor_xml = (''
- ''
- '')
- cls.hypervisor = Hypervisor.deserialize(cls.hypervisor_xml, "xml")
-
-
-class HypervisorServerCollectionDomainTest(object):
-
- def test_hypervisor_servers_length(self):
- self.assertEqual(len(self.hypervisor.servers), 2)
-
- def test_hypervisor_servers_attr(self):
- self.assertTrue(
- "server_one" in
- [server.name for server in self.hypervisor.servers])
- self.assertTrue(
- "server_two" in
- [server.name for server in self.hypervisor.servers])
- self.assertTrue(
- "b1ea4f1b-201c-47c5-95b9-c6fe2df39af0" in
- [server.id for server in self.hypervisor.servers])
- self.assertTrue(
- "9327b134-b1f5-43ec-a8f1-2b6eb153c739" in
- [server.id for server in self.hypervisor.servers])
-
-
-class ServersDomainCollectionJSONTest(unittest.TestCase,
- HypervisorServerCollectionDomainTest):
-
- @classmethod
- def setUp(cls):
- cls.hypervisor_json = ('{"hypervisors": [{'
- '"id": 1, '
- '"hypervisor_hostname": "hypervisor_test", '
- '"servers": [{'
- '"uuid": '
- '"b1ea4f1b-201c-47c5-95b9-c6fe2df39af0", '
- '"name": "server_one"}, '
- '{"uuid": '
- '"9327b134-b1f5-43ec-a8f1-2b6eb153c739", '
- '"name": "server_two"}]}]}')
- cls.hypervisor = Hypervisor.deserialize(cls.hypervisor_json, "json")
-
-
-class ServersDomainCollectionXMLTest(unittest.TestCase,
- HypervisorServerCollectionDomainTest):
-
- @classmethod
- def setUp(cls):
- cls.hypervisor_xml = (''
- ''
- ''
- ''
- ''
- ''
- '')
- cls.hypervisor = Hypervisor.deserialize(cls.hypervisor_xml,
- "xml")
+ cls.hypervisor_xml = """
+
+
+
+
+ """
+ cls.hypervisors = Hypervisors.deserialize(cls.hypervisor_xml, "xml")
diff --git a/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors_min.py b/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors_min.py
new file mode 100644
index 00000000..0c97fd1b
--- /dev/null
+++ b/metatests/cloudcafe/compute/hypervisors/models/test_hypervisors_min.py
@@ -0,0 +1,102 @@
+"""
+Copyright 2013 Rackspace
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+import unittest2 as unittest
+from cloudcafe.compute.hypervisors_api.model.hypervisor import HypervisorsMin
+
+
+class HypervisorsMinDomainTest(object):
+
+ def test_hypervisor_attr(self):
+ self.assertEqual(self.hypervisor[0].id, 1)
+ self.assertEqual(self.hypervisor[0].hypervisor_hostname,
+ "hypervisor_test")
+
+
+class HypervisorsMinDomainJSONTest(unittest.TestCase, HypervisorsMinDomainTest):
+
+ @classmethod
+ def setUp(cls):
+ cls.hypervisor_json = ('{"hypervisors": [{'
+ '"id": 1, '
+ '"hypervisor_hostname": "hypervisor_test"}]}')
+ cls.hypervisor = HypervisorsMin.deserialize(cls.hypervisor_json, "json")
+
+
+class HypervisorsMinDomainXMLTest(unittest.TestCase, HypervisorsMinDomainTest):
+
+ @classmethod
+ def setUp(cls):
+ cls.hypervisor_xml = (''
+ ''
+ '')
+ cls.hypervisor = HypervisorsMin.deserialize(cls.hypervisor_xml, "xml")
+
+
+class HypervisorServerCollectionDomainTest(object):
+
+ def test_hypervisor_servers_length(self):
+ self.assertEqual(len(self.hypervisors[0].servers), 2)
+
+ def test_hypervisor_servers_attr(self):
+ self.assertIn("server_one", [server.name for server in
+ self.hypervisors[0].servers])
+ self.assertIn("server_two", [server.name for server in
+ self.hypervisors[0].servers])
+ self.assertIn("b1ea4f1b-201c-47c5-95b9-c6fe2df39af0",
+ [server.id for server in self.hypervisors[0].servers])
+ self.assertIn("9327b134-b1f5-43ec-a8f1-2b6eb153c739",
+ [server.id for server in self.hypervisors[0].servers])
+
+
+class ServersDomainCollectionJSONTest(unittest.TestCase,
+ HypervisorServerCollectionDomainTest):
+
+ @classmethod
+ def setUp(cls):
+ cls.hypervisor_json = ('{"hypervisors": [{'
+ '"id": 1, '
+ '"hypervisor_hostname": "hypervisor_test", '
+ '"servers": [{'
+ '"uuid": '
+ '"b1ea4f1b-201c-47c5-95b9-c6fe2df39af0", '
+ '"name": "server_one"}, '
+ '{"uuid": '
+ '"9327b134-b1f5-43ec-a8f1-2b6eb153c739", '
+ '"name": "server_two"}]}]}')
+ cls.hypervisors = HypervisorsMin.deserialize(cls.hypervisor_json,
+ "json")
+
+
+class ServersDomainCollectionXMLTest(unittest.TestCase,
+ HypervisorServerCollectionDomainTest):
+
+ @classmethod
+ def setUp(cls):
+ cls.hypervisor_xml = (''
+ ''
+ ''
+ ''
+ ''
+ ''
+ '')
+ cls.hypervisors = HypervisorsMin.deserialize(cls.hypervisor_xml,
+ "xml")
diff --git a/metatests/cloudcafe/compute/servers/models/test_servers.py b/metatests/cloudcafe/compute/servers/models/test_servers.py
index 3f19f08e..14188d09 100644
--- a/metatests/cloudcafe/compute/servers/models/test_servers.py
+++ b/metatests/cloudcafe/compute/servers/models/test_servers.py
@@ -127,6 +127,7 @@ class ServerXMLDomainTest(unittest.TestCase, ServerDomainTest):
xmlns="{docs_url}/compute/api/v1.1"
status="ACTIVE" updated="2012-12-03T19:04:06Z"
hostId="123"
+ tenant_id="660"
name="testserver47476" created="2012-12-03T18:59:16Z"
userId="199835" tenantId="660" accessIPv4="192.168.1.10"
accessIPv6="2001:11:7811:69:cf10:c02d:ff10:fa"