Merge "Add "standard_attr_id" to some OVO dictionaries"

This commit is contained in:
Zuul 2020-11-20 02:22:22 +00:00 committed by Gerrit Code Review
commit 07f5a6b9df
10 changed files with 77 additions and 25 deletions

View File

@ -143,6 +143,11 @@ class DbBasePluginCommon(object):
allocated.create() allocated.create()
def _make_subnet_dict(self, subnet, fields=None, context=None): def _make_subnet_dict(self, subnet, fields=None, context=None):
if isinstance(subnet, subnet_obj.Subnet):
standard_attr_id = subnet.db_obj.standard_attr.id
else:
standard_attr_id = subnet.standard_attr.id
res = {'id': subnet['id'], res = {'id': subnet['id'],
'name': subnet['name'], 'name': subnet['name'],
'tenant_id': subnet['tenant_id'], 'tenant_id': subnet['tenant_id'],
@ -152,6 +157,7 @@ class DbBasePluginCommon(object):
'enable_dhcp': subnet['enable_dhcp'], 'enable_dhcp': subnet['enable_dhcp'],
'ipv6_ra_mode': subnet['ipv6_ra_mode'], 'ipv6_ra_mode': subnet['ipv6_ra_mode'],
'ipv6_address_mode': subnet['ipv6_address_mode'], 'ipv6_address_mode': subnet['ipv6_address_mode'],
'standard_attr_id': standard_attr_id,
} }
res['gateway_ip'] = str( res['gateway_ip'] = str(
subnet['gateway_ip']) if subnet['gateway_ip'] else None subnet['gateway_ip']) if subnet['gateway_ip'] else None
@ -218,6 +224,13 @@ class DbBasePluginCommon(object):
def _make_port_dict(self, port, fields=None, def _make_port_dict(self, port, fields=None,
process_extensions=True, process_extensions=True,
with_fixed_ips=True): with_fixed_ips=True):
if isinstance(port, port_obj.Port):
port_data = port.db_obj
standard_attr_id = port.db_obj.standard_attr.id
else:
port_data = port
standard_attr_id = port.standard_attr.id
mac = port["mac_address"] mac = port["mac_address"]
if isinstance(mac, netaddr.EUI): if isinstance(mac, netaddr.EUI):
mac.dialect = netaddr.mac_unix_expanded mac.dialect = netaddr.mac_unix_expanded
@ -229,7 +242,9 @@ class DbBasePluginCommon(object):
"admin_state_up": port["admin_state_up"], "admin_state_up": port["admin_state_up"],
"status": port["status"], "status": port["status"],
"device_id": port["device_id"], "device_id": port["device_id"],
"device_owner": port["device_owner"]} "device_owner": port["device_owner"],
'standard_attr_id': standard_attr_id,
}
if with_fixed_ips: if with_fixed_ips:
res["fixed_ips"] = [ res["fixed_ips"] = [
{'subnet_id': ip["subnet_id"], {'subnet_id': ip["subnet_id"],
@ -237,9 +252,6 @@ class DbBasePluginCommon(object):
ip["ip_address"])} for ip in port["fixed_ips"]] ip["ip_address"])} for ip in port["fixed_ips"]]
# Call auxiliary extend functions, if any # Call auxiliary extend functions, if any
if process_extensions: if process_extensions:
port_data = port
if isinstance(port, port_obj.Port):
port_data = port.db_obj
resource_extend.apply_funcs( resource_extend.apply_funcs(
port_def.COLLECTION_NAME, res, port_data) port_def.COLLECTION_NAME, res, port_data)
return db_utils.resource_fields(res, fields) return db_utils.resource_fields(res, fields)
@ -310,7 +322,8 @@ class DbBasePluginCommon(object):
'mtu': network.get('mtu', constants.DEFAULT_NETWORK_MTU), 'mtu': network.get('mtu', constants.DEFAULT_NETWORK_MTU),
'status': network['status'], 'status': network['status'],
'subnets': [subnet['id'] 'subnets': [subnet['id']
for subnet in network['subnets']]} for subnet in network['subnets']],
'standard_attr_id': network.standard_attr.id}
res['shared'] = self._is_network_shared(context, network.rbac_entries) res['shared'] = self._is_network_shared(context, network.rbac_entries)
# Call auxiliary extend functions, if any # Call auxiliary extend functions, if any
if process_extensions: if process_extensions:

