summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@yahoo.com>2010-09-11 08:31:16 -0700
committerVishvananda Ishaya <vishvananda@yahoo.com>2010-09-11 08:31:16 -0700
commitc8a233eb971e2cce9a4fd99581645169a478c0f2 (patch)
tree4e4857b9f9275bdc56cb138d68adee8abf660e1b /nova/db
parentab51f8fa5b41566665c7c559c08311efac2b3adc (diff)
parent6de809d887584bb29a7e39418a3209f1345ed01a (diff)
remerged scheduler
Diffstat (limited to 'nova/db')
-rw-r--r--nova/db/api.py30
-rw-r--r--nova/db/sqlalchemy/api.py55
-rw-r--r--nova/db/sqlalchemy/models.py11
3 files changed, 53 insertions, 43 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index d4068dcea..1b477da72 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -173,12 +173,20 @@ def floating_ip_get_instance(context, address):
####################
-def fixed_ip_allocate(context, network_id):
- """Allocate free fixed ip and return the address.
+def fixed_ip_associate(context, address, instance_id):
+ """Associate fixed ip to instance.
+
+ Raises if fixed ip is not available.
+ """
+ return IMPL.fixed_ip_associate(context, address, instance_id)
+
+
+def fixed_ip_associate_pool(context, network_id, instance_id):
+ """Find free ip in network and associate it to instance.
Raises if one is not available.
"""
- return IMPL.fixed_ip_allocate(context, network_id)
+ return IMPL.fixed_ip_associate_pool(context, network_id, instance_id)
def fixed_ip_create(context, values):
@@ -186,9 +194,9 @@ def fixed_ip_create(context, values):
return IMPL.fixed_ip_create(context, values)
-def fixed_ip_deallocate(context, address):
- """Deallocate a fixed ip by address."""
- return IMPL.fixed_ip_deallocate(context, address)
+def fixed_ip_disassociate(context, address):
+ """Disassociate a fixed ip from an instance by address."""
+ return IMPL.fixed_ip_disassociate(context, address)
def fixed_ip_get_by_address(context, address):
@@ -206,16 +214,6 @@ def fixed_ip_get_network(context, address):
return IMPL.fixed_ip_get_network(context, address)
-def fixed_ip_instance_associate(context, address, instance_id):
- """Associate a fixed ip to an instance by address."""
- return IMPL.fixed_ip_instance_associate(context, address, instance_id)
-
-
-def fixed_ip_instance_disassociate(context, address):
- """Disassociate a fixed ip from an instance by address."""
- return IMPL.fixed_ip_instance_disassociate(context, address)
-
-
def fixed_ip_update(context, address, values):
"""Create a fixed ip from the values dictionary."""
return IMPL.fixed_ip_update(context, address, values)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index ef2896338..735e88145 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -256,7 +256,25 @@ def floating_ip_get_instance(_context, address):
###################
-def fixed_ip_allocate(_context, network_id):
+def fixed_ip_associate(_context, address, instance_id):
+ session = get_session()
+ with session.begin():
+ fixed_ip_ref = session.query(models.FixedIp
+ ).filter_by(address=address
+ ).filter_by(deleted=False
+ ).filter_by(instance=None
+ ).with_lockmode('update'
+ ).first()
+ # NOTE(vish): if with_lockmode isn't supported, as in sqlite,
+ # then this has concurrency issues
+ if not fixed_ip_ref:
+ raise db.NoMoreAddresses()
+ fixed_ip_ref.instance = models.Instance.find(instance_id,
+ session=session)
+ session.add(fixed_ip_ref)
+
+
+def fixed_ip_associate_pool(_context, network_id, instance_id):
session = get_session()
with session.begin():
network_or_none = or_(models.FixedIp.network_id == network_id,
@@ -264,9 +282,8 @@ def fixed_ip_allocate(_context, network_id):
fixed_ip_ref = session.query(models.FixedIp
).filter(network_or_none
).filter_by(reserved=False
- ).filter_by(allocated=False
- ).filter_by(leased=False
).filter_by(deleted=False
+ ).filter_by(instance=None
).with_lockmode('update'
).first()
# NOTE(vish): if with_lockmode isn't supported, as in sqlite,
@@ -276,7 +293,8 @@ def fixed_ip_allocate(_context, network_id):
if not fixed_ip_ref.network:
fixed_ip_ref.network = models.Network.find(network_id,
session=session)
- fixed_ip_ref['allocated'] = True
+ fixed_ip_ref.instance = models.Instance.find(instance_id,
+ session=session)
session.add(fixed_ip_ref)
return fixed_ip_ref['address']
@@ -289,6 +307,14 @@ def fixed_ip_create(_context, values):
return fixed_ip_ref['address']
+def fixed_ip_disassociate(_context, address):
+ session = get_session()
+ with session.begin():
+ fixed_ip_ref = models.FixedIp.find_by_str(address, session=session)
+ fixed_ip_ref.instance = None
+ fixed_ip_ref.save(session=session)
+
+
def fixed_ip_get_by_address(_context, address):
return models.FixedIp.find_by_str(address)
@@ -305,27 +331,6 @@ def fixed_ip_get_network(_context, address):
return models.FixedIp.find_by_str(address, session=session).network
-def fixed_ip_deallocate(context, address):
- db.fixed_ip_update(context, address, {'allocated': False})
-
-
-def fixed_ip_instance_associate(_context, address, instance_id):
- session = get_session()
- with session.begin():
- fixed_ip_ref = models.FixedIp.find_by_str(address, session=session)
- instance_ref = models.Instance.find(instance_id, session=session)
- fixed_ip_ref.instance = instance_ref
- fixed_ip_ref.save(session=session)
-
-
-def fixed_ip_instance_disassociate(_context, address):
- session = get_session()
- with session.begin():
- fixed_ip_ref = models.FixedIp.find_by_str(address, session=session)
- fixed_ip_ref.instance = None
- fixed_ip_ref.save(session=session)
-
-
def fixed_ip_update(_context, address, values):
session = get_session()
with session.begin():
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index a45a2e37d..09bd4b4dc 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -24,8 +24,7 @@ import sys
import datetime
# TODO(vish): clean up these imports
-from sqlalchemy.orm import relationship, backref, validates, exc
-from sqlalchemy.sql import func
+from sqlalchemy.orm import relationship, backref, exc, object_mapper
from sqlalchemy import Column, Integer, String
from sqlalchemy import ForeignKey, DateTime, Boolean, Text
from sqlalchemy.ext.declarative import declarative_base
@@ -113,6 +112,14 @@ class NovaBase(object):
def __getitem__(self, key):
return getattr(self, key)
+ def __iter__(self):
+ self._i = iter(object_mapper(self).columns)
+ return self
+
+ def next(self):
+ n = self._i.next().name
+ return n, getattr(self, n)
+
# TODO(vish): Store images in the database instead of file system
#class Image(BASE, NovaBase):
# """Represents an image in the datastore"""