Enable the remaining top-level exportable resources

and rearrange the import/export methods a bit.
This commit is contained in:
Jeff Bradberry 2020-03-24 15:56:40 -04:00
parent e0f6af4700
commit 01d575f833

View File

@ -14,10 +14,10 @@ EXPORTABLE_RESOURCES = [
'credential_types',
'credentials',
'notification_templates',
# 'projects',
# 'inventory',
# 'job_templates',
# 'workflow_job_templates',
'projects',
'inventory',
'job_templates',
'workflow_job_templates',
]
@ -89,9 +89,13 @@ page.register_page(resources.api, Api)
class ApiV2(base.Base):
# Common import/export methods
def _get_options(self, endpoint):
return endpoint.options().json['actions']['POST']
# Export methods
def _serialize_asset(self, asset, options):
# Drop any (credential_type) assets that are being managed by the Tower instance.
if asset.json.get('managed_by_tower'):
@ -143,6 +147,20 @@ class ApiV2(base.Base):
assets = (self._serialize_asset(asset, options) for asset in results)
return [asset for asset in assets if asset is not None]
def export_assets(self, **kwargs):
# If no resource kwargs are explicitly used, export everything.
all_resources = all(kwargs.get(resource) is None for resource in EXPORTABLE_RESOURCES)
data = {}
for resource in EXPORTABLE_RESOURCES:
value = kwargs.get(resource)
if all_resources or value is not None:
data[resource] = self._get_assets(resource, value)
return data
# Import methods
def _dependent_resources(self, data):
page_resource = {getattr(self, resource)._create().__item_class__: resource
for resource in self.json}
@ -153,6 +171,8 @@ class ApiV2(base.Base):
def _register_page(self, page):
natural_key = freeze(get_natural_key(page))
# FIXME: we need to keep a reference for the case where we
# don't have a natural key, so we can delete
if natural_key is not None:
if getattr(self, '_natural_key', None) is None:
self._natural_key = {}
@ -206,9 +226,6 @@ class ApiV2(base.Base):
self._register_page(page)
def _assign_related(self, page, name, related_set):
pass # FIXME
def _assign_roles(self, page, roles):
role_endpoint = page.json['related']['roles']
for role in roles:
@ -224,6 +241,9 @@ class ApiV2(base.Base):
else:
pass # admin role
def _assign_related(self, page, name, related_set):
pass # FIXME
def _assign_related_assets(self, resource, assets):
for asset in assets:
page = self._get_by_natural_key(asset['natural_key'])
@ -234,26 +254,14 @@ class ApiV2(base.Base):
else:
self._assign_related(page, name, S)
def export_assets(self, **kwargs):
# If no resource kwargs are explicitly used, export everything.
all_resources = all(kwargs.get(resource) is None for resource in EXPORTABLE_RESOURCES)
data = {}
for resource in EXPORTABLE_RESOURCES:
value = kwargs.get(resource)
if all_resources or value is not None:
data[resource] = self._get_assets(resource, value)
return data
def import_assets(self, data):
for resource in self._dependent_resources(data):
self._register_existing_assets(resource)
self._create_assets(data, resource)
# FIXME: should we delete existing unpatched assets?
# for resource, assets in data.items():
# self._assign_related_assets(resource, assets)
for resource, assets in data.items():
self._assign_related_assets(resource, assets)
page.register_page(resources.v2, ApiV2)