Use Agent OVO in l3_agentschedulers_db

Agent object has been merged [1].
This patch uses Agent object in l3_agentschedulers_db.

[1] https://review.openstack.org/#/c/297887/

Co-Authored-By: Nguyen Phuong An <AnNP@vn.fujitsu.com>
Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db
Change-Id: I7c652919a258b2e0b7e068a759ff6bfa996b0c4d
This commit is contained in:
Vu Cong Tuan 2017-09-08 09:09:02 +07:00
parent 8b381c7324
commit 7f969fa855
3 changed files with 21 additions and 16 deletions

View File

@ -20,7 +20,6 @@ from oslo_config import cfg
from oslo_db import exception as db_exc
from oslo_log import log as logging
import oslo_messaging
from sqlalchemy import or_
from neutron.agent.common import utils as agent_utils
from neutron.common import constants as l_consts
@ -374,30 +373,31 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
for router_model, agent_count in l3_model_list]
def get_l3_agents(self, context, active=None, filters=None):
query = context.session.query(agent_model.Agent)
query = query.filter(
agent_model.Agent.agent_type == constants.AGENT_TYPE_L3)
agent_filters = {'agent_type': constants.AGENT_TYPE_L3}
if active is not None:
query = (query.filter(agent_model.Agent.admin_state_up == active))
agent_filters['admin_state_up'] = active
config_filters = []
if filters:
for key, value in filters.items():
column = getattr(agent_model.Agent, key, None)
if column:
if not value:
return []
query = query.filter(column.in_(value))
agent_modes = filters.get('agent_modes', [])
agent_modes = filters.pop('agent_modes', [])
if agent_modes:
agent_mode_key = '\"agent_mode\": \"'
configuration_filter = (
[agent_model.Agent.configurations.contains('%s%s\"' %
(agent_mode_key, agent_mode))
for agent_mode in agent_modes])
query = query.filter(or_(*configuration_filter))
config_filters = set('\"agent_mode\": \"%s\"' % agent_mode
for agent_mode in agent_modes)
agent_filters.update(filters)
agent_objs = []
if config_filters:
for conf_filter in config_filters:
agent_objs.extend(ag_obj.Agent.get_objects_by_agent_mode(
context, conf_filter, **agent_filters))
else:
agent_objs = ag_obj.Agent.get_objects(context, **agent_filters)
return [l3_agent
for l3_agent in query
for l3_agent in agent_objs
if agentschedulers_db.AgentSchedulerDbMixin.is_eligible_agent(
active, l3_agent)]

View File

@ -156,3 +156,8 @@ class Agent(base.NeutronDbObject):
agent_model.Agent.availability_zone.in_(availability_zones)).all()
agents = [cls._load_object(context, record) for record in query]
return agents
@classmethod
def get_objects_by_agent_mode(cls, context, agent_mode=None, **kwargs):
mode_filter = obj_utils.StringContains(agent_mode)
return cls.get_objects(context, configurations=mode_filter, **kwargs)

View File

@ -1909,7 +1909,7 @@ class TestGetL3AgentsWithAgentModeFilter(testlib_api.SqlTestCase,
self.assertEqual(len(self.expected_agent_modes), len(l3_agents))
returned_agent_modes = [self._get_agent_mode(agent)
for agent in l3_agents]
self.assertEqual(self.expected_agent_modes, returned_agent_modes)
self.assertItemsEqual(self.expected_agent_modes, returned_agent_modes)
class L3AgentAZLeastRoutersSchedulerTestCase(L3HATestCaseMixin):