Add dns domain manipulation to nova.
Adding this functionality required the existing DNS api to be rearranged considerably. Nova needs to track some information about domains that is outside the scope of the DNS driver, specifically the availability zone of a private domain and the project of a public domain. In order to track those attributes, this patch adds a new table to the Nova database, dns_domains. This patch perpetuates some naming ambiguities (e.g. zone vs. domain). A future renaming patch will sort all this out. For blueprint public-and-private-dns. Change-Id: I80865207d34ab7c6e2afc5638863a299b3913f8e
This commit is contained in:
parent
db66823fdf
commit
92e66df6e7
@ -324,6 +324,32 @@ def floating_ip_set_auto_assigned(context, address):
|
||||
"""Set auto_assigned flag to floating ip"""
|
||||
return IMPL.floating_ip_set_auto_assigned(context, address)
|
||||
|
||||
|
||||
def dnsdomain_list(context):
|
||||
"""Get a list of all zones in our database, public and private."""
|
||||
return IMPL.dnsdomain_list(context)
|
||||
|
||||
|
||||
def dnsdomain_register_for_zone(context, fqdomain, zone):
|
||||
"""Associated a DNS domain with an availability zone"""
|
||||
return IMPL.dnsdomain_register_for_zone(context, fqdomain, zone)
|
||||
|
||||
|
||||
def dnsdomain_register_for_project(context, fqdomain, project):
|
||||
"""Associated a DNS domain with a project id"""
|
||||
return IMPL.dnsdomain_register_for_project(context, fqdomain, project)
|
||||
|
||||
|
||||
def dnsdomain_unregister(context, fqdomain):
|
||||
"""Purge associations for the specified DNS zone"""
|
||||
return IMPL.dnsdomain_unregister(context, fqdomain)
|
||||
|
||||
|
||||
def dnsdomain_get(context, fqdomain):
|
||||
"""Get the db record for the specified domain."""
|
||||
return IMPL.dnsdomain_get(context, fqdomain)
|
||||
|
||||
|
||||
####################
|
||||
|
||||
|
||||
|
@ -695,6 +695,77 @@ def floating_ip_update(context, address, values):
|
||||
floating_ip_ref.save(session=session)
|
||||
|
||||
|
||||
@require_context
|
||||
def _dnsdomain_get(context, session, fqdomain):
|
||||
return model_query(context, models.DNSDomain,
|
||||
session=session, read_deleted="no").\
|
||||
filter_by(domain=fqdomain).\
|
||||
with_lockmode('update').\
|
||||
first()
|
||||
|
||||
|
||||
@require_context
|
||||
def dnsdomain_get(context, fqdomain):
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
return _dnsdomain_get(context, session, fqdomain)
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def _dnsdomain_get_or_create(context, session, fqdomain):
|
||||
domain_ref = _dnsdomain_get(context, session, fqdomain)
|
||||
if not domain_ref:
|
||||
dns_ref = models.DNSDomain()
|
||||
dns_ref.update({'domain': fqdomain,
|
||||
'availability_zone': None,
|
||||
'project_id': None})
|
||||
return dns_ref
|
||||
|
||||
return domain_ref
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def dnsdomain_register_for_zone(context, fqdomain, zone):
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
domain_ref = _dnsdomain_get_or_create(context, session, fqdomain)
|
||||
domain_ref.scope = 'private'
|
||||
domain_ref.availability_zone = zone
|
||||
domain_ref.save(session=session)
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def dnsdomain_register_for_project(context, fqdomain, project):
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
domain_ref = _dnsdomain_get_or_create(context, session, fqdomain)
|
||||
domain_ref.scope = 'public'
|
||||
domain_ref.project_id = project
|
||||
domain_ref.save(session=session)
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def dnsdomain_unregister(context, fqdomain):
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
domain_ref = _dnsdomain_get(context, session, fqdomain)
|
||||
if domain_ref:
|
||||
domain_ref.delete(session=session)
|
||||
|
||||
|
||||
@require_context
|
||||
def dnsdomain_list(context):
|
||||
session = get_session()
|
||||
records = model_query(context, models.DNSDomain,
|
||||
session=session, read_deleted="no").\
|
||||
with_lockmode('update').all()
|
||||
domains = []
|
||||
for record in records:
|
||||
domains.append(record.domain)
|
||||
|
||||
return domains
|
||||
|
||||
|
||||
###################
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user