mirror of
https://github.com/ansible/awx.git
synced 2026-05-08 01:47:35 -02:30
Fix a couple of flaws
- The dependency ordering may spit out page types that weren't in the import data set. Make sure to be able to map those to resources anyway. - freeze() needs to be able to deal with nullable foreign keys.
This commit is contained in:
@@ -179,6 +179,8 @@ class Config(CustomCommand):
|
|||||||
|
|
||||||
|
|
||||||
def freeze(key):
|
def freeze(key):
|
||||||
|
if key is None:
|
||||||
|
return None
|
||||||
return frozenset((k, freeze(v) if isinstance(v, dict) else v) for k, v in key.items())
|
return frozenset((k, freeze(v) if isinstance(v, dict) else v) for k, v in key.items())
|
||||||
|
|
||||||
|
|
||||||
@@ -199,9 +201,9 @@ class Import(CustomCommand):
|
|||||||
return self._natural_key.get(frozen_key)
|
return self._natural_key.get(frozen_key)
|
||||||
|
|
||||||
def create_assets(self, data, resource):
|
def create_assets(self, data, resource):
|
||||||
if resource not in data:
|
if resource not in data or resource not in EXPORTABLE_RESOURCES:
|
||||||
return
|
return
|
||||||
cprint("importing {}".format(resource), 'red', file=client.stderr)
|
cprint("importing {}".format(resource), 'red', file=self.client.stderr)
|
||||||
|
|
||||||
endpoint = getattr(self.v2, resource)
|
endpoint = getattr(self.v2, resource)
|
||||||
options = self._options[resource]
|
options = self._options[resource]
|
||||||
@@ -212,7 +214,8 @@ class Import(CustomCommand):
|
|||||||
if field in ('related', 'natural_key'):
|
if field in ('related', 'natural_key'):
|
||||||
continue
|
continue
|
||||||
if options[field]['type'] == 'id':
|
if options[field]['type'] == 'id':
|
||||||
post_data[field] = self.get_by_natural_key(value)['id']
|
page = self.get_by_natural_key(value)
|
||||||
|
post_data[field] = page['id'] if page is not None else None
|
||||||
else:
|
else:
|
||||||
post_data[field] = value
|
post_data[field] = value
|
||||||
|
|
||||||
@@ -264,13 +267,11 @@ class Import(CustomCommand):
|
|||||||
self.assign_related(page, name, S)
|
self.assign_related(page, name, S)
|
||||||
|
|
||||||
def dependent_resources(self, data):
|
def dependent_resources(self, data):
|
||||||
page_resource = {}
|
page_resource = {getattr(self.v2, resource)._create().__item_class__: resource
|
||||||
for resource in data:
|
for resource in self.v2.json}
|
||||||
endpoint = getattr(self.v2, resource)
|
data_pages = [getattr(self.v2, resource)._create().__item_class__ for resource in data]
|
||||||
page_cls = endpoint._create().__item_class__
|
|
||||||
page_resource[page_cls] = resource
|
|
||||||
|
|
||||||
for page_cls in itertools.chain(*has_create.page_creation_order(*page_resource.keys())):
|
for page_cls in itertools.chain(*has_create.page_creation_order(*data_pages)):
|
||||||
yield page_resource[page_cls]
|
yield page_resource[page_cls]
|
||||||
|
|
||||||
def handle(self, client, parser):
|
def handle(self, client, parser):
|
||||||
@@ -280,6 +281,7 @@ class Import(CustomCommand):
|
|||||||
|
|
||||||
data = json.load(sys.stdin)
|
data = json.load(sys.stdin)
|
||||||
client.authenticate()
|
client.authenticate()
|
||||||
|
self.client = client
|
||||||
self.v2 = client.v2
|
self.v2 = client.v2
|
||||||
|
|
||||||
for resource in self.dependent_resources(data):
|
for resource in self.dependent_resources(data):
|
||||||
|
|||||||
Reference in New Issue
Block a user