
The BGP service plugin will automatically re-schedule BGP speakers that are unscheduled with a periodic job. This introduces a race condition that the basic scenario test job needs to account for. This change causes the test_remove_add_speaker_agent() test to ignore any DrAgentAssociationError when attempting to explicitly reschedule a BGP speaker that has just unscheduled. Since the content of the test is not affected by catching and ignoring these errors, we can safely ignore the error while enabling the test to pass consistently. Change-Id: I10b11ae52b36552d448cecaea03cfa1baaca026a Closes-Bug: #1820293
118 lines
5.5 KiB
Python
118 lines
5.5 KiB
Python
# Copyright (C) 2016 VA Linux Systems Japan K.K.
|
|
# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp>
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
from tempest import config
|
|
from tempest.lib import decorators
|
|
from tempest.lib import exceptions as t_exc
|
|
|
|
from neutron_dynamic_routing.tests.tempest.scenario import base as s_base
|
|
from neutron_dynamic_routing.tests.tempest.scenario.basic import base
|
|
|
|
from os_ken.tests.integrated.common import docker_base as ctn_base
|
|
|
|
CONF = config.CONF
|
|
|
|
|
|
class BgpSpeakerBasicTest(base.BgpSpeakerBasicTestJSONBase):
|
|
|
|
@decorators.idempotent_id('cc615252-c6cb-4d75-a70e-608fb2c3736a')
|
|
def test_schedule_added_speaker(self):
|
|
self.bgp_peer_args[0]['peer_ip'] = self.r_as_ip[0].split('/')[0]
|
|
num, subnet = self.tnet_gen.next()
|
|
mask = '/' + str(self.TPool.prefixlen)
|
|
TNet = s_base.Net(name='', net=subnet, mask=self.TPool.prefixlen,
|
|
cidr=subnet + mask, router=None)
|
|
TSubNet = s_base.SubNet(name='', cidr=TNet.cidr, mask=TNet.mask)
|
|
MyRouter = s_base.Router(name='my-router' + str(num), gw='')
|
|
ext_net_id = self.create_bgp_network(
|
|
4, self.MyScope,
|
|
self.PNet, self.PPool, self.PSubNet,
|
|
self.TPool, [[TNet, TSubNet, MyRouter]])
|
|
speaker_id, peers_ids = self.create_and_add_peers_to_speaker(
|
|
ext_net_id,
|
|
self.bgp_speaker_args,
|
|
[self.bgp_peer_args[0]])
|
|
self.check_remote_as_state(self.dr, self.r_ass[0],
|
|
ctn_base.BGP_FSM_ESTABLISHED)
|
|
|
|
@decorators.idempotent_id('ce98c33c-0ffa-49ae-b365-da836406793b')
|
|
def test_unschedule_deleted_speaker(self):
|
|
self.bgp_peer_args[0]['peer_ip'] = self.r_as_ip[0].split('/')[0]
|
|
num, subnet = self.tnet_gen.next()
|
|
mask = '/' + str(self.TPool.prefixlen)
|
|
TNet = s_base.Net(name='', net=subnet, mask=self.TPool.prefixlen,
|
|
cidr=subnet + mask, router=None)
|
|
TSubNet = s_base.SubNet(name='', cidr=TNet.cidr, mask=TNet.mask)
|
|
MyRouter = s_base.Router(name='my-router' + str(num), gw='')
|
|
ext_net_id = self.create_bgp_network(
|
|
4, self.MyScope,
|
|
self.PNet, self.PPool, self.PSubNet,
|
|
self.TPool, [[TNet, TSubNet, MyRouter]])
|
|
speaker_id, peers_ids = self.create_and_add_peers_to_speaker(
|
|
ext_net_id,
|
|
self.bgp_speaker_args,
|
|
[self.bgp_peer_args[0]],
|
|
auto_delete=False)
|
|
self.check_remote_as_state(self.dr, self.r_ass[0],
|
|
ctn_base.BGP_FSM_ESTABLISHED)
|
|
self.delete_bgp_speaker(speaker_id)
|
|
self.delete_bgp_peer(peers_ids[0])
|
|
self.check_remote_as_state(self.dr, self.r_ass[0],
|
|
ctn_base.BGP_FSM_ACTIVE,
|
|
init_state=ctn_base.BGP_FSM_ESTABLISHED)
|
|
|
|
@decorators.idempotent_id('aa6c565c-ded3-413b-8dc9-3928b3b0e38f')
|
|
def test_remove_add_speaker_agent(self):
|
|
self.bgp_peer_args[0]['peer_ip'] = self.r_as_ip[0].split('/')[0]
|
|
num, subnet = self.tnet_gen.next()
|
|
mask = '/' + str(self.TPool.prefixlen)
|
|
TNet = s_base.Net(name='', net=subnet, mask=self.TPool.prefixlen,
|
|
cidr=subnet + mask, router=None)
|
|
TSubNet = s_base.SubNet(name='', cidr=TNet.cidr, mask=TNet.mask)
|
|
MyRouter = s_base.Router(name='my-router' + str(num), gw='')
|
|
ext_net_id = self.create_bgp_network(
|
|
4, self.MyScope,
|
|
self.PNet, self.PPool, self.PSubNet,
|
|
self.TPool, [[TNet, TSubNet, MyRouter]])
|
|
speaker_id, peers_ids = self.create_and_add_peers_to_speaker(
|
|
ext_net_id,
|
|
self.bgp_speaker_args,
|
|
[self.bgp_peer_args[0]])
|
|
self.check_remote_as_state(self.dr, self.r_ass[0],
|
|
ctn_base.BGP_FSM_ESTABLISHED)
|
|
agent_list = self.bgp_client.list_dragents_for_bgp_speaker(
|
|
speaker_id)['agents']
|
|
self.assertEqual(1, len(agent_list))
|
|
agent_id = agent_list[0]['id']
|
|
self.bgp_client.remove_bgp_speaker_from_dragent(agent_id, speaker_id)
|
|
self.check_remote_as_state(self.dr, self.r_ass[0],
|
|
ctn_base.BGP_FSM_ACTIVE,
|
|
init_state=ctn_base.BGP_FSM_ESTABLISHED)
|
|
|
|
try:
|
|
self.bgp_client.add_bgp_speaker_to_dragent(agent_id, speaker_id)
|
|
except t_exc.Conflict:
|
|
# Ignore this error because the bgpspeaker may have been
|
|
# re-scheduled automatically between now and the last call to
|
|
# self.bgp_client.remove_bgp_speaker_from_dragent(). The call
|
|
# to check_remote_as_state() will properly assert whether the
|
|
# bgpspeaker was scheduled appropriately regardless of whether
|
|
# an exception is encountered here.
|
|
pass
|
|
|
|
self.check_remote_as_state(self.dr, self.r_ass[0],
|
|
ctn_base.BGP_FSM_ESTABLISHED)
|