diff options
Diffstat (limited to 'nova/tests/api/openstack/compute/contrib/test_availability_zone.py')
-rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_availability_zone.py | 512 |
1 files changed, 0 insertions, 512 deletions
diff --git a/nova/tests/api/openstack/compute/contrib/test_availability_zone.py b/nova/tests/api/openstack/compute/contrib/test_availability_zone.py deleted file mode 100644 index 6a09b03fc5..0000000000 --- a/nova/tests/api/openstack/compute/contrib/test_availability_zone.py +++ /dev/null @@ -1,512 +0,0 @@ -# Copyright 2012 IBM Corp. -# -# 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 datetime - -from lxml import etree -from oslo.config import cfg -from oslo.serialization import jsonutils -import webob - -from nova.api.openstack.compute.contrib import availability_zone as az_v2 -from nova.api.openstack.compute import plugins -from nova.api.openstack.compute.plugins.v3 import availability_zone as az_v21 -from nova.api.openstack.compute.plugins.v3 import servers as servers_v21 -from nova.api.openstack.compute import servers as servers_v2 -from nova.api.openstack import extensions -from nova import availability_zones -from nova.compute import api as compute_api -from nova.compute import flavors -from nova import context -from nova import db -from nova import exception -from nova import servicegroup -from nova import test -from nova.tests.api.openstack import fakes -from nova.tests import fake_instance -from nova.tests.image import fake -from nova.tests import matchers -from nova.tests.objects import test_service - -FAKE_UUID = fakes.FAKE_UUID - - -def fake_service_get_all(context, disabled=None): - def __fake_service(binary, availability_zone, - created_at, updated_at, host, disabled): - return dict(test_service.fake_service, - binary=binary, - availability_zone=availability_zone, - available_zones=availability_zone, - created_at=created_at, - updated_at=updated_at, - host=host, - disabled=disabled) - - if disabled: - return [__fake_service("nova-compute", "zone-2", - datetime.datetime(2012, 11, 14, 9, 53, 25, 0), - datetime.datetime(2012, 12, 26, 14, 45, 25, 0), - "fake_host-1", True), - __fake_service("nova-scheduler", "internal", - datetime.datetime(2012, 11, 14, 9, 57, 3, 0), - datetime.datetime(2012, 12, 26, 14, 45, 25, 0), - "fake_host-1", True), - __fake_service("nova-network", "internal", - datetime.datetime(2012, 11, 16, 7, 25, 46, 0), - datetime.datetime(2012, 12, 26, 14, 45, 24, 0), - "fake_host-2", True)] - else: - return [__fake_service("nova-compute", "zone-1", - datetime.datetime(2012, 11, 14, 9, 53, 25, 0), - datetime.datetime(2012, 12, 26, 14, 45, 25, 0), - "fake_host-1", False), - __fake_service("nova-sched", "internal", - datetime.datetime(2012, 11, 14, 9, 57, 3, 0), - datetime.datetime(2012, 12, 26, 14, 45, 25, 0), - "fake_host-1", False), - __fake_service("nova-network", "internal", - datetime.datetime(2012, 11, 16, 7, 25, 46, 0), - datetime.datetime(2012, 12, 26, 14, 45, 24, 0), - "fake_host-2", False)] - - -def fake_service_is_up(self, service): - return service['binary'] != u"nova-network" - - -def fake_set_availability_zones(context, services): - return services - - -def fake_get_availability_zones(context): - return ['nova'], [] - - -CONF = cfg.CONF - - -class AvailabilityZoneApiTestV21(test.NoDBTestCase): - availability_zone = az_v21 - url = '/v2/fake/os-availability-zone' - - def setUp(self): - super(AvailabilityZoneApiTestV21, self).setUp() - availability_zones.reset_cache() - self.stubs.Set(db, 'service_get_all', fake_service_get_all) - self.stubs.Set(availability_zones, 'set_availability_zones', - fake_set_availability_zones) - self.stubs.Set(servicegroup.API, 'service_is_up', fake_service_is_up) - - def _get_wsgi_instance(self): - return fakes.wsgi_app_v21(init_only=('os-availability-zone', - 'servers')) - - def test_filtered_availability_zones(self): - az = self.availability_zone.AvailabilityZoneController() - zones = ['zone1', 'internal'] - expected = [{'zoneName': 'zone1', - 'zoneState': {'available': True}, - "hosts": None}] - result = az._get_filtered_availability_zones(zones, True) - self.assertEqual(result, expected) - - expected = [{'zoneName': 'zone1', - 'zoneState': {'available': False}, - "hosts": None}] - result = az._get_filtered_availability_zones(zones, False) - self.assertEqual(result, expected) - - def test_availability_zone_index(self): - req = webob.Request.blank(self.url) - resp = req.get_response(self._get_wsgi_instance()) - self.assertEqual(resp.status_int, 200) - resp_dict = jsonutils.loads(resp.body) - - self.assertIn('availabilityZoneInfo', resp_dict) - zones = resp_dict['availabilityZoneInfo'] - self.assertEqual(len(zones), 2) - self.assertEqual(zones[0]['zoneName'], u'zone-1') - self.assertTrue(zones[0]['zoneState']['available']) - self.assertIsNone(zones[0]['hosts']) - self.assertEqual(zones[1]['zoneName'], u'zone-2') - self.assertFalse(zones[1]['zoneState']['available']) - self.assertIsNone(zones[1]['hosts']) - - def test_availability_zone_detail(self): - def _formatZone(zone_dict): - result = [] - - # Zone tree view item - result.append({'zoneName': zone_dict['zoneName'], - 'zoneState': u'available' - if zone_dict['zoneState']['available'] else - u'not available'}) - - if zone_dict['hosts'] is not None: - for (host, services) in zone_dict['hosts'].items(): - # Host tree view item - result.append({'zoneName': u'|- %s' % host, - 'zoneState': u''}) - for (svc, state) in services.items(): - # Service tree view item - result.append({'zoneName': u'| |- %s' % svc, - 'zoneState': u'%s %s %s' % ( - 'enabled' if state['active'] else - 'disabled', - ':-)' if state['available'] else - 'XXX', - jsonutils.to_primitive( - state['updated_at']))}) - return result - - def _assertZone(zone, name, status): - self.assertEqual(zone['zoneName'], name) - self.assertEqual(zone['zoneState'], status) - - availabilityZone = self.availability_zone.AvailabilityZoneController() - - req_url = self.url + '/detail' - req = webob.Request.blank(req_url) - req.method = 'GET' - req.environ['nova.context'] = context.get_admin_context() - resp_dict = availabilityZone.detail(req) - - self.assertIn('availabilityZoneInfo', resp_dict) - zones = resp_dict['availabilityZoneInfo'] - self.assertEqual(len(zones), 3) - - ''' availabilityZoneInfo field content in response body: - [{'zoneName': 'zone-1', - 'zoneState': {'available': True}, - 'hosts': {'fake_host-1': { - 'nova-compute': {'active': True, 'available': True, - 'updated_at': datetime(2012, 12, 26, 14, 45, 25)}}}}, - {'zoneName': 'internal', - 'zoneState': {'available': True}, - 'hosts': {'fake_host-1': { - 'nova-sched': {'active': True, 'available': True, - 'updated_at': datetime(2012, 12, 26, 14, 45, 25)}}, - 'fake_host-2': { - 'nova-network': {'active': True, 'available': False, - 'updated_at': datetime(2012, 12, 26, 14, 45, 24)}}}}, - {'zoneName': 'zone-2', - 'zoneState': {'available': False}, - 'hosts': None}] - ''' - - l0 = [u'zone-1', u'available'] - l1 = [u'|- fake_host-1', u''] - l2 = [u'| |- nova-compute', u'enabled :-) 2012-12-26T14:45:25.000000'] - l3 = [u'internal', u'available'] - l4 = [u'|- fake_host-1', u''] - l5 = [u'| |- nova-sched', u'enabled :-) 2012-12-26T14:45:25.000000'] - l6 = [u'|- fake_host-2', u''] - l7 = [u'| |- nova-network', u'enabled XXX 2012-12-26T14:45:24.000000'] - l8 = [u'zone-2', u'not available'] - - z0 = _formatZone(zones[0]) - z1 = _formatZone(zones[1]) - z2 = _formatZone(zones[2]) - - self.assertEqual(len(z0), 3) - self.assertEqual(len(z1), 5) - self.assertEqual(len(z2), 1) - - _assertZone(z0[0], l0[0], l0[1]) - _assertZone(z0[1], l1[0], l1[1]) - _assertZone(z0[2], l2[0], l2[1]) - _assertZone(z1[0], l3[0], l3[1]) - _assertZone(z1[1], l4[0], l4[1]) - _assertZone(z1[2], l5[0], l5[1]) - _assertZone(z1[3], l6[0], l6[1]) - _assertZone(z1[4], l7[0], l7[1]) - _assertZone(z2[0], l8[0], l8[1]) - - def test_availability_zone_detail_no_services(self): - expected_response = {'availabilityZoneInfo': - [{'zoneState': {'available': True}, - 'hosts': {}, - 'zoneName': 'nova'}]} - self.stubs.Set(availability_zones, 'get_availability_zones', - fake_get_availability_zones) - availabilityZone = self.availability_zone.AvailabilityZoneController() - - req_url = self.url + '/detail' - req = webob.Request.blank(req_url) - req.method = 'GET' - req.environ['nova.context'] = context.get_admin_context() - resp_dict = availabilityZone.detail(req) - - self.assertThat(resp_dict, - matchers.DictMatches(expected_response)) - - -class AvailabilityZoneApiTestV2(AvailabilityZoneApiTestV21): - availability_zone = az_v2 - - def _get_wsgi_instance(self): - return fakes.wsgi_app() - - -class ServersControllerCreateTestV21(test.TestCase): - base_url = '/v2/fake/' - - def setUp(self): - """Shared implementation for tests below that create instance.""" - super(ServersControllerCreateTestV21, self).setUp() - - self.instance_cache_num = 0 - - self._set_up_controller() - - def instance_create(context, inst): - inst_type = flavors.get_flavor_by_flavor_id(3) - image_uuid = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6' - def_image_ref = 'http://localhost/images/%s' % image_uuid - self.instance_cache_num += 1 - instance = fake_instance.fake_db_instance(**{ - 'id': self.instance_cache_num, - 'display_name': inst['display_name'] or 'test', - 'uuid': FAKE_UUID, - 'instance_type': inst_type, - 'access_ip_v4': '1.2.3.4', - 'access_ip_v6': 'fead::1234', - 'image_ref': inst.get('image_ref', def_image_ref), - 'user_id': 'fake', - 'project_id': 'fake', - 'availability_zone': 'nova', - 'reservation_id': inst['reservation_id'], - "created_at": datetime.datetime(2010, 10, 10, 12, 0, 0), - "updated_at": datetime.datetime(2010, 11, 11, 11, 0, 0), - "progress": 0, - "fixed_ips": [], - "task_state": "", - "vm_state": "", - "root_device_name": inst.get('root_device_name', 'vda'), - }) - - return instance - - fake.stub_out_image_service(self.stubs) - self.stubs.Set(db, 'instance_create', instance_create) - - def _set_up_controller(self): - ext_info = plugins.LoadedExtensionInfo() - self.controller = servers_v21.ServersController( - extension_info=ext_info) - CONF.set_override('extensions_blacklist', - 'os-availability-zone', - 'osapi_v3') - self.no_availability_zone_controller = servers_v21.ServersController( - extension_info=ext_info) - - def _verify_no_availability_zone(self, **kwargs): - self.assertNotIn('availability_zone', kwargs) - - def _test_create_extra(self, params, controller): - image_uuid = 'c905cedb-7281-47e4-8a62-f26bc5fc4c77' - server = dict(name='server_test', imageRef=image_uuid, flavorRef=2) - server.update(params) - body = dict(server=server) - req = fakes.HTTPRequest.blank(self.base_url + 'servers') - req.method = 'POST' - req.body = jsonutils.dumps(body) - req.headers["content-type"] = "application/json" - server = controller.create(req, body=body).obj['server'] - - def test_create_instance_with_availability_zone_disabled(self): - params = {'availability_zone': 'foo'} - old_create = compute_api.API.create - - def create(*args, **kwargs): - self._verify_no_availability_zone(**kwargs) - return old_create(*args, **kwargs) - - self.stubs.Set(compute_api.API, 'create', create) - self._test_create_extra(params, self.no_availability_zone_controller) - - def _create_instance_with_availability_zone(self, zone_name): - def create(*args, **kwargs): - self.assertIn('availability_zone', kwargs) - self.assertEqual('nova', kwargs['availability_zone']) - return old_create(*args, **kwargs) - - old_create = compute_api.API.create - self.stubs.Set(compute_api.API, 'create', create) - image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6' - flavor_ref = ('http://localhost' + self.base_url + 'flavors/3') - body = { - 'server': { - 'name': 'server_test', - 'imageRef': image_href, - 'flavorRef': flavor_ref, - 'metadata': { - 'hello': 'world', - 'open': 'stack', - }, - 'availability_zone': zone_name, - }, - } - - req = fakes.HTTPRequest.blank(self.base_url + 'servers') - req.method = 'POST' - req.body = jsonutils.dumps(body) - req.headers["content-type"] = "application/json" - admin_context = context.get_admin_context() - db.service_create(admin_context, {'host': 'host1_zones', - 'binary': "nova-compute", - 'topic': 'compute', - 'report_count': 0}) - agg = db.aggregate_create(admin_context, - {'name': 'agg1'}, {'availability_zone': 'nova'}) - db.aggregate_host_add(admin_context, agg['id'], 'host1_zones') - return req, body - - def test_create_instance_with_availability_zone(self): - zone_name = 'nova' - req, body = self._create_instance_with_availability_zone(zone_name) - res = self.controller.create(req, body=body).obj - server = res['server'] - self.assertEqual(fakes.FAKE_UUID, server['id']) - - def test_create_instance_with_invalid_availability_zone_too_long(self): - zone_name = 'a' * 256 - req, body = self._create_instance_with_availability_zone(zone_name) - self.assertRaises(exception.ValidationError, - self.controller.create, req, body=body) - - def test_create_instance_with_invalid_availability_zone_too_short(self): - zone_name = '' - req, body = self._create_instance_with_availability_zone(zone_name) - self.assertRaises(exception.ValidationError, - self.controller.create, req, body=body) - - def test_create_instance_with_invalid_availability_zone_not_str(self): - zone_name = 111 - req, body = self._create_instance_with_availability_zone(zone_name) - self.assertRaises(exception.ValidationError, - self.controller.create, req, body=body) - - def test_create_instance_without_availability_zone(self): - image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6' - flavor_ref = ('http://localhost' + self.base_url + 'flavors/3') - body = { - 'server': { - 'name': 'server_test', - 'imageRef': image_href, - 'flavorRef': flavor_ref, - 'metadata': { - 'hello': 'world', - 'open': 'stack', - }, - }, - } - - req = fakes.HTTPRequest.blank(self.base_url + 'servers') - req.method = 'POST' - req.body = jsonutils.dumps(body) - req.headers["content-type"] = "application/json" - res = self.controller.create(req, body=body).obj - server = res['server'] - self.assertEqual(fakes.FAKE_UUID, server['id']) - - -class ServersControllerCreateTestV2(ServersControllerCreateTestV21): - - def _set_up_controller(self): - ext_mgr = extensions.ExtensionManager() - ext_mgr.extensions = {'os-availability-zone': 'fake'} - self.controller = servers_v2.Controller(ext_mgr) - ext_mgr_no_az = extensions.ExtensionManager() - ext_mgr_no_az.extensions = {} - self.no_availability_zone_controller = servers_v2.Controller( - ext_mgr_no_az) - - def _verify_no_availability_zone(self, **kwargs): - self.assertIsNone(kwargs['availability_zone']) - - def test_create_instance_with_invalid_availability_zone_too_long(self): - # NOTE: v2.0 API does not check this bad request case. - # So we skip this test for v2.0 API. - pass - - def test_create_instance_with_invalid_availability_zone_too_short(self): - # NOTE: v2.0 API does not check this bad request case. - # So we skip this test for v2.0 API. - pass - - def test_create_instance_with_invalid_availability_zone_not_str(self): - # NOTE: v2.0 API does not check this bad request case. - # So we skip this test for v2.0 API. - pass - - -class AvailabilityZoneSerializerTest(test.NoDBTestCase): - def test_availability_zone_index_detail_serializer(self): - def _verify_zone(zone_dict, tree): - self.assertEqual(tree.tag, 'availabilityZone') - self.assertEqual(zone_dict['zoneName'], tree.get('name')) - self.assertEqual(str(zone_dict['zoneState']['available']), - tree[0].get('available')) - - for _idx, host_child in enumerate(tree[1]): - self.assertIn(host_child.get('name'), zone_dict['hosts']) - svcs = zone_dict['hosts'][host_child.get('name')] - for _idx, svc_child in enumerate(host_child[0]): - self.assertIn(svc_child.get('name'), svcs) - svc = svcs[svc_child.get('name')] - self.assertEqual(len(svc_child), 1) - - self.assertEqual(str(svc['available']), - svc_child[0].get('available')) - self.assertEqual(str(svc['active']), - svc_child[0].get('active')) - self.assertEqual(str(svc['updated_at']), - svc_child[0].get('updated_at')) - - serializer = az_v2.AvailabilityZonesTemplate() - raw_availability_zones = \ - [{'zoneName': 'zone-1', - 'zoneState': {'available': True}, - 'hosts': {'fake_host-1': { - 'nova-compute': {'active': True, 'available': True, - 'updated_at': - datetime.datetime( - 2012, 12, 26, 14, 45, 25)}}}}, - {'zoneName': 'internal', - 'zoneState': {'available': True}, - 'hosts': {'fake_host-1': { - 'nova-sched': {'active': True, 'available': True, - 'updated_at': - datetime.datetime( - 2012, 12, 26, 14, 45, 25)}}, - 'fake_host-2': { - 'nova-network': {'active': True, - 'available': False, - 'updated_at': - datetime.datetime( - 2012, 12, 26, 14, 45, 24)}}}}, - {'zoneName': 'zone-2', - 'zoneState': {'available': False}, - 'hosts': None}] - - text = serializer.serialize( - dict(availabilityZoneInfo=raw_availability_zones)) - tree = etree.fromstring(text) - - self.assertEqual('availabilityZones', tree.tag) - self.assertEqual(len(raw_availability_zones), len(tree)) - for idx, child in enumerate(tree): - _verify_zone(raw_availability_zones[idx], child) |