Move list-az from engine manager to api

There's no need to issue a rpc request to manager to list az from DB,
we can just do it from api side, also this saves a rpc call.

Change-Id: Ie10db1f0df3a255d4bdbfb334936a9c03e3e900c
This commit is contained in:
Zhenguo Niu 2017-04-01 16:22:47 +08:00
parent 587a4cbea2
commit 83dfea98c9
7 changed files with 33 additions and 50 deletions

View File

@ -266,7 +266,7 @@ class API(object):
# check availability zone
if availability_zone:
azs = self.engine_rpcapi.list_availability_zones(context)
azs = self.list_availability_zones(context)
if availability_zone not in azs['availability_zones']:
raise exception.AZNotFound
@ -330,8 +330,17 @@ class API(object):
self.engine_rpcapi.rebuild_instance(context, instance)
def list_availability_zones(self, context):
"""Get a list of availability zones."""
return self.engine_rpcapi.list_availability_zones(context)
"""Get availability zone list."""
compute_nodes = objects.ComputeNodeList.get_all_available(context)
azs = set()
for node in compute_nodes:
az = node.availability_zone \
or CONF.engine.default_availability_zone
if az is not None:
azs.add(az)
return {'availability_zones': list(azs)}
def lock(self, context, instance):
"""Lock the given instance."""

View File

@ -534,19 +534,6 @@ class EngineManager(base_manager.BaseEngineManager):
utils.process_event(fsm, instance, event='done')
LOG.info('Instance was successfully rebuilt', instance=instance)
def list_availability_zones(self, context):
"""Get availability zone list."""
compute_nodes = objects.ComputeNodeList.get_all_available(context)
azs = set()
for node in compute_nodes:
az = node.availability_zone \
or CONF.engine.default_availability_zone
if az is not None:
azs.add(az)
return {'availability_zones': list(azs)}
def get_serial_console(self, context, instance):
node_console_info = self.driver.get_serial_console_by_instance(
context, instance)

View File

