Merge "Stop using Octavia network driver"
This commit is contained in:
commit
d7b58f3dd2
|
@ -133,7 +133,6 @@ sqlalchemy-migrate==0.11.0
|
|||
sqlparse==0.2.2
|
||||
statsd==3.2.1
|
||||
stestr==1.0.0
|
||||
stevedore==1.20.0
|
||||
Tempita==0.5.2
|
||||
tenacity==4.4.0
|
||||
testrepository==0.0.18
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
# 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 keystoneauth1 import loading as ks_loading
|
||||
from neutronclient.neutron import client as neutron_client
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import excutils
|
||||
|
||||
from ovn_octavia_provider.common import constants
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
CONF = cfg.CONF
|
||||
|
||||
NEUTRON_VERSION = '2.0'
|
||||
|
||||
|
||||
class KeystoneSession(object):
|
||||
|
||||
def __init__(self, section=constants.SERVICE_AUTH):
|
||||
self._session = None
|
||||
self._auth = None
|
||||
|
||||
self.section = section
|
||||
ks_loading.register_auth_conf_options(cfg.CONF, self.section)
|
||||
ks_loading.register_session_conf_options(cfg.CONF, self.section)
|
||||
|
||||
@property
|
||||
def session(self):
|
||||
"""Initialize a Keystone session.
|
||||
|
||||
:return: a Keystone Session object
|
||||
"""
|
||||
if not self._session:
|
||||
self._session = ks_loading.load_session_from_conf_options(
|
||||
cfg.CONF, self.section, auth=self.auth)
|
||||
return self._session
|
||||
|
||||
@property
|
||||
def auth(self):
|
||||
if not self._auth:
|
||||
self._auth = ks_loading.load_auth_from_conf_options(
|
||||
cfg.CONF, self.section)
|
||||
return self._auth
|
||||
|
||||
|
||||
class Singleton(type):
|
||||
_instances = {}
|
||||
|
||||
def __call__(cls, *args, **kwargs):
|
||||
if cls not in cls._instances:
|
||||
cls._instances[cls] = super(Singleton, cls).__call__(*args,
|
||||
**kwargs)
|
||||
return cls._instances[cls]
|
||||
|
||||
|
||||
class NeutronAuth(metaclass=Singleton):
|
||||
def __init__(self, region, service_name=None, endpoint=None,
|
||||
endpoint_type='publicURL', insecure=False,
|
||||
ca_cert=None):
|
||||
"""Create neutron client object.
|
||||
|
||||
:param region: The region of the service
|
||||
:param service_name: The name of the neutron service in the catalog
|
||||
:param endpoint: The endpoint of the service
|
||||
:param endpoint_type: The endpoint_type of the service
|
||||
:param insecure: Turn off certificate validation
|
||||
:param ca_cert: CA Cert file path
|
||||
:return: a Neutron Client object.
|
||||
:raises Exception: if the client cannot be created
|
||||
"""
|
||||
ksession = KeystoneSession()
|
||||
kwargs = {'region_name': region,
|
||||
'session': ksession.session,
|
||||
'endpoint_type': endpoint_type,
|
||||
'insecure': insecure}
|
||||
if service_name:
|
||||
kwargs['service_name'] = service_name
|
||||
if endpoint:
|
||||
kwargs['endpoint_override'] = endpoint
|
||||
if ca_cert:
|
||||
kwargs['ca_cert'] = ca_cert
|
||||
try:
|
||||
self.neutron_client = neutron_client.Client(
|
||||
NEUTRON_VERSION, **kwargs)
|
||||
except Exception:
|
||||
with excutils.save_and_reraise_exception():
|
||||
LOG.exception("Error creating Neutron client.")
|
|
@ -33,3 +33,6 @@ LB_EXT_IDS_MEMBER_PREFIX = 'member_'
|
|||
LB_EXT_IDS_VIP_KEY = 'neutron:vip'
|
||||
LB_EXT_IDS_VIP_FIP_KEY = 'neutron:vip_fip'
|
||||
LB_EXT_IDS_VIP_PORT_ID_KEY = 'neutron:vip_port_id'
|
||||
|
||||
# Auth sections
|
||||
SERVICE_AUTH = 'service_auth'
|
||||
|
|
|
@ -32,9 +32,9 @@ from ovs.stream import Stream
|
|||
from ovsdbapp.backend.ovs_idl import connection
|
||||
from ovsdbapp.backend.ovs_idl import event as row_event
|
||||
from ovsdbapp.backend.ovs_idl import idlutils
|
||||
from stevedore import driver
|
||||
import tenacity
|
||||
|
||||
from ovn_octavia_provider.common import clients
|
||||
from ovn_octavia_provider.common import config as ovn_conf
|
||||
# TODO(mjozefcz): Start consuming const and utils
|
||||
# from neutron-lib once released.
|
||||
|
@ -89,19 +89,22 @@ class IPVersionsMixingNotSupportedError(
|
|||
operator_fault_string = user_fault_string
|
||||
|
||||
|
||||
def get_network_driver():
|
||||
def get_neutron_client():
|
||||
try:
|
||||
CONF.import_group('controller_worker', 'octavia.common.config')
|
||||
name = CONF.controller_worker.network_driver
|
||||
except ImportError:
|
||||
# TODO(mjozefcz): Remove this when the config option will
|
||||
# land in octavia-lib.
|
||||
name = 'network_noop_driver'
|
||||
return driver.DriverManager(
|
||||
namespace='octavia.network.drivers',
|
||||
name=name,
|
||||
invoke_on_load=True
|
||||
).driver
|
||||
return clients.NeutronAuth(
|
||||
endpoint=CONF.neutron.endpoint,
|
||||
region=CONF.neutron.region_name,
|
||||
endpoint_type=CONF.neutron.endpoint_type,
|
||||
service_name=CONF.neutron.service_name,
|
||||
insecure=CONF.neutron.insecure,
|
||||
ca_cert=CONF.neutron.ca_certificates_file,
|
||||
).neutron_client
|
||||
except n_exc.NeutronClientException as e:
|
||||
msg = _('Cannot inialize Neutron Client. Exception: %s. '
|
||||
'Please verify Neutron service configuration '
|
||||
'in Octavia API configuration.') % e
|
||||
raise driver_exceptions.DriverError(
|
||||
operator_fault_string=msg)
|
||||
|
||||
|
||||
class LogicalRouterPortEvent(row_event.RowEvent):
|
||||
|
@ -613,10 +616,10 @@ class OvnProviderHelper(object):
|
|||
if network_id:
|
||||
ls_name = utils.ovn_name(network_id)
|
||||
else:
|
||||
network_driver = get_network_driver()
|
||||
neutron_client = get_neutron_client()
|
||||
try:
|
||||
subnet = network_driver.get_subnet(subnet_id)
|
||||
ls_name = utils.ovn_name(subnet.network_id)
|
||||
subnet = neutron_client.show_subnet(subnet_id)
|
||||
ls_name = utils.ovn_name(subnet['subnet']['network_id'])
|
||||
except n_exc.NotFound:
|
||||
LOG.warning('Subnet %s not found while trying to '
|
||||
'fetch its data.', subnet_id)
|
||||
|
@ -741,7 +744,7 @@ class OvnProviderHelper(object):
|
|||
return self._add_lb_to_lr_association(ovn_lb, ovn_lr, lr_ref)
|
||||
|
||||
def _find_ls_for_lr(self, router):
|
||||
netdriver = get_network_driver()
|
||||
neutron_client = get_neutron_client()
|
||||
ls = []
|
||||
for port in router.ports:
|
||||
if port.gateway_chassis:
|
||||
|
@ -750,8 +753,8 @@ class OvnProviderHelper(object):
|
|||
ovn_const.OVN_SUBNET_EXT_IDS_KEY, '').split(' ')
|
||||
for sid in sids:
|
||||
try:
|
||||
ls.append(utils.ovn_name(
|
||||
netdriver.get_subnet(sid).network_id))
|
||||
subnet = neutron_client.show_subnet(sid)
|
||||
ls.append(utils.ovn_name(subnet['subnet']['network_id']))
|
||||
except n_exc.NotFound:
|
||||
LOG.exception('Subnet %s not found while trying to '
|
||||
'fetch its data.', sid)
|
||||
|
@ -911,14 +914,14 @@ class OvnProviderHelper(object):
|
|||
|
||||
def lb_create(self, loadbalancer, protocol=None):
|
||||
port = None
|
||||
network_driver = get_network_driver()
|
||||
neutron_client = get_neutron_client()
|
||||
if loadbalancer.get('vip_port_id'):
|
||||
# In case we don't have vip_network_id
|
||||
port = network_driver.neutron_client.show_port(
|
||||
port = neutron_client.show_port(
|
||||
loadbalancer['vip_port_id'])['port']
|
||||
elif (loadbalancer.get('vip_network_id') and
|
||||
loadbalancer.get('vip_address')):
|
||||
ports = network_driver.neutron_client.list_ports(
|
||||
ports = neutron_client.list_ports(
|
||||
network_id=loadbalancer['vip_network_id'])
|
||||
for p in ports['ports']:
|
||||
for ip in p['fixed_ips']:
|
||||
|
@ -1780,13 +1783,13 @@ class OvnProviderHelper(object):
|
|||
port['port']['fixed_ips'][0]['ip_address'] = vip_d['vip_address']
|
||||
except KeyError:
|
||||
pass
|
||||
network_driver = get_network_driver()
|
||||
neutron_client = get_neutron_client()
|
||||
try:
|
||||
return network_driver.neutron_client.create_port(port)
|
||||
return neutron_client.create_port(port)
|
||||
except n_exc.IpAddressAlreadyAllocatedClient:
|
||||
# Sometimes the VIP is already created (race-conditions)
|
||||
# Lets get the it from Neutron API.
|
||||
ports = network_driver.neutron_client.list_ports(
|
||||
ports = neutron_client.list_ports(
|
||||
network_id=vip_d['vip_network_id'],
|
||||
name='%s%s' % (ovn_const.LB_VIP_PORT_PREFIX, lb_id))
|
||||
if not ports['ports']:
|
||||
|
@ -1804,9 +1807,9 @@ class OvnProviderHelper(object):
|
|||
return {'port': port}
|
||||
|
||||
def delete_vip_port(self, port_id):
|
||||
network_driver = get_network_driver()
|
||||
neutron_client = get_neutron_client()
|
||||
try:
|
||||
network_driver.neutron_client.delete_port(port_id)
|
||||
neutron_client.delete_port(port_id)
|
||||
except n_exc.PortNotFoundClient:
|
||||
LOG.warning("Port %s could not be found. Please "
|
||||
"check Neutron logs. Perhaps port "
|
||||
|
@ -1849,10 +1852,10 @@ class OvnProviderHelper(object):
|
|||
return
|
||||
|
||||
# Find out if member has FIP assigned.
|
||||
network_driver = get_network_driver()
|
||||
neutron_client = get_neutron_client()
|
||||
try:
|
||||
subnet = network_driver.get_subnet(info['subnet_id'])
|
||||
ls_name = utils.ovn_name(subnet.network_id)
|
||||
subnet = neutron_client.show_subnet(info['subnet_id'])
|
||||
ls_name = utils.ovn_name(subnet['subnet']['network_id'])
|
||||
except n_exc.NotFound:
|
||||
LOG.exception('Subnet %s not found while trying to '
|
||||
'fetch its data.', info['subnet_id'])
|
||||
|
@ -1908,12 +1911,12 @@ class OvnProviderHelper(object):
|
|||
# We should call neutron API to do 'empty' update of the FIP.
|
||||
# It will bump revision number and do recomputation of the FIP.
|
||||
try:
|
||||
fip_info = network_driver.neutron_client.show_floatingip(
|
||||
fip_info = neutron_client.show_floatingip(
|
||||
fip.external_ids[ovn_const.OVN_FIP_EXT_ID_KEY])
|
||||
empty_update = {
|
||||
"floatingip": {
|
||||
'description': fip_info['floatingip']['description']}}
|
||||
network_driver.neutron_client.update_floatingip(
|
||||
neutron_client.update_floatingip(
|
||||
fip.external_ids[ovn_const.OVN_FIP_EXT_ID_KEY],
|
||||
empty_update)
|
||||
except n_exc.NotFound:
|
||||
|
|
|
@ -61,25 +61,22 @@ class TestOctaviaOvnProviderDriver(
|
|||
self.ovn_driver._ovn_helper._octavia_driver_lib = mock.MagicMock()
|
||||
self._o_driver_lib = self.ovn_driver._ovn_helper._octavia_driver_lib
|
||||
self._o_driver_lib.update_loadbalancer_status = mock.Mock()
|
||||
self.fake_network_driver = mock.MagicMock()
|
||||
ovn_driver.get_network_driver = mock.MagicMock()
|
||||
ovn_driver.get_network_driver.return_value = self.fake_network_driver
|
||||
self.fake_network_driver.get_subnet = self._mock_get_subnet
|
||||
self.fake_network_driver.neutron_client.list_ports = (
|
||||
self._mock_list_ports)
|
||||
self.fake_network_driver.neutron_client.show_port = (
|
||||
self._mock_show_port)
|
||||
self.fake_network_driver.neutron_client.\
|
||||
delete_port.return_value = True
|
||||
self.fake_neutron_client = mock.MagicMock()
|
||||
ovn_driver.get_neutron_client = mock.MagicMock()
|
||||
ovn_driver.get_neutron_client.return_value = self.fake_neutron_client
|
||||
self.fake_neutron_client.show_subnet = self._mock_show_subnet
|
||||
self.fake_neutron_client.list_ports = self._mock_list_ports
|
||||
self.fake_neutron_client.show_port = self._mock_show_port
|
||||
self.fake_neutron_client.delete_port.return_value = True
|
||||
self._local_net_cache = {}
|
||||
self._local_port_cache = {'ports': []}
|
||||
self.addCleanup(self.ovn_driver._ovn_helper.shutdown)
|
||||
self.core_plugin = directory.get_plugin()
|
||||
|
||||
def _mock_get_subnet(self, subnet_id):
|
||||
m_subnet = mock.MagicMock()
|
||||
m_subnet.network_id = self._local_net_cache[subnet_id]
|
||||
return m_subnet
|
||||
def _mock_show_subnet(self, subnet_id):
|
||||
subnet = {}
|
||||
subnet['network_id'] = self._local_net_cache[subnet_id]
|
||||
return {'subnet': subnet}
|
||||
|
||||
def _mock_list_ports(self, **kwargs):
|
||||
return self._local_port_cache
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
#
|
||||
# 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 mock
|
||||
|
||||
from oslotest import base
|
||||
|
||||
from ovn_octavia_provider.common import clients
|
||||
|
||||
|
||||
class TestKeystoneSession(base.BaseTestCase):
|
||||
@mock.patch(
|
||||
'keystoneauth1.loading.register_auth_conf_options')
|
||||
@mock.patch(
|
||||
'keystoneauth1.loading.register_session_conf_options')
|
||||
def test_init(self, kl_rs, kl_ra):
|
||||
clients.KeystoneSession()
|
||||
kl_ra.assert_called_once_with(mock.ANY, 'service_auth')
|
||||
kl_rs.assert_called_once_with(mock.ANY, 'service_auth')
|
||||
|
||||
@mock.patch(
|
||||
'keystoneauth1.loading.load_session_from_conf_options')
|
||||
def test_cached_session(self, kl):
|
||||
ksession = clients.KeystoneSession()
|
||||
self.assertIs(
|
||||
ksession.session,
|
||||
ksession.session)
|
||||
kl.assert_called_once_with(
|
||||
mock.ANY, 'service_auth', auth=ksession.auth)
|
||||
|
||||
@mock.patch(
|
||||
'keystoneauth1.loading.load_auth_from_conf_options')
|
||||
def test_cached_auth(self, kl):
|
||||
ksession = clients.KeystoneSession()
|
||||
self.assertIs(
|
||||
ksession.auth,
|
||||
ksession.auth)
|
||||
kl.assert_called_once_with(mock.ANY, 'service_auth')
|
||||
|
||||
|
||||
class TestNeutronAuth(base.BaseTestCase):
|
||||
def setUp(self):
|
||||
super(TestNeutronAuth, self).setUp()
|
||||
self.mock_client = mock.patch(
|
||||
'neutronclient.neutron.client.Client').start()
|
||||
self.client_args = {
|
||||
'endpoint': 'foo_endpoint',
|
||||
'region': 'foo_region',
|
||||
'endpoint_type': 'foo_endpoint_type',
|
||||
'service_name': 'foo_service_name',
|
||||
'insecure': 'foo_insecure',
|
||||
'ca_cert': 'foo_ca_cert'}
|
||||
clients.Singleton._instances = {}
|
||||
|
||||
@mock.patch.object(clients, 'KeystoneSession')
|
||||
def test_init(self, mock_ks):
|
||||
clients.NeutronAuth(**self.client_args)
|
||||
self.mock_client.assert_called_once_with(
|
||||
'2.0',
|
||||
endpoint_override=self.client_args['endpoint'],
|
||||
region_name=self.client_args['region'],
|
||||
endpoint_type=self.client_args['endpoint_type'],
|
||||
service_name=self.client_args['service_name'],
|
||||
insecure=self.client_args['insecure'],
|
||||
ca_cert=self.client_args['ca_cert'],
|
||||
session=mock_ks().session)
|
||||
|
||||
def test_singleton(self):
|
||||
c1 = clients.NeutronAuth(**self.client_args)
|
||||
c2 = clients.NeutronAuth(**self.client_args)
|
||||
self.assertIs(c1, c2)
|
||||
|
||||
def test_singleton_exception(self):
|
||||
with mock.patch(
|
||||
'neutronclient.neutron.client.Client',
|
||||
side_effect=[RuntimeError, 'foo', 'foo']) as n_cli:
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
clients.NeutronAuth,
|
||||
**self.client_args)
|
||||
c2 = clients.NeutronAuth(**self.client_args)
|
||||
c3 = clients.NeutronAuth(**self.client_args)
|
||||
self.assertIs(c2, c3)
|
||||
self.assertEqual(n_cli._mock_call_count, 2)
|
|
@ -647,7 +647,7 @@ class TestOvnProviderDriver(TestOvnOctaviaBase):
|
|||
self.mock_add_request.assert_called_once_with(expected_dict)
|
||||
|
||||
def test_create_vip_port(self):
|
||||
with mock.patch.object(ovn_driver, 'get_network_driver'):
|
||||
with mock.patch.object(ovn_driver, 'get_neutron_client'):
|
||||
port_dict = self.driver.create_vip_port(self.loadbalancer_id,
|
||||
self.project_id,
|
||||
self.vip_dict)
|
||||
|
@ -662,7 +662,7 @@ class TestOvnProviderDriver(TestOvnOctaviaBase):
|
|||
self.assertEqual(value, self.vip_output[key])
|
||||
|
||||
def test_create_vip_port_exception(self):
|
||||
with mock.patch.object(ovn_driver, 'get_network_driver',
|
||||
with mock.patch.object(ovn_driver, 'get_neutron_client',
|
||||
side_effect=[RuntimeError]):
|
||||
self.assertRaises(
|
||||
exceptions.DriverError,
|
||||
|
@ -928,11 +928,10 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.db_set.assert_called_once_with(
|
||||
'Load_Balancer', self.ovn_lb.uuid, ('protocol', 'tcp'))
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_lb_create_disabled(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_lb_create_disabled(self, net_cli):
|
||||
self.lb['admin_state_up'] = False
|
||||
net_dr.return_value.neutron_client.list_ports.return_value = (
|
||||
self.ports)
|
||||
net_cli.return_value.list_ports.return_value = self.ports
|
||||
status = self.helper.lb_create(self.lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
constants.ACTIVE)
|
||||
|
@ -946,11 +945,10 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
name=mock.ANY,
|
||||
protocol=None)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_lb_create_enabled(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_lb_create_enabled(self, net_cli):
|
||||
self.lb['admin_state_up'] = True
|
||||
net_dr.return_value.neutron_client.list_ports.return_value = (
|
||||
self.ports)
|
||||
net_cli.return_value.list_ports.return_value = self.ports
|
||||
status = self.helper.lb_create(self.lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
constants.ACTIVE)
|
||||
|
@ -964,8 +962,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
name=mock.ANY,
|
||||
protocol=None)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_lb_create_on_multi_protocol(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_lb_create_on_multi_protocol(self, net_cli):
|
||||
"""This test situation when new protocol is added
|
||||
|
||||
to the same loadbalancer and we need to add
|
||||
|
@ -975,8 +973,7 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.lb['protocol'] = 'UDP'
|
||||
self.lb[ovn_const.LB_EXT_IDS_LR_REF_KEY] = 'foo'
|
||||
self.lb[ovn_const.LB_EXT_IDS_LS_REFS_KEY] = "{\"neutron-foo\": 1}"
|
||||
net_dr.return_value.neutron_client.list_ports.return_value = (
|
||||
self.ports)
|
||||
net_cli.return_value.list_ports.return_value = self.ports
|
||||
status = self.helper.lb_create(self.lb, protocol='UDP')
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
constants.ACTIVE)
|
||||
|
@ -995,12 +992,11 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
network_id=self.lb['vip_network_id']),
|
||||
mock.call(self.ovn_lb, associate=True, network_id='foo')])
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
@mock.patch.object(ovn_driver.OvnProviderHelper, 'delete_vip_port')
|
||||
def test_lb_create_exception(self, del_port, net_dr):
|
||||
def test_lb_create_exception(self, del_port, net_cli):
|
||||
self.helper._find_ovn_lbs.side_effect = [RuntimeError]
|
||||
net_dr.return_value.neutron_client.list_ports.return_value = (
|
||||
self.ports)
|
||||
net_cli.return_value.list_ports.return_value = self.ports
|
||||
status = self.helper.lb_create(self.lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
constants.ERROR)
|
||||
|
@ -1008,10 +1004,10 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
constants.ERROR)
|
||||
del_port.assert_called_once_with(self.ports.get('ports')[0]['id'])
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
@mock.patch.object(ovn_driver.OvnProviderHelper, 'delete_vip_port')
|
||||
def test_lb_delete(self, del_port, net_dr):
|
||||
net_dr.return_value.neutron_client.delete_port.return_value = None
|
||||
def test_lb_delete(self, del_port, net_cli):
|
||||
net_cli.return_value.delete_port.return_value = None
|
||||
status = self.helper.lb_delete(self.ovn_lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
constants.DELETED)
|
||||
|
@ -1032,9 +1028,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.lb_del.assert_not_called()
|
||||
del_port.assert_not_called()
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
@mock.patch.object(ovn_driver.OvnProviderHelper, 'delete_vip_port')
|
||||
def test_lb_delete_exception(self, del_port, net_dr):
|
||||
def test_lb_delete_exception(self, del_port):
|
||||
self.helper.ovn_nbdb_api.lb_del.side_effect = [RuntimeError]
|
||||
status = self.helper.lb_delete(self.lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
|
@ -1045,10 +1040,10 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.ovn_lb.uuid)
|
||||
del_port.assert_called_once_with('foo_port')
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
@mock.patch.object(ovn_driver.OvnProviderHelper, 'delete_vip_port')
|
||||
def test_lb_delete_port_not_found(self, del_port, net_dr):
|
||||
net_dr.return_value.neutron_client.delete_port.side_effect = (
|
||||
def test_lb_delete_port_not_found(self, del_port, net_cli):
|
||||
net_cli.return_value.delete_port.side_effect = (
|
||||
[n_exc.PortNotFoundClient])
|
||||
status = self.helper.lb_delete(self.ovn_lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
|
@ -1059,9 +1054,9 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.ovn_lb.uuid)
|
||||
del_port.assert_called_once_with('foo_port')
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_lb_delete_cascade(self, net_dr):
|
||||
net_dr.return_value.neutron_client.delete_port.return_value = None
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_lb_delete_cascade(self, net_cli):
|
||||
net_cli.return_value.delete_port.return_value = None
|
||||
self.lb['cascade'] = True
|
||||
status = self.helper.lb_delete(self.lb)
|
||||
self.assertEqual(status['loadbalancers'][0]['provisioning_status'],
|
||||
|
@ -1077,13 +1072,13 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.lb_del.assert_called_once_with(
|
||||
self.ovn_lb.uuid)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_lb_delete_ls_lr(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_lb_delete_ls_lr(self, net_cli):
|
||||
self.ovn_lb.external_ids.update({
|
||||
ovn_const.LB_EXT_IDS_LR_REF_KEY: self.router.name,
|
||||
ovn_const.LB_EXT_IDS_LS_REFS_KEY:
|
||||
'{\"neutron-%s\": 1}' % self.network.uuid})
|
||||
net_dr.return_value.neutron_client.delete_port.return_value = None
|
||||
net_cli.return_value.delete_port.return_value = None
|
||||
(self.helper.ovn_nbdb_api.ls_get.return_value.execute.
|
||||
return_value) = self.network
|
||||
(self.helper.ovn_nbdb_api.tables['Logical_Router'].rows.
|
||||
|
@ -1094,9 +1089,9 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.lr_lb_del.assert_called_once_with(
|
||||
self.router.uuid, self.ovn_lb.uuid)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_lb_delete_multiple_protocols(self, net_dr):
|
||||
net_dr.return_value.neutron_client.delete_port.return_value = None
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_lb_delete_multiple_protocols(self, net_cli):
|
||||
net_cli.return_value.delete_port.return_value = None
|
||||
self.mock_find_ovn_lbs.stop()
|
||||
udp_lb = copy.copy(self.ovn_lb)
|
||||
udp_lb.protocol = ['udp']
|
||||
|
@ -1906,8 +1901,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.assertEqual(status['listeners'][0]['id'],
|
||||
'listener1')
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_logical_router_port_event_create(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_logical_router_port_event_create(self, net_cli):
|
||||
self.router_port_event = ovn_driver.LogicalRouterPortEvent(
|
||||
self.helper)
|
||||
row = fakes.FakeOvsdbRow.create_one_ovsdb_row(
|
||||
|
@ -1920,8 +1915,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'type': 'lb_create_lrp_assoc'}
|
||||
self.mock_add_request.assert_called_once_with(expected)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_logical_router_port_event_delete(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_logical_router_port_event_delete(self, net_cli):
|
||||
self.router_port_event = ovn_driver.LogicalRouterPortEvent(
|
||||
self.helper)
|
||||
row = fakes.FakeOvsdbRow.create_one_ovsdb_row(
|
||||
|
@ -1934,8 +1929,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'type': 'lb_delete_lrp_assoc'}
|
||||
self.mock_add_request.assert_called_once_with(expected)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_logical_router_port_event_gw_port(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_logical_router_port_event_gw_port(self, net_cli):
|
||||
self.router_port_event = ovn_driver.LogicalRouterPortEvent(
|
||||
self.helper)
|
||||
row = fakes.FakeOvsdbRow.create_one_ovsdb_row(
|
||||
|
@ -2121,14 +2116,15 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
for lb in self.network.load_balancer:
|
||||
self.assertNotIn(lb, net_lb)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__find_ls_for_lr(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__find_ls_for_lr(self, net_cli):
|
||||
fake_subnet1 = fakes.FakeSubnet.create_one_subnet()
|
||||
fake_subnet1.network_id = 'foo1'
|
||||
fake_subnet1['network_id'] = 'foo1'
|
||||
fake_subnet2 = fakes.FakeSubnet.create_one_subnet()
|
||||
fake_subnet2.network_id = 'foo2'
|
||||
net_dr.return_value.get_subnet.side_effect = [
|
||||
fake_subnet1, fake_subnet2]
|
||||
fake_subnet2['network_id'] = 'foo2'
|
||||
net_cli.return_value.show_subnet.side_effect = [
|
||||
{'subnet': fake_subnet1},
|
||||
{'subnet': fake_subnet2}]
|
||||
p1 = fakes.FakeOVNPort.create_one_port(attrs={
|
||||
'gateway_chassis': [],
|
||||
'external_ids': {
|
||||
|
@ -2140,14 +2136,15 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.assertListEqual(['neutron-foo1', 'neutron-foo2'],
|
||||
res)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__find_ls_for_lr_subnet_not_found(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__find_ls_for_lr_subnet_not_found(self, net_cli):
|
||||
fake_subnet1 = fakes.FakeSubnet.create_one_subnet()
|
||||
fake_subnet1.network_id = 'foo1'
|
||||
fake_subnet1['network_id'] = 'foo1'
|
||||
fake_subnet2 = fakes.FakeSubnet.create_one_subnet()
|
||||
fake_subnet2.network_id = 'foo2'
|
||||
net_dr.return_value.get_subnet.side_effect = [
|
||||
fake_subnet1, n_exc.NotFound]
|
||||
fake_subnet2['network_id'] = 'foo2'
|
||||
net_cli.return_value.show_subnet.side_effect = [
|
||||
{'subnet': fake_subnet1},
|
||||
n_exc.NotFound]
|
||||
p1 = fakes.FakeOVNPort.create_one_port(attrs={
|
||||
'gateway_chassis': [],
|
||||
'external_ids': {
|
||||
|
@ -2158,8 +2155,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
res = self.helper._find_ls_for_lr(self.router)
|
||||
self.assertListEqual(['neutron-foo1'], res)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__find_ls_for_lr_gw_port(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__find_ls_for_lr_gw_port(self, net_cli):
|
||||
p1 = fakes.FakeOVNPort.create_one_port(attrs={
|
||||
'gateway_chassis': ['foo-gw-chassis'],
|
||||
'external_ids': {
|
||||
|
@ -2193,8 +2190,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
add.assert_not_called()
|
||||
delete.assert_called_once_with(self.ref_lb1, self.router, lr_ref)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__del_lb_to_lr_association(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__del_lb_to_lr_association(self, net_cli):
|
||||
lr_ref = self.ref_lb1.external_ids.get(
|
||||
ovn_const.LB_EXT_IDS_LR_REF_KEY)
|
||||
upd_lr_ref = '%s,%s' % (lr_ref, self.router.name)
|
||||
|
@ -2212,8 +2209,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
expected_calls)
|
||||
self.helper.ovn_nbdb_api.db_remove.assert_not_called()
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__del_lb_to_lr_association_no_lr_ref(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__del_lb_to_lr_association_no_lr_ref(self, net_cli):
|
||||
lr_ref = ''
|
||||
self.helper._del_lb_to_lr_association(
|
||||
self.ref_lb1, self.router, lr_ref)
|
||||
|
@ -2221,8 +2218,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.db_remove.assert_not_called()
|
||||
self.helper.ovn_nbdb_api.lr_lb_del.assert_not_called()
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__del_lb_to_lr_association_lr_ref_empty_after(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__del_lb_to_lr_association_lr_ref_empty_after(self, net_cli):
|
||||
lr_ref = self.router.name
|
||||
self.helper._del_lb_to_lr_association(
|
||||
self.ref_lb1, self.router, lr_ref)
|
||||
|
@ -2309,18 +2306,17 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.db_set.assert_called_once_with(
|
||||
'Load_Balancer', self.ref_lb1.uuid, ('external_ids', ls_refs))
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__update_lb_to_ls_association_subnet(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__update_lb_to_ls_association_subnet(self, net_cli):
|
||||
self._update_lb_to_ls_association.stop()
|
||||
subnet = fakes.FakeSubnet.create_one_subnet(
|
||||
attrs={'id': 'foo_subnet_id',
|
||||
'name': 'foo_subnet_name',
|
||||
'network_id': 'foo_network_id'})
|
||||
net_dr.return_value.get_subnet.return_value = subnet
|
||||
|
||||
net_cli.return_value.show_subnet.return_value = {
|
||||
'subnet': subnet}
|
||||
self.helper._update_lb_to_ls_association(
|
||||
self.ref_lb1, subnet_id=subnet.id, associate=True)
|
||||
|
||||
self.helper.ovn_nbdb_api.ls_get.assert_called_once_with(
|
||||
'neutron-foo_network_id')
|
||||
|
||||
|
@ -2339,8 +2335,7 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.db_set.assert_called_once_with(
|
||||
'Load_Balancer', self.ref_lb1.uuid, ('external_ids', ls_refs))
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__update_lb_to_ls_association_no_ls(self, net_dr):
|
||||
def test__update_lb_to_ls_association_no_ls(self):
|
||||
self._update_lb_to_ls_association.stop()
|
||||
(self.helper.ovn_nbdb_api.ls_get.return_value.execute.
|
||||
side_effect) = [idlutils.RowNotFound]
|
||||
|
@ -2383,9 +2378,10 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
('external_ids', {'ls_refs': '{}'}))
|
||||
self.helper.ovn_nbdb_api.ls_lb_del.assert_not_called()
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test__update_lb_to_ls_association_network_dis_net_not_found(self, gn):
|
||||
gn.return_value.get_subnet.side_effect = n_exc.NotFound
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test__update_lb_to_ls_association_network_dis_net_not_found(
|
||||
self, net_cli):
|
||||
net_cli.return_value.show_subnet.side_effect = n_exc.NotFound
|
||||
self._update_lb_to_ls_association.stop()
|
||||
(self.helper.ovn_nbdb_api.ls_get.return_value.execute.
|
||||
return_value) = self.network
|
||||
|
@ -2538,8 +2534,7 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
|
||||
@mock.patch('ovn_octavia_provider.driver.OvnProviderHelper.'
|
||||
'_find_ovn_lbs')
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_handle_vip_fip_associate(self, net_dr, fb):
|
||||
def test_handle_vip_fip_associate(self, fb):
|
||||
lb = mock.MagicMock()
|
||||
fip_info = {
|
||||
'action': 'associate',
|
||||
|
@ -2568,8 +2563,8 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'172.26.21.20:80': '192.168.2.149:1010'}))]
|
||||
self.helper.ovn_nbdb_api.assert_has_calls(calls)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_handle_member_dvr_lb_has_no_fip(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_handle_member_dvr_lb_has_no_fip(self, net_cli):
|
||||
lb = mock.MagicMock()
|
||||
info = {
|
||||
'id': self.member_id,
|
||||
|
@ -2580,11 +2575,11 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
lb.external_ids = external_ids
|
||||
self.mock_find_lb_pool_key.return_value = lb
|
||||
self.helper.handle_member_dvr(info)
|
||||
net_dr.assert_not_called()
|
||||
net_cli.show_subnet.assert_not_called()
|
||||
self.helper.ovn_nbdb_api.db_clear.assert_not_called()
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_handle_member_dvr_lb_fip_no_ls_ports(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_handle_member_dvr_lb_fip_no_ls_ports(self, net_cli):
|
||||
lb = mock.MagicMock()
|
||||
info = {
|
||||
'id': self.member_id,
|
||||
|
@ -2604,7 +2599,7 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.helper.ovn_nbdb_api.db_clear.assert_not_called()
|
||||
|
||||
def _test_handle_member_dvr_lb_fip(
|
||||
self, net_dr, action=ovn_driver.REQ_INFO_MEMBER_ADDED):
|
||||
self, net_cli, action=ovn_driver.REQ_INFO_MEMBER_ADDED):
|
||||
lb = mock.MagicMock()
|
||||
fake_port = fakes.FakePort.create_one_port(
|
||||
attrs={'allowed_address_pairs': ''})
|
||||
|
@ -2615,9 +2610,10 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'subnet_id': fake_port['fixed_ips'][0]['subnet_id'],
|
||||
'action': action}
|
||||
member_subnet = fakes.FakeSubnet.create_one_subnet()
|
||||
member_subnet.id = self.member_subnet_id
|
||||
member_subnet.network_id = 'foo'
|
||||
net_dr.return_value.get_subnet.return_value = member_subnet
|
||||
member_subnet['id'] = self.member_subnet_id
|
||||
member_subnet['network_id'] = 'foo'
|
||||
net_cli.return_value.show_subnet.return_value = {
|
||||
'subnet': member_subnet}
|
||||
fake_lsp = fakes.FakeOVNPort.from_neutron_port(
|
||||
fake_port)
|
||||
fake_ls = fakes.FakeOvsdbRow.create_one_ovsdb_row(
|
||||
|
@ -2634,8 +2630,7 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
fip_info = {
|
||||
'floatingip': {
|
||||
'description': 'bar'}}
|
||||
net_dr.return_value.neutron_client.show_floatingip.return_value = (
|
||||
fip_info)
|
||||
net_cli.return_value.show_floatingip.return_value = fip_info
|
||||
self.helper.ovn_nbdb_api.db_find_rows.return_value.\
|
||||
execute.return_value = [fake_nat]
|
||||
external_ids = {
|
||||
|
@ -2656,21 +2651,21 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
mock.ANY]
|
||||
self.helper.ovn_nbdb_api.assert_has_calls(calls)
|
||||
else:
|
||||
(net_dr.return_value.neutron_client.show_floatingip.
|
||||
(net_cli.return_value.show_floatingip.
|
||||
assert_called_once_with('fip_id'))
|
||||
(net_dr.return_value.neutron_client.update_floatingip.
|
||||
(net_cli.return_value.update_floatingip.
|
||||
assert_called_once_with('fip_id', {
|
||||
'floatingip': {'description': 'bar'}}))
|
||||
self.helper.ovn_nbdb_api.db_clear.assert_not_called()
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_handle_member_dvr_lb_fip_member_added(self, net_dr):
|
||||
self._test_handle_member_dvr_lb_fip(net_dr)
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_handle_member_dvr_lb_fip_member_added(self, net_cli):
|
||||
self._test_handle_member_dvr_lb_fip(net_cli)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_handle_member_dvr_lb_fip_member_deleted(self, net_dr):
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_handle_member_dvr_lb_fip_member_deleted(self, net_cli):
|
||||
self._test_handle_member_dvr_lb_fip(
|
||||
net_dr, action=ovn_driver.REQ_INFO_MEMBER_DELETED)
|
||||
net_cli, action=ovn_driver.REQ_INFO_MEMBER_DELETED)
|
||||
|
||||
@mock.patch.object(ovn_driver, 'atexit')
|
||||
def test_ovsdb_connections(self, mock_atexit):
|
||||
|
@ -2701,14 +2696,14 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'network_id': self.vip_dict['vip_network_id'],
|
||||
'admin_state_up': True,
|
||||
'project_id': self.project_id}}
|
||||
with mock.patch.object(ovn_driver, 'get_network_driver') as gn:
|
||||
with mock.patch.object(ovn_driver, 'get_neutron_client') as net_cli:
|
||||
self.vip_dict['vip_address'] = '10.1.10.1'
|
||||
self.helper.create_vip_port(self.project_id,
|
||||
self.loadbalancer_id,
|
||||
self.vip_dict)
|
||||
expected_call = [
|
||||
mock.call().neutron_client.create_port(expected_dict)]
|
||||
gn.assert_has_calls(expected_call)
|
||||
mock.call().create_port(expected_dict)]
|
||||
net_cli.assert_has_calls(expected_call)
|
||||
|
||||
def test_create_vip_port_vip_not_selected(self):
|
||||
expected_dict = {
|
||||
|
@ -2719,19 +2714,19 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'network_id': self.vip_dict['vip_network_id'],
|
||||
'admin_state_up': True,
|
||||
'project_id': self.project_id}}
|
||||
with mock.patch.object(ovn_driver, 'get_network_driver') as gn:
|
||||
with mock.patch.object(ovn_driver, 'get_neutron_client') as net_cli:
|
||||
self.helper.create_vip_port(self.project_id,
|
||||
self.loadbalancer_id,
|
||||
self.vip_dict)
|
||||
expected_call = [
|
||||
mock.call().neutron_client.create_port(expected_dict)]
|
||||
gn.assert_has_calls(expected_call)
|
||||
mock.call().create_port(expected_dict)]
|
||||
net_cli.assert_has_calls(expected_call)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_create_vip_port_vip_selected_already_exist(self, net_dr):
|
||||
net_dr.return_value.neutron_client.create_port.side_effect = [
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_create_vip_port_vip_selected_already_exist(self, net_cli):
|
||||
net_cli.return_value.create_port.side_effect = [
|
||||
n_exc.IpAddressAlreadyAllocatedClient]
|
||||
net_dr.return_value.neutron_client.list_ports.return_value = {
|
||||
net_cli.return_value.list_ports.return_value = {
|
||||
'ports': [
|
||||
{'name': 'ovn-lb-vip-' + self.loadbalancer_id,
|
||||
'id': self.loadbalancer_id}]}
|
||||
|
@ -2747,17 +2742,18 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
'id': self.loadbalancer_id}}
|
||||
self.assertDictEqual(expected, ret)
|
||||
expected_call = [
|
||||
mock.call().neutron_client.list_ports(
|
||||
mock.call().list_ports(
|
||||
network_id='%s' % self.vip_dict['vip_network_id'],
|
||||
name='%s%s' % (ovn_const.LB_VIP_PORT_PREFIX,
|
||||
self.loadbalancer_id))]
|
||||
net_dr.assert_has_calls(expected_call)
|
||||
net_cli.assert_has_calls(expected_call)
|
||||
|
||||
@mock.patch('ovn_octavia_provider.driver.get_network_driver')
|
||||
def test_create_vip_port_vip_selected_other_allocation_exist(self, net_dr):
|
||||
net_dr.return_value.neutron_client.create_port.side_effect = [
|
||||
@mock.patch('ovn_octavia_provider.driver.get_neutron_client')
|
||||
def test_create_vip_port_vip_selected_other_allocation_exist(
|
||||
self, net_cli):
|
||||
net_cli.return_value.create_port.side_effect = [
|
||||
n_exc.IpAddressAlreadyAllocatedClient]
|
||||
net_dr.return_value.neutron_client.list_ports.return_value = {
|
||||
net_cli.return_value.list_ports.return_value = {
|
||||
'ports': []}
|
||||
self.vip_dict['vip_address'] = '10.1.10.1'
|
||||
ret = self.helper.create_vip_port(
|
||||
|
@ -2766,11 +2762,11 @@ class TestOvnProviderHelper(TestOvnOctaviaBase):
|
|||
self.vip_dict)
|
||||
self.assertIsNone(ret)
|
||||
expected_call = [
|
||||
mock.call().neutron_client.list_ports(
|
||||
mock.call().list_ports(
|
||||
network_id='%s' % self.vip_dict['vip_network_id'],
|
||||
name='%s%s' % (ovn_const.LB_VIP_PORT_PREFIX,
|
||||
self.loadbalancer_id))]
|
||||
net_dr.assert_has_calls(expected_call)
|
||||
net_cli.assert_has_calls(expected_call)
|
||||
self.helper._update_status_to_octavia.assert_called_once_with(
|
||||
{'loadbalancers':
|
||||
[{'id': self.loadbalancer_id,
|
||||
|
|
|
@ -2,9 +2,11 @@
|
|||
# of appearance. Changing the order has an impact on the overall integration
|
||||
# process, which may cause wedges in the gate later.
|
||||
|
||||
keystoneauth1>=3.4.0 # Apache-2.0
|
||||
netaddr>=0.7.18 # BSD
|
||||
neutron-lib>=1.28.0 # Apache-2.0
|
||||
oslo.config>=5.2.0 # Apache-2.0
|
||||
oslo.utils>=3.33.0 # Apache-2.0
|
||||
ovs>=2.8.0 # Apache-2.0
|
||||
ovsdbapp>=0.17.0 # Apache-2.0
|
||||
pbr!=2.1.0,>=2.0.0 # Apache-2.0
|
||||
|
|
Loading…
Reference in New Issue