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"