@ -74,11 +74,6 @@ class EngineAPI(object):
cctxt = self.client.prepare(topic=self.topic, server=CONF.host)
return cctxt.cast(context, 'rebuild_instance', instance=instance)
def list_availability_zones(self, context):
"""Signal to engine service to get availability zone list."""
cctxt = self.client.prepare(topic=self.topic, server=CONF.host)
return cctxt.call(context, 'list_availability_zones')
def get_serial_console(self, context, instance):
cctxt = self.client.prepare(topic=self.topic, server=CONF.host)
return cctxt.call(context, 'get_serial_console',

View File

@ -87,8 +87,6 @@ class TestInstances(v1_test.APITestV1):
self.network_api = mock.Mock()
self.useFixture(mockpatch.Patch('mogan.network.api.API',
return_value=self.network_api))
self.rpc_api.list_availability_zones.return_value = {
'availability_zones': ['test_zone']}
self.image_api.get.return_value = _get_fake_image()
self.network_api.validate_networks.return_value = 100
super(TestInstances, self).setUp()
@ -129,7 +127,6 @@ class TestInstances(v1_test.APITestV1):
"description": "just test instance " + str(i),
'instance_type_uuid': 'ff28b5a2-73e5-431c-b4b7-1b96b74bca7b',
'image_uuid': 'b8f82429-3a13-4ffe-9398-4d1abdc256a8',
'availability_zone': 'test_zone',
'networks': [
{'net_id': 'c1940655-8b8e-4370-b8f9-03ba1daeca31'}],
'extra': {'fake_key': 'fake_value'}
@ -148,7 +145,7 @@ class TestInstances(v1_test.APITestV1):
self.assertEqual(self.INSTANCE_TYPE_UUID, resp['instance_type_uuid'])
self.assertEqual('b8f82429-3a13-4ffe-9398-4d1abdc256a8',
resp['image_uuid'])
self.assertEqual('test_zone', resp['availability_zone'])
self.assertEqual(None, resp['availability_zone'])
self.assertEqual({}, resp['network_info'])
self.assertEqual({'fake_key': 'fake_value'}, resp['extra'])
self.assertIn('links', resp)
@ -170,7 +167,7 @@ class TestInstances(v1_test.APITestV1):
self.assertEqual(self.INSTANCE_TYPE_UUID, resp['instance_type_uuid'])
self.assertEqual('b8f82429-3a13-4ffe-9398-4d1abdc256a8',
resp['image_uuid'])
self.assertEqual('test_zone', resp['availability_zone'])
self.assertEqual(None, resp['availability_zone'])
self.assertEqual({}, resp['network_info'])
self.assertEqual({'fake_key': 'fake_value'}, resp['extra'])
self.assertIn('links', resp)

View File

@ -17,6 +17,7 @@
import mock
from oslo_context import context
from oslo_utils import uuidutils
from mogan.common import exception
from mogan.common import states
@ -25,6 +26,7 @@ from mogan.engine import rpcapi as engine_rpcapi
from mogan import objects
from mogan.tests.unit.db import base
from mogan.tests.unit.db import utils as db_utils
from mogan.tests.unit.objects import utils as obj_utils
class ComputeAPIUnitTest(base.DbTestCase):
@ -90,7 +92,7 @@ class ComputeAPIUnitTest(base.DbTestCase):
@mock.patch.object(engine_rpcapi.EngineAPI, 'create_instance')
@mock.patch('mogan.engine.api.API._get_image')
@mock.patch('mogan.engine.api.API._validate_and_build_base_options')
@mock.patch.object(engine_rpcapi.EngineAPI, 'list_availability_zones')
@mock.patch('mogan.engine.api.API.list_availability_zones')
def test_create(self, mock_list_az, mock_validate, mock_get_image,
mock_create):
instance_type = self._create_instance_type()
@ -140,7 +142,7 @@ class ComputeAPIUnitTest(base.DbTestCase):
after_in_use = res.get('instances').in_use
self.assertEqual(before_in_use + 2, after_in_use)
@mock.patch.object(engine_rpcapi.EngineAPI, 'list_availability_zones')
@mock.patch('mogan.engine.api.API.list_availability_zones')
def test_create_with_invalid_az(self, mock_list_az):
instance_type = mock.MagicMock()
mock_list_az.return_value = {'availability_zones': ['invalid_az']}
@ -161,7 +163,7 @@ class ComputeAPIUnitTest(base.DbTestCase):
@mock.patch('mogan.engine.api.API._get_image')
@mock.patch('mogan.engine.api.API._validate_and_build_base_options')
@mock.patch.object(engine_rpcapi.EngineAPI, 'list_availability_zones')
@mock.patch('mogan.engine.api.API.list_availability_zones')
def test_create_over_quota_limit(self, mock_list_az, mock_validate,
mock_get_image):
instance_type = self._create_instance_type()
@ -307,3 +309,17 @@ class ComputeAPIUnitTest(base.DbTestCase):
fake_instance_obj = self._create_fake_instance_obj(fake_instance)
self.engine_api.rebuild(self.context, fake_instance_obj)
self.assertTrue(mock_rebuild.called)
def test_list_availability_zone(self):
uuid1 = uuidutils.generate_uuid()
uuid2 = uuidutils.generate_uuid()
obj_utils.create_test_compute_node(
self.context, availability_zone='az1')
obj_utils.create_test_compute_node(
self.context, node_uuid=uuid1, availability_zone='az2')
obj_utils.create_test_compute_node(
self.context, node_uuid=uuid2, availability_zone='az1')
azs = self.engine_api.list_availability_zones(self.context)
self.assertItemsEqual(['az1', 'az2'], azs['availability_zones'])

View File

@ -125,22 +125,6 @@ class ManageInstanceTestCase(mgr_utils.ServiceSetUpMixin,
ironic_states.POWER_ON)
get_power_mock.assert_called_once_with(self.context, instance.uuid)
def test_list_availability_zone(self):
uuid1 = uuidutils.generate_uuid()
uuid2 = uuidutils.generate_uuid()
obj_utils.create_test_compute_node(
self.context, availability_zone='az1')
obj_utils.create_test_compute_node(
self.context, node_uuid=uuid1, availability_zone='az2')
obj_utils.create_test_compute_node(
self.context, node_uuid=uuid2, availability_zone='az1')
self._start_service()
azs = self.service.list_availability_zones(self.context)
self._stop_service()
self.assertItemsEqual(['az1', 'az2'], azs['availability_zones'])
@mock.patch.object(ironic.IronicClientWrapper, 'call')
def test_get_serial_console(self, mock_ironic_call):
fake_node = mock.MagicMock()

View File

@ -128,8 +128,3 @@ class RPCAPITestCase(base.DbTestCase):
'cast',
version='1.0',
instance=self.fake_instance_obj)
def test_list_availability_zones(self):
self._test_rpcapi('list_availability_zones',
'call',
version='1.0')