View File

@ -1045,7 +1045,9 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase,
'router_id': floatingip.router_id, 'router_id': floatingip.router_id,
'port_id': floatingip.fixed_port_id, 'port_id': floatingip.fixed_port_id,
'fixed_ip_address': fixed_ip_address, 'fixed_ip_address': fixed_ip_address,
'status': floatingip.status} 'status': floatingip.status,
'standard_attr_id': floatingip.db_obj.standard_attr.id,
}
# NOTE(mlavalle): The following assumes this mixin is used in a # NOTE(mlavalle): The following assumes this mixin is used in a
# class inheriting from CommonDbMixin, which is true for all existing # class inheriting from CommonDbMixin, which is true for all existing
# plugins. # plugins.

View File

@ -100,12 +100,12 @@ def _get_standard_attr_id(context, resource_uuid, resource_type):
@db_api.retry_if_session_inactive() @db_api.retry_if_session_inactive()
def create_initial_revision(context, resource_uuid, resource_type, def create_initial_revision(context, resource_uuid, resource_type,
revision_number=INITIAL_REV_NUM, revision_number=INITIAL_REV_NUM,
may_exist=False): may_exist=False, std_attr_id=None):
LOG.debug('create_initial_revision uuid=%s, type=%s, rev=%s', LOG.debug('create_initial_revision uuid=%s, type=%s, rev=%s',
resource_uuid, resource_type, revision_number) resource_uuid, resource_type, revision_number)
db_func = context.session.merge if may_exist else context.session.add db_func = context.session.merge if may_exist else context.session.add
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
std_attr_id = _get_standard_attr_id( std_attr_id = std_attr_id or _get_standard_attr_id(
context, resource_uuid, resource_type) context, resource_uuid, resource_type)
row = ovn_models.OVNRevisionNumbers( row = ovn_models.OVNRevisionNumbers(
resource_uuid=resource_uuid, resource_type=resource_type, resource_uuid=resource_uuid, resource_type=resource_type,
@ -124,7 +124,7 @@ def delete_revision(context, resource_uuid, resource_type):
context.session.delete(row) context.session.delete(row)
def _ensure_revision_row_exist(context, resource, resource_type): def _ensure_revision_row_exist(context, resource, resource_type, std_attr_id):
"""Ensure the revision row exists. """Ensure the revision row exists.
Ensure the revision row exist before we try to bump its revision Ensure the revision row exist before we try to bump its revision
@ -145,7 +145,8 @@ def _ensure_revision_row_exist(context, resource, resource_type):
'%(res_type)s) when bumping the revision number. ' '%(res_type)s) when bumping the revision number. '
'Creating one.', {'res_uuid': resource['id'], 'Creating one.', {'res_uuid': resource['id'],
'res_type': resource_type}) 'res_type': resource_type})
create_initial_revision(context, resource['id'], resource_type) create_initial_revision(context, resource['id'], resource_type,
std_attr_id=std_attr_id)
@db_api.retry_if_session_inactive() @db_api.retry_if_session_inactive()
@ -163,9 +164,16 @@ def get_revision_row(context, resource_uuid):
def bump_revision(context, resource, resource_type): def bump_revision(context, resource, resource_type):
revision_number = ovn_utils.get_revision_number(resource, resource_type) revision_number = ovn_utils.get_revision_number(resource, resource_type)
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
_ensure_revision_row_exist(context, resource, resource_type) # NOTE(ralonsoh): "resource" could be a dict or an OVO.
std_attr_id = _get_standard_attr_id( try:
context, resource['id'], resource_type) std_attr_id = resource.db_obj.standard_attr.id
except AttributeError:
std_attr_id = resource.get('standard_attr_id', None)
_ensure_revision_row_exist(context, resource, resource_type,
std_attr_id)
std_attr_id = (std_attr_id or
_get_standard_attr_id(context, resource['id'],
resource_type))
row = context.session.merge(ovn_models.OVNRevisionNumbers( row = context.session.merge(ovn_models.OVNRevisionNumbers(
standard_attr_id=std_attr_id, resource_uuid=resource['id'], standard_attr_id=std_attr_id, resource_uuid=resource['id'],
resource_type=resource_type)) resource_type=resource_type))

