From 07568f68e6dfe652d6063c696b9be96447a9c992 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Tue, 4 Jun 2013 05:05:08 -0400 Subject: Session cleanup for db.security_group_* methods Remove session parameter from: security_group_get security_group_get_by_name security_group_create security_group_update security_group_ensure_default security_group_count_by_project left as is as it involves quota changes and will be done separately with other _count_by_project functions. Convert security_group_destroy to use model_query() instead of session.query(). blueprint db-session-cleanup Change-Id: I31e8333f67cf900b6f4aa6c5b967a9a6fb71147e --- nova/db/sqlalchemy/api.py | 142 ++++++++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 63 deletions(-) (limited to 'nova') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 9e0f8f7e0..51232ce09 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1459,8 +1459,7 @@ def instance_create(context, values): def _get_sec_group_models(session, security_groups): models = [] - default_group = security_group_ensure_default(context, - session=session) + default_group = security_group_ensure_default(context) if 'default' in security_groups: models.append(default_group) # Generate a new list, so we don't modify the original @@ -3209,6 +3208,16 @@ def block_device_mapping_destroy_by_instance_and_device(context, instance_uuid, ################### +def _security_group_create(context, values, session=None): + security_group_ref = models.SecurityGroup() + # FIXME(devcamcar): Unless I do this, rules fails with lazy load exception + # once save() is called. This will get cleaned up in next orm pass. + security_group_ref.rules + security_group_ref.update(values) + security_group_ref.save(session=session) + return security_group_ref + + def _security_group_get_query(context, session=None, read_deleted=None, project_only=False, join_rules=True): query = model_query(context, models.SecurityGroup, session=session, @@ -3224,7 +3233,7 @@ def _security_group_get_by_names(context, session, project_id, group_names): Raise SecurityGroupNotFoundForProject for a name not found. """ query = _security_group_get_query(context, session=session, - read_deleted="no", join_rules=False).\ + read_deleted="no", join_rules=False).\ filter_by(project_id=project_id).\ filter(models.SecurityGroup.name.in_(group_names)) sg_models = query.all() @@ -3245,11 +3254,10 @@ def security_group_get_all(context): @require_context -def security_group_get(context, security_group_id, columns_to_join=None, - session=None): - query = _security_group_get_query(context, session=session, - project_only=True).\ - filter_by(id=security_group_id) +def security_group_get(context, security_group_id, columns_to_join=None): + query = _security_group_get_query(context, project_only=True).\ + filter_by(id=security_group_id) + if columns_to_join is None: columns_to_join = [] if 'instances' in columns_to_join: @@ -3265,12 +3273,9 @@ def security_group_get(context, security_group_id, columns_to_join=None, @require_context def security_group_get_by_name(context, project_id, group_name, - columns_to_join=None, session=None): - if session is None: - session = get_session() - - query = _security_group_get_query(context, session=session, - read_deleted="no", join_rules=False).\ + columns_to_join=None): + query = _security_group_get_query(context, + read_deleted="no", join_rules=False).\ filter_by(project_id=project_id).\ filter_by(name=group_name) @@ -3335,70 +3340,77 @@ def security_group_in_use(context, group_id): @require_context -def security_group_create(context, values, session=None): - security_group_ref = models.SecurityGroup() - # FIXME(devcamcar): Unless I do this, rules fails with lazy load exception - # once save() is called. This will get cleaned up in next orm pass. - security_group_ref.rules - security_group_ref.update(values) - if session is None: - session = get_session() - security_group_ref.save(session=session) - return security_group_ref +def security_group_create(context, values): + return _security_group_create(context, values) @require_context -def security_group_update(context, security_group_id, values, session=None): - security_group_ref = model_query(context, models.SecurityGroup, - session=session).filter_by(id=security_group_id).first() +def security_group_update(context, security_group_id, values): + session = get_session() + with session.begin(): + security_group_ref = model_query(context, models.SecurityGroup, + session=session).\ + filter_by(id=security_group_id).\ + first() - if not security_group_ref: - raise exception.SecurityGroupNotFound( - security_group_id=security_group_id) - security_group_ref.update(values) - return security_group_ref + if not security_group_ref: + raise exception.SecurityGroupNotFound( + security_group_id=security_group_id) + security_group_ref.update(values) + return security_group_ref -def security_group_ensure_default(context, session=None): +def security_group_ensure_default(context): """Ensure default security group exists for a project_id.""" - try: - default_group = security_group_get_by_name(context, - context.project_id, 'default', - columns_to_join=[], session=session) - except exception.NotFound: - values = {'name': 'default', - 'description': 'default', - 'user_id': context.user_id, - 'project_id': context.project_id} - default_group = security_group_create(context, values, - session=session) - for default_rule in security_group_default_rule_list(context): - # This is suboptimal, it should be programmatic to know - # the values of the default_rule - rule_values = {'protocol': default_rule.protocol, - 'from_port': default_rule.from_port, - 'to_port': default_rule.to_port, - 'cidr': default_rule.cidr, - 'parent_group_id': default_group.id, - } - security_group_rule_create(context, rule_values) - return default_group + session = get_session() + with session.begin(): + try: + default_group = _security_group_get_by_names(context, + session, + context.project_id, + ['default'])[0] + except exception.NotFound: + values = {'name': 'default', + 'description': 'default', + 'user_id': context.user_id, + 'project_id': context.project_id} + default_group = _security_group_create(context, values, + session=session) + default_rules = _security_group_rule_get_default_query(context, + session=session).all() + for default_rule in default_rules: + # This is suboptimal, it should be programmatic to know + # the values of the default_rule + rule_values = {'protocol': default_rule.protocol, + 'from_port': default_rule.from_port, + 'to_port': default_rule.to_port, + 'cidr': default_rule.cidr, + 'parent_group_id': default_group.id, + } + _security_group_rule_create(context, + rule_values, + session=session) + return default_group @require_context def security_group_destroy(context, security_group_id): session = get_session() with session.begin(): - session.query(models.SecurityGroup).\ + model_query(context, models.SecurityGroup, + session=session).\ filter_by(id=security_group_id).\ soft_delete() - session.query(models.SecurityGroupInstanceAssociation).\ + model_query(context, models.SecurityGroupInstanceAssociation, + session=session).\ filter_by(security_group_id=security_group_id).\ soft_delete() - session.query(models.SecurityGroupIngressRule).\ + model_query(context, models.SecurityGroupIngressRule, + session=session).\ filter_by(group_id=security_group_id).\ soft_delete() - session.query(models.SecurityGroupIngressRule).\ + model_query(context, models.SecurityGroupIngressRule, + session=session).\ filter_by(parent_group_id=security_group_id).\ soft_delete() @@ -3414,6 +3426,13 @@ def security_group_count_by_project(context, project_id, session=None): ################### +def _security_group_rule_create(context, values, session=None): + security_group_rule_ref = models.SecurityGroupIngressRule() + security_group_rule_ref.update(values) + security_group_rule_ref.save(session=session) + return security_group_rule_ref + + def _security_group_rule_get_query(context, session=None): return model_query(context, models.SecurityGroupIngressRule, session=session) @@ -3452,10 +3471,7 @@ def security_group_rule_get_by_security_group_grantee(context, @require_context def security_group_rule_create(context, values): - security_group_rule_ref = models.SecurityGroupIngressRule() - security_group_rule_ref.update(values) - security_group_rule_ref.save() - return security_group_rule_ref + return _security_group_rule_create(context, values) @require_context -- cgit