From f8a25024ff4a3225b3c7ba7de0927916b39126fc Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 10 Sep 2010 07:34:10 -0700 Subject: add a simple iterator to NovaBase to support converting into dictionary --- nova/db/sqlalchemy/models.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 679a44d21..6818f838c 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""" -- cgit From 6083273c9949b0e49a0c0af7cfc8f0fb83ea7c79 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 11 Sep 2010 03:06:27 -0700 Subject: fix network association issue --- nova/db/sqlalchemy/api.py | 1 + 1 file changed, 1 insertion(+) (limited to 'nova/db') diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 02ebdd222..bcdea4b67 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -185,6 +185,7 @@ def fixed_ip_allocate(_context, network_id): ).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, -- cgit From 2f3a63ac73176ed91cfcf8b011a2769fbf88201a Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 11 Sep 2010 03:31:40 -0700 Subject: simplified network instance association --- nova/db/api.py | 30 ++++++++++++-------------- nova/db/sqlalchemy/api.py | 54 +++++++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 41 deletions(-) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index d81673fad..6a0386bad 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -139,12 +139,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_allocate(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_allocate(context, network_id, instance_id) def fixed_ip_create(context, values): @@ -152,9 +160,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_instance_disassociate(context, address) def fixed_ip_get_by_address(context, address): @@ -172,16 +180,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 bcdea4b67..485dca2b0 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -174,7 +174,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, @@ -182,8 +200,6 @@ 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' @@ -195,7 +211,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'] @@ -208,6 +225,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) @@ -224,27 +249,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(): -- cgit From b574d88fd6b27ac59bc51867e824f4ec9e1f7632 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 11 Sep 2010 04:01:44 -0700 Subject: fixed tests, added a flag for updating dhcp on disassociate --- nova/db/api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'nova/db') diff --git a/nova/db/api.py b/nova/db/api.py index 6a0386bad..d749ae50a 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -144,7 +144,7 @@ def fixed_ip_associate(context, address, instance_id): Raises if fixed ip is not available. """ - return IMPL.fixed_ip_allocate(context, address, instance_id) + return IMPL.fixed_ip_associate(context, address, instance_id) def fixed_ip_associate_pool(context, network_id, instance_id): @@ -152,7 +152,7 @@ def fixed_ip_associate_pool(context, network_id, instance_id): Raises if one is not available. """ - return IMPL.fixed_ip_allocate(context, network_id, instance_id) + return IMPL.fixed_ip_associate_pool(context, network_id, instance_id) def fixed_ip_create(context, values): @@ -162,7 +162,7 @@ def fixed_ip_create(context, values): def fixed_ip_disassociate(context, address): """Disassociate a fixed ip from an instance by address.""" - return IMPL.fixed_ip_instance_disassociate(context, address) + return IMPL.fixed_ip_disassociate(context, address) def fixed_ip_get_by_address(context, address): -- cgit