View File

@ -327,7 +327,9 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase,
'name': security_group['name'], 'name': security_group['name'],
'stateful': security_group['stateful'], 'stateful': security_group['stateful'],
'tenant_id': security_group['tenant_id'], 'tenant_id': security_group['tenant_id'],
'description': security_group['description']} 'description': security_group['description'],
'standard_attr_id': security_group.db_obj.standard_attr.id,
}
if security_group.rules: if security_group.rules:
res['security_group_rules'] = [ res['security_group_rules'] = [
self._make_security_group_rule_dict(r.db_obj) self._make_security_group_rule_dict(r.db_obj)
@ -661,7 +663,9 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase,
'port_range_min': security_group_rule['port_range_min'], 'port_range_min': security_group_rule['port_range_min'],
'port_range_max': security_group_rule['port_range_max'], 'port_range_max': security_group_rule['port_range_max'],
'remote_ip_prefix': security_group_rule['remote_ip_prefix'], 'remote_ip_prefix': security_group_rule['remote_ip_prefix'],
'remote_group_id': security_group_rule['remote_group_id']} 'remote_group_id': security_group_rule['remote_group_id'],
'standard_attr_id': security_group_rule.standard_attr.id,
}
resource_extend.apply_funcs(ext_sg.SECURITYGROUPRULES, res, resource_extend.apply_funcs(ext_sg.SECURITYGROUPRULES, res,
security_group_rule) security_group_rule)

View File

