Merge "deepcopy binding and binding levels avoid expiration" into stable/newton
This commit is contained in:
commit
4853229fea
|
@ -13,6 +13,8 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import copy
|
||||
|
||||
from neutron_lib import constants
|
||||
from oslo_log import log
|
||||
from oslo_serialization import jsonutils
|
||||
|
@ -96,8 +98,10 @@ class PortContext(MechanismDriverContext, api.PortContext):
|
|||
else:
|
||||
self._network_context = NetworkContext(
|
||||
plugin, plugin_context, network) if network else None
|
||||
self._binding = binding
|
||||
self._binding_levels = binding_levels
|
||||
# NOTE(kevinbenton): these copys can go away once we are working with
|
||||
# OVO objects here instead of native SQLA objects.
|
||||
self._binding = copy.deepcopy(binding)
|
||||
self._binding_levels = copy.deepcopy(binding_levels)
|
||||
self._segments_to_bind = None
|
||||
self._new_bound_segment = None
|
||||
self._next_segments_to_bind = None
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import copy
|
||||
|
||||
from eventlet import greenthread
|
||||
from neutron_lib.api import validators
|
||||
from neutron_lib import constants as const
|
||||
|
@ -348,6 +350,10 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
|
|||
binding.host = ''
|
||||
|
||||
self._update_port_dict_binding(port, binding)
|
||||
# merging here brings binding changes into the session so they can be
|
||||
# committed since the binding attached to the context is detached from
|
||||
# the session
|
||||
mech_context._plugin_context.session.merge(binding)
|
||||
return changes
|
||||
|
||||
def _bind_port_if_needed(self, context, allow_notify=False,
|
||||
|
@ -510,6 +516,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
|
|||
cur_binding.vif_details = new_binding.vif_details
|
||||
db.clear_binding_levels(session, port_id, cur_binding.host)
|
||||
db.set_binding_levels(session, bind_context._binding_levels)
|
||||
# refresh context with a snapshot of updated state
|
||||
cur_context._binding = copy.deepcopy(cur_binding)
|
||||
cur_context._binding_levels = bind_context._binding_levels
|
||||
|
||||
# Update PortContext's port dictionary to reflect the
|
||||
|
@ -1414,6 +1422,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
|
|||
self._update_port_dict_binding(port, binding)
|
||||
binding.host = attrs and attrs.get(portbindings.HOST_ID)
|
||||
binding.router_id = attrs and attrs.get('device_id')
|
||||
# merge into session to reflect changes
|
||||
mech_context._plugin_context.session.merge(binding)
|
||||
|
||||
@utils.transaction_guard
|
||||
@db_api.retry_if_session_inactive()
|
||||
|
@ -1635,8 +1645,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
|
|||
session, port['id'], host)
|
||||
if not binding:
|
||||
return
|
||||
binding['status'] = status
|
||||
binding.update(binding)
|
||||
binding.status = status
|
||||
updated = True
|
||||
|
||||
if (updated and
|
||||
|
|
|
@ -1596,7 +1596,8 @@ class TestMl2PortBinding(Ml2PluginV2TestCase,
|
|||
plugin = manager.NeutronManager.get_plugin()
|
||||
binding = ml2_db.get_locked_port_and_binding(self.context.session,
|
||||
port['port']['id'])[1]
|
||||
binding['host'] = 'test'
|
||||
with self.context.session.begin(subtransactions=True):
|
||||
binding.host = 'test'
|
||||
mech_context = driver_context.PortContext(
|
||||
plugin, self.context, port['port'],
|
||||
plugin.get_network(self.context, port['port']['network_id']),
|
||||
|
@ -1604,7 +1605,9 @@ class TestMl2PortBinding(Ml2PluginV2TestCase,
|
|||
with mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin.'
|
||||
'_update_port_dict_binding') as update_mock:
|
||||
attrs = {portbindings.HOST_ID: None}
|
||||
plugin._process_port_binding(mech_context, attrs)
|
||||
self.assertEqual('test', binding.host)
|
||||
with self.context.session.begin(subtransactions=True):
|
||||
plugin._process_port_binding(mech_context, attrs)
|
||||
self.assertTrue(update_mock.mock_calls)
|
||||
self.assertEqual('', binding.host)
|
||||
|
||||
|
@ -2507,7 +2510,7 @@ class TestMl2PluginCreateUpdateDeletePort(base.BaseTestCase):
|
|||
binding.host = 'vm_host'
|
||||
binding.vnic_type = portbindings.VNIC_NORMAL
|
||||
binding.profile = ''
|
||||
binding.vif_type = ''
|
||||
binding.vif_type = 'unbound'
|
||||
binding.vif_details = ''
|
||||
|
||||
with mock.patch.object(ml2_plugin.Ml2Plugin, '__init__') as init,\
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
import mock
|
||||
from neutron_lib import constants as const
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from neutron import context
|
||||
from neutron.extensions import portbindings
|
||||
|
@ -194,7 +195,7 @@ class PortBindingTestCase(test_plugin.NeutronDbPluginV2TestCase):
|
|||
port_id=original_port['id'],
|
||||
host=original_port['binding:host_id'],
|
||||
vnic_type=original_port['binding:vnic_type'],
|
||||
profile=original_port['binding:profile'],
|
||||
profile=jsonutils.dumps(original_port['binding:profile']),
|
||||
vif_type=original_port['binding:vif_type'],
|
||||
vif_details=original_port['binding:vif_details'])
|
||||
levels = 1
|
||||
|
|
Loading…
Reference in New Issue