Fix handling of source_groups with no-db-compute.

The moving of data around in no-db-compute broke source groups. This
is a combination of a few errors. First, the instance_type data wasn't
being retrieved from system_metadata. Second, the instance_type data
was too deep in the heirarchy and being ignored. Finally, source
groups require a nw info call which causes a db access by
nova-compute.

Fixes bug 1122316

Change-Id: Iccb6e5d336c0b2c8ba41c41ab2e046fc9617835a
This commit is contained in:
Vishvananda Ishaya
2013-02-11 09:00:16 -08:00
parent 032308c792
commit 1564bbce98
4 changed files with 11 additions and 5 deletions

View File

@@ -208,9 +208,9 @@ class ConductorManager(manager.SchedulerDependentManager):
return jsonutils.to_primitive(group) return jsonutils.to_primitive(group)
def security_group_rule_get_by_security_group(self, context, secgroup): def security_group_rule_get_by_security_group(self, context, secgroup):
rule = self.db.security_group_rule_get_by_security_group( rules = self.db.security_group_rule_get_by_security_group(
context, secgroup['id']) context, secgroup['id'])
return jsonutils.to_primitive(rule) return jsonutils.to_primitive(rules, max_depth=4)
def provider_fw_rule_get_all(self, context): def provider_fw_rule_get_all(self, context):
rules = self.db.provider_fw_rule_get_all(context) rules = self.db.provider_fw_rule_get_all(context)

View File

@@ -3203,7 +3203,8 @@ def security_group_rule_get_by_security_group(context, security_group_id,
session=None): session=None):
return _security_group_rule_get_query(context, session=session).\ return _security_group_rule_get_query(context, session=session).\
filter_by(parent_group_id=security_group_id).\ filter_by(parent_group_id=security_group_id).\
options(joinedload_all('grantee_group.instances.instance_type')).\ options(joinedload_all('grantee_group.instances.'
'system_metadata')).\
all() all()

View File

@@ -20,6 +20,7 @@
import functools import functools
import inspect import inspect
from nova.compute import instance_types
from nova.db import base from nova.db import base
from nova import exception from nova import exception
from nova.network import floating_ips from nova.network import floating_ips
@@ -362,8 +363,9 @@ class API(base.Base):
def _get_instance_nw_info(self, context, instance): def _get_instance_nw_info(self, context, instance):
"""Returns all network info related to an instance.""" """Returns all network info related to an instance."""
instance_type = instance_types.extract_instance_type(instance)
args = {'instance_id': instance['uuid'], args = {'instance_id': instance['uuid'],
'rxtx_factor': instance['instance_type']['rxtx_factor'], 'rxtx_factor': instance_type['rxtx_factor'],
'host': instance['host'], 'host': instance['host'],
'project_id': instance['project_id']} 'project_id': instance['project_id']}
nw_info = self.network_rpcapi.get_instance_nw_info(context, **args) nw_info = self.network_rpcapi.get_instance_nw_info(context, **args)

View File

@@ -19,6 +19,7 @@
from oslo.config import cfg from oslo.config import cfg
from nova import conductor
from nova import context from nova import context
from nova import network from nova import network
from nova.network import linux_net from nova.network import linux_net
@@ -398,9 +399,11 @@ class IptablesFirewallDriver(FirewallDriver):
# and should be the only one making # and should be the only one making
# making rpc calls. # making rpc calls.
nw_api = network.API() nw_api = network.API()
capi = conductor.API()
for instance in rule['grantee_group']['instances']: for instance in rule['grantee_group']['instances']:
nw_info = nw_api.get_instance_nw_info(ctxt, nw_info = nw_api.get_instance_nw_info(ctxt,
instance) instance,
capi)
ips = [ip['address'] ips = [ip['address']
for ip in nw_info.fixed_ips() for ip in nw_info.fixed_ips()