From 01d575f833b63291d817997beb8d4a6bbfcd7aa9 Mon Sep 17 00:00:00 2001 From: Jeff Bradberry Date: Tue, 24 Mar 2020 15:56:40 -0400 Subject: [PATCH] Enable the remaining top-level exportable resources and rearrange the import/export methods a bit. --- awxkit/awxkit/api/pages/api.py | 50 ++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/awxkit/awxkit/api/pages/api.py b/awxkit/awxkit/api/pages/api.py index 92295dd8f6..ca93782e10 100644 --- a/awxkit/awxkit/api/pages/api.py +++ b/awxkit/awxkit/api/pages/api.py @@ -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)