summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorTrey Morris <trey.morris@rackspace.com>2011-03-14 13:32:22 -0500
committerTrey Morris <trey.morris@rackspace.com>2011-03-14 13:32:22 -0500
commit093c8200a102891232e2da166830cd59ee133fc4 (patch)
treef07ed6dac0a7e83fe9bf6adf6dc4b4ea0d3da02d /nova/db
parent18e16ab9f5be77764a810b2d6ac5ae8c5be6bb52 (diff)
downloadnova-093c8200a102891232e2da166830cd59ee133fc4.tar.gz
nova-093c8200a102891232e2da166830cd59ee133fc4.tar.xz
nova-093c8200a102891232e2da166830cd59ee133fc4.zip
committing to share
Diffstat (limited to 'nova/db')
-rw-r--r--nova/db/api.py39
-rw-r--r--nova/db/sqlalchemy/api.py131
-rw-r--r--nova/db/sqlalchemy/models.py76
3 files changed, 198 insertions, 48 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index dcaf55e8f..5b92afbcd 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -325,6 +325,37 @@ def fixed_ip_update(context, address, values):
####################
+def mac_address_create(context, values):
+ """create a new mac address record in teh database"""
+ return IMPL.mac_address_create(context, values)
+
+
+def mac_address_get(context, mac_address):
+ """gets a mac address from the table"""
+ return IMPL.mac_address_get(context, mac_address)
+
+
+def mac_address_get_all_by_instance(context, instance_id):
+ """gets all mac addresses for instance"""
+ return IMPL.mac_address_get_all_by_instance(context, instance_id)
+
+
+def mac_address_get_all_by_network(context, network_id):
+ """gets all mac addresses for instance"""
+ return IMPL.mac_address_get_all_by_network(context, network_id)
+
+
+def mac_address_delete(context, mac_address):
+ """delete mac address record in teh database"""
+ return IMPL.mac_address_delete(context, mac_address)
+
+
+def mac_address_delete_by_instance(context, instance_id):
+ """delete mac address record in teh database"""
+ return IMPL.mac_address_delete_by_instance(context, instance_id)
+####################
+
+
def instance_create(context, values):
"""Create an instance from the values dictionary."""
return IMPL.instance_create(context, values)
@@ -370,13 +401,13 @@ def instance_get_all_by_reservation(context, reservation_id):
return IMPL.instance_get_all_by_reservation(context, reservation_id)
-def instance_get_fixed_address(context, instance_id):
+def instance_get_fixed_addresses(context, instance_id):
"""Get the fixed ip address of an instance."""
- return IMPL.instance_get_fixed_address(context, instance_id)
+ return IMPL.instance_get_fixed_addresses(context, instance_id)
-def instance_get_fixed_address_v6(context, instance_id):
- return IMPL.instance_get_fixed_address_v6(context, instance_id)
+def instance_get_fixed_addresses_v6(context, instance_id):
+ return IMPL.instance_get_fixed_addresses_v6(context, instance_id)
def instance_get_floating_address(context, instance_id):
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 6df2a8843..6e59f4b1d 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -630,11 +630,16 @@ def fixed_ip_get_all_by_instance(context, instance_id):
@require_context
def fixed_ip_get_instance_v6(context, address):
session = get_session()
+
+ # convert IPv6 address to mac
mac = utils.to_mac(address)
+ # get mac address row
+ mac_ref = mac_address_get(context, mac)
+
+ # look up instance based on instance_id from mac address row
result = session.query(models.Instance).\
- filter_by(mac_address=mac).\
- first()
+ filter_by(id=mac_ref.instance_id)
return result
@@ -659,6 +664,98 @@ def fixed_ip_update(context, address, values):
@require_context
+def mac_address_create(context, values):
+ """create a new mac address record in teh database
+
+ context = request context object
+ values = dict containing column values
+ """
+ mac_address_ref = models.MacAddress()
+ mac_address_ref.update(values)
+ mac_address_ref.save()
+
+ session = get_session()
+ with session.begin():
+ instance = instance_get(context, instance_id, session=session)
+ network = network_get(context, network_id, session=session)
+ mac_address.instance = instance
+ mac_address.network = network
+ mac_address_ref.save(session=session)
+ return mac_address_ref
+
+
+def mac_address_get(context, mac_address):
+ """gets a mac address from the table
+
+ context = request context object
+ mac_address = the mac you're looking to get
+ """
+ session = get_session()
+ with session.begin():
+ mac_address_ref = session.query(models.MacAddress).\
+ filter_by(mac_address=mac_address)
+ return mac_address_ref
+
+
+@require_context
+def mac_address_get_all_by_instance(context, instance_id):
+ """gets all mac addresses for instance
+
+ context = request context object
+ instance_id = instance to retreive macs for
+ """
+ session = get_session()
+ with session.begin():
+ mac_address_refs = session.query(models.MacAddress).\
+ filter_by(instance_id=instance_id)
+ return mac_address_refs
+
+
+@require_context
+def mac_address_get_all_by_network(context, network_id):
+ """gets all mac addresses for instance
+
+ context = request context object
+ network_id = network to retreive macs for
+ """
+ session = get_session()
+ with session.begin():
+ mac_address_refs = session.query(models.MacAddress).\
+ filter_by(network_id=network_id)
+ return mac_address_refs
+
+
+@require_context
+def mac_address_delete(context, mac_address):
+ """delete mac address record in teh database
+
+ context = request context object
+ instance_id = instance to remove macs for
+ """
+ ref = mac_address_get(mac_address)
+ session = get_session()
+ with session.begin():
+ ref.delete(session=session)
+
+
+@require_context
+def mac_address_delete_by_instance(context, instance_id):
+ """delete mac address record in teh database
+
+ context = request context object
+ instance_id = instance to remove macs for
+ """
+ refs = mac_address_get_all_by_instance(instance_id)
+ session = get_session()
+ with session.begin():
+ for ref in refs:
+ ref.delete(session=session)
+
+
+###################
+
+
+@require_context
def instance_create(context, values):
"""Create a new Instance record in the database.
@@ -819,24 +916,35 @@ def instance_get_project_vpn(context, project_id):
@require_context
-def instance_get_fixed_address(context, instance_id):
+def instance_get_fixed_addresses(context, instance_id):
session = get_session()
with session.begin():
instance_ref = instance_get(context, instance_id, session=session)
- if not instance_ref.fixed_ip:
+ if not instance_ref.fixed_ips:
return None
- return instance_ref.fixed_ip['address']
+ return [fixed_ip.address for fixed_ip in instance_ref.fixed_ips]
@require_context
-def instance_get_fixed_address_v6(context, instance_id):
+def instance_get_fixed_addresses_v6(context, instance_id):
session = get_session()
with session.begin():
+ # get instance
instance_ref = instance_get(context, instance_id, session=session)
- network_ref = network_get_by_instance(context, instance_id)
- prefix = network_ref.cidr_v6
- mac = instance_ref.mac_address
- return utils.to_global_ipv6(prefix, mac)
+ # get networks associated with instance
+ network_refs = network_get_all_by_instance(context, instance_id)
+ # compile a list of cidr_v6 prefixes sorted by network id
+ prefixes = [ref.cidr_v6 for ref in
+ sorted(network_refs, key=lambda ref: ref.id)]
+ # get mac rows associated with instance
+ mac_refs = mac_address_get_all_by_instance(context, instance_ref.id)
+ # compile of list of the mac_addresses sorted by network id
+ macs = [ref.mac_address for ref in
+ sorted(mac_refs, key=lambda ref: ref.network_id)]
+ # combine prefixes and macs into (prefix,mac) pairs
+ prefix_mac_pairs = zip(prefixes, macs)
+ # return list containing ipv6 address for each pair
+ return [utils.to_global_ipv6(pair) for pair in prefix_mac_pairs]
@require_context
@@ -1081,7 +1189,8 @@ def network_get(context, network_id, session=None):
@require_admin_context
def network_get_all(context):
session = get_session()
- result = session.query(models.Network)
+ result = session.query(models.Network).\
+ filter_by(deleted=False)
if not result:
raise exception.NotFound(_('No networks defined'))
return result
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index 1882efeba..bbadbeee4 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -174,7 +174,6 @@ class Instance(BASE, NovaBase):
user_data = Column(Text)
reservation_id = Column(String(255))
- mac_address = Column(String(255))
scheduled_at = Column(DateTime)
launched_at = Column(DateTime)
@@ -404,21 +403,6 @@ class Network(BASE, NovaBase):
host = Column(String(255)) # , ForeignKey('hosts.id'))
-class AuthToken(BASE, NovaBase):
- """Represents an authorization token for all API transactions.
-
- Fields are a string representing the actual token and a user id for
- mapping to the actual user
-
- """
- __tablename__ = 'auth_tokens'
- token_hash = Column(String(255), primary_key=True)
- user_id = Column(String(255))
- server_manageent_url = Column(String(255))
- storage_url = Column(String(255))
- cdn_management_url = Column(String(255))
-
-
# TODO(vish): can these both come from the same baseclass?
class FixedIp(BASE, NovaBase):
"""Represents a fixed ip for an instance."""
@@ -429,7 +413,7 @@ class FixedIp(BASE, NovaBase):
network = relationship(Network, backref=backref('fixed_ips'))
instance_id = Column(Integer, ForeignKey('instances.id'), nullable=True)
instance = relationship(Instance,
- backref=backref('fixed_ip', uselist=False),
+ backref=backref('fixed_ips'),
foreign_keys=instance_id,
primaryjoin='and_('
'FixedIp.instance_id == Instance.id,'
@@ -439,6 +423,48 @@ class FixedIp(BASE, NovaBase):
reserved = Column(Boolean, default=False)
+class FloatingIp(BASE, NovaBase):
+ """Represents a floating ip that dynamically forwards to a fixed ip."""
+ __tablename__ = 'floating_ips'
+ id = Column(Integer, primary_key=True)
+ address = Column(String(255))
+ fixed_ip_id = Column(Integer, ForeignKey('fixed_ips.id'), nullable=True)
+ fixed_ip = relationship(FixedIp,
+ backref=backref('floating_ips'),
+ foreign_keys=fixed_ip_id,
+ primaryjoin='and_('
+ 'FloatingIp.fixed_ip_id == FixedIp.id,'
+ 'FloatingIp.deleted == False)')
+ project_id = Column(String(255))
+ host = Column(String(255)) # , ForeignKey('hosts.id'))
+
+
+class MacAddress(BASE, NovaBase):
+ """Represents a mac address used by an instance"""
+ __tablename__ = 'mac_addresses'
+ id = Column(Integer, primary_key=True)
+ mac_address = Column(String(255), unique=True)
+ network_id = Column(Integer, ForeignKey('networks.id'), nullable=False)
+ network = relationship(Network, backref=backref('mac_addresses'))
+ instance_id = Column(Integer, ForeignKey('instances.id'), nullable=False)
+ instance = relationship(Instance, backref=backref('mac_addresses'))
+
+
+class AuthToken(BASE, NovaBase):
+ """Represents an authorization token for all API transactions.
+
+ Fields are a string representing the actual token and a user id for
+ mapping to the actual user
+
+ """
+ __tablename__ = 'auth_tokens'
+ token_hash = Column(String(255), primary_key=True)
+ user_id = Column(String(255))
+ server_manageent_url = Column(String(255))
+ storage_url = Column(String(255))
+ cdn_management_url = Column(String(255))
+
+
class User(BASE, NovaBase):
"""Represents a user."""
__tablename__ = 'users'
@@ -499,22 +525,6 @@ class UserProjectAssociation(BASE, NovaBase):
project_id = Column(String(255), ForeignKey(Project.id), primary_key=True)
-class FloatingIp(BASE, NovaBase):
- """Represents a floating ip that dynamically forwards to a fixed ip."""
- __tablename__ = 'floating_ips'
- id = Column(Integer, primary_key=True)
- address = Column(String(255))
- fixed_ip_id = Column(Integer, ForeignKey('fixed_ips.id'), nullable=True)
- fixed_ip = relationship(FixedIp,
- backref=backref('floating_ips'),
- foreign_keys=fixed_ip_id,
- primaryjoin='and_('
- 'FloatingIp.fixed_ip_id == FixedIp.id,'
- 'FloatingIp.deleted == False)')
- project_id = Column(String(255))
- host = Column(String(255)) # , ForeignKey('hosts.id'))
-
-
class ConsolePool(BASE, NovaBase):
"""Represents pool of consoles on the same physical node."""
__tablename__ = 'console_pools'