@ -341,7 +341,8 @@ class OVNMechanismDriver(api.MechanismDriver):
**kwargs): **kwargs):
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
kwargs['context'], kwargs['security_group']['id'], kwargs['context'], kwargs['security_group']['id'],
ovn_const.TYPE_SECURITY_GROUPS) ovn_const.TYPE_SECURITY_GROUPS,
std_attr_id=kwargs['security_group']['standard_attr_id'])
def _create_security_group(self, resource, event, trigger, def _create_security_group(self, resource, event, trigger,
security_group, **kwargs): security_group, **kwargs):
@ -365,7 +366,8 @@ class OVNMechanismDriver(api.MechanismDriver):
sg_rule = kwargs.get('security_group_rule') sg_rule = kwargs.get('security_group_rule')
context = kwargs.get('context') context = kwargs.get('context')
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
context, sg_rule['id'], ovn_const.TYPE_SECURITY_GROUP_RULES) context, sg_rule['id'], ovn_const.TYPE_SECURITY_GROUP_RULES,
std_attr_id=sg_rule['standard_attr_id'])
def _process_sg_rule_notification( def _process_sg_rule_notification(
self, resource, event, trigger, **kwargs): self, resource, event, trigger, **kwargs):
@ -474,7 +476,8 @@ class OVNMechanismDriver(api.MechanismDriver):
self._validate_network_segments(context.network_segments) self._validate_network_segments(context.network_segments)
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
context._plugin_context, context.current['id'], context._plugin_context, context.current['id'],
ovn_const.TYPE_NETWORKS) ovn_const.TYPE_NETWORKS,
std_attr_id=context.current['standard_attr_id'])
def create_network_postcommit(self, context): def create_network_postcommit(self, context):
"""Create a network. """Create a network.
@ -551,7 +554,8 @@ class OVNMechanismDriver(api.MechanismDriver):
def create_subnet_precommit(self, context): def create_subnet_precommit(self, context):
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
context._plugin_context, context.current['id'], context._plugin_context, context.current['id'],
ovn_const.TYPE_SUBNETS) ovn_const.TYPE_SUBNETS,
std_attr_id=context.current['standard_attr_id'])
def create_subnet_postcommit(self, context): def create_subnet_postcommit(self, context):
self._ovn_client.create_subnet(context._plugin_context, self._ovn_client.create_subnet(context._plugin_context,
@ -597,14 +601,16 @@ class OVNMechanismDriver(api.MechanismDriver):
port['id']) port['id'])
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
context._plugin_context, port['id'], ovn_const.TYPE_PORTS) context._plugin_context, port['id'], ovn_const.TYPE_PORTS,
std_attr_id=context.current['standard_attr_id'])
# in the case of router ports we also need to # in the case of router ports we also need to
# track the creation and update of the LRP OVN objects # track the creation and update of the LRP OVN objects
if ovn_utils.is_lsp_router_port(port): if ovn_utils.is_lsp_router_port(port):
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
context._plugin_context, port['id'], context._plugin_context, port['id'],
ovn_const.TYPE_ROUTER_PORTS) ovn_const.TYPE_ROUTER_PORTS,
std_attr_id=context.current['standard_attr_id'])
def _is_port_provisioning_required(self, port, host, original_host=None): def _is_port_provisioning_required(self, port, host, original_host=None):
vnic_type = port.get(portbindings.VNIC_TYPE, portbindings.VNIC_NORMAL) vnic_type = port.get(portbindings.VNIC_TYPE, portbindings.VNIC_NORMAL)
@ -718,7 +724,8 @@ class OVNMechanismDriver(api.MechanismDriver):
if not ovn_utils.is_lsp_router_port(original_port): if not ovn_utils.is_lsp_router_port(original_port):
ovn_revision_numbers_db.create_initial_revision( ovn_revision_numbers_db.create_initial_revision(
context._plugin_context, port['id'], context._plugin_context, port['id'],
ovn_const.TYPE_ROUTER_PORTS, may_exist=True) ovn_const.TYPE_ROUTER_PORTS, may_exist=True,
std_attr_id=context.current['standard_attr_id'])
def update_port_postcommit(self, context): def update_port_postcommit(self, context):
"""Update a port. """Update a port.

View File

@ -154,7 +154,8 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase,
def create_router_precommit(self, resource, event, trigger, context, def create_router_precommit(self, resource, event, trigger, context,
router, router_id, router_db): router, router_id, router_db):
db_rev.create_initial_revision( db_rev.create_initial_revision(
context, router_id, ovn_const.TYPE_ROUTERS) context, router_id, ovn_const.TYPE_ROUTERS,
std_attr_id=router_db.standard_attr.id)
def create_router(self, context, router): def create_router(self, context, router):
router = super(OVNL3RouterPlugin, self).create_router(context, router) router = super(OVNL3RouterPlugin, self).create_router(context, router)
@ -249,7 +250,8 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase,
def create_floatingip_precommit(self, resource, event, trigger, context, def create_floatingip_precommit(self, resource, event, trigger, context,
floatingip, floatingip_id, floatingip_db): floatingip, floatingip_id, floatingip_db):
db_rev.create_initial_revision( db_rev.create_initial_revision(
context, floatingip_id, ovn_const.TYPE_FLOATINGIPS) context, floatingip_id, ovn_const.TYPE_FLOATINGIPS,
std_attr_id=floatingip_db.standard_attr.id)
def create_floatingip(self, context, floatingip, def create_floatingip(self, context, floatingip,
initial_status=n_const.FLOATINGIP_STATUS_DOWN): initial_status=n_const.FLOATINGIP_STATUS_DOWN):

