mirror of
https://github.com/ansible/awx.git
synced 2026-03-23 11:55:04 -02:30
Deal somewhat reasonably with missing fields as part of the natural key
- JobTemplate.organization has recently been added, we need to support with and without - WorkflowJobTemplateNode is shortly going to get an identifier field, and we will need to support both with and without
This commit is contained in:
@@ -69,7 +69,7 @@ NATURAL_KEYS = {
|
|||||||
'notification_template': ('organization', 'name'),
|
'notification_template': ('organization', 'name'),
|
||||||
'project': ('organization', 'name'),
|
'project': ('organization', 'name'),
|
||||||
'inventory': ('organization', 'name'),
|
'inventory': ('organization', 'name'),
|
||||||
'job_template': ('name',),
|
'job_template': ('organization', 'name'),
|
||||||
'workflow_job_template': ('organization', 'name'),
|
'workflow_job_template': ('organization', 'name'),
|
||||||
|
|
||||||
# related resources
|
# related resources
|
||||||
@@ -92,9 +92,11 @@ def get_natural_key(page):
|
|||||||
natural_key[key[1:]] = get_natural_key(related_objs[0].get())
|
natural_key[key[1:]] = get_natural_key(related_objs[0].get())
|
||||||
elif key in page.related:
|
elif key in page.related:
|
||||||
natural_key[key] = get_natural_key(page.related[key].get())
|
natural_key[key] = get_natural_key(page.related[key].get())
|
||||||
else:
|
elif key in page:
|
||||||
natural_key[key] = page[key]
|
natural_key[key] = page[key]
|
||||||
|
|
||||||
|
if not natural_key:
|
||||||
|
return None
|
||||||
return natural_key
|
return natural_key
|
||||||
|
|
||||||
|
|
||||||
@@ -195,7 +197,7 @@ class Import(CustomCommand):
|
|||||||
|
|
||||||
def get_by_natural_key(self, key, fetch=True):
|
def get_by_natural_key(self, key, fetch=True):
|
||||||
frozen_key = freeze(key)
|
frozen_key = freeze(key)
|
||||||
if frozen_key not in self._natural_key and fetch:
|
if frozen_key is not None and frozen_key not in self._natural_key and fetch:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return self._natural_key.get(frozen_key)
|
return self._natural_key.get(frozen_key)
|
||||||
@@ -228,7 +230,12 @@ class Import(CustomCommand):
|
|||||||
else:
|
else:
|
||||||
page = page.put(post_data)
|
page = page.put(post_data)
|
||||||
|
|
||||||
self._natural_key[freeze(get_natural_key(page))] = page
|
self.register_page(page)
|
||||||
|
|
||||||
|
def register_page(self, page):
|
||||||
|
natural_key = freeze(get_natural_key(page))
|
||||||
|
if natural_key is not None:
|
||||||
|
self._natural_key[natural_key] = page
|
||||||
|
|
||||||
def register_existing_assets(self, resource):
|
def register_existing_assets(self, resource):
|
||||||
endpoint = getattr(self.v2, resource)
|
endpoint = getattr(self.v2, resource)
|
||||||
@@ -236,8 +243,8 @@ class Import(CustomCommand):
|
|||||||
self._options[resource] = options
|
self._options[resource] = options
|
||||||
|
|
||||||
results = endpoint.get(all_pages=True).results
|
results = endpoint.get(all_pages=True).results
|
||||||
for asset in results:
|
for page in results:
|
||||||
self._natural_key[freeze(get_natural_key(asset))] = asset
|
self.register_page(page)
|
||||||
|
|
||||||
def assign_roles(self, page, roles):
|
def assign_roles(self, page, roles):
|
||||||
role_endpoint = page.json['related']['roles']
|
role_endpoint = page.json['related']['roles']
|
||||||
@@ -260,6 +267,7 @@ class Import(CustomCommand):
|
|||||||
def assign_related_assets(self, resource, assets):
|
def assign_related_assets(self, resource, assets):
|
||||||
for asset in assets:
|
for asset in assets:
|
||||||
page = self.get_by_natural_key(asset['natural_key'])
|
page = self.get_by_natural_key(asset['natural_key'])
|
||||||
|
# FIXME: deal with `page is None` case
|
||||||
for name, S in asset.get('related', {}).items():
|
for name, S in asset.get('related', {}).items():
|
||||||
if name == 'roles':
|
if name == 'roles':
|
||||||
self.assign_roles(page, S)
|
self.assign_roles(page, S)
|
||||||
|
|||||||
Reference in New Issue
Block a user