diff options
| author | Trey Morris <trey.morris@rackspace.com> | 2011-03-14 13:32:22 -0500 |
|---|---|---|
| committer | Trey Morris <trey.morris@rackspace.com> | 2011-03-14 13:32:22 -0500 |
| commit | 093c8200a102891232e2da166830cd59ee133fc4 (patch) | |
| tree | f07ed6dac0a7e83fe9bf6adf6dc4b4ea0d3da02d /nova/db | |
| parent | 18e16ab9f5be77764a810b2d6ac5ae8c5be6bb52 (diff) | |
| download | nova-093c8200a102891232e2da166830cd59ee133fc4.tar.gz nova-093c8200a102891232e2da166830cd59ee133fc4.tar.xz nova-093c8200a102891232e2da166830cd59ee133fc4.zip | |
committing to share
Diffstat (limited to 'nova/db')
| -rw-r--r-- | nova/db/api.py | 39 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 131 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/models.py | 76 |
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' |