View File

@ -286,6 +286,7 @@ class SecurityGroupDbMixinTestCase(testlib_api.SqlTestCase):
'name': 'default', 'name': 'default',
'description': 'Default security group', 'description': 'Default security group',
'stateful': mock.ANY, 'stateful': mock.ANY,
'standard_attr_id': mock.ANY,
'security_group_rules': [ 'security_group_rules': [
# Four rules for egress/ingress and ipv4/ipv6 # Four rules for egress/ingress and ipv4/ipv6
mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY, mock.ANY,

View File

@ -3995,7 +3995,8 @@ class L3AgentDbTestCaseBase(L3NatTestCaseMixin):
project_id=f['floatingip']['project_id'], project_id=f['floatingip']['project_id'],
router_id=f['floatingip']['router_id'], router_id=f['floatingip']['router_id'],
status=f['floatingip']['status'], status=f['floatingip']['status'],
tenant_id=f['floatingip']['tenant_id']) tenant_id=f['floatingip']['tenant_id'],
standard_attr_id=mock.ANY)
finally: finally:
registry.unsubscribe(fake_method, resources.FLOATING_IP, registry.unsubscribe(fake_method, resources.FLOATING_IP,
events.AFTER_DELETE) events.AFTER_DELETE)

View File

@ -187,6 +187,16 @@ class FakePlugin(object):
self._get_port_security_group_bindings = mock.Mock() self._get_port_security_group_bindings = mock.Mock()
class FakeStandardAttribute(object):
def __init__(self, _id=1, resource_type=mock.ANY, description=mock.ANY,
revision_number=1):
self.id = _id
self.resource_type = resource_type
self.description = description
self.revision_number = revision_number
class FakeResource(dict): class FakeResource(dict):
def __init__(self, manager=None, info=None, loaded=False, methods=None): def __init__(self, manager=None, info=None, loaded=False, methods=None):
@ -282,6 +292,7 @@ class FakeNetwork(object):
'availability_zones': [], 'availability_zones': [],
'availability_zone_hints': [], 'availability_zone_hints': [],
'is_default': False, 'is_default': False,
'standard_attr_id': 1,
} }
# Overwrite default attributes. # Overwrite default attributes.
@ -659,6 +670,7 @@ class FakeFloatingIp(object):
'dns_domain': '', 'dns_domain': '',
'dns_name': '', 'dns_name': '',
'project_id': '', 'project_id': '',
'standard_attr': FakeStandardAttribute(),
} }
# Overwrite default attributes. # Overwrite default attributes.

View File

@ -1181,6 +1181,7 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase):
with self.port() as port: with self.port() as port:
port_id = port['port']['id'] port_id = port['port']['id']
new_port = plugin.update_port(ctx, port_id, {"port": {}}) new_port = plugin.update_port(ctx, port_id, {"port": {}})
new_port.pop('standard_attr_id')
self.assertEqual(port["port"], new_port) self.assertEqual(port["port"], new_port)
def _add_fake_dhcp_agent(self): def _add_fake_dhcp_agent(self):
@ -2076,6 +2077,7 @@ class TestMl2DvrPortsV2(TestMl2PortsV2):
self.assertEqual(1, publish.call_count) self.assertEqual(1, publish.call_count)
# needed for a full match in the assertion below # needed for a full match in the assertion below
port['port']['extra_dhcp_opts'] = [] port['port']['extra_dhcp_opts'] = []
port['port']['standard_attr_id'] = mock.ANY
expected = [mock.call(resources.PORT, events.PRECOMMIT_DELETE, expected = [mock.call(resources.PORT, events.PRECOMMIT_DELETE,
mock.ANY, network=mock.ANY, bind=mock.ANY, mock.ANY, network=mock.ANY, bind=mock.ANY,
port=port['port'], port_db=mock.ANY, port=port['port'], port_db=mock.ANY,