Make nova/virt use aggregate['metadetails']
This patch makes nova/virt use the metadata attached to the aggregate object instead of querying it separately. This allows us to remove a method from VirtAPI and avoid adding another one to conductor to support it. Change-Id: I4b9ff59147d30ff6f71fa66e838f060b8853dc95
This commit is contained in:
parent
07848e761a
commit
3f6a2d1621
|
@ -268,9 +268,6 @@ class ComputeVirtAPI(virtapi.VirtAPI):
|
||||||
def aggregate_get_by_host(self, context, host, key=None):
|
def aggregate_get_by_host(self, context, host, key=None):
|
||||||
return self._compute.db.aggregate_get_by_host(context, host, key=key)
|
return self._compute.db.aggregate_get_by_host(context, host, key=key)
|
||||||
|
|
||||||
def aggregate_metadata_get(self, context, aggregate_id):
|
|
||||||
return self._compute.db.aggregate_metadata_get(context, aggregate_id)
|
|
||||||
|
|
||||||
def aggregate_metadata_add(self, context, aggregate_id, metadata,
|
def aggregate_metadata_add(self, context, aggregate_id, metadata,
|
||||||
set_delete=False):
|
set_delete=False):
|
||||||
return self._compute.db.aggregate_metadata_add(context, aggregate_id,
|
return self._compute.db.aggregate_metadata_add(context, aggregate_id,
|
||||||
|
|
|
@ -2399,23 +2399,31 @@ class ResourcePoolWithStubs(StubDependencies, pool.ResourcePool):
|
||||||
|
|
||||||
class HypervisorPoolTestCase(test.TestCase):
|
class HypervisorPoolTestCase(test.TestCase):
|
||||||
|
|
||||||
|
fake_aggregate = {
|
||||||
|
'id': 98,
|
||||||
|
'hosts': [],
|
||||||
|
'metadetails': {
|
||||||
|
'master_compute': 'master',
|
||||||
|
pool_states.POOL_FLAG: {},
|
||||||
|
pool_states.KEY: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def test_slave_asks_master_to_add_slave_to_pool(self):
|
def test_slave_asks_master_to_add_slave_to_pool(self):
|
||||||
slave = ResourcePoolWithStubs()
|
slave = ResourcePoolWithStubs()
|
||||||
aggregate = {'id': 98, 'hosts': []}
|
|
||||||
|
|
||||||
slave.add_to_aggregate("CONTEXT", aggregate, "slave")
|
slave.add_to_aggregate("CONTEXT", self.fake_aggregate, "slave")
|
||||||
|
|
||||||
self.assertIn(
|
self.assertIn(
|
||||||
(slave.compute_rpcapi.add_aggregate_host,
|
(slave.compute_rpcapi.add_aggregate_host,
|
||||||
"CONTEXT", jsonutils.to_primitive(aggregate),
|
"CONTEXT", jsonutils.to_primitive(self.fake_aggregate),
|
||||||
"slave", "master", "SLAVE_INFO"),
|
"slave", "master", "SLAVE_INFO"),
|
||||||
slave.compute_rpcapi._mock_calls)
|
slave.compute_rpcapi._mock_calls)
|
||||||
|
|
||||||
def test_slave_asks_master_to_remove_slave_from_pool(self):
|
def test_slave_asks_master_to_remove_slave_from_pool(self):
|
||||||
slave = ResourcePoolWithStubs()
|
slave = ResourcePoolWithStubs()
|
||||||
aggregate = {'id': 98, 'hosts': []}
|
|
||||||
|
|
||||||
slave.remove_from_aggregate("CONTEXT", aggregate, "slave")
|
slave.remove_from_aggregate("CONTEXT", self.fake_aggregate, "slave")
|
||||||
|
|
||||||
self.assertIn(
|
self.assertIn(
|
||||||
(slave.compute_rpcapi.remove_aggregate_host,
|
(slave.compute_rpcapi.remove_aggregate_host,
|
||||||
|
|
|
@ -412,9 +412,6 @@ class FakeVirtAPI(virtapi.VirtAPI):
|
||||||
def aggregate_get_by_host(self, context, host, key=None):
|
def aggregate_get_by_host(self, context, host, key=None):
|
||||||
return db.aggregate_get_by_host(context, host, key)
|
return db.aggregate_get_by_host(context, host, key)
|
||||||
|
|
||||||
def aggregate_metadata_get(self, context, aggregate_id):
|
|
||||||
return db.aggregate_metadata_get(context, aggregate_id)
|
|
||||||
|
|
||||||
def aggregate_metadata_add(self, context, aggregate_id, metadata,
|
def aggregate_metadata_add(self, context, aggregate_id, metadata,
|
||||||
set_delete=False):
|
set_delete=False):
|
||||||
return db.aggregate_metadata_add(context, aggregate_id, metadata,
|
return db.aggregate_metadata_add(context, aggregate_id, metadata,
|
||||||
|
|
|
@ -48,14 +48,6 @@ class VirtAPI(object):
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def aggregate_metadata_get(self, context, aggregate_id):
|
|
||||||
"""Get metadata for the specified aggregate
|
|
||||||
:param context: security context
|
|
||||||
:param aggregate_id: id of aggregate for which metadata is to
|
|
||||||
be returned
|
|
||||||
"""
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
def aggregate_metadata_add(self, context, aggregate_id, metadata,
|
def aggregate_metadata_add(self, context, aggregate_id, metadata,
|
||||||
set_delete=False):
|
set_delete=False):
|
||||||
"""Add/update metadata for specified aggregate
|
"""Add/update metadata for specified aggregate
|
||||||
|
|
|
@ -57,13 +57,6 @@ class ResourcePool(object):
|
||||||
self._virtapi = virtapi
|
self._virtapi = virtapi
|
||||||
self.compute_rpcapi = compute_rpcapi.ComputeAPI()
|
self.compute_rpcapi = compute_rpcapi.ComputeAPI()
|
||||||
|
|
||||||
def _is_hv_pool(self, context, aggregate_id):
|
|
||||||
return pool_states.is_hv_pool(
|
|
||||||
self._virtapi.aggregate_metadata_get(context, aggregate_id))
|
|
||||||
|
|
||||||
def _get_metadata(self, context, aggregate_id):
|
|
||||||
return self._virtapi.aggregate_metadata_get(context, aggregate_id)
|
|
||||||
|
|
||||||
def undo_aggregate_operation(self, context, op, aggregate,
|
def undo_aggregate_operation(self, context, op, aggregate,
|
||||||
host, set_error):
|
host, set_error):
|
||||||
"""Undo aggregate operation when pool error raised"""
|
"""Undo aggregate operation when pool error raised"""
|
||||||
|
@ -80,24 +73,20 @@ class ResourcePool(object):
|
||||||
|
|
||||||
def add_to_aggregate(self, context, aggregate, host, slave_info=None):
|
def add_to_aggregate(self, context, aggregate, host, slave_info=None):
|
||||||
"""Add a compute host to an aggregate."""
|
"""Add a compute host to an aggregate."""
|
||||||
if not self._is_hv_pool(context, aggregate['id']):
|
if not pool_states.is_hv_pool(aggregate['metadetails']):
|
||||||
return
|
return
|
||||||
|
|
||||||
invalid = {pool_states.CHANGING: 'setup in progress',
|
invalid = {pool_states.CHANGING: 'setup in progress',
|
||||||
pool_states.DISMISSED: 'aggregate deleted',
|
pool_states.DISMISSED: 'aggregate deleted',
|
||||||
pool_states.ERROR: 'aggregate in error'}
|
pool_states.ERROR: 'aggregate in error'}
|
||||||
|
|
||||||
if (self._get_metadata(context, aggregate['id'])[pool_states.KEY]
|
if (aggregate['metadetails'][pool_states.KEY] in invalid.keys()):
|
||||||
in invalid.keys()):
|
|
||||||
raise exception.InvalidAggregateAction(
|
raise exception.InvalidAggregateAction(
|
||||||
action='add host',
|
action='add host',
|
||||||
aggregate_id=aggregate['id'],
|
aggregate_id=aggregate['id'],
|
||||||
reason=invalid[self._get_metadata(context,
|
reason=aggregate['metadetails'][pool_states.KEY])
|
||||||
aggregate['id'])
|
|
||||||
[pool_states.KEY]])
|
|
||||||
|
|
||||||
if (self._get_metadata(context, aggregate['id'])[pool_states.KEY]
|
if (aggregate['metadetails'][pool_states.KEY] == pool_states.CREATED):
|
||||||
== pool_states.CREATED):
|
|
||||||
self._virtapi.aggregate_metadata_add(context, aggregate['id'],
|
self._virtapi.aggregate_metadata_add(context, aggregate['id'],
|
||||||
{pool_states.KEY:
|
{pool_states.KEY:
|
||||||
pool_states.CHANGING})
|
pool_states.CHANGING})
|
||||||
|
@ -113,8 +102,7 @@ class ResourcePool(object):
|
||||||
else:
|
else:
|
||||||
# the pool is already up and running, we need to figure out
|
# the pool is already up and running, we need to figure out
|
||||||
# whether we can serve the request from this host or not.
|
# whether we can serve the request from this host or not.
|
||||||
master_compute = self._get_metadata(context,
|
master_compute = aggregate['metadetails']['master_compute']
|
||||||
aggregate['id'])['master_compute']
|
|
||||||
if master_compute == CONF.host and master_compute != host:
|
if master_compute == CONF.host and master_compute != host:
|
||||||
# this is the master -> do a pool-join
|
# this is the master -> do a pool-join
|
||||||
# To this aim, nova compute on the slave has to go down.
|
# To this aim, nova compute on the slave has to go down.
|
||||||
|
@ -137,25 +125,22 @@ class ResourcePool(object):
|
||||||
def remove_from_aggregate(self, context, aggregate, host, slave_info=None):
|
def remove_from_aggregate(self, context, aggregate, host, slave_info=None):
|
||||||
"""Remove a compute host from an aggregate."""
|
"""Remove a compute host from an aggregate."""
|
||||||
slave_info = slave_info or dict()
|
slave_info = slave_info or dict()
|
||||||
if not self._is_hv_pool(context, aggregate['id']):
|
if not pool_states.is_hv_pool(aggregate['metadetails']):
|
||||||
return
|
return
|
||||||
|
|
||||||
invalid = {pool_states.CREATED: 'no hosts to remove',
|
invalid = {pool_states.CREATED: 'no hosts to remove',
|
||||||
pool_states.CHANGING: 'setup in progress',
|
pool_states.CHANGING: 'setup in progress',
|
||||||
pool_states.DISMISSED: 'aggregate deleted', }
|
pool_states.DISMISSED: 'aggregate deleted', }
|
||||||
if (self._get_metadata(context, aggregate['id'])[pool_states.KEY]
|
if aggregate['metadetails'][pool_states.KEY] in invalid.keys():
|
||||||
in invalid.keys()):
|
|
||||||
raise exception.InvalidAggregateAction(
|
raise exception.InvalidAggregateAction(
|
||||||
action='remove host',
|
action='remove host',
|
||||||
aggregate_id=aggregate['id'],
|
aggregate_id=aggregate['id'],
|
||||||
reason=invalid[self._get_metadata(context,
|
reason=invalid[aggregate['metadetails'][pool_states.KEY]])
|
||||||
aggregate['id'])[pool_states.KEY]])
|
|
||||||
|
|
||||||
master_compute = self._get_metadata(context,
|
master_compute = aggregate['metadetails']['master_compute']
|
||||||
aggregate['id'])['master_compute']
|
|
||||||
if master_compute == CONF.host and master_compute != host:
|
if master_compute == CONF.host and master_compute != host:
|
||||||
# this is the master -> instruct it to eject a host from the pool
|
# this is the master -> instruct it to eject a host from the pool
|
||||||
host_uuid = self._get_metadata(context, aggregate['id'])[host]
|
host_uuid = aggregate['metadetails'][host]
|
||||||
self._eject_slave(aggregate['id'],
|
self._eject_slave(aggregate['id'],
|
||||||
slave_info.get('compute_uuid'), host_uuid)
|
slave_info.get('compute_uuid'), host_uuid)
|
||||||
self._virtapi.aggregate_metadata_delete(context, aggregate['id'],
|
self._virtapi.aggregate_metadata_delete(context, aggregate['id'],
|
||||||
|
|
Loading…
Reference in New Issue