From 33631c21e71d85910a20997881735aa43160d36a Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Thu, 9 Sep 2010 07:47:30 -0700 Subject: floating ip commands --- bin/nova-manage | 31 +++++++++++++++++++++++++++++++ nova/db/api.py | 25 ++++++++++++++++++++----- nova/db/sqlalchemy/api.py | 32 ++++++++++++++++++++++++++------ 3 files changed, 77 insertions(+), 11 deletions(-) diff --git a/bin/nova-manage b/bin/nova-manage index ecef5d555..408a2d9c8 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -26,6 +26,8 @@ import os import sys import time +import IPy + # If ../nova/__init__.py exists, add ../ to Python search path, so that # it will override what happens to be installed in /usr/(local/)lib/python... possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), @@ -218,12 +220,41 @@ class ProjectCommands(object): with open(filename, 'w') as f: f.write(zip_file) +class FloatingIpCommands(object): + """Class for managing floating ip.""" + + def create(self, host, range): + """Creates floating ips for host by range + arguments: host ip_range""" + for address in IPy.IP(range): + db.floating_ip_create(None, {'address': str(address), + 'host': host}) + + def delete(self, ip_range): + """Deletes floating ips by range + arguments: range""" + for address in IPy.IP(ip_range): + db.floating_ip_destroy(None, str(address)) + + + def list(self, host=None): + """Lists all floating ips (optionally by host) + arguments: [host]""" + if host == None: + floating_ips = db.floating_ip_get_all(None) + else: + floating_ips = db.floating_ip_get_all_by_host(None, host) + for floating_ip in floating_ips: + print "%s\t%s\ti-%s" % (floating_ip['host'], + floating_ip['address'], + floating_ip['instance_id']) CATEGORIES = [ ('user', UserCommands), ('project', ProjectCommands), ('role', RoleCommands), ('vpn', VpnCommands), + ('floating', FloatingIpCommands) ] diff --git a/nova/db/api.py b/nova/db/api.py index 59313b0af..d263f8c94 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -91,6 +91,16 @@ def floating_ip_create(context, values): return IMPL.floating_ip_create(context, values) +def floating_ip_deallocate(context, address): + """Deallocate an floating ip by address""" + return IMPL.floating_ip_deallocate(context, address) + + +def floating_ip_destroy(context, address): + """Destroy the floating_ip or raise if it does not exist.""" + return IMPL.floating_ip_destroy(context, address) + + def floating_ip_disassociate(context, address): """Disassociate an floating ip from a fixed ip by address. @@ -99,11 +109,6 @@ def floating_ip_disassociate(context, address): return IMPL.floating_ip_disassociate(context, address) -def floating_ip_deallocate(context, address): - """Deallocate an floating ip by address""" - return IMPL.floating_ip_deallocate(context, address) - - def floating_ip_fixed_ip_associate(context, floating_address, fixed_address): """Associate an floating ip to a fixed_ip by address.""" return IMPL.floating_ip_fixed_ip_associate(context, @@ -111,6 +116,16 @@ def floating_ip_fixed_ip_associate(context, floating_address, fixed_address): fixed_address) +def floating_ip_get_all(context): + """Get all floating ips.""" + return IMPL.floating_ip_get_all(context) + + +def floating_ip_get_all_by_host(context, host): + """Get all floating ips.""" + return IMPL.floating_ip_get_all_by_host(context, host) + + 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) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 8b94f6036..9180a2a55 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -100,6 +100,23 @@ def floating_ip_fixed_ip_associate(_context, floating_address, fixed_address): floating_ip_ref.save(session=session) +def floating_ip_deallocate(_context, address): + session = get_session() + with session.begin(): + floating_ip_ref = models.FloatingIp.find_by_str(address, + session=session) + floating_ip_ref['project_id'] = None + floating_ip_ref.save(session=session) + + +def floating_ip_destroy(_context, address): + session = get_session() + with session.begin(): + floating_ip_ref = models.FloatingIp.find_by_str(address, + session=session) + floating_ip_ref.delete(session=session) + + def floating_ip_disassociate(_context, address): session = get_session() with session.begin(): @@ -115,14 +132,17 @@ def floating_ip_disassociate(_context, address): return fixed_ip_address -def floating_ip_deallocate(_context, address): +def floating_ip_get_all(_context): + return models.FloatingIp.all() + + +def floating_ip_get_all_by_host(_context, host): session = get_session() with session.begin(): - floating_ip_ref = models.FloatingIp.find_by_str(address, - session=session) - floating_ip_ref['project_id'] = None - floating_ip_ref.save(session=session) - + return session.query(models.FloatingIp + ).filter_by(host=host + ).filter_by(deleted=False + ).all() def floating_ip_get_by_address(_context, address): return models.FloatingIp.find_by_str(address) -- cgit From 4dcc4bc4b459b454431ca60bec0dead2146f52af Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Thu, 9 Sep 2010 07:53:57 -0700 Subject: list command for floating ips --- bin/nova-manage | 9 ++++++--- nova/db/sqlalchemy/api.py | 16 ++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/bin/nova-manage b/bin/nova-manage index 408a2d9c8..56191252a 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -245,9 +245,12 @@ class FloatingIpCommands(object): else: floating_ips = db.floating_ip_get_all_by_host(None, host) for floating_ip in floating_ips: - print "%s\t%s\ti-%s" % (floating_ip['host'], - floating_ip['address'], - floating_ip['instance_id']) + instance = None + if floating_ip['fixed_ip']: + instance = floating_ip['fixed_ip']['instance']['str_id'] + print "%s\t%s\t%s" % (floating_ip['host'], + floating_ip['address'], + instance) CATEGORIES = [ ('user', UserCommands), diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 4330c86a9..eb39166ac 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -144,16 +144,20 @@ def floating_ip_disassociate(_context, address): def floating_ip_get_all(_context): - return models.FloatingIp.all() + session = get_session() + return session.query(models.FloatingIp + ).options(joinedload_all('fixed_ip.instance') + ).filter_by(deleted=False + ).all() def floating_ip_get_all_by_host(_context, host): session = get_session() - with session.begin(): - return session.query(models.FloatingIp - ).filter_by(host=host - ).filter_by(deleted=False - ).all() + return session.query(models.FloatingIp + ).options(joinedload_all('fixed_ip.instance') + ).filter_by(host=host + ).filter_by(deleted=False + ).all() def floating_ip_get_by_address(_context, address): return models.FloatingIp.find_by_str(address) -- cgit