Protect security group operations with the retry decorator

Adds the retry decorator to the security group DB module.

Partial-Bug: #1612798
Change-Id: I899ed5cacde769ecbb4057b6cb48e3624b07e149
This commit is contained in:
Kevin Benton 2016-09-07 19:06:41 -07:00
parent ad13bdfa27
commit 5902d0f174
2 changed files with 18 additions and 0 deletions

View File

@ -60,6 +60,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
{'event': event, 'reason': e})
raise exc_cls(reason=reason, id=id)
@db_api.retry_if_session_inactive()
def create_security_group(self, context, security_group, default_sg=False):
"""Create security group.
@ -122,6 +123,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
**kwargs)
return secgroup_dict
@db_api.retry_if_session_inactive()
def get_security_groups(self, context, filters=None, fields=None,
sorts=None, limit=None,
marker=None, page_reverse=False, default_sg=False):
@ -147,10 +149,12 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
limit=limit, marker_obj=marker_obj,
page_reverse=page_reverse)
@db_api.retry_if_session_inactive()
def get_security_groups_count(self, context, filters=None):
return self._get_collection_count(context, sg_models.SecurityGroup,
filters=filters)
@db_api.retry_if_session_inactive()
def get_security_group(self, context, id, fields=None, tenant_id=None):
"""Tenant id is given to handle the case when creating a security
group rule on behalf of another use.
@ -180,6 +184,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
raise ext_sg.SecurityGroupNotFound(id=id)
return sg
@db_api.retry_if_session_inactive()
def delete_security_group(self, context, id):
filters = {'security_group_id': [id]}
ports = self._get_port_security_group_bindings(context, filters)
@ -213,6 +218,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
registry.notify(resources.SECURITY_GROUP, events.AFTER_DELETE, self,
**kwargs)
@db_api.retry_if_session_inactive()
def update_security_group(self, context, id, security_group):
s = security_group['security_group']
@ -256,6 +262,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
'security_group_id': security_group['security_group_id']}
return self._fields(res, fields)
@db_api.retry_if_session_inactive()
def _create_port_security_group_binding(self, context, port_id,
security_group_id):
with context.session.begin(subtransactions=True):
@ -270,6 +277,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
self._make_security_group_binding_dict,
filters=filters, fields=fields)
@db_api.retry_if_session_inactive()
def _delete_port_security_group_bindings(self, context, port_id):
query = self._model_query(context, sg_models.SecurityGroupPortBinding)
bindings = query.filter(
@ -278,10 +286,12 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
for binding in bindings:
context.session.delete(binding)
@db_api.retry_if_session_inactive()
def create_security_group_rule_bulk(self, context, security_group_rules):
return self._create_bulk('security_group_rule', context,
security_group_rules)
@db_api.retry_if_session_inactive()
def create_security_group_rule_bulk_native(self, context,
security_group_rules):
rules = security_group_rules['security_group_rules']
@ -300,6 +310,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
ret.append(res_rule_dict)
return ret
@db_api.retry_if_session_inactive()
def create_security_group_rule(self, context, security_group_rule):
return self._create_security_group_rule(context, security_group_rule)
@ -557,6 +568,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
raise ext_sg.SecurityGroupRuleParameterConflict(
ethertype=rule['ethertype'], cidr=input_prefix)
@db_api.retry_if_session_inactive()
def get_security_group_rules(self, context, filters=None, fields=None,
sorts=None, limit=None, marker=None,
page_reverse=False):
@ -570,10 +582,12 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
limit=limit, marker_obj=marker_obj,
page_reverse=page_reverse)
@db_api.retry_if_session_inactive()
def get_security_group_rules_count(self, context, filters=None):
return self._get_collection_count(context, sg_models.SecurityGroupRule,
filters=filters)
@db_api.retry_if_session_inactive()
def get_security_group_rule(self, context, id, fields=None):
security_group_rule = self._get_security_group_rule(context, id)
return self._make_security_group_rule_dict(security_group_rule, fields)
@ -586,6 +600,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
raise ext_sg.SecurityGroupRuleNotFound(id=id)
return sgr
@db_api.retry_if_session_inactive()
def delete_security_group_rule(self, context, id):
kwargs = {
'context': context,

View File

@ -21,6 +21,7 @@ from sqlalchemy.orm import exc
from neutron._i18n import _, _LW
from neutron.common import utils
from neutron.db import api as db_api
from neutron.db.models import allowed_address_pair as aap_models
from neutron.db.models import securitygroup as sg_models
from neutron.db import models_v2
@ -164,6 +165,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
def notify_security_groups_member_updated(self, context, port):
self.notify_security_groups_member_updated_bulk(context, [port])
@db_api.retry_if_session_inactive()
def security_group_info_for_ports(self, context, ports):
sg_info = {'devices': ports,
'security_groups': {},
@ -446,6 +448,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
self._add_ingress_ra_rule(port, ips_ra)
self._add_ingress_dhcp_rule(port, ips_dhcp)
@db_api.retry_if_session_inactive()
def security_group_rules_for_ports(self, context, ports):
rules_in_db = self._select_rules_for_ports(context, ports)
for (port_id, rule_in_db) in rules_in_db: