summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@yahoo.com>2010-09-29 02:28:09 +0000
committerTarmac <>2010-09-29 02:28:09 +0000
commit1540480db44f55dcee8fe1998ed58a306b03f1df (patch)
tree6a5b111ae15e2b9d7ca607864803bc2b6b1cfc8f
parent2b65cf963b8afbc4703f79d3057e5c19f2894baa (diff)
parentbd5816698316f64a2df700ed361b66e533eb9a31 (diff)
downloadnova-1540480db44f55dcee8fe1998ed58a306b03f1df.tar.gz
nova-1540480db44f55dcee8fe1998ed58a306b03f1df.tar.xz
nova-1540480db44f55dcee8fe1998ed58a306b03f1df.zip
Fix a few errors in api calls related to mistyped database methods for floating_ips: specifically describe addresses and and associate address.
-rw-r--r--nova/api/ec2/cloud.py23
-rw-r--r--nova/db/api.py19
-rw-r--r--nova/db/sqlalchemy/api.py30
-rw-r--r--nova/network/linux_net.py11
-rw-r--r--nova/network/manager.py4
5 files changed, 58 insertions, 29 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index 05e8065f3..f3bd4f9d9 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -101,7 +101,7 @@ class CloudController(object):
def _get_mpi_data(self, project_id):
result = {}
- for instance in db.instance_get_by_project(None, project_id):
+ for instance in db.instance_get_all_by_project(None, project_id):
if instance['fixed_ip']:
line = '%s slots=%d' % (instance['fixed_ip']['address'],
INSTANCE_TYPES[instance['instance_type']]['vcpus'])
@@ -256,7 +256,7 @@ class CloudController(object):
if context.user.is_admin():
volumes = db.volume_get_all(context)
else:
- volumes = db.volume_get_by_project(context, context.project.id)
+ volumes = db.volume_get_all_by_project(context, context.project.id)
volumes = [self._format_volume(context, v) for v in volumes]
@@ -382,14 +382,14 @@ class CloudController(object):
def _format_instances(self, context, reservation_id=None):
reservations = {}
if reservation_id:
- instances = db.instance_get_by_reservation(context,
- reservation_id)
+ instances = db.instance_get_all_by_reservation(context,
+ reservation_id)
else:
if context.user.is_admin():
instances = db.instance_get_all(context)
else:
- instances = db.instance_get_by_project(context,
- context.project.id)
+ instances = db.instance_get_all_by_project(context,
+ context.project.id)
for instance in instances:
if not context.user.is_admin():
if instance['image_id'] == FLAGS.vpn_image_id:
@@ -439,8 +439,8 @@ class CloudController(object):
if context.user.is_admin():
iterator = db.floating_ip_get_all(context)
else:
- iterator = db.floating_ip_get_by_project(context,
- context.project.id)
+ iterator = db.floating_ip_get_all_by_project(context,
+ context.project.id)
for floating_ip_ref in iterator:
address = floating_ip_ref['address']
instance_id = None
@@ -482,14 +482,15 @@ class CloudController(object):
def associate_address(self, context, instance_id, public_ip, **kwargs):
instance_ref = db.instance_get_by_ec2_id(context, instance_id)
- fixed_ip_ref = db.fixed_ip_get_by_instance(context, instance_ref['id'])
+ fixed_address = db.instance_get_fixed_address(context,
+ instance_ref['id'])
floating_ip_ref = db.floating_ip_get_by_address(context, public_ip)
network_topic = self._get_network_topic(context)
rpc.cast(network_topic,
{"method": "associate_floating_ip",
"args": {"context": None,
"floating_address": floating_ip_ref['address'],
- "fixed_address": fixed_ip_ref['address']}})
+ "fixed_address": fixed_address}})
return {'associateResponse': ["Address associated."]}
def disassociate_address(self, context, public_ip, **kwargs):
@@ -640,7 +641,7 @@ class CloudController(object):
rpc.cast(network_topic,
{"method": "disassociate_floating_ip",
"args": {"context": None,
- "address": address}})
+ "floating_address": address}})
address = db.instance_get_fixed_address(context,
instance_ref['id'])
diff --git a/nova/db/api.py b/nova/db/api.py
index 208720ff9..3d633dd0f 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -161,10 +161,15 @@ def floating_ip_get_all(context):
def floating_ip_get_all_by_host(context, host):
- """Get all floating ips."""
+ """Get all floating ips by host."""
return IMPL.floating_ip_get_all_by_host(context, host)
+def floating_ip_get_all_by_project(context, project_id):
+ """Get all floating ips by project."""
+ return IMPL.floating_ip_get_all_by_project(context, project_id)
+
+
def floating_ip_get_by_address(context, address):
"""Get a floating ip by address or raise if it doesn't exist."""
return IMPL.floating_ip_get_by_address(context, address)
@@ -255,14 +260,14 @@ def instance_get_all_by_user(context, user_id):
"""Get all instances."""
return IMPL.instance_get_all(context, user_id)
-def instance_get_by_project(context, project_id):
+def instance_get_all_by_project(context, project_id):
"""Get all instance belonging to a project."""
- return IMPL.instance_get_by_project(context, project_id)
+ return IMPL.instance_get_all_by_project(context, project_id)
-def instance_get_by_reservation(context, reservation_id):
+def instance_get_all_by_reservation(context, reservation_id):
"""Get all instance belonging to a reservation."""
- return IMPL.instance_get_by_reservation(context, reservation_id)
+ return IMPL.instance_get_all_by_reservation(context, reservation_id)
def instance_get_fixed_address(context, instance_id):
@@ -535,9 +540,9 @@ def volume_get_instance(context, volume_id):
return IMPL.volume_get_instance(context, volume_id)
-def volume_get_by_project(context, project_id):
+def volume_get_all_by_project(context, project_id):
"""Get all volumes belonging to a project."""
- return IMPL.volume_get_by_project(context, project_id)
+ return IMPL.volume_get_all_by_project(context, project_id)
def volume_get_by_ec2_id(context, ec2_id):
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index ab8dc8004..05d38d73d 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -19,6 +19,8 @@
Implementation of SQLAlchemy backend
"""
+import sys
+
from nova import db
from nova import exception
from nova import flags
@@ -166,6 +168,7 @@ def floating_ip_allocate_address(_context, host, project_id):
floating_ip_ref = session.query(models.FloatingIp
).filter_by(host=host
).filter_by(fixed_ip_id=None
+ ).filter_by(project_id=None
).filter_by(deleted=False
).with_lockmode('update'
).first()
@@ -253,6 +256,14 @@ def floating_ip_get_all_by_host(_context, host):
).filter_by(deleted=False
).all()
+def floating_ip_get_all_by_project(_context, project_id):
+ session = get_session()
+ return session.query(models.FloatingIp
+ ).options(joinedload_all('fixed_ip.instance')
+ ).filter_by(project_id=project_id
+ ).filter_by(deleted=False
+ ).all()
+
def floating_ip_get_by_address(_context, address):
return models.FloatingIp.find_by_str(address)
@@ -328,7 +339,17 @@ def fixed_ip_disassociate(_context, address):
def fixed_ip_get_by_address(_context, address):
- return models.FixedIp.find_by_str(address)
+ session = get_session()
+ with session.begin():
+ try:
+ return session.query(models.FixedIp
+ ).options(joinedload_all('instance')
+ ).filter_by(address=address
+ ).filter_by(deleted=False
+ ).one()
+ except exc.NoResultFound:
+ new_exc = exception.NotFound("No model for address %s" % address)
+ raise new_exc.__class__, new_exc, sys.exc_info()[2]
def fixed_ip_get_instance(_context, address):
@@ -406,7 +427,7 @@ def instance_get_all_by_user(context, user_id):
).filter_by(user_id=user_id
).all()
-def instance_get_by_project(context, project_id):
+def instance_get_all_by_project(context, project_id):
session = get_session()
return session.query(models.Instance
).options(joinedload_all('fixed_ip.floating_ips')
@@ -415,7 +436,7 @@ def instance_get_by_project(context, project_id):
).all()
-def instance_get_by_reservation(_context, reservation_id):
+def instance_get_all_by_reservation(_context, reservation_id):
session = get_session()
return session.query(models.Instance
).options(joinedload_all('fixed_ip.floating_ips')
@@ -600,6 +621,7 @@ def network_get(_context, network_id):
def network_get_associated_fixed_ips(_context, network_id):
session = get_session()
return session.query(models.FixedIp
+ ).options(joinedload_all('instance')
).filter_by(network_id=network_id
).filter(models.FixedIp.instance_id != None
).filter_by(deleted=False
@@ -850,7 +872,7 @@ def volume_get_all(context):
return models.Volume.all(deleted=_deleted(context))
-def volume_get_by_project(context, project_id):
+def volume_get_all_by_project(context, project_id):
session = get_session()
return session.query(models.Volume
).filter_by(project_id=project_id
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py
index 25a9456b9..b5346218a 100644
--- a/nova/network/linux_net.py
+++ b/nova/network/linux_net.py
@@ -132,8 +132,9 @@ def ensure_bridge(bridge, interface, net_attrs=None):
def get_dhcp_hosts(context, network_id):
"""Get a string containing a network's hosts config in dnsmasq format"""
hosts = []
- for fixed_ip in db.network_get_associated_fixed_ips(context, network_id):
- hosts.append(_host_dhcp(fixed_ip['address']))
+ for fixed_ip_ref in db.network_get_associated_fixed_ips(context,
+ network_id):
+ hosts.append(_host_dhcp(fixed_ip_ref))
return '\n'.join(hosts)
@@ -171,12 +172,12 @@ def update_dhcp(context, network_id):
_execute(command, addl_env=env)
-def _host_dhcp(address):
+def _host_dhcp(fixed_ip_ref):
"""Return a host string for an address"""
- instance_ref = db.fixed_ip_get_instance(None, address)
+ instance_ref = fixed_ip_ref['instance']
return "%s,%s.novalocal,%s" % (instance_ref['mac_address'],
instance_ref['hostname'],
- address)
+ fixed_ip_ref['address'])
def _execute(cmd, *args, **kwargs):
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 321dac914..28c20e994 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -262,7 +262,7 @@ class VlanManager(NetworkManager):
if not fixed_ip_ref['allocated']:
logging.warn("IP %s leased that was already deallocated", address)
return
- instance_ref = self.db.fixed_ip_get_instance(context, address)
+ instance_ref = fixed_ip_ref['instance']
if not instance_ref:
raise exception.Error("IP %s leased that isn't associated" %
address)
@@ -280,7 +280,7 @@ class VlanManager(NetworkManager):
if not fixed_ip_ref['leased']:
logging.warn("IP %s released that was not leased", address)
return
- instance_ref = self.db.fixed_ip_get_instance(context, address)
+ instance_ref = fixed_ip_ref['instance']
if not instance_ref:
raise exception.Error("IP %s released that isn't associated" %
address)