diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 418cc67bb..875a8981c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,6 +52,8 @@ jobs: advisory: true - name: ui-lint command: make ui-lint + - name: ui-type-check + command: make ui-type-check - name: ui-test-screens command: make ui-test-screens - name: ui-test-general diff --git a/Makefile b/Makefile index 7613d8427..e84fb783b 100644 --- a/Makefile +++ b/Makefile @@ -303,6 +303,21 @@ api-lint: $(MAKE) lint yamllint -s . +## Regenerate the UI's API types from the serializers themselves. +## Run this after any change to a serializer, and commit the result. +## +## openapi-typescript is deliberately not a devDependency: it is a generator +## rather than part of the build, its committed output is what everything else +## consumes, and its peer range wants TypeScript 5 where this project is on 6. +## npx fetches it for the length of this command and leaves nothing behind. +ui-api-types: awx-link + @if [ "$(VENV_BASE)" ]; then \ + . $(VENV_BASE)/awx/bin/activate; \ + fi; \ + $(MANAGEMENT_COMMAND) spectacular --format openapi-json --file awx/ui/.schema.json + $(NPM_BIN) --prefix awx/ui run generate-api-types + rm -f awx/ui/.schema.json + ## Run egg_info_dev to generate awx.egg-info for development. awx-link: [ -d "/awx_devel/awx.egg-info" ] || $(PYTHON) /awx_devel/tools/scripts/egg_info_dev @@ -424,6 +439,11 @@ ui-lint: $(NPM_BIN) --prefix awx/ui install $(NPM_BIN) run --prefix awx/ui lint $(NPM_BIN) run --prefix awx/ui prettier-check + $(NPM_BIN) run --prefix awx/ui check-strings + +ui-type-check: + $(NPM_BIN) --prefix awx/ui install + $(NPM_BIN) run --prefix awx/ui type-check ui-test: $(NPM_BIN) --prefix awx/ui install diff --git a/awx/ui/.nvmrc b/awx/ui/.nvmrc new file mode 100644 index 000000000..2bd5a0a98 --- /dev/null +++ b/awx/ui/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/awx/ui/.schema.json b/awx/ui/.schema.json new file mode 100644 index 000000000..f3b36419b --- /dev/null +++ b/awx/ui/.schema.json @@ -0,0 +1,49691 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Ascender API", + "version": "v2", + "description": "Ascender API Documentation", + "contact": { + "email": "contact@snippets.local" + }, + "license": { + "name": "Apache License" + } + }, + "paths": { + "/api/": { + "get": { + "operationId": "api_retrieve", + "description": "List supported API versions", + "tags": [ + "api" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/": { + "get": { + "operationId": "root_retrieve", + "description": "List top level resources", + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/activity_stream/": { + "get": { + "operationId": "activity_stream_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "activity_stream" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/activity_stream/{id}/": { + "get": { + "operationId": "activity_stream_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "activity_stream" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivityStream" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_command_events/{id}/": { + "get": { + "operationId": "ad_hoc_command_events_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_command_events" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandEvent" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_commands/": { + "get": { + "operationId": "ad_hoc_commands_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAdHocCommandListList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "ad_hoc_commands_create", + "tags": [ + "ad_hoc_commands" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandListRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/": { + "get": { + "operationId": "ad_hoc_commands_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandDetail" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "ad_hoc_commands_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/activity_stream/": { + "get": { + "operationId": "ad_hoc_commands_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/cancel/": { + "get": { + "operationId": "ad_hoc_commands_cancel_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandCancel" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "ad_hoc_commands_cancel_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandCancel" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/events/": { + "get": { + "operationId": "ad_hoc_commands_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAdHocCommandEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/notifications/": { + "get": { + "operationId": "ad_hoc_commands_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/relaunch/": { + "get": { + "operationId": "ad_hoc_commands_relaunch_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "ad_hoc_commands_relaunch_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/ad_hoc_commands/{id}/stdout/": { + "get": { + "operationId": "ad_hoc_commands_stdout_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "ansi", + "ansi_download", + "html", + "json", + "txt", + "txt_download" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "ad_hoc_commands" + ], + "responses": { + "200": { + "content": { + "text/html": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/analytics/": { + "get": { + "operationId": "analytics_retrieve", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/adoption_rate/": { + "get": { + "operationId": "analytics_adoption_rate_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_adoption_rate_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/adoption_rate_options/": { + "get": { + "operationId": "analytics_adoption_rate_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_adoption_rate_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/authorized/": { + "get": { + "operationId": "analytics_authorized_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_authorized_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/event_explorer/": { + "get": { + "operationId": "analytics_event_explorer_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_event_explorer_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/event_explorer_options/": { + "get": { + "operationId": "analytics_event_explorer_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_event_explorer_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/host_explorer/": { + "get": { + "operationId": "analytics_host_explorer_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_host_explorer_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/host_explorer_options/": { + "get": { + "operationId": "analytics_host_explorer_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_host_explorer_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/job_explorer/": { + "get": { + "operationId": "analytics_job_explorer_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_job_explorer_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/job_explorer_options/": { + "get": { + "operationId": "analytics_job_explorer_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_job_explorer_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/probe_template_for_hosts/": { + "get": { + "operationId": "analytics_probe_template_for_hosts_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_probe_template_for_hosts_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/probe_template_for_hosts_options/": { + "get": { + "operationId": "analytics_probe_template_for_hosts_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_probe_template_for_hosts_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/probe_templates/": { + "get": { + "operationId": "analytics_probe_templates_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_probe_templates_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/probe_templates_options/": { + "get": { + "operationId": "analytics_probe_templates_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_probe_templates_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/report/{slug}/": { + "get": { + "operationId": "analytics_report_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$" + }, + "required": true + } + ], + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_report_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "parameters": [ + { + "in": "path", + "name": "slug", + "schema": { + "type": "string", + "pattern": "^[\\w-]+$" + }, + "required": true + } + ], + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/report_options/": { + "get": { + "operationId": "analytics_report_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_report_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/reports/": { + "get": { + "operationId": "analytics_reports_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_reports_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/roi_templates/": { + "get": { + "operationId": "analytics_roi_templates_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_roi_templates_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/analytics/roi_templates_options/": { + "get": { + "operationId": "analytics_roi_templates_options_retrieve", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "analytics_roi_templates_options_create", + "description": "Example:\n headers = {\n 'Content-Type': 'application/json',\n }\n\n params = {\n 'limit': '20',\n 'offset': '0',\n 'sort_by': 'name:asc',\n }\n\n json_data = {\n 'limit': '20',\n 'offset': '0',\n 'sort_options': 'name',\n 'sort_order': 'asc',\n 'tags': [],\n 'slug': [],\n 'name': [],\n 'description': '',\n }\n\n response = requests.post(f'{AUTOMATION_ANALYTICS_API_URL}/reports/', params=params,\n headers=headers, json=json_data)\n\n return Response(response.json(), status=response.status_code)", + "tags": [ + "analytics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/applications/": { + "get": { + "operationId": "applications_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "applications" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOAuth2ApplicationList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "applications_create", + "tags": [ + "applications" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2ApplicationRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/applications/{id}/": { + "get": { + "operationId": "applications_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "applications" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "applications_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "applications" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2ApplicationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "applications_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "applications" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedOAuth2ApplicationRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "applications_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "applications" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/applications/{id}/activity_stream/": { + "get": { + "operationId": "applications_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "applications" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/applications/{id}/tokens/": { + "get": { + "operationId": "applications_tokens_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "applications" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOAuth2TokenList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "applications_tokens_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "applications" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Token" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/auth/": { + "get": { + "operationId": "auth_retrieve", + "description": "List enabled single-sign-on endpoints", + "tags": [ + "auth" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/bulk/": { + "get": { + "operationId": "bulk_retrieve", + "description": "List top level resources", + "tags": [ + "bulk" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/bulk/host_create/": { + "get": { + "operationId": "bulk_host_create_retrieve", + "tags": [ + "bulk" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "bulk_host_create_create", + "tags": [ + "bulk" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkHostCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/bulk/host_delete/": { + "get": { + "operationId": "bulk_host_delete_retrieve", + "tags": [ + "bulk" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "bulk_host_delete_create", + "tags": [ + "bulk" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkHostDeleteRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/bulk/job_launch/": { + "get": { + "operationId": "bulk_job_launch_retrieve", + "tags": [ + "bulk" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "bulk_job_launch_create", + "tags": [ + "bulk" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkJobLaunchRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/config/": { + "get": { + "operationId": "config_retrieve", + "description": "Return various sitewide configuration settings", + "tags": [ + "config" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "config_create", + "tags": [ + "config" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "delete": { + "operationId": "config_destroy", + "tags": [ + "config" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/config/attach/": { + "post": { + "operationId": "config_attach_create", + "tags": [ + "config" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/config/subscriptions/": { + "post": { + "operationId": "config_subscriptions_create", + "tags": [ + "config" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/constructed_inventories/": { + "get": { + "operationId": "constructed_inventories_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "constructed_inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedConstructedInventoryList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "constructed_inventories_create", + "tags": [ + "constructed_inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstructedInventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstructedInventory" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/constructed_inventories/{id}/": { + "get": { + "operationId": "constructed_inventories_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "constructed_inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstructedInventory" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "constructed_inventories_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "constructed_inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstructedInventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstructedInventory" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "constructed_inventories_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "constructed_inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedConstructedInventoryRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstructedInventory" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "constructed_inventories_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "constructed_inventories" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/credential_input_sources/": { + "get": { + "operationId": "credential_input_sources_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credential_input_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialInputSourceList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "credential_input_sources_create", + "tags": [ + "credential_input_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSourceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSource" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credential_input_sources/{id}/": { + "get": { + "operationId": "credential_input_sources_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_input_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSource" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "credential_input_sources_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_input_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSourceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSource" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "credential_input_sources_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_input_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedCredentialInputSourceRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSource" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "credential_input_sources_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_input_sources" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/credential_types/": { + "get": { + "operationId": "credential_types_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialTypeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "credential_types_create", + "tags": [ + "credential_types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialTypeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credential_types/{id}/": { + "get": { + "operationId": "credential_types_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "credential_types_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialTypeRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "credential_types_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedCredentialTypeRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "credential_types_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/credential_types/{id}/activity_stream/": { + "get": { + "operationId": "credential_types_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credential_types/{id}/credentials/": { + "get": { + "operationId": "credential_types_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "credential_types_credentials_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credential_types/{id}/test/": { + "get": { + "operationId": "credential_types_test_retrieve", + "description": "Test a complete set of input values for an external credential before\nsaving it.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "credential_types_test_create", + "description": "Test a complete set of input values for an external credential before\nsaving it.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credential_types" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/credentials/": { + "get": { + "operationId": "credentials_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialSerializerCreateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "credentials_create", + "tags": [ + "credentials" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialSerializerCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialSerializerCreate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/": { + "get": { + "operationId": "credentials_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "credentials_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "credentials_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedCredentialRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "credentials_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/credentials/{id}/access_list/": { + "get": { + "operationId": "credentials_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/activity_stream/": { + "get": { + "operationId": "credentials_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/copy/": { + "get": { + "operationId": "credentials_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "credentials_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/input_sources/": { + "get": { + "operationId": "credentials_input_sources_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialInputSourceList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "credentials_input_sources_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSourceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialInputSource" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/object_roles/": { + "get": { + "operationId": "credentials_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/owner_teams/": { + "get": { + "operationId": "credentials_owner_teams_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/owner_users/": { + "get": { + "operationId": "credentials_owner_users_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/credentials/{id}/test/": { + "get": { + "operationId": "credentials_test_retrieve", + "description": "Test updates to the input values and metadata of an external credential\nbefore saving them.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "credentials_test_create", + "description": "Test updates to the input values and metadata of an external credential\nbefore saving them.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "credentials" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/dashboard/": { + "get": { + "operationId": "dashboard_retrieve", + "description": "Show Dashboard Details", + "tags": [ + "dashboard" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/dashboard/graphs/jobs/": { + "get": { + "operationId": "dashboard_graphs_jobs_retrieve", + "tags": [ + "dashboard" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/execution_environments/": { + "get": { + "operationId": "execution_environments_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "execution_environments" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedExecutionEnvironmentList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "execution_environments_create", + "tags": [ + "execution_environments" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironmentRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironment" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/execution_environments/{id}/": { + "get": { + "operationId": "execution_environments_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "execution_environments" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironment" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "execution_environments_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "execution_environments" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironmentRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironment" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "execution_environments_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "execution_environments" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedExecutionEnvironmentRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironment" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "execution_environments_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "execution_environments" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/execution_environments/{id}/activity_stream/": { + "get": { + "operationId": "execution_environments_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "execution_environments" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/execution_environments/{id}/copy/": { + "get": { + "operationId": "execution_environments_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "execution_environments" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "execution_environments_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "execution_environments" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/execution_environments/{id}/unified_job_templates/": { + "get": { + "operationId": "execution_environments_unified_job_templates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "execution_environments" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUnifiedJobTemplateList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/federated_inventories/": { + "get": { + "operationId": "federated_inventories_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "federated_inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedFederatedInventoryList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "federated_inventories_create", + "tags": [ + "federated_inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FederatedInventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FederatedInventory" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/federated_inventories/{id}/": { + "get": { + "operationId": "federated_inventories_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "federated_inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FederatedInventory" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "federated_inventories_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "federated_inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FederatedInventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FederatedInventory" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "federated_inventories_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "federated_inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedFederatedInventoryRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FederatedInventory" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "federated_inventories_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "federated_inventories" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/groups/": { + "get": { + "operationId": "groups_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "groups_create", + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/": { + "get": { + "operationId": "groups_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "groups_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "groups_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedGroupRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "groups_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/groups/{id}/activity_stream/": { + "get": { + "operationId": "groups_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/ad_hoc_commands/": { + "get": { + "operationId": "groups_ad_hoc_commands_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAdHocCommandListList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "groups_ad_hoc_commands_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandListRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/all_hosts/": { + "get": { + "operationId": "groups_all_hosts_list", + "description": "the list of all hosts below a group, even including subgroups", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/children/": { + "get": { + "operationId": "groups_children_list", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "groups_children_create", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/hosts/": { + "get": { + "operationId": "groups_hosts_list", + "description": "the list of hosts directly below a group", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "groups_hosts_create", + "description": "the list of hosts directly below a group", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Host" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/inventory_sources/": { + "get": { + "operationId": "groups_inventory_sources_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventorySourceList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/job_events/": { + "get": { + "operationId": "groups_job_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/job_host_summaries/": { + "get": { + "operationId": "groups_job_host_summaries_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobHostSummaryList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/potential_children/": { + "get": { + "operationId": "groups_potential_children_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/groups/{id}/variable_data/": { + "get": { + "operationId": "groups_variable_data_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/GroupVariableData" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "groups_variable_data_update", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupVariableDataRequest" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/GroupVariableDataRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/GroupVariableData" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "groups_variable_data_partial_update", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedGroupVariableDataRequest" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/PatchedGroupVariableDataRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/GroupVariableData" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/host_metric_summary_monthly/": { + "get": { + "operationId": "host_metric_summary_monthly_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "host_metric_summary_monthly" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostMetricSummaryMonthlyList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/host_metrics/": { + "get": { + "operationId": "host_metrics_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "host_metrics" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostMetricList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/host_metrics/{id}/": { + "get": { + "operationId": "host_metrics_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "host_metrics" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostMetric" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "host_metrics_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "host_metrics" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/hosts/": { + "get": { + "operationId": "hosts_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "hosts_create", + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Host" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/": { + "get": { + "operationId": "hosts_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Host" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "hosts_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Host" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "hosts_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedHostRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Host" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "hosts_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/hosts/{id}/activity_stream/": { + "get": { + "operationId": "hosts_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/ad_hoc_command_events/": { + "get": { + "operationId": "hosts_ad_hoc_command_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAdHocCommandEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/ad_hoc_commands/": { + "get": { + "operationId": "hosts_ad_hoc_commands_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAdHocCommandListList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "hosts_ad_hoc_commands_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandListRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/all_groups/": { + "get": { + "operationId": "hosts_all_groups_list", + "description": "the list of all groups of which the host is directly or indirectly a member", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/ansible_facts/": { + "get": { + "operationId": "hosts_ansible_facts_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnsibleFacts" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/groups/": { + "get": { + "operationId": "hosts_groups_list", + "description": "the list of groups a host is directly a member of", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "hosts_groups_create", + "description": "the list of groups a host is directly a member of", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/inventory_sources/": { + "get": { + "operationId": "hosts_inventory_sources_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventorySourceList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/job_events/": { + "get": { + "operationId": "hosts_job_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/job_host_summaries/": { + "get": { + "operationId": "hosts_job_host_summaries_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobHostSummaryList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/smart_inventories/": { + "get": { + "operationId": "hosts_smart_inventories_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/hosts/{id}/variable_data/": { + "get": { + "operationId": "hosts_variable_data_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/HostVariableData" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "hosts_variable_data_update", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostVariableDataRequest" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/HostVariableDataRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/HostVariableData" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "hosts_variable_data_partial_update", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "hosts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedHostVariableDataRequest" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/PatchedHostVariableDataRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/HostVariableData" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instance_groups/": { + "get": { + "operationId": "instance_groups_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "instance_groups_create", + "tags": [ + "instance_groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instance_groups/{id}/": { + "get": { + "operationId": "instance_groups_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "instance_groups_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instance_groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "instance_groups_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instance_groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedInstanceGroupRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "instance_groups_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/instance_groups/{id}/access_list/": { + "get": { + "operationId": "instance_groups_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instance_groups/{id}/instances/": { + "get": { + "operationId": "instance_groups_instances_list", + "description": "This mixin overloads attach/detach so that it calls InstanceGroup.save(),\ntriggering a background recalculation of policy-based instance group\nmembership.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "instance_groups_instances_create", + "description": "This mixin overloads attach/detach so that it calls InstanceGroup.save(),\ntriggering a background recalculation of policy-based instance group\nmembership.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instance_groups" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Instance" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instance_groups/{id}/jobs/": { + "get": { + "operationId": "instance_groups_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUnifiedJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instance_groups/{id}/object_roles/": { + "get": { + "operationId": "instance_groups_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instance_groups" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/": { + "get": { + "operationId": "instances_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "instances_create", + "tags": [ + "instances" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Instance" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/": { + "get": { + "operationId": "instances_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Instance" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "instances_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Instance" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "instances_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedInstanceRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Instance" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/health_check/": { + "get": { + "operationId": "instances_health_check_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceHealthCheck" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "instances_health_check_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceHealthCheck" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/install_bundle/": { + "get": { + "operationId": "instances_install_bundle_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Instance" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/instance_groups/": { + "get": { + "operationId": "instances_instance_groups_list", + "description": "This mixin overloads attach/detach so that it calls InstanceGroup.save(),\ntriggering a background recalculation of policy-based instance group\nmembership.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "instances_instance_groups_create", + "description": "This mixin overloads attach/detach so that it calls InstanceGroup.save(),\ntriggering a background recalculation of policy-based instance group\nmembership.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "instances" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/jobs/": { + "get": { + "operationId": "instances_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUnifiedJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/peers/": { + "get": { + "operationId": "instances_peers_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedReceptorAddressList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/instances/{id}/receptor_addresses/": { + "get": { + "operationId": "instances_receptor_addresses_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "instances" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedReceptorAddressList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/": { + "get": { + "operationId": "inventories_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_create", + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Inventory" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/": { + "get": { + "operationId": "inventories_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Inventory" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "inventories_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Inventory" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "inventories_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedInventoryRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Inventory" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "inventories_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/inventories/{id}/access_list/": { + "get": { + "operationId": "inventories_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/activity_stream/": { + "get": { + "operationId": "inventories_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/ad_hoc_commands/": { + "get": { + "operationId": "inventories_ad_hoc_commands_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAdHocCommandListList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_ad_hoc_commands_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandListRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdHocCommandList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/copy/": { + "get": { + "operationId": "inventories_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/groups/": { + "get": { + "operationId": "inventories_groups_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_groups_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/hosts/": { + "get": { + "operationId": "inventories_hosts_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_hosts_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HostRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Host" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/input_inventories/": { + "get": { + "operationId": "inventories_input_inventories_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_input_inventories_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Inventory" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/instance_groups/": { + "get": { + "operationId": "inventories_instance_groups_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_instance_groups_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/inventory_sources/": { + "get": { + "operationId": "inventories_inventory_sources_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventorySourceList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_inventory_sources_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySource" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/job_templates/": { + "get": { + "operationId": "inventories_job_templates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobTemplateList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/labels/": { + "get": { + "operationId": "inventories_labels_list", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_labels_create", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/object_roles/": { + "get": { + "operationId": "inventories_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/root_groups/": { + "get": { + "operationId": "inventories_root_groups_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_root_groups_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/script/": { + "get": { + "operationId": "inventories_script_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/inventories/{id}/tree/": { + "get": { + "operationId": "inventories_tree_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupTree" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/update_inventory_sources/": { + "get": { + "operationId": "inventories_update_inventory_sources_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceUpdate" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventories_update_inventory_sources_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceUpdate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventories/{id}/variable_data/": { + "get": { + "operationId": "inventories_variable_data_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableData" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "inventories_variable_data_update", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableDataRequest" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableDataRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableData" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "inventories_variable_data_partial_update", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "yaml" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventories" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedInventoryVariableDataRequest" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/PatchedInventoryVariableDataRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableData" + } + }, + "application/yaml": { + "schema": { + "$ref": "#/components/schemas/InventoryVariableData" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/": { + "get": { + "operationId": "inventory_sources_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventorySourceList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_create", + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySource" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/": { + "get": { + "operationId": "inventory_sources_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySource" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "inventory_sources_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySource" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "inventory_sources_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedInventorySourceRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySource" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "inventory_sources_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/inventory_sources/{id}/activity_stream/": { + "get": { + "operationId": "inventory_sources_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/credentials/": { + "get": { + "operationId": "inventory_sources_credentials_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_credentials_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/groups/": { + "get": { + "operationId": "inventory_sources_groups_list", + "description": "Concrete view for deleting everything related by `relationship`.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "inventory_sources_groups_destroy", + "description": "Concrete view for deleting everything related by `relationship`.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/inventory_sources/{id}/hosts/": { + "get": { + "operationId": "inventory_sources_hosts_list", + "description": "Concrete view for deleting everything related by `relationship`.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedHostList" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "inventory_sources_hosts_destroy", + "description": "Concrete view for deleting everything related by `relationship`.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/inventory_sources/{id}/instance_groups/": { + "get": { + "operationId": "inventory_sources_instance_groups_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_instance_groups_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/inventory_updates/": { + "get": { + "operationId": "inventory_sources_inventory_updates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryUpdateListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/notification_templates_error/": { + "get": { + "operationId": "inventory_sources_notification_templates_error_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_notification_templates_error_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/notification_templates_started/": { + "get": { + "operationId": "inventory_sources_notification_templates_started_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_notification_templates_started_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/notification_templates_success/": { + "get": { + "operationId": "inventory_sources_notification_templates_success_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_notification_templates_success_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/schedules/": { + "get": { + "operationId": "inventory_sources_schedules_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedScheduleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_schedules_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_sources/{id}/update/": { + "get": { + "operationId": "inventory_sources_update_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceUpdate" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_sources_update_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_sources" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventorySourceUpdate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_updates/": { + "get": { + "operationId": "inventory_updates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryUpdateListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_updates/{id}/": { + "get": { + "operationId": "inventory_updates_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryUpdateDetail" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "inventory_updates_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/inventory_updates/{id}/cancel/": { + "get": { + "operationId": "inventory_updates_cancel_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryUpdateCancel" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "inventory_updates_cancel_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InventoryUpdateCancel" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_updates/{id}/credentials/": { + "get": { + "operationId": "inventory_updates_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_updates/{id}/events/": { + "get": { + "operationId": "inventory_updates_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryUpdateEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_updates/{id}/notifications/": { + "get": { + "operationId": "inventory_updates_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/inventory_updates/{id}/stdout/": { + "get": { + "operationId": "inventory_updates_stdout_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "ansi", + "ansi_download", + "html", + "json", + "txt", + "txt_download" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "inventory_updates" + ], + "responses": { + "200": { + "content": { + "text/html": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_events/{id}/": { + "get": { + "operationId": "job_events_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_events" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobEvent" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_events/{id}/children/": { + "get": { + "operationId": "job_events_children_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_events" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_host_summaries/{id}/": { + "get": { + "operationId": "job_host_summaries_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_host_summaries" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobHostSummary" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/": { + "get": { + "operationId": "job_templates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_create", + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/": { + "get": { + "operationId": "job_templates_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplate" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "job_templates_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplate" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "job_templates_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedJobTemplateRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplate" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "job_templates_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/job_templates/{id}/access_list/": { + "get": { + "operationId": "job_templates_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/activity_stream/": { + "get": { + "operationId": "job_templates_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/bitbucket_dc/": { + "post": { + "operationId": "job_templates_bitbucket_dc_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/job_templates/{id}/callback/": { + "get": { + "operationId": "job_templates_callback_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "job_templates_callback_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/job_templates/{id}/copy/": { + "get": { + "operationId": "job_templates_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/credentials/": { + "get": { + "operationId": "job_templates_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_credentials_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/github/": { + "post": { + "operationId": "job_templates_github_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/job_templates/{id}/gitlab/": { + "post": { + "operationId": "job_templates_gitlab_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/job_templates/{id}/instance_groups/": { + "get": { + "operationId": "job_templates_instance_groups_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_instance_groups_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/jobs/": { + "get": { + "operationId": "job_templates_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/labels/": { + "get": { + "operationId": "job_templates_labels_list", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_labels_create", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/launch/": { + "get": { + "operationId": "job_templates_launch_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobLaunch" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_launch_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobLaunchRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobLaunch" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/notification_templates_changed/": { + "get": { + "operationId": "job_templates_notification_templates_changed_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_notification_templates_changed_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/notification_templates_error/": { + "get": { + "operationId": "job_templates_notification_templates_error_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_notification_templates_error_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/notification_templates_started/": { + "get": { + "operationId": "job_templates_notification_templates_started_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_notification_templates_started_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/notification_templates_success/": { + "get": { + "operationId": "job_templates_notification_templates_success_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_notification_templates_success_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/object_roles/": { + "get": { + "operationId": "job_templates_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/schedules/": { + "get": { + "operationId": "job_templates_schedules_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedScheduleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_schedules_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/slice_workflow_jobs/": { + "get": { + "operationId": "job_templates_slice_workflow_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobListList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "job_templates_slice_workflow_jobs_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobListRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/job_templates/{id}/survey_spec/": { + "get": { + "operationId": "job_templates_survey_spec_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "job_templates_survey_spec_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "delete": { + "operationId": "job_templates_survey_spec_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/job_templates/{id}/webhook_key/": { + "get": { + "operationId": "job_templates_webhook_key_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "job_templates_webhook_key_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/jobs/": { + "get": { + "operationId": "jobs_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/": { + "get": { + "operationId": "jobs_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobDetail" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "jobs_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/jobs/{id}/activity_stream/": { + "get": { + "operationId": "jobs_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/cancel/": { + "get": { + "operationId": "jobs_cancel_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobCancel" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "jobs_cancel_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobCancel" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/create_schedule/": { + "get": { + "operationId": "jobs_create_schedule_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobCreateSchedule" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "jobs_create_schedule_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobCreateSchedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/credentials/": { + "get": { + "operationId": "jobs_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/job_events/": { + "get": { + "operationId": "jobs_job_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/job_events/children_summary/": { + "get": { + "operationId": "jobs_job_events_children_summary_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/jobs/{id}/job_host_summaries/": { + "get": { + "operationId": "jobs_job_host_summaries_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobHostSummaryList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/labels/": { + "get": { + "operationId": "jobs_labels_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/notifications/": { + "get": { + "operationId": "jobs_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/relaunch/": { + "get": { + "operationId": "jobs_relaunch_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobRelaunch" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "jobs_relaunch_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobRelaunchRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobRelaunch" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/jobs/{id}/stdout/": { + "get": { + "operationId": "jobs_stdout_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "ansi", + "ansi_download", + "html", + "json", + "txt", + "txt_download" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "jobs" + ], + "responses": { + "200": { + "content": { + "text/html": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/labels/": { + "get": { + "operationId": "labels_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "labels" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "labels_create", + "tags": [ + "labels" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/labels/{id}/": { + "get": { + "operationId": "labels_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "labels" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "labels_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "labels" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "labels_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "labels" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedLabelRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/me/": { + "get": { + "operationId": "me_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "me" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/mesh_visualizer/": { + "get": { + "operationId": "mesh_visualizer_retrieve", + "tags": [ + "mesh_visualizer" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/metrics/": { + "get": { + "operationId": "metrics_retrieve", + "description": "Show Metrics Details", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "json", + "txt" + ] + } + } + ], + "tags": [ + "metrics" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/notification_templates/": { + "get": { + "operationId": "notification_templates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "notification_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "notification_templates_create", + "tags": [ + "notification_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/notification_templates/{id}/": { + "get": { + "operationId": "notification_templates_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "notification_templates_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "notification_templates_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedNotificationTemplateRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "notification_templates_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/notification_templates/{id}/copy/": { + "get": { + "operationId": "notification_templates_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "notification_templates_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/notification_templates/{id}/notifications/": { + "get": { + "operationId": "notification_templates_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "notification_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/notification_templates/{id}/test/": { + "post": { + "operationId": "notification_templates_test_create", + "description": "Test a Notification Template", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notification_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/notifications/": { + "get": { + "operationId": "notifications_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "notifications" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/notifications/{id}/": { + "get": { + "operationId": "notifications_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "notifications" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Notification" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/": { + "get": { + "operationId": "organizations_retrieve", + "tags": [ + "organizations" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "organizations_create", + "tags": [ + "organizations" + ], + "responses": { + "201": { + "description": "No response body" + } + } + } + }, + "/api/v2/organizations/{id}/": { + "get": { + "operationId": "organizations_retrieve_2", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "organizations_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "organizations_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedOrganizationRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "organizations_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/organizations/{id}/access_list/": { + "get": { + "operationId": "organizations_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/activity_stream/": { + "get": { + "operationId": "organizations_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/admins/": { + "get": { + "operationId": "organizations_admins_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_admins_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/applications/": { + "get": { + "operationId": "organizations_applications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOAuth2ApplicationList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_applications_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2ApplicationRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/credentials/": { + "get": { + "operationId": "organizations_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOrganizationCredentialSerializerCreateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_credentials_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationCredentialSerializerCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationCredentialSerializerCreate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/execution_environments/": { + "get": { + "operationId": "organizations_execution_environments_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedExecutionEnvironmentList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_execution_environments_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironmentRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExecutionEnvironment" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/galaxy_credentials/": { + "get": { + "operationId": "organizations_galaxy_credentials_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_galaxy_credentials_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/instance_groups/": { + "get": { + "operationId": "organizations_instance_groups_list", + "description": "This mixin overloads attach/detach so that it calls Organization.save(),\nto ensure instance group updates are persisted", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_instance_groups_create", + "description": "This mixin overloads attach/detach so that it calls Organization.save(),\nto ensure instance group updates are persisted", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/inventories/": { + "get": { + "operationId": "organizations_inventories_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/job_templates/": { + "get": { + "operationId": "organizations_job_templates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedJobTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_job_templates_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/notification_templates/": { + "get": { + "operationId": "organizations_notification_templates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_notification_templates_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/notification_templates_approvals/": { + "get": { + "operationId": "organizations_notification_templates_approvals_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_notification_templates_approvals_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/notification_templates_changed/": { + "get": { + "operationId": "organizations_notification_templates_changed_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_notification_templates_changed_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/notification_templates_error/": { + "get": { + "operationId": "organizations_notification_templates_error_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_notification_templates_error_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/notification_templates_started/": { + "get": { + "operationId": "organizations_notification_templates_started_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_notification_templates_started_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/notification_templates_success/": { + "get": { + "operationId": "organizations_notification_templates_success_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_notification_templates_success_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/object_roles/": { + "get": { + "operationId": "organizations_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/projects/": { + "get": { + "operationId": "organizations_projects_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_projects_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/teams/": { + "get": { + "operationId": "organizations_teams_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_teams_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/users/": { + "get": { + "operationId": "organizations_users_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_users_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/organizations/{id}/workflow_job_templates/": { + "get": { + "operationId": "organizations_workflow_job_templates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "organizations" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_workflow_job_templates_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/ping/": { + "get": { + "operationId": "ping_retrieve", + "description": "Return some basic information about this instance\n\nEverything returned here should be considered public / insecure, as\nthis requires no auth and is intended for use by the installer process.", + "tags": [ + "ping" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/project_updates/": { + "get": { + "operationId": "project_updates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectUpdateListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/project_updates/{id}/": { + "get": { + "operationId": "project_updates_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectUpdateDetail" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "project_updates_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/project_updates/{id}/cancel/": { + "get": { + "operationId": "project_updates_cancel_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectUpdateCancel" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "project_updates_cancel_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectUpdateCancel" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/project_updates/{id}/events/": { + "get": { + "operationId": "project_updates_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectUpdateEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/project_updates/{id}/notifications/": { + "get": { + "operationId": "project_updates_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/project_updates/{id}/scm_inventory_updates/": { + "get": { + "operationId": "project_updates_scm_inventory_updates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventoryUpdateListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/project_updates/{id}/stdout/": { + "get": { + "operationId": "project_updates_stdout_retrieve", + "parameters": [ + { + "in": "query", + "name": "format", + "schema": { + "type": "string", + "enum": [ + "ansi", + "ansi_download", + "html", + "json", + "txt", + "txt_download" + ] + } + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "project_updates" + ], + "responses": { + "200": { + "content": { + "text/html": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "text/plain": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnifiedJobStdout" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/": { + "get": { + "operationId": "projects_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_create", + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/": { + "get": { + "operationId": "projects_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "projects_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "projects_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedProjectRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "projects_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/projects/{id}/access_list/": { + "get": { + "operationId": "projects_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/activity_stream/": { + "get": { + "operationId": "projects_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/bitbucket_dc/": { + "post": { + "operationId": "projects_bitbucket_dc_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/projects/{id}/copy/": { + "get": { + "operationId": "projects_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/github/": { + "post": { + "operationId": "projects_github_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/projects/{id}/gitlab/": { + "post": { + "operationId": "projects_gitlab_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/projects/{id}/inventories/": { + "get": { + "operationId": "projects_inventories_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectInventories" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/notification_templates_error/": { + "get": { + "operationId": "projects_notification_templates_error_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_notification_templates_error_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/notification_templates_started/": { + "get": { + "operationId": "projects_notification_templates_started_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_notification_templates_started_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/notification_templates_success/": { + "get": { + "operationId": "projects_notification_templates_success_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_notification_templates_success_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/object_roles/": { + "get": { + "operationId": "projects_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/playbooks/": { + "get": { + "operationId": "projects_playbooks_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectPlaybooks" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/project_updates/": { + "get": { + "operationId": "projects_project_updates_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectUpdateListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/schedules/": { + "get": { + "operationId": "projects_schedules_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedScheduleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_schedules_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/scm_inventory_sources/": { + "get": { + "operationId": "projects_scm_inventory_sources_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInventorySourceList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/teams/": { + "get": { + "operationId": "projects_teams_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/update/": { + "get": { + "operationId": "projects_update_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectUpdateView" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_update_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectUpdateView" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/projects/{id}/webhook_key/": { + "get": { + "operationId": "projects_webhook_key_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "projects_webhook_key_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/receptor_addresses/": { + "get": { + "operationId": "receptor_addresses_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "receptor_addresses" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedReceptorAddressList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/receptor_addresses/{id}/": { + "get": { + "operationId": "receptor_addresses_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "receptor_addresses" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReceptorAddress" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/roles/": { + "get": { + "operationId": "roles_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "roles" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/roles/{id}/": { + "get": { + "operationId": "roles_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "roles" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Role" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/roles/{id}/children/": { + "get": { + "operationId": "roles_children_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "roles" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/roles/{id}/parents/": { + "get": { + "operationId": "roles_parents_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "roles" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/roles/{id}/teams/": { + "get": { + "operationId": "roles_teams_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "roles" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "roles_teams_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "roles" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/roles/{id}/users/": { + "get": { + "operationId": "roles_users_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "roles" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "roles_users_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "roles" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/": { + "get": { + "operationId": "schedules_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "schedules" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedScheduleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "schedules_create", + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/{id}/": { + "get": { + "operationId": "schedules_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "schedules_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "schedules_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedScheduleRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "schedules_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/schedules/{id}/credentials/": { + "get": { + "operationId": "schedules_credentials_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "schedules" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "schedules_credentials_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/{id}/instance_groups/": { + "get": { + "operationId": "schedules_instance_groups_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "schedules" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "schedules_instance_groups_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/{id}/jobs/": { + "get": { + "operationId": "schedules_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "schedules" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUnifiedJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/{id}/labels/": { + "get": { + "operationId": "schedules_labels_list", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "schedules" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "schedules_labels_create", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/preview/": { + "post": { + "operationId": "schedules_preview_create", + "tags": [ + "schedules" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchedulePreviewRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchedulePreview" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/schedules/zoneinfo/": { + "get": { + "operationId": "schedules_zoneinfo_retrieve", + "tags": [ + "schedules" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/settings/": { + "get": { + "operationId": "settings_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + } + ], + "tags": [ + "settings" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedSettingCategoryList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/settings/{category_slug}/": { + "get": { + "operationId": "settings_retrieve", + "parameters": [ + { + "in": "path", + "name": "category_slug", + "schema": { + "type": "string", + "pattern": "^[a-z0-9-]+$" + }, + "required": true + } + ], + "tags": [ + "settings" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingSingleton" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "settings_update", + "parameters": [ + { + "in": "path", + "name": "category_slug", + "schema": { + "type": "string", + "pattern": "^[a-z0-9-]+$" + }, + "required": true + } + ], + "tags": [ + "settings" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingSingletonRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingSingleton" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "settings_partial_update", + "parameters": [ + { + "in": "path", + "name": "category_slug", + "schema": { + "type": "string", + "pattern": "^[a-z0-9-]+$" + }, + "required": true + } + ], + "tags": [ + "settings" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedSettingSingletonRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingSingleton" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "settings_destroy", + "parameters": [ + { + "in": "path", + "name": "category_slug", + "schema": { + "type": "string", + "pattern": "^[a-z0-9-]+$" + }, + "required": true + } + ], + "tags": [ + "settings" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/settings/logging/test/": { + "post": { + "operationId": "settings_logging_test_create", + "tags": [ + "settings" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingSingletonRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingSingleton" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/": { + "get": { + "operationId": "system_job_templates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedSystemJobTemplateList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/{id}/": { + "get": { + "operationId": "system_job_templates_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemJobTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/{id}/jobs/": { + "get": { + "operationId": "system_job_templates_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedSystemJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/{id}/launch/": { + "get": { + "operationId": "system_job_templates_launch_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "system_job_templates_launch_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/system_job_templates/{id}/notification_templates_error/": { + "get": { + "operationId": "system_job_templates_notification_templates_error_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "system_job_templates_notification_templates_error_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/{id}/notification_templates_started/": { + "get": { + "operationId": "system_job_templates_notification_templates_started_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "system_job_templates_notification_templates_started_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/{id}/notification_templates_success/": { + "get": { + "operationId": "system_job_templates_notification_templates_success_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "system_job_templates_notification_templates_success_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_job_templates/{id}/schedules/": { + "get": { + "operationId": "system_job_templates_schedules_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedScheduleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "system_job_templates_schedules_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_jobs/": { + "get": { + "operationId": "system_jobs_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedSystemJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_jobs/{id}/": { + "get": { + "operationId": "system_jobs_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemJob" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "system_jobs_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/system_jobs/{id}/cancel/": { + "get": { + "operationId": "system_jobs_cancel_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemJobCancel" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "system_jobs_cancel_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemJobCancel" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_jobs/{id}/events/": { + "get": { + "operationId": "system_jobs_events_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedSystemJobEventList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/system_jobs/{id}/notifications/": { + "get": { + "operationId": "system_jobs_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "system_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/": { + "get": { + "operationId": "teams_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "teams_create", + "tags": [ + "teams" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/": { + "get": { + "operationId": "teams_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "teams_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "teams_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedTeamRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "teams_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/teams/{id}/access_list/": { + "get": { + "operationId": "teams_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/activity_stream/": { + "get": { + "operationId": "teams_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/credentials/": { + "get": { + "operationId": "teams_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamCredentialSerializerCreateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "teams_credentials_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamCredentialSerializerCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamCredentialSerializerCreate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/object_roles/": { + "get": { + "operationId": "teams_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/projects/": { + "get": { + "operationId": "teams_projects_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/roles/": { + "get": { + "operationId": "teams_roles_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleSerializerWithParentAccessList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "teams_roles_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleSerializerWithParentAccess" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/teams/{id}/users/": { + "get": { + "operationId": "teams_users_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "teams" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "teams_users_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "teams" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/tokens/": { + "get": { + "operationId": "tokens_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "tokens" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOAuth2TokenList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "tokens_create", + "tags": [ + "tokens" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Token" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/tokens/{id}/": { + "get": { + "operationId": "tokens_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "tokens" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenDetail" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "tokens_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "tokens" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenDetailRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenDetail" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "tokens_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "tokens" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedOAuth2TokenDetailRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenDetail" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "tokens_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "tokens" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/tokens/{id}/activity_stream/": { + "get": { + "operationId": "tokens_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "tokens" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/unified_job_templates/": { + "get": { + "operationId": "unified_job_templates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "unified_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUnifiedJobTemplateList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/unified_jobs/": { + "get": { + "operationId": "unified_jobs_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "unified_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUnifiedJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/": { + "get": { + "operationId": "users_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_create", + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/": { + "get": { + "operationId": "users_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "users_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "users_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedUserRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "users_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/users/{id}/access_list/": { + "get": { + "operationId": "users_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/activity_stream/": { + "get": { + "operationId": "users_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/admin_of_organizations/": { + "get": { + "operationId": "users_admin_of_organizations_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/users/{id}/applications/": { + "get": { + "operationId": "users_applications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOAuth2ApplicationList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_applications_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2ApplicationRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/authorized_tokens/": { + "get": { + "operationId": "users_authorized_tokens_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserAuthorizedTokenList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_authorized_tokens_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserAuthorizedTokenRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserAuthorizedToken" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/credentials/": { + "get": { + "operationId": "users_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserCredentialSerializerCreateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_credentials_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserCredentialSerializerCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserCredentialSerializerCreate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/organizations/": { + "get": { + "operationId": "users_organizations_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/users/{id}/personal_tokens/": { + "get": { + "operationId": "users_personal_tokens_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserPersonalTokenList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_personal_tokens_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserPersonalTokenRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserPersonalToken" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/projects/": { + "get": { + "operationId": "users_projects_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedProjectList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/roles/": { + "get": { + "operationId": "users_roles_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleSerializerWithParentAccessList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_roles_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleSerializerWithParentAccess" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/teams/": { + "get": { + "operationId": "users_teams_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTeamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/users/{id}/tokens/": { + "get": { + "operationId": "users_tokens_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOAuth2TokenList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "users_tokens_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2TokenRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2Token" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_approval_templates/{id}/": { + "get": { + "operationId": "workflow_approval_templates_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approval_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowApprovalTemplate" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "workflow_approval_templates_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approval_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowApprovalTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowApprovalTemplate" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "workflow_approval_templates_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approval_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedWorkflowApprovalTemplateRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowApprovalTemplate" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "workflow_approval_templates_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approval_templates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_approval_templates/{id}/approvals/": { + "get": { + "operationId": "workflow_approval_templates_approvals_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_approval_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowApprovalListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_approval_votes/": { + "get": { + "operationId": "workflow_approval_votes_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_approval_votes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowApprovalVoteList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_approval_votes/{id}/": { + "get": { + "operationId": "workflow_approval_votes_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approval_votes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowApprovalVote" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_approvals/": { + "get": { + "operationId": "workflow_approvals_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowApprovalListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_approvals/{id}/": { + "get": { + "operationId": "workflow_approvals_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowApproval" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "workflow_approvals_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_approvals/{id}/approve/": { + "get": { + "operationId": "workflow_approvals_approve_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "workflow_approvals_approve_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_approvals/{id}/deny/": { + "get": { + "operationId": "workflow_approvals_deny_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "workflow_approvals_deny_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_approvals/{id}/votes/": { + "get": { + "operationId": "workflow_approvals_votes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_approvals" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowApprovalVoteList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/": { + "get": { + "operationId": "workflow_job_nodes_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobNodeListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/": { + "get": { + "operationId": "workflow_job_nodes_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobNodeDetail" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/always_nodes/": { + "get": { + "operationId": "workflow_job_nodes_always_nodes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobNodeListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/condition_nodes/": { + "get": { + "operationId": "workflow_job_nodes_condition_nodes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobNodeListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/credentials/": { + "get": { + "operationId": "workflow_job_nodes_credentials_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/failure_nodes/": { + "get": { + "operationId": "workflow_job_nodes_failure_nodes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobNodeListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/instance_groups/": { + "get": { + "operationId": "workflow_job_nodes_instance_groups_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_nodes_instance_groups_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/labels/": { + "get": { + "operationId": "workflow_job_nodes_labels_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_nodes/{id}/success_nodes/": { + "get": { + "operationId": "workflow_job_nodes_success_nodes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobNodeListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/": { + "get": { + "operationId": "workflow_job_template_nodes_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateNodeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_create", + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/": { + "get": { + "operationId": "workflow_job_template_nodes_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeDetail" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "workflow_job_template_nodes_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeDetailRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeDetail" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "workflow_job_template_nodes_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedWorkflowJobTemplateNodeDetailRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeDetail" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "workflow_job_template_nodes_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/always_nodes/": { + "get": { + "operationId": "workflow_job_template_nodes_always_nodes_list", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateNodeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_always_nodes_create", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/condition_nodes/": { + "get": { + "operationId": "workflow_job_template_nodes_condition_nodes_list", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateNodeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_condition_nodes_create", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/create_approval_template/": { + "get": { + "operationId": "workflow_job_template_nodes_create_approval_template_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeCreateApproval" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_create_approval_template_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeCreateApprovalRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeCreateApproval" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/credentials/": { + "get": { + "operationId": "workflow_job_template_nodes_credentials_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedCredentialList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_credentials_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/failure_nodes/": { + "get": { + "operationId": "workflow_job_template_nodes_failure_nodes_list", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateNodeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_failure_nodes_create", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/instance_groups/": { + "get": { + "operationId": "workflow_job_template_nodes_instance_groups_list", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedInstanceGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_instance_groups_create", + "description": "Derived version of SubListCreateAttachDetachAPIView that prohibits creation", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/labels/": { + "get": { + "operationId": "workflow_job_template_nodes_labels_list", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_labels_create", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_template_nodes/{id}/success_nodes/": { + "get": { + "operationId": "workflow_job_template_nodes_success_nodes_list", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateNodeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_template_nodes_success_nodes_create", + "description": "Useful when you have a self-referring ManyToManyRelationship.\n* Tower uses a shallow (2-deep only) url pattern. For example:\n\nWhen an object hangs off of a parent object you would have the url of the\nform /api/v2/parent_model/34/child_model. If you then wanted a child of the\nchild model you would NOT do /api/v2/parent_model/34/child_model/87/child_child_model\nInstead, you would access the child_child_model via /api/v2/child_child_model/87/\nand you would create child_child_model's off of /api/v2/child_model/87/child_child_model_set\nNow, when creating child_child_model related to child_model you still want to\nlink child_child_model to parent_model. That's what this class is for", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_template_nodes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/": { + "get": { + "operationId": "workflow_job_templates_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_create", + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/": { + "get": { + "operationId": "workflow_job_templates_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplate" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "workflow_job_templates_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplate" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "workflow_job_templates_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedWorkflowJobTemplateRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplate" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "workflow_job_templates_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/access_list/": { + "get": { + "operationId": "workflow_job_templates_access_list_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceAccessListElementList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/activity_stream/": { + "get": { + "operationId": "workflow_job_templates_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/bitbucket_dc/": { + "post": { + "operationId": "workflow_job_templates_bitbucket_dc_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/copy/": { + "get": { + "operationId": "workflow_job_templates_copy_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Copy" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/github/": { + "post": { + "operationId": "workflow_job_templates_github_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/gitlab/": { + "post": { + "operationId": "workflow_job_templates_gitlab_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/labels/": { + "get": { + "operationId": "workflow_job_templates_labels_list", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_labels_create", + "description": "For related labels lists like /api/v2/inventories/N/labels/\n\nWe want want the last instance to be deleted from the database\nwhen the last disassociate happens.\n\nSubclasses need to define parent_model", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LabelRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/launch/": { + "get": { + "operationId": "workflow_job_templates_launch_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobLaunch" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_launch_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobLaunchRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobLaunch" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/notification_templates_approvals/": { + "get": { + "operationId": "workflow_job_templates_notification_templates_approvals_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_notification_templates_approvals_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/notification_templates_error/": { + "get": { + "operationId": "workflow_job_templates_notification_templates_error_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_notification_templates_error_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/notification_templates_started/": { + "get": { + "operationId": "workflow_job_templates_notification_templates_started_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_notification_templates_started_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/notification_templates_success/": { + "get": { + "operationId": "workflow_job_templates_notification_templates_success_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationTemplateList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_notification_templates_success_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/object_roles/": { + "get": { + "operationId": "workflow_job_templates_object_roles_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedRoleList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/schedules/": { + "get": { + "operationId": "workflow_job_templates_schedules_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedScheduleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_schedules_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Schedule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/survey_spec/": { + "get": { + "operationId": "workflow_job_templates_survey_spec_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "workflow_job_templates_survey_spec_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "delete": { + "operationId": "workflow_job_templates_survey_spec_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/webhook_key/": { + "get": { + "operationId": "workflow_job_templates_webhook_key_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "workflow_job_templates_webhook_key_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/workflow_jobs/": { + "get": { + "operationId": "workflow_job_templates_workflow_jobs_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_job_templates/{id}/workflow_nodes/": { + "get": { + "operationId": "workflow_job_templates_workflow_nodes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_job_templates" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobTemplateNodeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_job_templates_workflow_nodes_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_job_templates" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNodeRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_jobs/": { + "get": { + "operationId": "workflow_jobs_list", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/": { + "get": { + "operationId": "workflow_jobs_retrieve", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJob" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "workflow_jobs_destroy", + "description": "Special handling when deleting a running unified job object.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/activity_stream/": { + "get": { + "operationId": "workflow_jobs_activity_stream_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedActivityStreamList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/cancel/": { + "get": { + "operationId": "workflow_jobs_cancel_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobCancel" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "workflow_jobs_cancel_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowJobCancel" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/labels/": { + "get": { + "operationId": "workflow_jobs_labels_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedLabelList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/notifications/": { + "get": { + "operationId": "workflow_jobs_notifications_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedNotificationList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/relaunch/": { + "get": { + "operationId": "workflow_jobs_relaunch_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "description": "No response body" + } + } + }, + "post": { + "operationId": "workflow_jobs_relaunch_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/workflow_jobs/{id}/workflow_nodes/": { + "get": { + "operationId": "workflow_jobs_workflow_nodes_list", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "integer" + }, + "required": true + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "A search term.", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "workflow_jobs" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedWorkflowJobNodeListList" + } + } + }, + "description": "" + } + } + } + }, + "/api/debug/": { + "get": { + "operationId": "api_debug_retrieve", + "description": "List of available debug urls", + "tags": [ + "api" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/debug/dependency_manager/": { + "get": { + "operationId": "api_debug_dependency_manager_retrieve", + "tags": [ + "api" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/debug/task_manager/": { + "get": { + "operationId": "api_debug_task_manager_retrieve", + "tags": [ + "api" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/debug/workflow_manager/": { + "get": { + "operationId": "api_debug_workflow_manager_retrieve", + "tags": [ + "api" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/o/": { + "get": { + "operationId": "api_o_retrieve", + "tags": [ + "api" + ], + "security": [ + {} + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/service-index/": { + "get": { + "operationId": "service_index_retrieve", + "description": "Link other resource registry endpoints", + "tags": [ + "service-index" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/service-index/metadata/": { + "get": { + "operationId": "service_index_metadata_retrieve", + "tags": [ + "service-index" + ], + "responses": { + "200": { + "description": "No response body" + } + } + } + }, + "/api/v2/service-index/resource-types/": { + "get": { + "operationId": "service_index_resource_types_list", + "description": "Index of the resource types that are configured in the system.", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + } + ], + "tags": [ + "service-index" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceTypeList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/service-index/resource-types/{name}/": { + "get": { + "operationId": "service_index_resource_types_retrieve", + "description": "Index of the resource types that are configured in the system.", + "parameters": [ + { + "in": "path", + "name": "name", + "schema": { + "type": "string", + "pattern": "^[^/]+$" + }, + "required": true + } + ], + "tags": [ + "service-index" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceType" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/service-index/resource-types/{name}/manifest/": { + "get": { + "operationId": "service_index_resource_types_manifest_retrieve", + "description": "Returns the as a stream the csv of resource_id,hash for a given resource type.", + "parameters": [ + { + "in": "path", + "name": "name", + "schema": { + "type": "string", + "pattern": "^[^/]+$" + }, + "required": true + } + ], + "tags": [ + "service-index" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceType" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/service-index/resources/": { + "get": { + "operationId": "service_index_resources_list", + "description": "List all resources. Accepts an optional 'extra_fields' query parameter (comma-separated) to include additional fields in the response. Supported values: resource_data.", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + } + ], + "tags": [ + "service-index" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedResourceListList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "service_index_resources_create", + "description": "Index of all the resources in the system.", + "tags": [ + "service-index" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Resource" + } + } + }, + "description": "" + } + } + } + }, + "/api/v2/service-index/resources/{ansible_id}/": { + "get": { + "operationId": "service_index_resources_retrieve", + "description": "Index of all the resources in the system.", + "parameters": [ + { + "in": "path", + "name": "ansible_id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "required": true + } + ], + "tags": [ + "service-index" + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Resource" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "service_index_resources_update", + "description": "Index of all the resources in the system.", + "parameters": [ + { + "in": "path", + "name": "ansible_id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "required": true + } + ], + "tags": [ + "service-index" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Resource" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "service_index_resources_partial_update", + "description": "Index of all the resources in the system.", + "parameters": [ + { + "in": "path", + "name": "ansible_id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "required": true + } + ], + "tags": [ + "service-index" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedResourceRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Resource" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "service_index_resources_destroy", + "description": "Index of all the resources in the system.", + "parameters": [ + { + "in": "path", + "name": "ansible_id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "required": true + } + ], + "tags": [ + "service-index" + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v2/service-index/resources/bulk-update/": { + "post": { + "operationId": "service_index_resources_bulk_update_create", + "description": "Bulk-update resource metadata (new_service_id, new_ansible_id, is_partially_migrated, resource_data).\n\nAccepts a JSON object with an ``items`` key containing a list of update objects.\nEach object must contain at minimum an ``ansible_id`` identifying the resource\nto update plus one or more fields to change.\nEach item is applied in its own savepoint so that a failure in one item\ndoes not roll back others.\n\nReturns a summary with the count of updated resources and any per-item errors.\n\nPerformance note:\n This endpoint uses a loop-of-singles pattern (one savepoint + update_resource()\n per item) rather than Django's QuerySet.bulk_update(). This is an intentional\n trade-off: ResourceTypeProcessor.save() is a per-service plugin point with\n custom logic (e.g. M2M permission handling in RoleDefinitionProcessor) that\n cannot be expressed as a single bulk SQL statement. The primary performance\n gain of this endpoint comes from eliminating N HTTP round-trips — the DB query\n overhead of per-item saves is negligible on a local connection for typical\n batch sizes (100-1000 items). True DB-level batching can be explored as a\n future optimization for metadata-only fields.", + "tags": [ + "service-index" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Resource" + } + } + }, + "description": "" + } + } + } + } + }, + "components": { + "schemas": { + "ALLOWJINJAINEXTRAVARSEnum": { + "enum": [ + "always", + "never", + "template" + ], + "type": "string", + "description": "* `always` - Always\n* `never` - Never\n* `template` - Only On Job Template Definitions" + }, + "AUTHLDAP1GROUPTYPEEnum": { + "enum": [ + "PosixGroupType", + "GroupOfNamesType", + "GroupOfUniqueNamesType", + "ActiveDirectoryGroupType", + "OrganizationalRoleGroupType", + "MemberDNGroupType", + "NestedGroupOfNamesType", + "NestedGroupOfUniqueNamesType", + "NestedActiveDirectoryGroupType", + "NestedOrganizationalRoleGroupType", + "NestedMemberDNGroupType", + "PosixUIDGroupType" + ], + "type": "string", + "description": "* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTHLDAP2GROUPTYPEEnum": { + "enum": [ + "PosixGroupType", + "GroupOfNamesType", + "GroupOfUniqueNamesType", + "ActiveDirectoryGroupType", + "OrganizationalRoleGroupType", + "MemberDNGroupType", + "NestedGroupOfNamesType", + "NestedGroupOfUniqueNamesType", + "NestedActiveDirectoryGroupType", + "NestedOrganizationalRoleGroupType", + "NestedMemberDNGroupType", + "PosixUIDGroupType" + ], + "type": "string", + "description": "* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTHLDAP3GROUPTYPEEnum": { + "enum": [ + "PosixGroupType", + "GroupOfNamesType", + "GroupOfUniqueNamesType", + "ActiveDirectoryGroupType", + "OrganizationalRoleGroupType", + "MemberDNGroupType", + "NestedGroupOfNamesType", + "NestedGroupOfUniqueNamesType", + "NestedActiveDirectoryGroupType", + "NestedOrganizationalRoleGroupType", + "NestedMemberDNGroupType", + "PosixUIDGroupType" + ], + "type": "string", + "description": "* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTHLDAP4GROUPTYPEEnum": { + "enum": [ + "PosixGroupType", + "GroupOfNamesType", + "GroupOfUniqueNamesType", + "ActiveDirectoryGroupType", + "OrganizationalRoleGroupType", + "MemberDNGroupType", + "NestedGroupOfNamesType", + "NestedGroupOfUniqueNamesType", + "NestedActiveDirectoryGroupType", + "NestedOrganizationalRoleGroupType", + "NestedMemberDNGroupType", + "PosixUIDGroupType" + ], + "type": "string", + "description": "* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTHLDAP5GROUPTYPEEnum": { + "enum": [ + "PosixGroupType", + "GroupOfNamesType", + "GroupOfUniqueNamesType", + "ActiveDirectoryGroupType", + "OrganizationalRoleGroupType", + "MemberDNGroupType", + "NestedGroupOfNamesType", + "NestedGroupOfUniqueNamesType", + "NestedActiveDirectoryGroupType", + "NestedOrganizationalRoleGroupType", + "NestedMemberDNGroupType", + "PosixUIDGroupType" + ], + "type": "string", + "description": "* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTHLDAPGROUPTYPEEnum": { + "enum": [ + "PosixGroupType", + "GroupOfNamesType", + "GroupOfUniqueNamesType", + "ActiveDirectoryGroupType", + "OrganizationalRoleGroupType", + "MemberDNGroupType", + "NestedGroupOfNamesType", + "NestedGroupOfUniqueNamesType", + "NestedActiveDirectoryGroupType", + "NestedOrganizationalRoleGroupType", + "NestedMemberDNGroupType", + "PosixUIDGroupType" + ], + "type": "string", + "description": "* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "ActivityStream": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "timestamp": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "operation": { + "nullable": true, + "description": "The action taken with respect to the given object(s).\n\n* `create` - Entity Created\n* `update` - Entity Updated\n* `delete` - Entity Deleted\n* `associate` - Entity Associated with another Entity\n* `disassociate` - Entity was Disassociated with another Entity", + "oneOf": [ + { + "$ref": "#/components/schemas/OperationEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "changes": { + "type": "string", + "readOnly": true, + "description": "A summary of the new and changed values when an object is created, updated, or deleted" + }, + "object1": { + "type": "string", + "nullable": true, + "description": "For create, update, and delete events this is the object type that was affected. For associate and disassociate events this is the object type associated or disassociated with object2." + }, + "object2": { + "type": "string", + "nullable": true, + "description": "Unpopulated for create, update, and delete events. For associate and disassociate events this is the object type that object1 is being associated with." + }, + "object_association": { + "type": "string", + "readOnly": true, + "description": "When present, shows the field name of the role or relationship that changed." + }, + "action_node": { + "type": "string", + "readOnly": true, + "description": "The cluster node the activity took place on." + }, + "object_type": { + "type": "string", + "readOnly": true, + "description": "When present, shows the model on which the role or relationship was defined." + } + }, + "required": [ + "action_node", + "changes", + "id", + "object1", + "object2", + "object_association", + "object_type", + "operation", + "related", + "summary_fields", + "timestamp", + "type", + "url" + ] + }, + "AdHocCommandCancel": { + "type": "object", + "properties": { + "can_cancel": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_cancel" + ] + }, + "AdHocCommandDetail": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "event_processing_finished": { + "type": "boolean", + "readOnly": true, + "description": "Indicates whether all of the events generated by this unified job have been saved to the database." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential": { + "type": "integer", + "nullable": true + }, + "module_name": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleNameEnum" + } + ], + "default": "command" + }, + "module_args": { + "type": "string", + "nullable": true, + "default": "" + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "become_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false + }, + "host_status_counts": { + "readOnly": true, + "nullable": true, + "description": "Playbook stats from the Ansible playbook_on_stats event." + } + }, + "required": [ + "canceled_on", + "controller_node", + "created", + "elapsed", + "event_processing_finished", + "execution_node", + "failed", + "finished", + "host_status_counts", + "id", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "result_traceback", + "started", + "status", + "summary_fields", + "type", + "url", + "work_unit_id" + ] + }, + "AdHocCommandEvent": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "ad_hoc_command": { + "type": "integer", + "readOnly": true + }, + "event": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/AdHocCommandEventEventEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "counter": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "event_display": { + "type": "string", + "readOnly": true + }, + "event_data": { + "default": {} + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "changed": { + "type": "boolean", + "readOnly": true + }, + "uuid": { + "type": "string", + "readOnly": true + }, + "host": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "host_name": { + "type": "string", + "readOnly": true + }, + "stdout": { + "type": "string", + "readOnly": true + }, + "start_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "end_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "verbosity": { + "type": "integer", + "minimum": 0, + "readOnly": true + } + }, + "required": [ + "ad_hoc_command", + "changed", + "counter", + "created", + "end_line", + "event", + "event_display", + "failed", + "host", + "host_name", + "id", + "modified", + "related", + "start_line", + "stdout", + "summary_fields", + "type", + "url", + "uuid", + "verbosity" + ] + }, + "AdHocCommandEventEventEnum": { + "enum": [ + "runner_on_failed", + "runner_on_ok", + "runner_on_unreachable", + "runner_on_skipped", + "debug", + "verbose", + "deprecated", + "warning", + "system_warning", + "error" + ], + "type": "string", + "description": "* `runner_on_failed` - Host Failed\n* `runner_on_ok` - Host OK\n* `runner_on_unreachable` - Host Unreachable\n* `runner_on_skipped` - Host Skipped\n* `debug` - Debug\n* `verbose` - Verbose\n* `deprecated` - Deprecated\n* `warning` - Warning\n* `system_warning` - System Warning\n* `error` - Error" + }, + "AdHocCommandList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential": { + "type": "integer", + "nullable": true + }, + "module_name": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleNameEnum" + } + ], + "default": "command" + }, + "module_args": { + "type": "string", + "nullable": true, + "default": "" + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "become_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false + } + }, + "required": [ + "canceled_on", + "controller_node", + "created", + "elapsed", + "execution_node", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "started", + "status", + "summary_fields", + "type", + "url", + "work_unit_id" + ] + }, + "AdHocCommandListRequest": { + "type": "object", + "properties": { + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential": { + "type": "integer", + "nullable": true + }, + "module_name": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleNameEnum" + } + ], + "default": "command" + }, + "module_args": { + "type": "string", + "nullable": true, + "default": "" + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "become_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false + } + } + }, + "AnsibleFacts": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + } + }, + "required": [ + "created", + "id", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "AuthorizationGrantTypeEnum": { + "enum": [ + "authorization-code", + "password" + ], + "type": "string", + "description": "* `authorization-code` - Authorization code\n* `password` - Resource owner password-based" + }, + "BlankEnum": { + "enum": [ + "" + ] + }, + "BulkHost": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Is this host online and available for running jobs?" + }, + "instance_id": { + "type": "string", + "nullable": true, + "default": "", + "description": "The value used by the remote inventory source to uniquely identify the host", + "maxLength": 1024 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + }, + "required": [ + "name" + ] + }, + "BulkHostCreateRequest": { + "type": "object", + "properties": { + "inventory": { + "type": "integer", + "writeOnly": true, + "description": "Primary Key ID of inventory to add hosts to." + }, + "hosts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkHostRequest" + }, + "writeOnly": true, + "description": "List of hosts to be created, JSON. e.g. [{\"name\": \"example.com\"}, {\"name\": \"127.0.0.1\"}]", + "maxItems": 100000 + } + }, + "required": [ + "hosts", + "inventory" + ] + }, + "BulkHostDeleteRequest": { + "type": "object", + "properties": { + "hosts": { + "type": "array", + "items": {}, + "writeOnly": true, + "description": "List of hosts ids to be deleted, e.g. [105, 130, 131, 200]", + "maxItems": 100000 + } + }, + "required": [ + "hosts" + ] + }, + "BulkHostRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Is this host online and available for running jobs?" + }, + "instance_id": { + "type": "string", + "nullable": true, + "default": "", + "description": "The value used by the remote inventory source to uniquely identify the host", + "maxLength": 1024 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + }, + "required": [ + "name" + ] + }, + "BulkJobLaunchRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "writeOnly": true, + "default": "Bulk Job Launch", + "maxLength": 512 + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkJobNodeRequest" + }, + "writeOnly": true, + "description": "List of jobs to be launched, JSON. e.g. [{\"unified_job_template\": 7}, {\"unified_job_template\": 10}]" + }, + "description": { + "type": "string", + "writeOnly": true, + "minLength": 1 + }, + "extra_vars": { + "writeOnly": true + }, + "organization": { + "type": "integer", + "writeOnly": true, + "nullable": true, + "description": "Inherit permissions from this organization. If not provided, a organization the user is a member of will be selected automatically." + }, + "inventory": { + "type": "integer", + "writeOnly": true + }, + "limit": { + "type": "string", + "writeOnly": true, + "minLength": 1 + }, + "scm_branch": { + "type": "string", + "writeOnly": true, + "minLength": 1, + "maxLength": 1024 + }, + "skip_tags": { + "type": "string", + "writeOnly": true, + "minLength": 1 + }, + "job_tags": { + "type": "string", + "writeOnly": true, + "minLength": 1 + } + }, + "required": [ + "jobs" + ] + }, + "BulkJobNode": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "minimum": 1 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "minimum": 1 + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "job": { + "type": "integer", + "nullable": true + }, + "workflow_job": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer", + "minimum": 1, + "description": "Primary key of the template for this job, can be a job template or inventory source." + }, + "success_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "failure_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "always_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_edges": { + "type": "string", + "readOnly": true, + "description": "List of condition data for each conditional edge originating from this node; id is the target node." + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "do_not_run": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Indicates that a job will not be created when True. Workflow runtime semantics will mark this True if the node is in a path that will decidedly not be ran. A value of False means the node may not run." + }, + "prior_run_succeeded": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set when a workflow is relaunched from a failed node: the node's job succeeded in the prior run, so it is carried forward as already-successful. It spawns no new job, but the scheduler treats it as a successful parent so its success/always paths are still traversed." + }, + "prior_run_elapsed": { + "type": "number", + "format": "double", + "readOnly": true, + "nullable": true, + "description": "Elapsed time (seconds) of this node's job in the run it was carried forward from." + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "retry_attempts": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Number of times this node's job has been automatically retried after failing." + }, + "retried_jobs": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "identifier": { + "type": "string", + "nullable": true, + "description": "An identifier coresponding to the workflow job template node that this node was created from.", + "maxLength": 512 + }, + "credentials": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + }, + "instance_groups": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + } + }, + "required": [ + "always_nodes", + "condition_edges", + "condition_nodes", + "created", + "failure_nodes", + "id", + "modified", + "prior_run_elapsed", + "related", + "retried_jobs", + "retry_attempts", + "success_nodes", + "summary_fields", + "type", + "unified_job_template", + "url" + ] + }, + "BulkJobNodeRequest": { + "type": "object", + "properties": { + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "minimum": 1 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "minimum": 1 + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "job": { + "type": "integer", + "nullable": true + }, + "workflow_job": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer", + "minimum": 1, + "description": "Primary key of the template for this job, can be a job template or inventory source." + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "do_not_run": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Indicates that a job will not be created when True. Workflow runtime semantics will mark this True if the node is in a path that will decidedly not be ran. A value of False means the node may not run." + }, + "prior_run_succeeded": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set when a workflow is relaunched from a failed node: the node's job succeeded in the prior run, so it is carried forward as already-successful. It spawns no new job, but the scheduler treats it as a successful parent so its success/always paths are still traversed." + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "identifier": { + "type": "string", + "nullable": true, + "description": "An identifier coresponding to the workflow job template node that this node was created from.", + "maxLength": 512 + }, + "credentials": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + }, + "instance_groups": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + } + }, + "required": [ + "unified_job_template" + ] + }, + "ClientTypeEnum": { + "enum": [ + "confidential", + "public" + ], + "type": "string", + "description": "* `confidential` - Confidential\n* `public` - Public" + }, + "ConstructedInventory": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "kind": { + "readOnly": true, + "nullable": true, + "description": "Kind of inventory being represented.\n\n* `` - Hosts have a direct link to this inventory.\n* `smart` - Hosts for inventory generated using the host_filter property.\n* `constructed` - Parse list of source inventories with the constructed inventory plugin.\n* `federated` - Route jobs to source inventory instance groups automatically.", + "oneOf": [ + { + "$ref": "#/components/schemas/KindA5dEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "has_active_failures": { + "type": "boolean", + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Flag indicating whether any hosts in this inventory have failed." + }, + "total_hosts": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Total number of hosts in this inventory." + }, + "hosts_with_active_failures": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Number of hosts in this inventory with active failures." + }, + "total_groups": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Total number of groups in this inventory." + }, + "has_inventory_sources": { + "type": "boolean", + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Flag indicating whether this inventory has any external inventory sources." + }, + "total_inventory_sources": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Total number of external inventory sources configured within this inventory." + }, + "inventory_sources_with_failures": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Number of external inventory sources in this inventory with failures." + }, + "pending_deletion": { + "type": "boolean", + "readOnly": true, + "description": "Flag indicating the inventory is being deleted." + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the inventory will prevent adding any organization instance groups to the list of preferred instances groups to run associated job templates on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + }, + "source_vars": { + "type": "string", + "description": "The source_vars for the related auto-created inventory source, special to constructed inventory." + }, + "update_cache_timeout": { + "type": "integer", + "minimum": 0, + "nullable": true, + "description": "The cache timeout for the related auto-created inventory source, special to constructed inventory" + }, + "limit": { + "type": "string", + "description": "The limit to restrict the returned hosts for the related auto-created inventory source, special to constructed inventory." + }, + "verbosity": { + "type": "integer", + "maximum": 2, + "minimum": 0, + "nullable": true, + "description": "The verbosity level for the related auto-created inventory source, special to constructed inventory" + } + }, + "required": [ + "created", + "has_active_failures", + "has_inventory_sources", + "hosts_with_active_failures", + "id", + "inventory_sources_with_failures", + "kind", + "modified", + "name", + "organization", + "pending_deletion", + "related", + "summary_fields", + "total_groups", + "total_hosts", + "total_inventory_sources", + "type", + "url" + ] + }, + "ConstructedInventoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the inventory will prevent adding any organization instance groups to the list of preferred instances groups to run associated job templates on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + }, + "source_vars": { + "type": "string", + "description": "The source_vars for the related auto-created inventory source, special to constructed inventory." + }, + "update_cache_timeout": { + "type": "integer", + "minimum": 0, + "nullable": true, + "description": "The cache timeout for the related auto-created inventory source, special to constructed inventory" + }, + "limit": { + "type": "string", + "description": "The limit to restrict the returned hosts for the related auto-created inventory source, special to constructed inventory." + }, + "verbosity": { + "type": "integer", + "maximum": 2, + "minimum": 0, + "nullable": true, + "description": "The verbosity level for the related auto-created inventory source, special to constructed inventory" + } + }, + "required": [ + "name", + "organization" + ] + }, + "Copy": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "CopyRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name" + ] + }, + "Credential": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "kind": { + "type": "string", + "readOnly": true + }, + "cloud": { + "type": "string", + "readOnly": true + }, + "kubernetes": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "cloud", + "created", + "credential_type", + "id", + "kind", + "kubernetes", + "managed", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "CredentialInputSource": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "input_field_name": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "metadata": { + "default": {} + }, + "target_credential": { + "type": "integer" + }, + "source_credential": { + "type": "integer" + } + }, + "required": [ + "created", + "id", + "input_field_name", + "modified", + "related", + "source_credential", + "summary_fields", + "target_credential", + "type", + "url" + ] + }, + "CredentialInputSourceRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "input_field_name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 1024 + }, + "metadata": { + "default": {} + }, + "target_credential": { + "type": "integer" + }, + "source_credential": { + "type": "integer" + } + }, + "required": [ + "input_field_name", + "source_credential", + "target_credential" + ] + }, + "CredentialRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + } + }, + "required": [ + "credential_type", + "name" + ] + }, + "CredentialSerializerCreate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Inherit permissions from organization roles. If provided on creation, do not give either user or team." + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "kind": { + "type": "string", + "readOnly": true + }, + "cloud": { + "type": "string", + "readOnly": true + }, + "kubernetes": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "cloud", + "created", + "credential_type", + "id", + "kind", + "kubernetes", + "managed", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "CredentialSerializerCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Inherit permissions from organization roles. If provided on creation, do not give either user or team." + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "user": { + "type": "integer", + "writeOnly": true, + "nullable": true, + "description": "Write-only field used to add user to owner role. If provided, do not give either team or organization. Only valid for creation." + }, + "team": { + "type": "integer", + "writeOnly": true, + "nullable": true, + "description": "Write-only field used to add team to owner role. If provided, do not give either user or organization. Only valid for creation." + } + }, + "required": [ + "credential_type", + "name" + ] + }, + "CredentialType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "kind": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/CredentialTypeKindEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "namespace": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "injectors": { + "default": {}, + "description": "Enter injectors using either JSON or YAML syntax. Refer to the documentation for example syntax." + } + }, + "required": [ + "created", + "id", + "kind", + "managed", + "modified", + "name", + "namespace", + "related", + "summary_fields", + "type", + "url" + ] + }, + "CredentialTypeKindEnum": { + "enum": [ + "ssh", + "vault", + "net", + "scm", + "cloud", + "registry", + "token", + "insights", + "external", + "kubernetes", + "galaxy", + "cryptography" + ], + "type": "string", + "description": "* `ssh` - Machine\n* `vault` - Vault\n* `net` - Network\n* `scm` - Source Control\n* `cloud` - Cloud\n* `registry` - Container Registry\n* `token` - Personal Access Token\n* `insights` - Insights\n* `external` - External\n* `kubernetes` - Kubernetes\n* `galaxy` - Galaxy/Automation Hub\n* `cryptography` - Cryptography" + }, + "CredentialTypeRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "kind": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/CredentialTypeKindEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "injectors": { + "default": {}, + "description": "Enter injectors using either JSON or YAML syntax. Refer to the documentation for example syntax." + } + }, + "required": [ + "kind", + "name" + ] + }, + "EventC0bEnum": { + "enum": [ + "runner_on_failed", + "runner_on_start", + "runner_on_ok", + "runner_on_error", + "runner_on_skipped", + "runner_on_unreachable", + "runner_on_no_hosts", + "runner_on_async_poll", + "runner_on_async_ok", + "runner_on_async_failed", + "runner_item_on_ok", + "runner_item_on_failed", + "runner_item_on_skipped", + "runner_retry", + "runner_on_file_diff", + "playbook_on_start", + "playbook_on_notify", + "playbook_on_include", + "playbook_on_no_hosts_matched", + "playbook_on_no_hosts_remaining", + "playbook_on_task_start", + "playbook_on_vars_prompt", + "playbook_on_setup", + "playbook_on_import_for_host", + "playbook_on_not_import_for_host", + "playbook_on_play_start", + "playbook_on_stats", + "debug", + "verbose", + "deprecated", + "warning", + "system_warning", + "error" + ], + "type": "string", + "description": "* `runner_on_failed` - Host Failed\n* `runner_on_start` - Host Started\n* `runner_on_ok` - Host OK\n* `runner_on_error` - Host Failure\n* `runner_on_skipped` - Host Skipped\n* `runner_on_unreachable` - Host Unreachable\n* `runner_on_no_hosts` - No Hosts Remaining\n* `runner_on_async_poll` - Host Polling\n* `runner_on_async_ok` - Host Async OK\n* `runner_on_async_failed` - Host Async Failure\n* `runner_item_on_ok` - Item OK\n* `runner_item_on_failed` - Item Failed\n* `runner_item_on_skipped` - Item Skipped\n* `runner_retry` - Host Retry\n* `runner_on_file_diff` - File Difference\n* `playbook_on_start` - Playbook Started\n* `playbook_on_notify` - Running Handlers\n* `playbook_on_include` - Including File\n* `playbook_on_no_hosts_matched` - No Hosts Matched\n* `playbook_on_no_hosts_remaining` - No Hosts Remaining\n* `playbook_on_task_start` - Task Started\n* `playbook_on_vars_prompt` - Variables Prompted\n* `playbook_on_setup` - Gathering Facts\n* `playbook_on_import_for_host` - internal: on Import for Host\n* `playbook_on_not_import_for_host` - internal: on Not Import for Host\n* `playbook_on_play_start` - Play Started\n* `playbook_on_stats` - Playbook Complete\n* `debug` - Debug\n* `verbose` - Verbose\n* `deprecated` - Deprecated\n* `warning` - Warning\n* `system_warning` - System Warning\n* `error` - Error" + }, + "ExecutionEnvironment": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this execution environment." + }, + "image": { + "type": "string", + "nullable": true, + "title": "Image location", + "description": "The full image location, including the container registry, image name, and version tag.", + "maxLength": 1024 + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "credential": { + "type": "integer", + "nullable": true + }, + "pull": { + "nullable": true, + "default": "", + "description": "Pull image before running?\n\n* `always` - Always pull container before running.\n* `missing` - Only pull the image if not present before running.\n* `never` - Never pull container before running.", + "oneOf": [ + { + "$ref": "#/components/schemas/PullEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "created", + "id", + "image", + "managed", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "ExecutionEnvironmentRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this execution environment." + }, + "image": { + "type": "string", + "nullable": true, + "minLength": 1, + "title": "Image location", + "description": "The full image location, including the container registry, image name, and version tag.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "nullable": true + }, + "pull": { + "nullable": true, + "default": "", + "description": "Pull image before running?\n\n* `always` - Always pull container before running.\n* `missing` - Only pull the image if not present before running.\n* `never` - Never pull container before running.", + "oneOf": [ + { + "$ref": "#/components/schemas/PullEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "image", + "name" + ] + }, + "FederatedInventory": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "kind": { + "readOnly": true, + "nullable": true, + "description": "Kind of inventory being represented.\n\n* `` - Hosts have a direct link to this inventory.\n* `smart` - Hosts for inventory generated using the host_filter property.\n* `constructed` - Parse list of source inventories with the constructed inventory plugin.\n* `federated` - Route jobs to source inventory instance groups automatically.", + "oneOf": [ + { + "$ref": "#/components/schemas/KindA5dEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "has_active_failures": { + "type": "boolean", + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Flag indicating whether any hosts in this inventory have failed." + }, + "total_hosts": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Total number of hosts in this inventory." + }, + "hosts_with_active_failures": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Number of hosts in this inventory with active failures." + }, + "total_groups": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Total number of groups in this inventory." + }, + "has_inventory_sources": { + "type": "boolean", + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Flag indicating whether this inventory has any external inventory sources." + }, + "total_inventory_sources": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Total number of external inventory sources configured within this inventory." + }, + "inventory_sources_with_failures": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Number of external inventory sources in this inventory with failures." + }, + "pending_deletion": { + "type": "boolean", + "readOnly": true, + "description": "Flag indicating the inventory is being deleted." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + } + }, + "required": [ + "created", + "has_active_failures", + "has_inventory_sources", + "hosts_with_active_failures", + "id", + "inventory_sources_with_failures", + "kind", + "modified", + "name", + "organization", + "pending_deletion", + "related", + "summary_fields", + "total_groups", + "total_hosts", + "total_inventory_sources", + "type", + "url" + ] + }, + "FederatedInventoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + } + }, + "required": [ + "name", + "organization" + ] + }, + "Group": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + } + }, + "required": [ + "created", + "id", + "inventory", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "GroupRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + } + }, + "required": [ + "inventory", + "name" + ] + }, + "GroupTree": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + }, + "children": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "children", + "created", + "id", + "inventory", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "GroupVariableData": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + } + } + }, + "GroupVariableDataRequest": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + } + } + }, + "Host": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Is this host online and available for running jobs?" + }, + "instance_id": { + "type": "string", + "nullable": true, + "default": "", + "description": "The value used by the remote inventory source to uniquely identify the host", + "maxLength": 1024 + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + }, + "has_active_failures": { + "type": "string", + "readOnly": true + }, + "has_inventory_sources": { + "type": "string", + "readOnly": true + }, + "last_job": { + "type": "string", + "readOnly": true + }, + "last_job_host_summary": { + "type": "string", + "readOnly": true + }, + "ansible_facts_modified": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time ansible_facts was last modified." + } + }, + "required": [ + "ansible_facts_modified", + "created", + "has_active_failures", + "has_inventory_sources", + "id", + "inventory", + "last_job", + "last_job_host_summary", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "HostMetric": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "hostname": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "url": { + "type": "string", + "readOnly": true + }, + "first_automation": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "When the host was first automated against" + }, + "last_automation": { + "type": "string", + "format": "date-time", + "description": "When the host was last automated against" + }, + "last_deleted": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the host was last deleted" + }, + "automated_counter": { + "type": "integer", + "maximum": 9223372036854775807, + "minimum": -9223372036854775808, + "format": "int64", + "default": 0, + "description": "How many times was the host automated" + }, + "deleted_counter": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "How many times was the host deleted" + }, + "deleted": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Boolean flag saying whether the host is deleted and therefore not counted into the subscription consumption" + }, + "used_in_inventories": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "nullable": true, + "description": "How many inventories contain this host" + } + }, + "required": [ + "first_automation", + "hostname", + "id", + "last_automation", + "url" + ] + }, + "HostMetricSummaryMonthly": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "date": { + "type": "string", + "format": "date", + "readOnly": true + }, + "license_consumed": { + "type": "integer", + "readOnly": true, + "description": "How many unique hosts are consumed from the license" + }, + "license_capacity": { + "type": "integer", + "readOnly": true, + "description": "'License capacity as max. number of unique hosts" + }, + "hosts_added": { + "type": "integer", + "readOnly": true, + "description": "How many hosts were added in the associated month, consuming more license capacity" + }, + "hosts_deleted": { + "type": "integer", + "readOnly": true, + "description": "How many hosts were deleted in the associated month, freeing the license capacity" + }, + "indirectly_managed_hosts": { + "type": "integer", + "readOnly": true, + "description": "Manually entered number indirectly managed hosts for a certain month" + } + }, + "required": [ + "date", + "hosts_added", + "hosts_deleted", + "id", + "indirectly_managed_hosts", + "license_capacity", + "license_consumed" + ] + }, + "HostRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Is this host online and available for running jobs?" + }, + "instance_id": { + "type": "string", + "nullable": true, + "default": "", + "description": "The value used by the remote inventory source to uniquely identify the host", + "maxLength": 1024 + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + }, + "required": [ + "inventory", + "name" + ] + }, + "HostVariableData": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + } + }, + "HostVariableDataRequest": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + } + }, + "HostsEnum": { + "enum": [ + "all", + "failed" + ], + "type": "string", + "description": "* `all` - No change to job limit\n* `failed` - All failed and unreachable hosts" + }, + "Instance": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "hostname": { + "type": "string", + "nullable": true, + "maxLength": 250, + "pattern": "^localhost$|^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^(?:0*\\:)*?:?0*1$" + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "uuid": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "last_seen": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "Last time instance ran its heartbeat task for main cluster nodes. Last known connection to receptor mesh for execution nodes." + }, + "health_check_started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The last time a health check was initiated on this instance." + }, + "health_check_pending": { + "type": "string", + "readOnly": true + }, + "last_health_check": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "Last time a health check was ran on this instance to refresh cpu, memory, and capacity." + }, + "errors": { + "type": "string", + "readOnly": true, + "description": "Any error details from the last health check." + }, + "capacity_adjustment": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,1}(?:\\.\\d{0,2})?$", + "default": "1.00" + }, + "version": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "capacity": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "consumed_capacity": { + "type": "string", + "readOnly": true + }, + "percent_capacity_remaining": { + "type": "string", + "readOnly": true + }, + "jobs_running": { + "type": "integer", + "readOnly": true, + "description": "Count of jobs in the running or waiting state that are targeted for this instance" + }, + "jobs_total": { + "type": "integer", + "readOnly": true, + "description": "Count of all jobs that target this instance" + }, + "cpu": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,3}(?:\\.\\d{0,1})?$", + "readOnly": true + }, + "memory": { + "type": "integer", + "readOnly": true, + "description": "Total system memory of this instance in bytes." + }, + "cpu_capacity": { + "type": "integer", + "readOnly": true + }, + "mem_capacity": { + "type": "integer", + "readOnly": true + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true + }, + "managed_by_policy": { + "type": "boolean", + "nullable": true, + "default": true + }, + "node_type": { + "nullable": true, + "default": "execution", + "description": "Role that this node plays in the mesh.\n\n* `control` - Control plane node\n* `execution` - Execution plane node\n* `hybrid` - Controller and execution\n* `hop` - Message-passing node, no execution capability", + "oneOf": [ + { + "$ref": "#/components/schemas/NodeTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "node_state": { + "nullable": true, + "default": "installed", + "description": "Indicates the current life cycle stage of this instance.\n\n* `provisioning` - Provisioning\n* `provision-fail` - Provisioning Failure\n* `installed` - Installed\n* `ready` - Ready\n* `unavailable` - Unavailable\n* `deprovisioning` - De-provisioning\n* `deprovision-fail` - De-provisioning Failure", + "oneOf": [ + { + "$ref": "#/components/schemas/NodeStateEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "managed": { + "type": "boolean", + "readOnly": true, + "description": "If True, this instance is managed by the control plane." + }, + "ip_address": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "peers": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Primary keys of receptor addresses to peer to." + }, + "reverse_peers": { + "type": "string", + "readOnly": true + }, + "listener_port": { + "type": "integer", + "nullable": true + }, + "peers_from_control_nodes": { + "type": "boolean" + }, + "protocol": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "capacity", + "consumed_capacity", + "cpu", + "cpu_capacity", + "created", + "errors", + "health_check_pending", + "health_check_started", + "hostname", + "id", + "ip_address", + "jobs_running", + "jobs_total", + "last_health_check", + "last_seen", + "managed", + "mem_capacity", + "memory", + "modified", + "percent_capacity_remaining", + "protocol", + "related", + "reverse_peers", + "summary_fields", + "type", + "url", + "uuid", + "version" + ] + }, + "InstanceGroup": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 250 + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "capacity": { + "type": "string", + "readOnly": true + }, + "consumed_capacity": { + "type": "string", + "readOnly": true + }, + "percent_capacity_remaining": { + "type": "string", + "readOnly": true + }, + "jobs_running": { + "type": "string", + "readOnly": true + }, + "max_concurrent_jobs": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum number of concurrent jobs to run on a group. When set to zero, no maximum is enforced." + }, + "max_forks": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum number of forks to execute concurrently on a group. When set to zero, no maximum is enforced." + }, + "jobs_total": { + "type": "integer", + "readOnly": true, + "description": "Count of all jobs that target this instance group" + }, + "instances": { + "type": "string", + "readOnly": true + }, + "is_container_group": { + "type": "boolean", + "description": "Indicates whether instances in this group are containerized.Containerized groups have a designated Openshift or Kubernetes cluster." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "policy_instance_percentage": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Minimum percentage of all instances that will be automatically assigned to this group when new instances come online." + }, + "policy_instance_minimum": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Static minimum number of Instances that will be automatically assign to this group when new instances come online." + }, + "policy_instance_list": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of exact-match Instances that will be assigned to this group" + }, + "pod_spec_override": { + "type": "string", + "nullable": true, + "default": "" + }, + "summary_fields": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "capacity", + "consumed_capacity", + "created", + "id", + "instances", + "jobs_running", + "jobs_total", + "modified", + "name", + "percent_capacity_remaining", + "related", + "summary_fields", + "type", + "url" + ] + }, + "InstanceGroupRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 250 + }, + "max_concurrent_jobs": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum number of concurrent jobs to run on a group. When set to zero, no maximum is enforced." + }, + "max_forks": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum number of forks to execute concurrently on a group. When set to zero, no maximum is enforced." + }, + "is_container_group": { + "type": "boolean", + "description": "Indicates whether instances in this group are containerized.Containerized groups have a designated Openshift or Kubernetes cluster." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "policy_instance_percentage": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Minimum percentage of all instances that will be automatically assigned to this group when new instances come online." + }, + "policy_instance_minimum": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Static minimum number of Instances that will be automatically assign to this group when new instances come online." + }, + "policy_instance_list": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "description": "List of exact-match Instances that will be assigned to this group" + }, + "pod_spec_override": { + "type": "string", + "nullable": true, + "default": "" + } + }, + "required": [ + "name" + ] + }, + "InstanceHealthCheck": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "hostname": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "ip_address": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "version": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "last_health_check": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "Last time a health check was ran on this instance to refresh cpu, memory, and capacity." + }, + "errors": { + "type": "string", + "readOnly": true, + "description": "Any error details from the last health check." + }, + "cpu": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,3}(?:\\.\\d{0,1})?$", + "readOnly": true + }, + "memory": { + "type": "integer", + "readOnly": true, + "description": "Total system memory of this instance in bytes." + }, + "cpu_capacity": { + "type": "integer", + "readOnly": true + }, + "mem_capacity": { + "type": "integer", + "readOnly": true + }, + "capacity": { + "type": "integer", + "readOnly": true + } + }, + "required": [ + "capacity", + "cpu", + "cpu_capacity", + "errors", + "hostname", + "ip_address", + "last_health_check", + "mem_capacity", + "memory", + "uuid", + "version" + ] + }, + "InstanceRequest": { + "type": "object", + "properties": { + "hostname": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 250, + "pattern": "^localhost$|^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^(?:0*\\:)*?:?0*1$" + }, + "capacity_adjustment": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,1}(?:\\.\\d{0,2})?$", + "default": "1.00" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true + }, + "managed_by_policy": { + "type": "boolean", + "nullable": true, + "default": true + }, + "node_type": { + "nullable": true, + "default": "execution", + "description": "Role that this node plays in the mesh.\n\n* `control` - Control plane node\n* `execution` - Execution plane node\n* `hybrid` - Controller and execution\n* `hop` - Message-passing node, no execution capability", + "oneOf": [ + { + "$ref": "#/components/schemas/NodeTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "node_state": { + "nullable": true, + "default": "installed", + "description": "Indicates the current life cycle stage of this instance.\n\n* `provisioning` - Provisioning\n* `provision-fail` - Provisioning Failure\n* `installed` - Installed\n* `ready` - Ready\n* `unavailable` - Unavailable\n* `deprovisioning` - De-provisioning\n* `deprovision-fail` - De-provisioning Failure", + "oneOf": [ + { + "$ref": "#/components/schemas/NodeStateEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "peers": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Primary keys of receptor addresses to peer to." + }, + "listener_port": { + "type": "integer", + "nullable": true + }, + "peers_from_control_nodes": { + "type": "boolean" + } + }, + "required": [ + "hostname" + ] + }, + "Inventory": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "kind": { + "nullable": true, + "default": "", + "description": "Kind of inventory being represented.\n\n* `` - Hosts have a direct link to this inventory.\n* `smart` - Hosts for inventory generated using the host_filter property.\n* `constructed` - Parse list of source inventories with the constructed inventory plugin.\n* `federated` - Route jobs to source inventory instance groups automatically.", + "oneOf": [ + { + "$ref": "#/components/schemas/KindA5dEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "host_filter": { + "type": "string", + "nullable": true, + "description": "Filter that will be applied to the hosts of this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "has_active_failures": { + "type": "boolean", + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Flag indicating whether any hosts in this inventory have failed." + }, + "total_hosts": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Total number of hosts in this inventory." + }, + "hosts_with_active_failures": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Number of hosts in this inventory with active failures." + }, + "total_groups": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Total number of groups in this inventory." + }, + "has_inventory_sources": { + "type": "boolean", + "readOnly": true, + "description": "This field is deprecated and will be removed in a future release. Flag indicating whether this inventory has any external inventory sources." + }, + "total_inventory_sources": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Total number of external inventory sources configured within this inventory." + }, + "inventory_sources_with_failures": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Number of external inventory sources in this inventory with failures." + }, + "pending_deletion": { + "type": "boolean", + "readOnly": true, + "description": "Flag indicating the inventory is being deleted." + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the inventory will prevent adding any organization instance groups to the list of preferred instances groups to run associated job templates on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + } + }, + "required": [ + "created", + "has_active_failures", + "has_inventory_sources", + "hosts_with_active_failures", + "id", + "inventory_sources_with_failures", + "modified", + "name", + "organization", + "pending_deletion", + "related", + "summary_fields", + "total_groups", + "total_hosts", + "total_inventory_sources", + "type", + "url" + ] + }, + "InventoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "kind": { + "nullable": true, + "default": "", + "description": "Kind of inventory being represented.\n\n* `` - Hosts have a direct link to this inventory.\n* `smart` - Hosts for inventory generated using the host_filter property.\n* `constructed` - Parse list of source inventories with the constructed inventory plugin.\n* `federated` - Route jobs to source inventory instance groups automatically.", + "oneOf": [ + { + "$ref": "#/components/schemas/KindA5dEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "host_filter": { + "type": "string", + "nullable": true, + "description": "Filter that will be applied to the hosts of this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the inventory will prevent adding any organization instance groups to the list of preferred instances groups to run associated job templates on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + } + }, + "required": [ + "name", + "organization" + ] + }, + "InventorySource": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "source": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/SourceEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "source_path": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "source_vars": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source variables in YAML or JSON format." + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source SCM branch. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "minimum": 1, + "nullable": true, + "description": "Cloud credential to use for inventory updates." + }, + "enabled_var": { + "type": "string", + "nullable": true, + "default": "", + "description": "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified as \"foo.bar\", in which case the lookup will traverse into nested dicts, equivalent to: from_dict.get(\"foo\", {}).get(\"bar\", default)" + }, + "enabled_value": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only used when enabled_var is set. Value when the host is considered enabled. For example if enabled_var=\"status.power_state\"and enabled_value=\"powered_on\" with host variables:{ \"status\": { \"power_state\": \"powered_on\", \"created\": \"2020-08-04T18:13:04+00:00\", \"healthy\": true }, \"name\": \"foobar\", \"ip_address\": \"192.168.2.1\"}The host would be marked enabled. If power_state where any value other than powered_on then the host would be disabled when imported. If the key is not found then the host will be enabled" + }, + "host_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "This field is deprecated and will be removed in a future release. Regex where only matching hosts will be imported." + }, + "overwrite": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local groups and hosts from remote inventory source." + }, + "overwrite_vars": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local variables from remote inventory source." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity481Enum" + } + ], + "default": 1, + "minimum": 0, + "maximum": 2147483647 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "", + "description": "Enter host, group or pattern match" + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/InventorySourceStatusEnum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "update_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "update_cache_timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "source_project": { + "type": "integer", + "nullable": true, + "description": "Project containing inventory file used as source." + }, + "last_update_failed": { + "type": "boolean", + "readOnly": true + }, + "last_updated": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "created", + "id", + "inventory", + "last_job_failed", + "last_job_run", + "last_update_failed", + "last_updated", + "modified", + "name", + "next_job_run", + "related", + "status", + "summary_fields", + "type", + "url" + ] + }, + "InventorySourceRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "source": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/SourceEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "source_path": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "source_vars": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source variables in YAML or JSON format." + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source SCM branch. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "minimum": 1, + "nullable": true, + "description": "Cloud credential to use for inventory updates." + }, + "enabled_var": { + "type": "string", + "nullable": true, + "default": "", + "description": "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified as \"foo.bar\", in which case the lookup will traverse into nested dicts, equivalent to: from_dict.get(\"foo\", {}).get(\"bar\", default)" + }, + "enabled_value": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only used when enabled_var is set. Value when the host is considered enabled. For example if enabled_var=\"status.power_state\"and enabled_value=\"powered_on\" with host variables:{ \"status\": { \"power_state\": \"powered_on\", \"created\": \"2020-08-04T18:13:04+00:00\", \"healthy\": true }, \"name\": \"foobar\", \"ip_address\": \"192.168.2.1\"}The host would be marked enabled. If power_state where any value other than powered_on then the host would be disabled when imported. If the key is not found then the host will be enabled" + }, + "host_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "This field is deprecated and will be removed in a future release. Regex where only matching hosts will be imported." + }, + "overwrite": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local groups and hosts from remote inventory source." + }, + "overwrite_vars": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local variables from remote inventory source." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity481Enum" + } + ], + "default": 1, + "minimum": 0, + "maximum": 2147483647 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "", + "description": "Enter host, group or pattern match" + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "update_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "update_cache_timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "source_project": { + "type": "integer", + "nullable": true, + "description": "Project containing inventory file used as source." + } + }, + "required": [ + "inventory", + "name" + ] + }, + "InventorySourceStatusEnum": { + "enum": [ + "new", + "pending", + "waiting", + "running", + "successful", + "failed", + "error", + "canceled", + "never updated", + "none" + ], + "type": "string", + "description": "* `new` - New\n* `pending` - Pending\n* `waiting` - Waiting\n* `running` - Running\n* `successful` - Successful\n* `failed` - Failed\n* `error` - Error\n* `canceled` - Canceled\n* `never updated` - Never Updated\n* `none` - No External Source" + }, + "InventorySourceUpdate": { + "type": "object", + "properties": { + "can_update": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_update" + ] + }, + "InventoryUpdateCancel": { + "type": "object", + "properties": { + "can_cancel": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_cancel" + ] + }, + "InventoryUpdateDetail": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "source": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/SourceEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "source_path": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "source_vars": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source variables in YAML or JSON format." + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source SCM branch. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "minimum": 1, + "nullable": true, + "description": "Cloud credential to use for inventory updates." + }, + "enabled_var": { + "type": "string", + "nullable": true, + "default": "", + "description": "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified as \"foo.bar\", in which case the lookup will traverse into nested dicts, equivalent to: from_dict.get(\"foo\", {}).get(\"bar\", default)" + }, + "enabled_value": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only used when enabled_var is set. Value when the host is considered enabled. For example if enabled_var=\"status.power_state\"and enabled_value=\"powered_on\" with host variables:{ \"status\": { \"power_state\": \"powered_on\", \"created\": \"2020-08-04T18:13:04+00:00\", \"healthy\": true }, \"name\": \"foobar\", \"ip_address\": \"192.168.2.1\"}The host would be marked enabled. If power_state where any value other than powered_on then the host would be disabled when imported. If the key is not found then the host will be enabled" + }, + "host_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "This field is deprecated and will be removed in a future release. Regex where only matching hosts will be imported." + }, + "overwrite": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local groups and hosts from remote inventory source." + }, + "overwrite_vars": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local variables from remote inventory source." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity481Enum" + } + ], + "default": 1, + "minimum": 0, + "maximum": 2147483647 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "", + "description": "Enter host, group or pattern match" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "event_processing_finished": { + "type": "boolean", + "readOnly": true, + "description": "Indicates whether all of the events generated by this unified job have been saved to the database." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "inventory_source": { + "type": "integer", + "readOnly": true + }, + "license_error": { + "type": "boolean", + "readOnly": true + }, + "org_host_limit_error": { + "type": "boolean", + "readOnly": true + }, + "source_project_update": { + "type": "integer", + "nullable": true, + "description": "Inventory files from this Project Update were used for the inventory update." + }, + "instance_group": { + "type": "integer", + "nullable": true, + "description": "The Instance group the job was run under" + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The SCM Revision from the Project used for this inventory update. Only applicable to inventories source from scm" + }, + "source_project": { + "type": "string", + "readOnly": true, + "description": "The project used for this job." + } + }, + "required": [ + "canceled_on", + "controller_node", + "created", + "elapsed", + "event_processing_finished", + "execution_node", + "failed", + "finished", + "id", + "inventory_source", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "license_error", + "modified", + "name", + "org_host_limit_error", + "related", + "result_traceback", + "scm_revision", + "source_project", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "InventoryUpdateEvent": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "event": { + "type": "string", + "readOnly": true + }, + "counter": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "event_display": { + "type": "string", + "readOnly": true + }, + "event_data": { + "default": {} + }, + "failed": { + "type": "string", + "readOnly": true + }, + "changed": { + "type": "string", + "readOnly": true + }, + "uuid": { + "type": "string", + "readOnly": true + }, + "stdout": { + "type": "string", + "readOnly": true + }, + "start_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "end_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "verbosity": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "inventory_update": { + "type": "integer", + "readOnly": true + } + }, + "required": [ + "changed", + "counter", + "created", + "end_line", + "event", + "event_display", + "failed", + "id", + "inventory_update", + "modified", + "related", + "start_line", + "stdout", + "summary_fields", + "type", + "url", + "uuid", + "verbosity" + ] + }, + "InventoryUpdateList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "source": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/SourceEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "source_path": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "source_vars": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source variables in YAML or JSON format." + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source SCM branch. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "minimum": 1, + "nullable": true, + "description": "Cloud credential to use for inventory updates." + }, + "enabled_var": { + "type": "string", + "nullable": true, + "default": "", + "description": "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified as \"foo.bar\", in which case the lookup will traverse into nested dicts, equivalent to: from_dict.get(\"foo\", {}).get(\"bar\", default)" + }, + "enabled_value": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only used when enabled_var is set. Value when the host is considered enabled. For example if enabled_var=\"status.power_state\"and enabled_value=\"powered_on\" with host variables:{ \"status\": { \"power_state\": \"powered_on\", \"created\": \"2020-08-04T18:13:04+00:00\", \"healthy\": true }, \"name\": \"foobar\", \"ip_address\": \"192.168.2.1\"}The host would be marked enabled. If power_state where any value other than powered_on then the host would be disabled when imported. If the key is not found then the host will be enabled" + }, + "host_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "This field is deprecated and will be removed in a future release. Regex where only matching hosts will be imported." + }, + "overwrite": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local groups and hosts from remote inventory source." + }, + "overwrite_vars": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local variables from remote inventory source." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity481Enum" + } + ], + "default": 1, + "minimum": 0, + "maximum": 2147483647 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "", + "description": "Enter host, group or pattern match" + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "inventory_source": { + "type": "integer", + "readOnly": true + }, + "license_error": { + "type": "boolean", + "readOnly": true + }, + "org_host_limit_error": { + "type": "boolean", + "readOnly": true + }, + "source_project_update": { + "type": "integer", + "nullable": true, + "description": "Inventory files from this Project Update were used for the inventory update." + }, + "instance_group": { + "type": "integer", + "nullable": true, + "description": "The Instance group the job was run under" + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The SCM Revision from the Project used for this inventory update. Only applicable to inventories source from scm" + } + }, + "required": [ + "canceled_on", + "controller_node", + "created", + "elapsed", + "execution_node", + "failed", + "finished", + "id", + "inventory_source", + "job_explanation", + "launch_type", + "launched_by", + "license_error", + "modified", + "name", + "org_host_limit_error", + "related", + "scm_revision", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "InventoryVariableData": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + } + } + }, + "InventoryVariableDataRequest": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + } + } + }, + "JobCancel": { + "type": "object", + "properties": { + "can_cancel": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_cancel" + ] + }, + "JobCreateSchedule": { + "type": "object", + "properties": { + "can_schedule": { + "type": "string", + "readOnly": true + }, + "prompts": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "can_schedule", + "prompts" + ] + }, + "JobDetail": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobTypeB0aEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "project": { + "type": "integer", + "nullable": true + }, + "playbook": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Branch to use in job run. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_slice_pinned_hosts": { + "type": "string", + "nullable": true, + "default": "", + "description": "Comma separated list of host names to include in every slice of a sliced job, in addition to the hosts of the slice itself. Useful when a play targets a coordinating host, such as localhost, that all slices depend on. Names are matched exactly against inventory hosts; groups and patterns are not supported. Has no effect unless the job is sliced." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "force_handlers": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "start_at_task": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "use_fact_cache": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the service will act as an Ansible Fact Cache Plugin; persisting facts at the end of a playbook run to the database and caching facts for use by Ansible." + }, + "organization": { + "type": "integer", + "readOnly": true, + "nullable": true, + "description": "The organization used to determine access to this unified job." + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "event_processing_finished": { + "type": "boolean", + "readOnly": true, + "description": "Indicates whether all of the events generated by this unified job have been saved to the database." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "job_template": { + "type": "integer", + "nullable": true + }, + "passwords_needed_to_start": { + "type": "string", + "readOnly": true + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "artifacts": { + "type": "string", + "readOnly": true + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The SCM Revision from the Project used for this job, if available" + }, + "instance_group": { + "type": "integer", + "nullable": true, + "description": "The Instance group the job was run under" + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, textual changes made to any templated files on the host are shown in the standard output" + }, + "job_slice_number": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "If part of a sliced job, the ID of the inventory slice operated on. If not part of sliced job, parameter is not used." + }, + "job_slice_count": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "If ran as part of sliced jobs, the total number of slices. If 1, job is not part of a sliced job." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + }, + "host_status_counts": { + "readOnly": true, + "nullable": true, + "description": "Playbook stats from the Ansible playbook_on_stats event." + }, + "playbook_counts": { + "type": "string", + "readOnly": true, + "description": "A count of all plays and tasks for the job run." + } + }, + "required": [ + "artifacts", + "canceled_on", + "controller_node", + "created", + "elapsed", + "event_processing_finished", + "execution_node", + "failed", + "finished", + "host_status_counts", + "id", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "organization", + "passwords_needed_to_start", + "playbook_counts", + "related", + "result_traceback", + "scm_revision", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "JobEvent": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "job": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "event": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/EventC0bEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "counter": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "event_display": { + "type": "string", + "readOnly": true + }, + "event_data": { + "default": {} + }, + "event_level": { + "type": "integer", + "readOnly": true + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "changed": { + "type": "boolean", + "readOnly": true + }, + "uuid": { + "type": "string", + "readOnly": true + }, + "parent_uuid": { + "type": "string", + "readOnly": true + }, + "host": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "host_name": { + "type": "string", + "readOnly": true + }, + "playbook": { + "type": "string", + "readOnly": true + }, + "play": { + "type": "string", + "readOnly": true + }, + "task": { + "type": "string", + "readOnly": true + }, + "role": { + "type": "string", + "readOnly": true + }, + "stdout": { + "type": "string", + "readOnly": true + }, + "start_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "end_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "verbosity": { + "type": "integer", + "minimum": 0, + "readOnly": true + } + }, + "required": [ + "changed", + "counter", + "created", + "end_line", + "event", + "event_display", + "event_level", + "failed", + "host", + "host_name", + "id", + "job", + "modified", + "parent_uuid", + "play", + "playbook", + "related", + "role", + "start_line", + "stdout", + "summary_fields", + "task", + "type", + "url", + "uuid", + "verbosity" + ] + }, + "JobHostSummary": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "job": { + "type": "integer", + "readOnly": true + }, + "host": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "constructed_host": { + "type": "integer", + "readOnly": true, + "nullable": true, + "description": "Only for jobs run against constructed inventories, this links to the host inside the constructed inventory." + }, + "host_name": { + "type": "string", + "readOnly": true, + "default": "" + }, + "changed": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "dark": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "failures": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "ok": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "processed": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "skipped": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "ignored": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "rescued": { + "type": "integer", + "minimum": 0, + "readOnly": true + } + }, + "required": [ + "changed", + "constructed_host", + "created", + "dark", + "failed", + "failures", + "host", + "host_name", + "id", + "ignored", + "job", + "modified", + "ok", + "processed", + "related", + "rescued", + "skipped", + "summary_fields", + "type", + "url" + ] + }, + "JobLaunch": { + "type": "object", + "properties": { + "can_start_without_user_input": { + "type": "boolean", + "readOnly": true + }, + "passwords_needed_to_start": { + "type": "string", + "readOnly": true + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_variables_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_tags_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_diff_mode_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_job_type_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_limit_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_verbosity_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_inventory_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_credential_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_execution_environment_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_labels_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_forks_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_job_slice_count_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_timeout_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_instance_groups_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "survey_enabled": { + "type": "string", + "readOnly": true + }, + "variables_needed_to_start": { + "type": "string", + "readOnly": true + }, + "credential_needed_to_start": { + "type": "string", + "readOnly": true + }, + "inventory_needed_to_start": { + "type": "string", + "readOnly": true + }, + "job_template_data": { + "type": "string", + "readOnly": true + }, + "defaults": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "ask_credential_on_launch", + "ask_diff_mode_on_launch", + "ask_execution_environment_on_launch", + "ask_forks_on_launch", + "ask_instance_groups_on_launch", + "ask_inventory_on_launch", + "ask_job_slice_count_on_launch", + "ask_job_type_on_launch", + "ask_labels_on_launch", + "ask_limit_on_launch", + "ask_scm_branch_on_launch", + "ask_skip_tags_on_launch", + "ask_tags_on_launch", + "ask_timeout_on_launch", + "ask_variables_on_launch", + "ask_verbosity_on_launch", + "can_start_without_user_input", + "credential_needed_to_start", + "defaults", + "inventory_needed_to_start", + "job_template_data", + "passwords_needed_to_start", + "survey_enabled", + "variables_needed_to_start" + ] + }, + "JobLaunchRequest": { + "type": "object", + "properties": { + "extra_vars": { + "writeOnly": true + }, + "inventory": { + "type": "integer", + "writeOnly": true + }, + "scm_branch": { + "type": "string", + "writeOnly": true, + "maxLength": 1024 + }, + "limit": { + "type": "string", + "writeOnly": true + }, + "job_tags": { + "type": "string", + "writeOnly": true + }, + "skip_tags": { + "type": "string", + "writeOnly": true + }, + "job_type": { + "allOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + } + ], + "writeOnly": true + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "writeOnly": true + }, + "diff_mode": { + "type": "boolean", + "writeOnly": true + }, + "credentials": { + "type": "array", + "items": { + "type": "integer", + "writeOnly": true + }, + "writeOnly": true + }, + "credential_passwords": { + "type": "string", + "writeOnly": true + }, + "execution_environment": { + "type": "integer", + "writeOnly": true + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "writeOnly": true + }, + "writeOnly": true + }, + "forks": { + "type": "integer", + "minimum": 0, + "writeOnly": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "writeOnly": true + }, + "timeout": { + "type": "integer", + "writeOnly": true + }, + "instance_groups": { + "type": "array", + "items": { + "type": "integer", + "writeOnly": true + }, + "writeOnly": true + } + } + }, + "JobList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobTypeB0aEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "project": { + "type": "integer", + "nullable": true + }, + "playbook": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Branch to use in job run. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_slice_pinned_hosts": { + "type": "string", + "nullable": true, + "default": "", + "description": "Comma separated list of host names to include in every slice of a sliced job, in addition to the hosts of the slice itself. Useful when a play targets a coordinating host, such as localhost, that all slices depend on. Names are matched exactly against inventory hosts; groups and patterns are not supported. Has no effect unless the job is sliced." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "force_handlers": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "start_at_task": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "use_fact_cache": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the service will act as an Ansible Fact Cache Plugin; persisting facts at the end of a playbook run to the database and caching facts for use by Ansible." + }, + "organization": { + "type": "integer", + "readOnly": true, + "nullable": true, + "description": "The organization used to determine access to this unified job." + }, + "job_template": { + "type": "integer", + "nullable": true + }, + "passwords_needed_to_start": { + "type": "string", + "readOnly": true + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The SCM Revision from the Project used for this job, if available" + }, + "instance_group": { + "type": "integer", + "nullable": true, + "description": "The Instance group the job was run under" + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, textual changes made to any templated files on the host are shown in the standard output" + }, + "job_slice_number": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "If part of a sliced job, the ID of the inventory slice operated on. If not part of sliced job, parameter is not used." + }, + "job_slice_count": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "If ran as part of sliced jobs, the total number of slices. If 1, job is not part of a sliced job." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + } + }, + "required": [ + "canceled_on", + "controller_node", + "created", + "elapsed", + "execution_node", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "organization", + "passwords_needed_to_start", + "related", + "scm_revision", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "JobRelaunch": { + "type": "object", + "properties": { + "passwords_needed_to_start": { + "type": "string", + "readOnly": true + }, + "retry_counts": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "passwords_needed_to_start", + "retry_counts" + ] + }, + "JobRelaunchRequest": { + "type": "object", + "properties": { + "hosts": { + "writeOnly": true, + "nullable": true, + "default": "all", + "oneOf": [ + { + "$ref": "#/components/schemas/HostsEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "credential_passwords": { + "type": "string", + "writeOnly": true + } + }, + "required": [ + "credential_passwords" + ] + }, + "JobTemplate": { + "type": "object", + "description": "Provide recent jobs and survey details in summary_fields", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "project": { + "type": "integer", + "nullable": true + }, + "playbook": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Branch to use in job run. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_slice_pinned_hosts": { + "type": "string", + "nullable": true, + "default": "", + "description": "Comma separated list of host names to include in every slice of a sliced job, in addition to the hosts of the slice itself. Useful when a play targets a coordinating host, such as localhost, that all slices depend on. Names are matched exactly against inventory hosts; groups and patterns are not supported. Has no effect unless the job is sliced." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "force_handlers": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "start_at_task": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "use_fact_cache": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the service will act as an Ansible Fact Cache Plugin; persisting facts at the end of a playbook run to the database and caching facts for use by Ansible." + }, + "organization": { + "type": "integer", + "readOnly": true, + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/JobTemplateStatusEnum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "host_config_key": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_diff_mode_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_variables_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_limit_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_job_type_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_verbosity_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_inventory_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_credential_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_execution_environment_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_labels_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_forks_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_job_slice_count_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_timeout_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_instance_groups_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "survey_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "become_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, textual changes made to any templated files on the host are shown in the standard output" + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "job_slice_count": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of jobs to slice into at runtime. Will cause the Job Template to launch a workflow if value is greater than 1." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the job template will prevent adding any inventory or organization instance groups to the list of preferred instances groups to run on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + } + }, + "required": [ + "created", + "id", + "last_job_failed", + "last_job_run", + "modified", + "name", + "next_job_run", + "organization", + "related", + "status", + "summary_fields", + "type", + "url" + ] + }, + "JobTemplateRequest": { + "type": "object", + "description": "Provide recent jobs and survey details in summary_fields", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "project": { + "type": "integer", + "nullable": true + }, + "playbook": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Branch to use in job run. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_slice_pinned_hosts": { + "type": "string", + "nullable": true, + "default": "", + "description": "Comma separated list of host names to include in every slice of a sliced job, in addition to the hosts of the slice itself. Useful when a play targets a coordinating host, such as localhost, that all slices depend on. Names are matched exactly against inventory hosts; groups and patterns are not supported. Has no effect unless the job is sliced." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "force_handlers": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "start_at_task": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "use_fact_cache": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the service will act as an Ansible Fact Cache Plugin; persisting facts at the end of a playbook run to the database and caching facts for use by Ansible." + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "host_config_key": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_diff_mode_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_variables_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_limit_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_job_type_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_verbosity_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_inventory_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_credential_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_execution_environment_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_labels_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_forks_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_job_slice_count_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_timeout_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_instance_groups_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "survey_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "become_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, textual changes made to any templated files on the host are shown in the standard output" + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "job_slice_count": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of jobs to slice into at runtime. Will cause the Job Template to launch a workflow if value is greater than 1." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_key": { + "type": "string", + "writeOnly": true, + "description": "Shared secret that the webhook service will use to sign requests. Leave blank to generate a new one when the webhook service is set.", + "maxLength": 64 + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the job template will prevent adding any inventory or organization instance groups to the list of preferred instances groups to run on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + } + }, + "required": [ + "name" + ] + }, + "JobTemplateStatusEnum": { + "enum": [ + "new", + "pending", + "waiting", + "running", + "successful", + "failed", + "error", + "canceled", + "never updated" + ], + "type": "string", + "description": "* `new` - New\n* `pending` - Pending\n* `waiting` - Waiting\n* `running` - Running\n* `successful` - Successful\n* `failed` - Failed\n* `error` - Error\n* `canceled` - Canceled\n* `never updated` - Never Updated" + }, + "JobType726Enum": { + "enum": [ + "run", + "check" + ], + "type": "string", + "description": "* `run` - Run\n* `check` - Check" + }, + "JobType75cEnum": { + "enum": [ + "cleanup_jobs", + "cleanup_activitystream", + "cleanup_sessions", + "cleanup_tokens" + ], + "type": "string", + "description": "* `cleanup_jobs` - Remove jobs older than a certain number of days\n* `cleanup_activitystream` - Remove activity stream entries older than a certain number of days\n* `cleanup_sessions` - Removes expired browser sessions from the database\n* `cleanup_tokens` - Removes expired OAuth 2 access tokens and refresh tokens" + }, + "JobTypeB0aEnum": { + "enum": [ + "run", + "check", + "scan" + ], + "type": "string", + "description": "* `run` - Run\n* `check` - Check\n* `scan` - Scan" + }, + "KindA5dEnum": { + "enum": [ + "smart", + "constructed", + "federated" + ], + "type": "string", + "description": "* `` - Hosts have a direct link to this inventory.\n* `smart` - Hosts for inventory generated using the host_filter property.\n* `constructed` - Parse list of source inventories with the constructed inventory plugin.\n* `federated` - Route jobs to source inventory instance groups automatically." + }, + "LOGAGGREGATORLEVELEnum": { + "enum": [ + "DEBUG", + "INFO", + "WARNING", + "ERROR", + "CRITICAL" + ], + "type": "string", + "description": "* `DEBUG` - DEBUG\n* `INFO` - INFO\n* `WARNING` - WARNING\n* `ERROR` - ERROR\n* `CRITICAL` - CRITICAL" + }, + "LOGAGGREGATORPROTOCOLEnum": { + "enum": [ + "https", + "tcp", + "udp" + ], + "type": "string", + "description": "* `https` - HTTPS/HTTP\n* `tcp` - TCP\n* `udp` - UDP" + }, + "LOGAGGREGATORTYPEEnum": { + "enum": [ + "logstash", + "splunk", + "loggly", + "sumologic", + "ledger", + "other" + ], + "type": "string", + "description": "* `logstash` - logstash\n* `splunk` - splunk\n* `loggly` - loggly\n* `sumologic` - sumologic\n* `ledger` - ledger\n* `other` - other" + }, + "Label": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "organization": { + "type": "integer", + "description": "Organization this label belongs to." + } + }, + "required": [ + "created", + "id", + "modified", + "name", + "organization", + "related", + "summary_fields", + "type", + "url" + ] + }, + "LabelRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "organization": { + "type": "integer", + "description": "Organization this label belongs to." + } + }, + "required": [ + "name", + "organization" + ] + }, + "LaunchTypeEnum": { + "enum": [ + "manual", + "relaunch", + "callback", + "scheduled", + "dependency", + "workflow", + "webhook", + "sync", + "scm" + ], + "type": "string", + "description": "* `manual` - Manual\n* `relaunch` - Relaunch\n* `callback` - Callback\n* `scheduled` - Scheduled\n* `dependency` - Dependency\n* `workflow` - Workflow\n* `webhook` - Webhook\n* `sync` - Sync\n* `scm` - SCM Update" + }, + "ModuleNameEnum": { + "enum": [ + "command", + "shell", + "yum", + "apt", + "apt_key", + "apt_repository", + "apt_rpm", + "service", + "group", + "user", + "mount", + "ping", + "selinux", + "setup", + "win_ping", + "win_service", + "win_updates", + "win_group", + "win_user" + ], + "type": "string", + "description": "* `command` - command\n* `shell` - shell\n* `yum` - yum\n* `apt` - apt\n* `apt_key` - apt_key\n* `apt_repository` - apt_repository\n* `apt_rpm` - apt_rpm\n* `service` - service\n* `group` - group\n* `user` - user\n* `mount` - mount\n* `ping` - ping\n* `selinux` - selinux\n* `setup` - setup\n* `win_ping` - win_ping\n* `win_service` - win_service\n* `win_updates` - win_updates\n* `win_group` - win_group\n* `win_user` - win_user" + }, + "NodeStateEnum": { + "enum": [ + "provisioning", + "provision-fail", + "installed", + "ready", + "unavailable", + "deprovisioning", + "deprovision-fail" + ], + "type": "string", + "description": "* `provisioning` - Provisioning\n* `provision-fail` - Provisioning Failure\n* `installed` - Installed\n* `ready` - Ready\n* `unavailable` - Unavailable\n* `deprovisioning` - De-provisioning\n* `deprovision-fail` - De-provisioning Failure" + }, + "NodeTypeEnum": { + "enum": [ + "control", + "execution", + "hybrid", + "hop" + ], + "type": "string", + "description": "* `control` - Control plane node\n* `execution` - Execution plane node\n* `hybrid` - Controller and execution\n* `hop` - Message-passing node, no execution capability" + }, + "Notification": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "notification_template": { + "type": "integer", + "readOnly": true + }, + "error": { + "type": "string", + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/NotificationStatusEnum" + } + ], + "readOnly": true + }, + "notifications_sent": { + "type": "integer", + "readOnly": true + }, + "notification_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/NotificationTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "recipients": { + "type": "string", + "readOnly": true + }, + "subject": { + "type": "string", + "readOnly": true + }, + "body": { + "type": "string", + "readOnly": true, + "description": "Notification body" + } + }, + "required": [ + "body", + "created", + "error", + "id", + "modified", + "notification_template", + "notification_type", + "notifications_sent", + "recipients", + "related", + "status", + "subject", + "summary_fields", + "type", + "url" + ] + }, + "NotificationStatusEnum": { + "enum": [ + "pending", + "successful", + "failed" + ], + "type": "string", + "description": "* `pending` - Pending\n* `successful` - Successful\n* `failed` - Failed" + }, + "NotificationTemplate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true + }, + "notification_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/NotificationTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "notification_configuration": { + "default": {} + }, + "messages": { + "nullable": true, + "default": { + "started": null, + "success": null, + "error": null, + "changed": null, + "workflow_approval": null + }, + "description": "Optional custom messages for notification template." + } + }, + "required": [ + "created", + "id", + "modified", + "name", + "notification_type", + "organization", + "related", + "summary_fields", + "type", + "url" + ] + }, + "NotificationTemplateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true + }, + "notification_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/NotificationTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "notification_configuration": { + "default": {} + }, + "messages": { + "nullable": true, + "default": { + "started": null, + "success": null, + "error": null, + "changed": null, + "workflow_approval": null + }, + "description": "Optional custom messages for notification template." + } + }, + "required": [ + "name", + "notification_type", + "organization" + ] + }, + "NotificationTypeEnum": { + "enum": [ + "email", + "grafana", + "irc", + "mattermost", + "pagerduty", + "rocketchat", + "slack", + "twilio", + "webhook" + ], + "type": "string", + "description": "* `email` - Email\n* `grafana` - Grafana\n* `irc` - IRC\n* `mattermost` - Mattermost\n* `pagerduty` - Pagerduty\n* `rocketchat` - Rocket.Chat\n* `slack` - Slack\n* `twilio` - Twilio\n* `webhook` - Webhook" + }, + "NullEnum": { + "enum": [ + null + ] + }, + "OAuth2Application": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 255 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "client_id": { + "type": "string", + "readOnly": true, + "nullable": true + }, + "client_secret": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "Used for more stringent verification of access to an application when creating a token." + }, + "client_type": { + "nullable": true, + "description": "Set to Public or Confidential depending on how secure the client device is.\n\n* `confidential` - Confidential\n* `public` - Public", + "oneOf": [ + { + "$ref": "#/components/schemas/ClientTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "redirect_uris": { + "type": "string", + "nullable": true, + "description": "Allowed URIs list, space separated" + }, + "authorization_grant_type": { + "nullable": true, + "description": "The Grant type the user must use for acquire tokens for this application.\n\n* `authorization-code` - Authorization code\n* `password` - Resource owner password-based", + "oneOf": [ + { + "$ref": "#/components/schemas/AuthorizationGrantTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "skip_authorization": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set True to skip authorization step for completely trusted applications." + }, + "organization": { + "type": "integer", + "description": "Organization containing this application." + } + }, + "required": [ + "authorization_grant_type", + "client_id", + "client_secret", + "client_type", + "created", + "id", + "modified", + "name", + "organization", + "related", + "summary_fields", + "type", + "url" + ] + }, + "OAuth2ApplicationRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "maxLength": 255 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "client_type": { + "nullable": true, + "description": "Set to Public or Confidential depending on how secure the client device is.\n\n* `confidential` - Confidential\n* `public` - Public", + "oneOf": [ + { + "$ref": "#/components/schemas/ClientTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "redirect_uris": { + "type": "string", + "nullable": true, + "description": "Allowed URIs list, space separated" + }, + "authorization_grant_type": { + "nullable": true, + "description": "The Grant type the user must use for acquire tokens for this application.\n\n* `authorization-code` - Authorization code\n* `password` - Resource owner password-based", + "oneOf": [ + { + "$ref": "#/components/schemas/AuthorizationGrantTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "skip_authorization": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set True to skip authorization step for completely trusted applications." + }, + "organization": { + "type": "integer", + "description": "Organization containing this application." + } + }, + "required": [ + "authorization_grant_type", + "client_type", + "name", + "organization" + ] + }, + "OAuth2Token": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "user": { + "type": "integer", + "readOnly": true, + "description": "The user representing the token owner" + }, + "token": { + "type": "string", + "readOnly": true + }, + "refresh_token": { + "type": "string", + "readOnly": true + }, + "application": { + "type": "integer", + "nullable": true + }, + "expires": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + }, + "required": [ + "created", + "expires", + "id", + "modified", + "refresh_token", + "related", + "summary_fields", + "token", + "type", + "url", + "user" + ] + }, + "OAuth2TokenDetail": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "user": { + "type": "integer", + "readOnly": true, + "description": "The user representing the token owner" + }, + "token": { + "type": "string", + "readOnly": true + }, + "refresh_token": { + "type": "string", + "readOnly": true + }, + "application": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "expires": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + }, + "required": [ + "application", + "created", + "expires", + "id", + "modified", + "refresh_token", + "related", + "summary_fields", + "token", + "type", + "url", + "user" + ] + }, + "OAuth2TokenDetailRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + } + }, + "OAuth2TokenRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "application": { + "type": "integer", + "nullable": true + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + } + }, + "OnTimeoutEnum": { + "enum": [ + "deny", + "approve" + ], + "type": "string", + "description": "* `deny` - Deny\n* `approve` - Approve" + }, + "OperationEnum": { + "enum": [ + "create", + "update", + "delete", + "associate", + "disassociate" + ], + "type": "string", + "description": "* `create` - Entity Created\n* `update` - Entity Updated\n* `delete` - Entity Deleted\n* `associate` - Entity Associated with another Entity\n* `disassociate` - Entity was Disassociated with another Entity" + }, + "Organization": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "max_hosts": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "Maximum number of hosts allowed to be managed by this organization." + }, + "default_environment": { + "type": "integer", + "nullable": true, + "description": "The default execution environment for jobs run by this organization." + } + }, + "required": [ + "created", + "id", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "OrganizationCredentialSerializerCreate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Inherit permissions from organization roles. If provided on creation, do not give either user or team." + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "kind": { + "type": "string", + "readOnly": true + }, + "cloud": { + "type": "string", + "readOnly": true + }, + "kubernetes": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "cloud", + "created", + "credential_type", + "id", + "kind", + "kubernetes", + "managed", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "OrganizationCredentialSerializerCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Inherit permissions from organization roles. If provided on creation, do not give either user or team." + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + } + }, + "required": [ + "credential_type", + "name" + ] + }, + "OrganizationRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "max_hosts": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "Maximum number of hosts allowed to be managed by this organization." + }, + "default_environment": { + "type": "integer", + "nullable": true, + "description": "The default execution environment for jobs run by this organization." + } + }, + "required": [ + "name" + ] + }, + "PENDOTRACKINGSTATEEnum": { + "enum": [ + "off", + "anonymous", + "detailed" + ], + "type": "string", + "description": "* `off` - Off\n* `anonymous` - Anonymous\n* `detailed` - Detailed" + }, + "PaginatedActivityStreamList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityStream" + } + } + } + }, + "PaginatedAdHocCommandEventList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AdHocCommandEvent" + } + } + } + }, + "PaginatedAdHocCommandListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AdHocCommandList" + } + } + } + }, + "PaginatedConstructedInventoryList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConstructedInventory" + } + } + } + }, + "PaginatedCredentialInputSourceList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialInputSource" + } + } + } + }, + "PaginatedCredentialList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Credential" + } + } + } + }, + "PaginatedCredentialSerializerCreateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialSerializerCreate" + } + } + } + }, + "PaginatedCredentialTypeList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialType" + } + } + } + }, + "PaginatedExecutionEnvironmentList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExecutionEnvironment" + } + } + } + }, + "PaginatedFederatedInventoryList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FederatedInventory" + } + } + } + }, + "PaginatedGroupList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Group" + } + } + } + }, + "PaginatedHostList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Host" + } + } + } + }, + "PaginatedHostMetricList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HostMetric" + } + } + } + }, + "PaginatedHostMetricSummaryMonthlyList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HostMetricSummaryMonthly" + } + } + } + }, + "PaginatedInstanceGroupList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InstanceGroup" + } + } + } + }, + "PaginatedInstanceList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Instance" + } + } + } + }, + "PaginatedInventoryList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Inventory" + } + } + } + }, + "PaginatedInventorySourceList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InventorySource" + } + } + } + }, + "PaginatedInventoryUpdateEventList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InventoryUpdateEvent" + } + } + } + }, + "PaginatedInventoryUpdateListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InventoryUpdateList" + } + } + } + }, + "PaginatedJobEventList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JobEvent" + } + } + } + }, + "PaginatedJobHostSummaryList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JobHostSummary" + } + } + } + }, + "PaginatedJobListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JobList" + } + } + } + }, + "PaginatedJobTemplateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JobTemplate" + } + } + } + }, + "PaginatedLabelList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "PaginatedNotificationList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Notification" + } + } + } + }, + "PaginatedNotificationTemplateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTemplate" + } + } + } + }, + "PaginatedOAuth2ApplicationList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OAuth2Application" + } + } + } + }, + "PaginatedOAuth2TokenList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OAuth2Token" + } + } + } + }, + "PaginatedOrganizationCredentialSerializerCreateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrganizationCredentialSerializerCreate" + } + } + } + }, + "PaginatedProjectList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + } + } + } + }, + "PaginatedProjectUpdateEventList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectUpdateEvent" + } + } + } + }, + "PaginatedProjectUpdateListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectUpdateList" + } + } + } + }, + "PaginatedReceptorAddressList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReceptorAddress" + } + } + } + }, + "PaginatedResourceAccessListElementList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceAccessListElement" + } + } + } + }, + "PaginatedResourceListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceList" + } + } + } + }, + "PaginatedResourceTypeList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceType" + } + } + } + }, + "PaginatedRoleList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Role" + } + } + } + }, + "PaginatedRoleSerializerWithParentAccessList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleSerializerWithParentAccess" + } + } + } + }, + "PaginatedScheduleList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Schedule" + } + } + } + }, + "PaginatedSettingCategoryList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SettingCategory" + } + } + } + }, + "PaginatedSystemJobEventList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemJobEvent" + } + } + } + }, + "PaginatedSystemJobListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemJobList" + } + } + } + }, + "PaginatedSystemJobTemplateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemJobTemplate" + } + } + } + }, + "PaginatedTeamCredentialSerializerCreateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TeamCredentialSerializerCreate" + } + } + } + }, + "PaginatedTeamList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Team" + } + } + } + }, + "PaginatedUnifiedJobListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UnifiedJobList" + } + } + } + }, + "PaginatedUnifiedJobTemplateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UnifiedJobTemplate" + } + } + } + }, + "PaginatedUserAuthorizedTokenList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserAuthorizedToken" + } + } + } + }, + "PaginatedUserCredentialSerializerCreateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserCredentialSerializerCreate" + } + } + } + }, + "PaginatedUserList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "PaginatedUserPersonalTokenList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserPersonalToken" + } + } + } + }, + "PaginatedWorkflowApprovalListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowApprovalList" + } + } + } + }, + "PaginatedWorkflowApprovalVoteList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowApprovalVote" + } + } + } + }, + "PaginatedWorkflowJobListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowJobList" + } + } + } + }, + "PaginatedWorkflowJobNodeListList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowJobNodeList" + } + } + } + }, + "PaginatedWorkflowJobTemplateList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowJobTemplate" + } + } + } + }, + "PaginatedWorkflowJobTemplateNodeList": { + "type": "object", + "required": [ + "count", + "results" + ], + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowJobTemplateNode" + } + } + } + }, + "PatchedConstructedInventoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the inventory will prevent adding any organization instance groups to the list of preferred instances groups to run associated job templates on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + }, + "source_vars": { + "type": "string", + "description": "The source_vars for the related auto-created inventory source, special to constructed inventory." + }, + "update_cache_timeout": { + "type": "integer", + "minimum": 0, + "nullable": true, + "description": "The cache timeout for the related auto-created inventory source, special to constructed inventory" + }, + "limit": { + "type": "string", + "description": "The limit to restrict the returned hosts for the related auto-created inventory source, special to constructed inventory." + }, + "verbosity": { + "type": "integer", + "maximum": 2, + "minimum": 0, + "nullable": true, + "description": "The verbosity level for the related auto-created inventory source, special to constructed inventory" + } + } + }, + "PatchedCredentialInputSourceRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "input_field_name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 1024 + }, + "metadata": { + "default": {} + }, + "target_credential": { + "type": "integer" + }, + "source_credential": { + "type": "integer" + } + } + }, + "PatchedCredentialRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + } + } + }, + "PatchedCredentialTypeRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "kind": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/CredentialTypeKindEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "injectors": { + "default": {}, + "description": "Enter injectors using either JSON or YAML syntax. Refer to the documentation for example syntax." + } + } + }, + "PatchedExecutionEnvironmentRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this execution environment." + }, + "image": { + "type": "string", + "nullable": true, + "minLength": 1, + "title": "Image location", + "description": "The full image location, including the container registry, image name, and version tag.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "nullable": true + }, + "pull": { + "nullable": true, + "default": "", + "description": "Pull image before running?\n\n* `always` - Always pull container before running.\n* `missing` - Only pull the image if not present before running.\n* `never` - Never pull container before running.", + "oneOf": [ + { + "$ref": "#/components/schemas/PullEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + } + }, + "PatchedFederatedInventoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + } + } + }, + "PatchedGroupRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + } + } + }, + "PatchedGroupVariableDataRequest": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Group variables in JSON or YAML format." + } + } + }, + "PatchedHostRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "inventory": { + "type": "integer" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Is this host online and available for running jobs?" + }, + "instance_id": { + "type": "string", + "nullable": true, + "default": "", + "description": "The value used by the remote inventory source to uniquely identify the host", + "maxLength": 1024 + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + } + }, + "PatchedHostVariableDataRequest": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Host variables in JSON or YAML format." + } + } + }, + "PatchedInstanceGroupRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 250 + }, + "max_concurrent_jobs": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum number of concurrent jobs to run on a group. When set to zero, no maximum is enforced." + }, + "max_forks": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum number of forks to execute concurrently on a group. When set to zero, no maximum is enforced." + }, + "is_container_group": { + "type": "boolean", + "description": "Indicates whether instances in this group are containerized.Containerized groups have a designated Openshift or Kubernetes cluster." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "policy_instance_percentage": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Minimum percentage of all instances that will be automatically assigned to this group when new instances come online." + }, + "policy_instance_minimum": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Static minimum number of Instances that will be automatically assign to this group when new instances come online." + }, + "policy_instance_list": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "description": "List of exact-match Instances that will be assigned to this group" + }, + "pod_spec_override": { + "type": "string", + "nullable": true, + "default": "" + } + } + }, + "PatchedInstanceRequest": { + "type": "object", + "properties": { + "hostname": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 250, + "pattern": "^localhost$|^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^(?:0*\\:)*?:?0*1$" + }, + "capacity_adjustment": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,1}(?:\\.\\d{0,2})?$", + "default": "1.00" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true + }, + "managed_by_policy": { + "type": "boolean", + "nullable": true, + "default": true + }, + "node_type": { + "nullable": true, + "default": "execution", + "description": "Role that this node plays in the mesh.\n\n* `control` - Control plane node\n* `execution` - Execution plane node\n* `hybrid` - Controller and execution\n* `hop` - Message-passing node, no execution capability", + "oneOf": [ + { + "$ref": "#/components/schemas/NodeTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "node_state": { + "nullable": true, + "default": "installed", + "description": "Indicates the current life cycle stage of this instance.\n\n* `provisioning` - Provisioning\n* `provision-fail` - Provisioning Failure\n* `installed` - Installed\n* `ready` - Ready\n* `unavailable` - Unavailable\n* `deprovisioning` - De-provisioning\n* `deprovision-fail` - De-provisioning Failure", + "oneOf": [ + { + "$ref": "#/components/schemas/NodeStateEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "peers": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Primary keys of receptor addresses to peer to." + }, + "listener_port": { + "type": "integer", + "nullable": true + }, + "peers_from_control_nodes": { + "type": "boolean" + } + } + }, + "PatchedInventoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "Organization containing this inventory." + }, + "kind": { + "nullable": true, + "default": "", + "description": "Kind of inventory being represented.\n\n* `` - Hosts have a direct link to this inventory.\n* `smart` - Hosts for inventory generated using the host_filter property.\n* `constructed` - Parse list of source inventories with the constructed inventory plugin.\n* `federated` - Route jobs to source inventory instance groups automatically.", + "oneOf": [ + { + "$ref": "#/components/schemas/KindA5dEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "host_filter": { + "type": "string", + "nullable": true, + "description": "Filter that will be applied to the hosts of this inventory." + }, + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the inventory will prevent adding any organization instance groups to the list of preferred instances groups to run associated job templates on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + }, + "allow_deletes_while_in_use": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, hosts can be deleted from this inventory while jobs are running against it. By default those deletions are rejected until the running jobs finish." + } + } + }, + "PatchedInventorySourceRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "source": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/SourceEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "source_path": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "source_vars": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source variables in YAML or JSON format." + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory source SCM branch. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "credential": { + "type": "integer", + "minimum": 1, + "nullable": true, + "description": "Cloud credential to use for inventory updates." + }, + "enabled_var": { + "type": "string", + "nullable": true, + "default": "", + "description": "Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified as \"foo.bar\", in which case the lookup will traverse into nested dicts, equivalent to: from_dict.get(\"foo\", {}).get(\"bar\", default)" + }, + "enabled_value": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only used when enabled_var is set. Value when the host is considered enabled. For example if enabled_var=\"status.power_state\"and enabled_value=\"powered_on\" with host variables:{ \"status\": { \"power_state\": \"powered_on\", \"created\": \"2020-08-04T18:13:04+00:00\", \"healthy\": true }, \"name\": \"foobar\", \"ip_address\": \"192.168.2.1\"}The host would be marked enabled. If power_state where any value other than powered_on then the host would be disabled when imported. If the key is not found then the host will be enabled" + }, + "host_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "This field is deprecated and will be removed in a future release. Regex where only matching hosts will be imported." + }, + "overwrite": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local groups and hosts from remote inventory source." + }, + "overwrite_vars": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Overwrite local variables from remote inventory source." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity481Enum" + } + ], + "default": 1, + "minimum": 0, + "maximum": 2147483647 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "", + "description": "Enter host, group or pattern match" + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "update_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "update_cache_timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "source_project": { + "type": "integer", + "nullable": true, + "description": "Project containing inventory file used as source." + } + } + }, + "PatchedInventoryVariableDataRequest": { + "type": "object", + "properties": { + "variables": { + "type": "string", + "nullable": true, + "default": "", + "description": "Inventory variables in JSON or YAML format." + } + } + }, + "PatchedJobTemplateRequest": { + "type": "object", + "description": "Provide recent jobs and survey details in summary_fields", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_type": { + "nullable": true, + "default": "run", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "inventory": { + "type": "integer", + "nullable": true + }, + "project": { + "type": "integer", + "nullable": true + }, + "playbook": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Branch to use in job run. Project default used if blank. Only allowed if project allow_override field is set to true.", + "maxLength": 1024 + }, + "forks": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0 + }, + "limit": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_slice_pinned_hosts": { + "type": "string", + "nullable": true, + "default": "", + "description": "Comma separated list of host names to include in every slice of a sliced job, in addition to the hosts of the slice itself. Useful when a play targets a coordinating host, such as localhost, that all slices depend on. Names are matched exactly against inventory hosts; groups and patterns are not supported. Has no effect unless the job is sliced." + }, + "verbosity": { + "allOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + } + ], + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "force_handlers": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true, + "default": "" + }, + "start_at_task": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "use_fact_cache": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the service will act as an Ansible Fact Cache Plugin; persisting facts at the end of a playbook run to the database and caching facts for use by Ansible." + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "host_config_key": { + "type": "string", + "nullable": true, + "default": "", + "maxLength": 1024 + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_diff_mode_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_variables_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_limit_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_job_type_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_verbosity_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_inventory_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_credential_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_execution_environment_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_labels_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_forks_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_job_slice_count_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_timeout_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_instance_groups_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "survey_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "become_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "diff_mode": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, textual changes made to any templated files on the host are shown in the standard output" + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "job_slice_count": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of jobs to slice into at runtime. Will cause the Job Template to launch a workflow if value is greater than 1." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_key": { + "type": "string", + "writeOnly": true, + "description": "Shared secret that the webhook service will use to sign requests. Leave blank to generate a new one when the webhook service is set.", + "maxLength": 64 + }, + "prevent_instance_group_fallback": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled, the job template will prevent adding any inventory or organization instance groups to the list of preferred instances groups to run on.If this setting is enabled and you provided an empty list, the global instance groups will be applied." + } + } + }, + "PatchedLabelRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "organization": { + "type": "integer", + "description": "Organization this label belongs to." + } + } + }, + "PatchedNotificationTemplateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true + }, + "notification_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/NotificationTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "notification_configuration": { + "default": {} + }, + "messages": { + "nullable": true, + "default": { + "started": null, + "success": null, + "error": null, + "changed": null, + "workflow_approval": null + }, + "description": "Optional custom messages for notification template." + } + } + }, + "PatchedOAuth2ApplicationRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "maxLength": 255 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "client_type": { + "nullable": true, + "description": "Set to Public or Confidential depending on how secure the client device is.\n\n* `confidential` - Confidential\n* `public` - Public", + "oneOf": [ + { + "$ref": "#/components/schemas/ClientTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "redirect_uris": { + "type": "string", + "nullable": true, + "description": "Allowed URIs list, space separated" + }, + "authorization_grant_type": { + "nullable": true, + "description": "The Grant type the user must use for acquire tokens for this application.\n\n* `authorization-code` - Authorization code\n* `password` - Resource owner password-based", + "oneOf": [ + { + "$ref": "#/components/schemas/AuthorizationGrantTypeEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "skip_authorization": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set True to skip authorization step for completely trusted applications." + }, + "organization": { + "type": "integer", + "description": "Organization containing this application." + } + } + }, + "PatchedOAuth2TokenDetailRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + } + }, + "PatchedOrganizationRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "max_hosts": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "Maximum number of hosts allowed to be managed by this organization." + }, + "default_environment": { + "type": "integer", + "nullable": true, + "description": "The default execution environment for jobs run by this organization." + } + } + }, + "PatchedProjectRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "local_path": { + "type": "string", + "nullable": true, + "description": "Local path (relative to PROJECTS_ROOT) containing playbooks and related files for this project.", + "maxLength": 1024 + }, + "scm_type": { + "nullable": true, + "default": "", + "description": "Specifies the source control system used to store the project.\n\n* `` - Manual\n* `git` - Git\n* `svn` - Subversion\n* `archive` - Remote Archive", + "oneOf": [ + { + "$ref": "#/components/schemas/ScmTypeEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "scm_url": { + "type": "string", + "nullable": true, + "default": "", + "description": "The location where the project is stored.", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Specific branch, tag or commit to checkout.", + "maxLength": 256 + }, + "scm_refspec": { + "type": "string", + "nullable": true, + "default": "", + "description": "For git projects, an additional refspec to fetch.", + "maxLength": 1024 + }, + "scm_clean": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Discard any local changes before syncing the project." + }, + "scm_track_submodules": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Track submodules latest commits on defined branch." + }, + "scm_delete_on_update": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Delete the project before syncing." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "scm_update_on_launch": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Update the project when a job is launched that uses the project." + }, + "scm_update_cache_timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "The number of seconds after the last project update ran that a new project update will be launched as a job dependency." + }, + "allow_override": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Allow changing the SCM branch or revision in a job template that uses this project." + }, + "default_environment": { + "type": "integer", + "nullable": true, + "description": "The default execution environment for jobs run using this project." + }, + "signature_validation_credential": { + "type": "integer", + "nullable": true, + "description": "An optional credential used for validating files in the project against unexpected changes." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_key": { + "type": "string", + "writeOnly": true, + "description": "Shared secret that the webhook service will use to sign requests. Leave blank to generate a new one when the webhook service is set.", + "maxLength": 64 + }, + "webhook_ref_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only sync the project when the webhook ref matches this fnmatch pattern (e.g. refs/heads/main or refs/heads/release-*). When empty, any push or tag event triggers a sync.", + "maxLength": 1024 + } + } + }, + "PatchedResourceRequest": { + "type": "object", + "properties": { + "ansible_id": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "service_id": { + "type": "string", + "format": "uuid", + "description": "ID of the service responsible for managing this resource." + }, + "is_partially_migrated": { + "type": "boolean", + "description": "A flag indicating that the resource has been copied into the resource server, but the service_id hasn't been updated yet." + }, + "resource_type": { + "type": "string", + "minLength": 1 + }, + "resource_data": {} + } + }, + "PatchedScheduleRequest": { + "type": "object", + "properties": { + "rrule": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "A value representing the schedules iCal recurrence rule." + }, + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Enables processing of this schedule." + } + } + }, + "PatchedSettingSingletonRequest": { + "type": "object", + "description": "Present a group of settings (by category) as a single object.", + "properties": { + "ACTIVITY_STREAM_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Activity Stream", + "description": "Enable capturing activity for the activity stream." + }, + "ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC": { + "type": "boolean", + "default": false, + "title": "Enable Activity Stream for Inventory Sync", + "description": "Enable capturing activity for the activity stream when running inventory sync." + }, + "ORG_ADMINS_CAN_SEE_ALL_USERS": { + "type": "boolean", + "default": true, + "title": "All Users Visible to Organization Admins", + "description": "Controls whether any Organization Admin can view all users and teams, even those not associated with their Organization." + }, + "MANAGE_ORGANIZATION_AUTH": { + "type": "boolean", + "default": true, + "title": "Organization Admins Can Manage Users and Teams", + "description": "Controls whether any Organization Admin has the privileges to create and manage users and teams. You may want to disable this ability if you are using an LDAP or SAML integration." + }, + "TOWER_URL_BASE": { + "type": "string", + "minLength": 1, + "default": "https://ascenderhost", + "title": "Base URL of the service", + "description": "This setting is used by services like notifications to render a valid url to the service.", + "format": "uri" + }, + "REMOTE_HOST_HEADERS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "REMOTE_ADDR", + "REMOTE_HOST" + ], + "description": "HTTP headers and meta keys to search to determine remote host name or IP. Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if behind a reverse proxy. See the \"Proxy Support\" section of the AAP Installation guide for more details." + }, + "PROXY_IP_ALLOWED_LIST": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "description": "If the service is behind a reverse proxy/load balancer, use this setting to configure the proxy IP addresses from which the service should trust custom REMOTE_HOST_HEADERS header values. If this setting is an empty list (the default), the headers specified by REMOTE_HOST_HEADERS will be trusted unconditionally')" + }, + "CSRF_TRUSTED_ORIGINS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "CSRF Trusted Origins List", + "description": "If the service is behind a reverse proxy/load balancer, use this setting to configure the schema://addresses from which the service should trust Origin header values. " + }, + "REDHAT_USERNAME": { + "type": "string", + "default": "", + "title": "Red Hat customer username", + "description": "This username is used to send data to Automation Analytics" + }, + "REDHAT_PASSWORD": { + "type": "string", + "default": "", + "title": "Red Hat customer password", + "description": "This password is used to send data to Automation Analytics" + }, + "SUBSCRIPTIONS_USERNAME": { + "type": "string", + "default": "", + "title": "Red Hat or Satellite username", + "description": "This username is used to retrieve subscription and content information" + }, + "SUBSCRIPTIONS_PASSWORD": { + "type": "string", + "default": "", + "title": "Red Hat or Satellite password", + "description": "This password is used to retrieve subscription and content information" + }, + "AUTOMATION_ANALYTICS_URL": { + "type": "string", + "minLength": 1, + "default": "https://example.com", + "title": "Automation Analytics upload URL", + "description": "This setting is used to to configure the upload URL for data collection for Automation Analytics.", + "format": "uri" + }, + "DEFAULT_EXECUTION_ENVIRONMENT": { + "type": "integer", + "nullable": true, + "title": "Global default execution environment", + "description": "The Execution Environment to be used when one has not been configured for a job template." + }, + "AD_HOC_COMMANDS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "command", + "shell", + "yum", + "apt", + "apt_key", + "apt_repository", + "apt_rpm", + "service", + "group", + "user", + "mount", + "ping", + "selinux", + "setup", + "win_ping", + "win_service", + "win_updates", + "win_group", + "win_user" + ], + "title": "Ansible Modules Allowed for Ad Hoc Jobs", + "description": "List of modules allowed to be used by ad-hoc jobs." + }, + "ALLOW_JINJA_IN_EXTRA_VARS": { + "allOf": [ + { + "$ref": "#/components/schemas/ALLOWJINJAINEXTRAVARSEnum" + } + ], + "default": "template", + "title": "When can extra variables contain Jinja templates?", + "description": "Ansible allows variable substitution via the Jinja2 templating language for --extra-vars. This poses a potential security risk where users with the ability to specify extra vars at job launch time can use Jinja2 templates to run arbitrary Python. It is recommended that this value be set to \"template\" or \"never\".\n\n* `always` - Always\n* `never` - Never\n* `template` - Only On Job Template Definitions" + }, + "AWX_ISOLATION_BASE_PATH": { + "type": "string", + "minLength": 1, + "default": "/tmp", + "title": "Job execution path", + "description": "The directory in which the service will create new temporary directories for job execution and isolation (such as credential files)." + }, + "AWX_ISOLATION_SHOW_PATHS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "Paths to expose to isolated jobs", + "description": "List of paths that would otherwise be hidden to expose to isolated jobs. Enter one path per line. Volumes will be mounted from the execution node to the container. The supported format is HOST-DIR[:CONTAINER-DIR[:OPTIONS]]. " + }, + "AWX_TASK_ENV": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "Extra Environment Variables", + "description": "Additional environment variables set for playbook runs, inventory updates, project updates, and notification sending." + }, + "AWX_RUNNER_KEEPALIVE_SECONDS": { + "type": "integer", + "default": 0, + "title": "K8S Ansible Runner Keep-Alive Message Interval", + "description": "Only applies to jobs running in a Container Group. If not 0, send a message every so-many seconds to keep connection open." + }, + "GALAXY_TASK_ENV": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": { + "ANSIBLE_FORCE_COLOR": "false", + "GIT_SSH_COMMAND": "ssh -o StrictHostKeyChecking=no" + }, + "title": "Environment Variables for Galaxy Commands", + "description": "Additional environment variables set for invocations of ansible-galaxy within project updates. Useful if you must use a proxy server for ansible-galaxy but not git." + }, + "INSIGHTS_TRACKING_STATE": { + "type": "boolean", + "default": false, + "title": "Gather data for Automation Analytics", + "description": "Enables the service to gather data on automation and send it to Automation Analytics." + }, + "PROJECT_UPDATE_VVV": { + "type": "boolean", + "default": false, + "title": "Run Project Updates With Higher Verbosity", + "description": "Adds the CLI -vvv flag to ansible-playbook runs of project_update.yml used for project updates." + }, + "AWX_ROLES_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Role Download", + "description": "Allows roles to be dynamically downloaded from a requirements.yml file for SCM projects." + }, + "ASCENDER_AUTO_STATS_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Automatic Job Stats Artifacts", + "description": "Automatically add ascender_stats_* keys (changed/failed flags and host name lists derived from the playbook stats) to the artifacts of every finished playbook job (jobs launched from job templates; project updates, inventory syncs and ad hoc commands are not affected), so they can be used by downstream workflow nodes and conditional connectors without requiring set_stats in the playbook. Can be overridden per job or workflow with an ASCENDER_AUTO_STATS_ENABLED extra variable." + }, + "ASCENDER_AUTO_STATS_MAX_HOSTS": { + "type": "integer", + "minimum": 0, + "default": 100, + "title": "Maximum Hosts in Automatic Job Stats Artifacts", + "description": "When a play involves more hosts than this, the ascender_stats_* host name lists are omitted from the automatic job stats artifacts (the boolean flags are always kept) and ascender_stats_hosts_truncated is set instead. Can be overridden per job or workflow with an ASCENDER_AUTO_STATS_MAX_HOSTS extra variable." + }, + "AWX_COLLECTIONS_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Collection(s) Download", + "description": "Allows collections to be dynamically downloaded from a requirements.yml file for SCM projects." + }, + "ENABLE_ANSIBLE_29": { + "type": "boolean", + "default": false, + "title": "Enable Ansible 2.9 Compatibility", + "description": "If enabled, sets ANSIBLE_COLLECTIONS_PATHS for legacy Ansible 2.9 compatibility." + }, + "AWX_SHOW_PLAYBOOK_LINKS": { + "type": "boolean", + "default": false, + "title": "Follow symlinks", + "description": "Follow symbolic links when scanning for playbooks. Be aware that setting this to True can lead to infinite recursion if a link points to a parent directory of itself." + }, + "AWX_MOUNT_ISOLATED_PATHS_ON_K8S": { + "type": "boolean", + "default": false, + "title": "Expose host paths for Container Groups", + "description": "Expose paths via hostPath for the Pods created by a Container Group. HostPath volumes present many security risks, and it is a best practice to avoid the use of HostPaths when possible. " + }, + "GALAXY_IGNORE_CERTS": { + "type": "boolean", + "default": false, + "title": "Ignore Ansible Galaxy SSL Certificate Verification", + "description": "If set to true, certificate validation will not be done when installing content from any Galaxy server." + }, + "STDOUT_MAX_BYTES_DISPLAY": { + "type": "integer", + "minimum": 0, + "default": 1048576, + "title": "Standard Output Maximum Display Size", + "description": "Maximum Size of Standard Output in bytes to display before requiring the output be downloaded." + }, + "EVENT_STDOUT_MAX_BYTES_DISPLAY": { + "type": "integer", + "minimum": 0, + "default": 1024, + "title": "Job Event Standard Output Maximum Display Size", + "description": "Maximum Size of Standard Output in bytes to display for a single job or ad hoc command event. `stdout` will end with `…` when truncated." + }, + "MAX_WEBSOCKET_EVENT_RATE": { + "type": "integer", + "minimum": 0, + "default": 30, + "title": "Job Event Maximum Websocket Messages Per Second", + "description": "Maximum number of messages to update the UI live job output with per second. Value of 0 means no limit." + }, + "SCHEDULE_MAX_JOBS": { + "type": "integer", + "minimum": 1, + "default": 10, + "title": "Maximum Scheduled Jobs", + "description": "Maximum number of the same job template that can be waiting to run when launching from a schedule before no more are created." + }, + "AWX_ANSIBLE_CALLBACK_PLUGINS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "Ansible Callback Plugins", + "description": "List of paths to search for extra callback plugins to be used when running jobs. Enter one path per line." + }, + "DEFAULT_JOB_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow jobs to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual job template will override this." + }, + "DEFAULT_JOB_IDLE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "If no output is detected from ansible in this number of seconds the execution will be terminated. Use value of 0 to indicate that no idle timeout should be imposed." + }, + "DEFAULT_INVENTORY_UPDATE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow inventory updates to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual inventory source will override this." + }, + "DEFAULT_PROJECT_UPDATE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow project updates to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual project will override this." + }, + "ANSIBLE_FACT_CACHE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Per-Host Ansible Fact Cache Timeout", + "description": "Maximum time, in seconds, that stored Ansible facts are considered valid since the last time they were modified. Only valid, non-stale, facts will be accessible by a playbook. Note, this does not influence the deletion of ansible_facts from the database. Use a value of 0 to indicate that no timeout should be imposed." + }, + "MAX_FORKS": { + "type": "integer", + "default": 200, + "title": "Maximum number of forks per job", + "description": "Saving a Job Template with more than this number of forks will result in an error. When set to 0, no limit is applied." + }, + "LOG_AGGREGATOR_HOST": { + "type": "string", + "nullable": true, + "minLength": 1, + "title": "Logging Aggregator", + "description": "Hostname/IP where external logs will be sent to." + }, + "LOG_AGGREGATOR_PORT": { + "type": "integer", + "nullable": true, + "title": "Logging Aggregator Port", + "description": "Port on Logging Aggregator to send logs to (if required and not provided in Logging Aggregator)." + }, + "LOG_AGGREGATOR_TYPE": { + "nullable": true, + "title": "Logging Aggregator Type", + "description": "Format messages for the chosen log aggregator.\n\n* `logstash` - logstash\n* `splunk` - splunk\n* `loggly` - loggly\n* `sumologic` - sumologic\n* `ledger` - ledger\n* `other` - other", + "oneOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORTYPEEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "LOG_AGGREGATOR_USERNAME": { + "type": "string", + "default": "", + "title": "Logging Aggregator Username", + "description": "Username for external log aggregator (if required; HTTP/s only)." + }, + "LOG_AGGREGATOR_PASSWORD": { + "type": "string", + "default": "", + "title": "Logging Aggregator Password/Token", + "description": "Password or authentication token for external log aggregator (if required; HTTP/s only)." + }, + "LOG_AGGREGATOR_LOGGERS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "awx", + "activity_stream", + "job_events", + "system_tracking", + "broadcast_websocket", + "job_lifecycle" + ], + "title": "Loggers Sending Data to Log Aggregator Form", + "description": "List of loggers that will send HTTP logs to the collector, these can include any or all of: \nawx - service logs\nactivity_stream - activity stream records\njob_events - callback data from Ansible job events\nsystem_tracking - facts gathered from scan jobs\nbroadcast_websocket - errors pertaining to websockets broadcast metrics\njob_lifecycle - logs related to processing of a job\n" + }, + "LOG_AGGREGATOR_INDIVIDUAL_FACTS": { + "type": "boolean", + "default": false, + "title": "Log System Tracking Facts Individually", + "description": "If set, system tracking facts will be sent for each package, service, or other item found in a scan, allowing for greater search query granularity. If unset, facts will be sent as a single dictionary, allowing for greater efficiency in fact processing." + }, + "LOG_AGGREGATOR_ENABLED": { + "type": "boolean", + "default": false, + "title": "Enable External Logging", + "description": "Enable sending logs to external log aggregator." + }, + "LOG_AGGREGATOR_TOWER_UUID": { + "type": "string", + "default": "", + "title": "Cluster-wide unique identifier.", + "description": "Useful to uniquely identify instances." + }, + "LOG_AGGREGATOR_PROTOCOL": { + "allOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORPROTOCOLEnum" + } + ], + "default": "https", + "title": "Logging Aggregator Protocol", + "description": "Protocol used to communicate with log aggregator. HTTPS/HTTP assumes HTTPS unless http:// is explicitly used in the Logging Aggregator hostname.\n\n* `https` - HTTPS/HTTP\n* `tcp` - TCP\n* `udp` - UDP" + }, + "LOG_AGGREGATOR_TCP_TIMEOUT": { + "type": "integer", + "default": 5, + "title": "TCP Connection Timeout", + "description": "Number of seconds for a TCP connection to external log aggregator to timeout. Applies to HTTPS and TCP log aggregator protocols." + }, + "LOG_AGGREGATOR_VERIFY_CERT": { + "type": "boolean", + "default": true, + "title": "Enable/disable HTTPS certificate verification", + "description": "Flag to control enable/disable of certificate verification when LOG_AGGREGATOR_PROTOCOL is \"https\". If enabled, the log handler will verify certificate sent by external log aggregator before establishing connection." + }, + "LOG_AGGREGATOR_LEVEL": { + "allOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORLEVELEnum" + } + ], + "default": "INFO", + "title": "Logging Aggregator Level Threshold", + "description": "Level threshold used by log handler. Severities from lowest to highest are DEBUG, INFO, WARNING, ERROR, CRITICAL. Messages less severe than the threshold will be ignored by log handler. (messages under category awx.anlytics ignore this setting)\n\n* `DEBUG` - DEBUG\n* `INFO` - INFO\n* `WARNING` - WARNING\n* `ERROR` - ERROR\n* `CRITICAL` - CRITICAL" + }, + "LOG_AGGREGATOR_ACTION_QUEUE_SIZE": { + "type": "integer", + "minimum": 1, + "default": 131072, + "title": "Maximum number of messages that can be stored in the log action queue", + "description": "Defines how large the rsyslog action queue can grow in number of messages stored. This can have an impact on memory utilization. When the queue reaches 75% of this number, the queue will start writing to disk (queue.highWatermark in rsyslog). When it reaches 90%, NOTICE, INFO, and DEBUG messages will start to be discarded (queue.discardMark with queue.discardSeverity=5)." + }, + "LOG_AGGREGATOR_ACTION_MAX_DISK_USAGE_GB": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Maximum disk persistence for rsyslogd action queuing (in GB)", + "description": "Amount of data to store (in gigabytes) if an rsyslog action takes time to process an incoming message (defaults to 1). Equivalent to the rsyslogd queue.maxdiskspace setting on the action (e.g. omhttp). It stores files in the directory specified by LOG_AGGREGATOR_MAX_DISK_USAGE_PATH." + }, + "LOG_AGGREGATOR_MAX_DISK_USAGE_PATH": { + "type": "string", + "minLength": 1, + "default": "/var/lib/awx", + "title": "File system location for rsyslogd disk persistence", + "description": "Location to persist logs that should be retried after an outage of the external log aggregator (defaults to /var/lib/awx). Equivalent to the rsyslogd queue.spoolDirectory setting." + }, + "LOG_AGGREGATOR_RSYSLOGD_DEBUG": { + "type": "boolean", + "default": false, + "title": "Enable rsyslogd debugging", + "description": "Enabled high verbosity debugging for rsyslogd. Useful for debugging connection issues for external log aggregation." + }, + "API_400_ERROR_LOG_FORMAT": { + "type": "string", + "minLength": 1, + "default": "status {status_code} received by user {user_name} attempting to access {url_path} from {remote_addr}", + "title": "Log Format For API 4XX Errors", + "description": "The format of logged messages when an API 4XX error occurs, the following variables will be substituted: \nstatus_code - The HTTP status code of the error\nuser_name - The user name attempting to use the API\nurl_path - The URL path to the API endpoint called\nremote_addr - The remote address seen for the user\nerror - The error set by the api endpoint\nVariables need to be in the format {}." + }, + "AUTOMATION_ANALYTICS_LAST_GATHER": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last gather date for Automation Analytics." + }, + "AUTOMATION_ANALYTICS_LAST_ENTRIES": { + "type": "string", + "default": "", + "title": "Last gathered entries from the data collection service of Automation Analytics" + }, + "AUTOMATION_ANALYTICS_GATHER_INTERVAL": { + "type": "integer", + "minimum": 1800, + "default": 14400, + "description": "Interval (in seconds) between data gathering." + }, + "BULK_JOB_MAX_LAUNCH": { + "type": "integer", + "default": 100, + "title": "Max jobs to allow bulk jobs to launch", + "description": "Max jobs to allow bulk jobs to launch" + }, + "BULK_HOST_MAX_CREATE": { + "type": "integer", + "default": 100, + "title": "Max number of hosts to allow to be created in a single bulk action", + "description": "Max number of hosts to allow to be created in a single bulk action" + }, + "BULK_HOST_MAX_DELETE": { + "type": "integer", + "default": 250, + "title": "Max number of hosts to allow to be deleted in a single bulk action", + "description": "Max number of hosts to allow to be deleted in a single bulk action" + }, + "SUBSCRIPTION_USAGE_MODEL": { + "default": "", + "title": "Defines subscription usage model and shows Host Metrics", + "oneOf": [ + { + "$ref": "#/components/schemas/SUBSCRIPTIONUSAGEMODELEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + } + ] + }, + "CLEANUP_HOST_METRICS_LAST_TS": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last cleanup date for HostMetrics" + }, + "HOST_METRIC_SUMMARY_TASK_LAST_TS": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last computing date of HostMetricSummaryMonthly" + }, + "AWX_CLEANUP_PATHS": { + "type": "boolean", + "default": true, + "title": "Enable or Disable tmp dir cleanup", + "description": "Enable or Disable TMP Dir cleanup" + }, + "AWX_REQUEST_PROFILE": { + "type": "boolean", + "default": false, + "title": "Debug Web Requests", + "description": "Debug web request python timing" + }, + "DEFAULT_CONTAINER_RUN_OPTIONS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "--network", + "slirp4netns:enable_ipv6=true" + ], + "title": "Container Run Options", + "description": "List of options to pass to podman run example: ['--network', 'slirp4netns:enable_ipv6=true', '--log-level', 'debug']" + }, + "RECEPTOR_RELEASE_WORK": { + "type": "boolean", + "default": true, + "title": "Release Receptor Work", + "description": "Release receptor work" + }, + "SESSION_COOKIE_AGE": { + "type": "integer", + "maximum": 30000000000, + "minimum": 60, + "format": "int64", + "default": 1800, + "title": "Idle Time Force Log Out", + "description": "Number of seconds that a user is inactive before they will need to login again." + }, + "SESSIONS_PER_USER": { + "type": "integer", + "minimum": -1, + "default": -1, + "title": "Maximum number of simultaneous logged in sessions", + "description": "Maximum number of simultaneous logged in sessions a user may have. To disable enter -1." + }, + "DISABLE_LOCAL_AUTH": { + "type": "boolean", + "default": false, + "title": "Disable the built-in authentication system", + "description": "Controls whether users are prevented from using the built-in authentication system. You probably want to do this if you are using an LDAP or SAML integration." + }, + "AUTH_BASIC_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable HTTP Basic Auth", + "description": "Enable HTTP Basic Auth for the API Browser." + }, + "OAUTH2_PROVIDER": { + "type": "object", + "additionalProperties": { + "type": "integer", + "minimum": 1 + }, + "default": { + "ACCESS_TOKEN_EXPIRE_SECONDS": 31536000000, + "AUTHORIZATION_CODE_EXPIRE_SECONDS": 600, + "REFRESH_TOKEN_EXPIRE_SECONDS": 2628000 + }, + "title": "OAuth 2 Timeout Settings", + "description": "Dictionary for customizing OAuth 2 timeouts, available items are `ACCESS_TOKEN_EXPIRE_SECONDS`, the duration of access tokens in the number of seconds, `AUTHORIZATION_CODE_EXPIRE_SECONDS`, the duration of authorization codes in the number of seconds, and `REFRESH_TOKEN_EXPIRE_SECONDS`, the duration of refresh tokens, after expired access tokens, in the number of seconds." + }, + "ALLOW_OAUTH2_FOR_EXTERNAL_USERS": { + "type": "boolean", + "default": false, + "title": "Allow External Users to Create OAuth2 Tokens", + "description": "For security reasons, users from external auth providers (LDAP, SAML, SSO, Radius, and others) are not allowed to create OAuth2 tokens. To change this behavior, enable this setting. Existing tokens will not be deleted when this setting is toggled off." + }, + "LOGIN_REDIRECT_OVERRIDE": { + "type": "string", + "default": "", + "title": "Login redirect override URL", + "description": "URL to which unauthorized users will be redirected to log in. If blank, users will be sent to the login page." + }, + "ALLOW_METRICS_FOR_ANONYMOUS_USERS": { + "type": "boolean", + "default": false, + "title": "Allow anonymous users to poll metrics", + "description": "If true, anonymous users are allowed to poll metrics." + }, + "CUSTOM_LOGIN_INFO": { + "type": "string", + "default": "", + "description": "If needed, you can add specific information (such as a legal notice or a disclaimer) to a text box in the login modal using this setting. Any content added must be in plain text or an HTML fragment, as other markup languages are not supported." + }, + "CUSTOM_TITLE": { + "type": "string", + "default": "", + "title": "Custom Browser Title", + "description": "If set, this text will replace the default brand name in the browser tab title throughout the application." + }, + "CUSTOM_LOGO": { + "type": "string", + "default": "", + "title": "Custom Login Logo", + "description": "To set up a custom logo, provide a file that you create. For the custom logo to look its best, use a .png file with a transparent background. GIF, PNG and JPEG formats are supported." + }, + "CUSTOM_HEADER_LOGO": { + "type": "string", + "default": "", + "description": "To set up a custom logo for the application header, provide a file that you create. For the custom logo to look its best, use a .png file with a transparent background. GIF, PNG and JPEG formats are supported." + }, + "CUSTOM_THEME": { + "type": "string", + "default": "", + "description": "The contents of a CSS file, offered in the theme list alongside the themes that ship with the product. Scope the rules to html[data-theme=\"custom\"], the way the shipped themes scope theirs, and add html.pf-v6-theme-dark[data-theme=\"custom\"] for a dark theme. @import and remote URLs are rejected: use a relative path or a data: URI for fonts and images." + }, + "CUSTOM_THEME_NAME": { + "type": "string", + "default": "", + "description": "Name shown for the custom theme in the theme list. Defaults to Custom when left blank." + }, + "MAX_UI_JOB_EVENTS": { + "type": "integer", + "minimum": 100, + "default": 4000, + "title": "Max Job Events Retrieved by UI", + "description": "Maximum number of job events for the UI to retrieve within a single request." + }, + "UI_LIVE_UPDATES_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Live Updates in the UI", + "description": "If disabled, the page will not refresh when events are received. Reloading the page will be required to get the latest details." + }, + "SOCIAL_AUTH_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_USER_FIELDS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "nullable": true, + "description": "When set to an empty list `[]`, this setting prevents new user accounts from being created. Only users who have previously logged in using social auth or have a user account with a matching email address will be able to login." + }, + "SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL": { + "type": "boolean", + "default": false, + "title": "Use Email address for usernames", + "description": "Enabling this setting will tell social auth to use the full Email as username instead of the full name" + }, + "AUTH_LDAP_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAPGROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_1_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_1_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_1_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_1_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_1_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_1_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_1_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_1_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_1_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_1_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP1GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_1_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_1_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_1_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_1_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_1_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_1_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_2_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_2_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_2_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_2_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_2_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_2_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_2_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_2_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_2_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_2_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP2GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_2_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_2_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_2_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_2_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_3_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_3_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_3_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_3_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_3_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_3_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_3_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_3_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_3_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_3_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP3GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_3_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_3_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_3_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_3_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_3_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_3_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_4_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_4_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_4_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_4_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_4_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_4_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_4_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_4_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_4_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_4_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP4GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_4_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_4_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_4_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_4_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_4_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_4_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_5_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_5_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_5_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_5_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_5_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_5_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_5_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_5_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_5_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_5_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP5GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_5_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_5_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_5_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_5_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_5_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_5_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "RADIUS_SERVER": { + "type": "string", + "default": "", + "description": "Hostname/IP of RADIUS server. RADIUS authentication is disabled if this setting is empty." + }, + "RADIUS_PORT": { + "type": "integer", + "maximum": 65535, + "minimum": 1, + "default": 1812, + "description": "Port of RADIUS server." + }, + "RADIUS_SECRET": { + "type": "string", + "default": "", + "description": "Shared secret for authenticating to RADIUS server." + }, + "TACACSPLUS_HOST": { + "type": "string", + "default": "", + "title": "TACACS+ Server", + "description": "Hostname of TACACS+ server." + }, + "TACACSPLUS_PORT": { + "type": "integer", + "maximum": 65535, + "minimum": 1, + "default": 49, + "title": "TACACS+ Port", + "description": "Port number of TACACS+ server." + }, + "TACACSPLUS_SECRET": { + "type": "string", + "default": "", + "title": "TACACS+ Secret", + "description": "Shared secret for authenticating to TACACS+ server." + }, + "TACACSPLUS_SESSION_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 5, + "title": "TACACS+ Auth Session Timeout", + "description": "TACACS+ session timeout value in seconds, 0 disables timeout." + }, + "TACACSPLUS_AUTH_PROTOCOL": { + "allOf": [ + { + "$ref": "#/components/schemas/TACACSPLUSAUTHPROTOCOLEnum" + } + ], + "default": "ascii", + "title": "TACACS+ Authentication Protocol", + "description": "Choose the authentication protocol used by TACACS+ client.\n\n* `ascii` - ascii\n* `pap` - pap" + }, + "TACACSPLUS_REM_ADDR": { + "type": "boolean", + "default": false, + "title": "TACACS+ client address sending enabled", + "description": "Enable the client address sending by TACACS+ client." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Google OAuth2 Key", + "description": "The OAuth2 key from your web application." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Google OAuth2 Secret", + "description": "The OAuth2 secret from your web application." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "Google OAuth2 Allowed Domains", + "description": "Update this setting to restrict the domains who are allowed to login using Google OAuth2." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "Google OAuth2 Extra Arguments", + "description": "Extra arguments for Google OAuth2 login. You can restrict it to only allow a single domain to authenticate, even if the user is logged in with multple Google accounts. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Google OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Google OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_KEY": { + "type": "string", + "default": "", + "title": "GitHub OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub developer application." + }, + "SOCIAL_AUTH_GITHUB_SECRET": { + "type": "string", + "default": "", + "title": "GitHub OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub developer application." + }, + "SOCIAL_AUTH_GITHUB_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ORG_KEY": { + "type": "string", + "default": "", + "title": "GitHub Organization OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_ORG_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Organization OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_ORG_NAME": { + "type": "string", + "default": "", + "title": "GitHub Organization Name", + "description": "The name of your GitHub organization, as used in your organization's URL: https://github.com//." + }, + "SOCIAL_AUTH_GITHUB_ORG_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Organization OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ORG_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Organization OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_KEY": { + "type": "string", + "default": "", + "title": "GitHub Team OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Team OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_ID": { + "type": "string", + "default": "", + "title": "GitHub Team ID", + "description": "Find the numeric team ID using the Github API: http://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." + }, + "SOCIAL_AUTH_GITHUB_TEAM_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Team OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Team OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise developer application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise developer application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_NAME": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization Name", + "description": "The name of your GitHub Enterprise organization, as used in your organization's URL: https://github.com//." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Organization OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Organization OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_ID": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team ID", + "description": "Find the numeric team ID using the Github Enterprise API: http://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Team OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Team OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Azure AD OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Azure AD OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Azure AD Tenant OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Azure AD Tenant OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID": { + "type": "string", + "default": "", + "title": "Azure AD Tenant ID", + "description": "The directory/tenant ID of your Azure AD application. This limits authentication to a single tenant." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD Tenant OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD Tenant OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_OIDC_KEY": { + "type": "string", + "minLength": 1, + "title": "OIDC Key", + "description": "The OIDC key (Client ID) from your IDP." + }, + "SOCIAL_AUTH_OIDC_SECRET": { + "type": "string", + "default": "", + "title": "OIDC Secret", + "description": "The OIDC secret (Client Secret) from your IDP." + }, + "SOCIAL_AUTH_OIDC_OIDC_ENDPOINT": { + "type": "string", + "default": "", + "title": "OIDC Provider URL", + "description": "The URL for your OIDC provider including the path up to /.well-known/openid-configuration" + }, + "SOCIAL_AUTH_OIDC_VERIFY_SSL": { + "type": "boolean", + "default": true, + "title": "Verify OIDC Provider Certificate", + "description": "Verify the OIDC provider ssl certificate." + }, + "SAML_AUTO_CREATE_OBJECTS": { + "type": "boolean", + "default": true, + "title": "Automatically Create Organizations and Teams on SAML Login", + "description": "When enabled (the default), mapped Organizations and Teams will be created automatically on successful SAML login." + }, + "SOCIAL_AUTH_SAML_SP_ENTITY_ID": { + "type": "string", + "default": "", + "title": "SAML Service Provider Entity ID", + "description": "The application-defined unique identifier used as the audience of the SAML service provider (SP) configuration. This is usually the URL for the service." + }, + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT": { + "type": "string", + "default": "", + "title": "SAML Service Provider Public Certificate", + "description": "Create a keypair to use as a service provider (SP) and include the certificate content here." + }, + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY": { + "type": "string", + "default": "", + "title": "SAML Service Provider Private Key", + "description": "Create a keypair to use as a service provider (SP) and include the private key content here." + }, + "SOCIAL_AUTH_SAML_ORG_INFO": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": {} + }, + "default": {}, + "title": "SAML Service Provider Organization Info", + "description": "Provide the URL, display name, and the name of your app. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_TECHNICAL_CONTACT": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "SAML Service Provider Technical Contact", + "description": "Provide the name and email address of the technical contact for your service provider. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_SUPPORT_CONTACT": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "SAML Service Provider Support Contact", + "description": "Provide the name and email address of the support contact for your service provider. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_ENABLED_IDPS": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": {} + }, + "default": {}, + "title": "SAML Enabled Identity Providers", + "description": "Configure the Entity ID, SSO URL and certificate for each identity provider (IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user data using attribute names that differ from the default OIDs. Attribute names may be overridden for each IdP. An optional label may be set for each IdP to control the text of its login button. Refer to the Ansible documentation for additional details and syntax." + }, + "SOCIAL_AUTH_SAML_SECURITY_CONFIG": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "default": { + "requestedAuthnContext": false + }, + "title": "SAML Security Config", + "description": "A dict of key value pairs that are passed to the underlying python-saml security setting https://github.com/onelogin/python-saml#settings" + }, + "SOCIAL_AUTH_SAML_SP_EXTRA": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "title": "SAML Service Provider extra configuration data", + "description": "A dict of key value pairs to be passed to the underlying python-saml Service Provider configuration setting." + }, + "SOCIAL_AUTH_SAML_EXTRA_DATA": { + "type": "array", + "items": {}, + "nullable": true, + "title": "SAML IDP to extra_data attribute mapping", + "description": "A list of tuples that maps IDP attributes to extra_attributes. Each attribute will be a list of values, even if only 1 value." + }, + "SOCIAL_AUTH_SAML_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "SAML Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_SAML_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "SAML Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_SAML_ORGANIZATION_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML Organization Attribute Mapping", + "description": "Used to translate user organization membership." + }, + "SOCIAL_AUTH_SAML_TEAM_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML Team Attribute Mapping", + "description": "Used to translate user team membership." + }, + "SOCIAL_AUTH_SAML_USER_FLAGS_BY_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML User Flags Attribute Mapping", + "description": "Used to map super users and system auditors from SAML." + }, + "LOCAL_PASSWORD_MIN_LENGTH": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of characters in local password", + "description": "Minimum number of characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_DIGITS": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of digit characters in local password", + "description": "Minimum number of digit characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_UPPER": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of uppercase characters in local password", + "description": "Minimum number of uppercase characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_SPECIAL": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of special characters in local password", + "description": "Minimum number of special characters required in a local password. 0 means no minimum" + } + } + }, + "PatchedTeamRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer" + } + } + }, + "PatchedUserRequest": { + "type": "object", + "properties": { + "username": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + "pattern": "^[\\w.@+-]+$", + "maxLength": 150 + }, + "first_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "last_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "email": { + "type": "string", + "nullable": true, + "title": "Email address", + "maxLength": 254 + }, + "is_superuser": { + "type": "boolean", + "nullable": true, + "default": false, + "title": "Superuser status", + "description": "Designates that this user has all permissions without explicitly assigning them." + }, + "is_system_auditor": { + "type": "boolean", + "default": false + }, + "password": { + "type": "string", + "default": "", + "description": "Field used to change the password." + }, + "preferred_language": { + "type": "string", + "default": "" + } + } + }, + "PatchedWorkflowApprovalTemplateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) before the approval node expires and fails." + }, + "context_template": { + "type": "string", + "nullable": true, + "default": "", + "description": "A Jinja2 template rendered with upstream set_stats artifacts when the approval is created. The result is stored on the approval as context_message and shown to the approver." + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + } + }, + "PatchedWorkflowJobTemplateNodeDetailRequest": { + "type": "object", + "description": "Influence the api browser sample data to not include workflow_job_template\nwhen editing a WorkflowNode.\n\nNote: I was not able to accomplish this through the use of extra_kwargs.\nMaybe something to do with workflow_job_template being a relational field?", + "properties": { + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "workflow_job_template": { + "type": "integer" + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "identifier": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "An identifier for this node that is unique within its workflow. It is copied to workflow job nodes corresponding to this node.", + "maxLength": 512 + } + } + }, + "PatchedWorkflowJobTemplateRequest": { + "type": "object", + "description": "Provide recent jobs and survey details in summary_fields", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "survey_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_variables_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "limit": { + "type": "string", + "nullable": true + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "ask_inventory_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_limit_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_key": { + "type": "string", + "writeOnly": true, + "description": "Shared secret that the webhook service will use to sign requests. Leave blank to generate a new one when the webhook service is set.", + "maxLength": 64 + }, + "ask_labels_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "job_tags": { + "type": "string", + "nullable": true + } + } + }, + "Project": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "local_path": { + "type": "string", + "nullable": true, + "description": "Local path (relative to PROJECTS_ROOT) containing playbooks and related files for this project.", + "maxLength": 1024 + }, + "scm_type": { + "nullable": true, + "default": "", + "description": "Specifies the source control system used to store the project.\n\n* `` - Manual\n* `git` - Git\n* `svn` - Subversion\n* `archive` - Remote Archive", + "oneOf": [ + { + "$ref": "#/components/schemas/ScmTypeEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "scm_url": { + "type": "string", + "nullable": true, + "default": "", + "description": "The location where the project is stored.", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Specific branch, tag or commit to checkout.", + "maxLength": 256 + }, + "scm_refspec": { + "type": "string", + "nullable": true, + "default": "", + "description": "For git projects, an additional refspec to fetch.", + "maxLength": 1024 + }, + "scm_clean": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Discard any local changes before syncing the project." + }, + "scm_track_submodules": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Track submodules latest commits on defined branch." + }, + "scm_delete_on_update": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Delete the project before syncing." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The last revision fetched by a project update" + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/ProjectStatusEnum" + } + ], + "readOnly": true + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "scm_update_on_launch": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Update the project when a job is launched that uses the project." + }, + "scm_update_cache_timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "The number of seconds after the last project update ran that a new project update will be launched as a job dependency." + }, + "allow_override": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Allow changing the SCM branch or revision in a job template that uses this project." + }, + "default_environment": { + "type": "integer", + "nullable": true, + "description": "The default execution environment for jobs run using this project." + }, + "signature_validation_credential": { + "type": "integer", + "nullable": true, + "description": "An optional credential used for validating files in the project against unexpected changes." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_ref_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only sync the project when the webhook ref matches this fnmatch pattern (e.g. refs/heads/main or refs/heads/release-*). When empty, any push or tag event triggers a sync.", + "maxLength": 1024 + }, + "last_update_failed": { + "type": "boolean", + "readOnly": true + }, + "last_updated": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "required": [ + "created", + "id", + "last_job_failed", + "last_job_run", + "last_update_failed", + "last_updated", + "modified", + "name", + "next_job_run", + "related", + "scm_revision", + "status", + "summary_fields", + "type", + "url" + ] + }, + "ProjectInventories": { + "type": "object", + "properties": { + "inventory_files": { + "readOnly": true, + "description": "Array of inventory files and directories available within this project, not comprehensive." + } + }, + "required": [ + "inventory_files" + ] + }, + "ProjectPlaybooks": { + "type": "object", + "properties": { + "playbooks": { + "type": "string", + "readOnly": true, + "description": "Array of playbooks available within this project." + } + }, + "required": [ + "playbooks" + ] + }, + "ProjectRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "local_path": { + "type": "string", + "nullable": true, + "description": "Local path (relative to PROJECTS_ROOT) containing playbooks and related files for this project.", + "maxLength": 1024 + }, + "scm_type": { + "nullable": true, + "default": "", + "description": "Specifies the source control system used to store the project.\n\n* `` - Manual\n* `git` - Git\n* `svn` - Subversion\n* `archive` - Remote Archive", + "oneOf": [ + { + "$ref": "#/components/schemas/ScmTypeEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "scm_url": { + "type": "string", + "nullable": true, + "default": "", + "description": "The location where the project is stored.", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Specific branch, tag or commit to checkout.", + "maxLength": 256 + }, + "scm_refspec": { + "type": "string", + "nullable": true, + "default": "", + "description": "For git projects, an additional refspec to fetch.", + "maxLength": 1024 + }, + "scm_clean": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Discard any local changes before syncing the project." + }, + "scm_track_submodules": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Track submodules latest commits on defined branch." + }, + "scm_delete_on_update": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Delete the project before syncing." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "scm_update_on_launch": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Update the project when a job is launched that uses the project." + }, + "scm_update_cache_timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 0, + "description": "The number of seconds after the last project update ran that a new project update will be launched as a job dependency." + }, + "allow_override": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Allow changing the SCM branch or revision in a job template that uses this project." + }, + "default_environment": { + "type": "integer", + "nullable": true, + "description": "The default execution environment for jobs run using this project." + }, + "signature_validation_credential": { + "type": "integer", + "nullable": true, + "description": "An optional credential used for validating files in the project against unexpected changes." + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_key": { + "type": "string", + "writeOnly": true, + "description": "Shared secret that the webhook service will use to sign requests. Leave blank to generate a new one when the webhook service is set.", + "maxLength": 64 + }, + "webhook_ref_filter": { + "type": "string", + "nullable": true, + "default": "", + "description": "Only sync the project when the webhook ref matches this fnmatch pattern (e.g. refs/heads/main or refs/heads/release-*). When empty, any push or tag event triggers a sync.", + "maxLength": 1024 + } + }, + "required": [ + "name" + ] + }, + "ProjectStatusEnum": { + "enum": [ + "new", + "pending", + "waiting", + "running", + "successful", + "failed", + "error", + "canceled", + "never updated", + "ok", + "missing" + ], + "type": "string", + "description": "* `new` - New\n* `pending` - Pending\n* `waiting` - Waiting\n* `running` - Running\n* `successful` - Successful\n* `failed` - Failed\n* `error` - Error\n* `canceled` - Canceled\n* `never updated` - Never Updated\n* `ok` - OK\n* `missing` - Missing" + }, + "ProjectUpdateCancel": { + "type": "object", + "properties": { + "can_cancel": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_cancel" + ] + }, + "ProjectUpdateDetail": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "local_path": { + "type": "string", + "nullable": true, + "description": "Local path (relative to PROJECTS_ROOT) containing playbooks and related files for this project.", + "maxLength": 1024 + }, + "scm_type": { + "nullable": true, + "default": "", + "description": "Specifies the source control system used to store the project.\n\n* `` - Manual\n* `git` - Git\n* `svn` - Subversion\n* `archive` - Remote Archive", + "oneOf": [ + { + "$ref": "#/components/schemas/ScmTypeEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "scm_url": { + "type": "string", + "nullable": true, + "default": "", + "description": "The location where the project is stored.", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Specific branch, tag or commit to checkout.", + "maxLength": 256 + }, + "scm_refspec": { + "type": "string", + "nullable": true, + "default": "", + "description": "For git projects, an additional refspec to fetch.", + "maxLength": 1024 + }, + "scm_clean": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Discard any local changes before syncing the project." + }, + "scm_track_submodules": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Track submodules latest commits on defined branch." + }, + "scm_delete_on_update": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Delete the project before syncing." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The SCM Revision discovered by this update for the given project and branch." + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "event_processing_finished": { + "type": "boolean", + "readOnly": true, + "description": "Indicates whether all of the events generated by this unified job have been saved to the database." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "project": { + "type": "integer", + "readOnly": true + }, + "job_type": { + "nullable": true, + "default": "check", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "", + "description": "Parts of the project update playbook that will be run.", + "maxLength": 1024 + }, + "webhook_service": { + "nullable": true, + "description": "Service that the webhook request that triggered this update came from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + }, + "host_status_counts": { + "readOnly": true, + "nullable": true, + "description": "Playbook stats from the Ansible playbook_on_stats event." + }, + "playbook_counts": { + "type": "string", + "readOnly": true, + "description": "A count of all plays and tasks for the job run." + } + }, + "required": [ + "canceled_on", + "created", + "elapsed", + "event_processing_finished", + "execution_node", + "failed", + "finished", + "host_status_counts", + "id", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "playbook_counts", + "project", + "related", + "result_traceback", + "scm_revision", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "ProjectUpdateEvent": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "event": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/EventC0bEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "counter": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "event_display": { + "type": "string", + "readOnly": true + }, + "event_data": { + "type": "string", + "readOnly": true + }, + "event_level": { + "type": "integer", + "readOnly": true + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "changed": { + "type": "boolean", + "readOnly": true + }, + "uuid": { + "type": "string", + "readOnly": true + }, + "host_name": { + "type": "string", + "readOnly": true + }, + "playbook": { + "type": "string", + "readOnly": true + }, + "play": { + "type": "string", + "readOnly": true + }, + "task": { + "type": "string", + "readOnly": true + }, + "role": { + "type": "string", + "readOnly": true + }, + "stdout": { + "type": "string", + "readOnly": true + }, + "start_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "end_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "verbosity": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "project_update": { + "type": "integer", + "readOnly": true + } + }, + "required": [ + "changed", + "counter", + "created", + "end_line", + "event", + "event_data", + "event_display", + "event_level", + "failed", + "host_name", + "id", + "modified", + "play", + "playbook", + "project_update", + "related", + "role", + "start_line", + "stdout", + "summary_fields", + "task", + "type", + "url", + "uuid", + "verbosity" + ] + }, + "ProjectUpdateList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "local_path": { + "type": "string", + "nullable": true, + "description": "Local path (relative to PROJECTS_ROOT) containing playbooks and related files for this project.", + "maxLength": 1024 + }, + "scm_type": { + "nullable": true, + "default": "", + "description": "Specifies the source control system used to store the project.\n\n* `` - Manual\n* `git` - Git\n* `svn` - Subversion\n* `archive` - Remote Archive", + "oneOf": [ + { + "$ref": "#/components/schemas/ScmTypeEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "scm_url": { + "type": "string", + "nullable": true, + "default": "", + "description": "The location where the project is stored.", + "maxLength": 1024 + }, + "scm_branch": { + "type": "string", + "nullable": true, + "default": "", + "description": "Specific branch, tag or commit to checkout.", + "maxLength": 256 + }, + "scm_refspec": { + "type": "string", + "nullable": true, + "default": "", + "description": "For git projects, an additional refspec to fetch.", + "maxLength": 1024 + }, + "scm_clean": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Discard any local changes before syncing the project." + }, + "scm_track_submodules": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Track submodules latest commits on defined branch." + }, + "scm_delete_on_update": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Delete the project before syncing." + }, + "credential": { + "type": "integer", + "nullable": true + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) to run before the task is canceled." + }, + "scm_revision": { + "type": "string", + "readOnly": true, + "description": "The SCM Revision discovered by this update for the given project and branch." + }, + "project": { + "type": "integer", + "readOnly": true + }, + "job_type": { + "nullable": true, + "default": "check", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true, + "default": "", + "description": "Parts of the project update playbook that will be run.", + "maxLength": 1024 + }, + "webhook_service": { + "nullable": true, + "description": "Service that the webhook request that triggered this update came from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + } + }, + "required": [ + "canceled_on", + "created", + "elapsed", + "execution_node", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "project", + "related", + "scm_revision", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "ProjectUpdateView": { + "type": "object", + "properties": { + "can_update": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_update" + ] + }, + "ProtocolEnum": { + "enum": [ + "tcp", + "ws", + "wss" + ], + "type": "string", + "description": "* `tcp` - TCP\n* `ws` - WS\n* `wss` - WSS" + }, + "PullEnum": { + "enum": [ + "always", + "missing", + "never" + ], + "type": "string", + "description": "* `always` - Always pull container before running.\n* `missing` - Only pull the image if not present before running.\n* `never` - Never pull container before running." + }, + "ReceptorAddress": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "address": { + "type": "string", + "nullable": true, + "description": "Routable address for this instance.", + "maxLength": 255 + }, + "port": { + "type": "integer", + "maximum": 65535, + "minimum": 0, + "default": 27199, + "description": "Port for the address." + }, + "protocol": { + "nullable": true, + "default": "tcp", + "description": "Protocol to use for the Receptor listener, 'tcp', 'wss', or 'ws'.\n\n* `tcp` - TCP\n* `ws` - WS\n* `wss` - WSS", + "oneOf": [ + { + "$ref": "#/components/schemas/ProtocolEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "websocket_path": { + "type": "string", + "nullable": true, + "default": "", + "description": "Websocket path.", + "maxLength": 255 + }, + "is_internal": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If True, only routable within the Kubernetes cluster." + }, + "canonical": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If True, this address is the canonical address for the instance." + }, + "instance": { + "type": "integer" + }, + "peers_from_control_nodes": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If True, control plane cluster nodes should automatically peer to it." + }, + "full_address": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "address", + "full_address", + "id", + "instance", + "url" + ] + }, + "Resource": { + "type": "object", + "properties": { + "object_id": { + "type": "string", + "readOnly": true, + "description": "The object id for this resource." + }, + "name": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The name of this resource." + }, + "ansible_id": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "service_id": { + "type": "string", + "format": "uuid", + "description": "ID of the service responsible for managing this resource." + }, + "is_partially_migrated": { + "type": "boolean", + "description": "A flag indicating that the resource has been copied into the resource server, but the service_id hasn't been updated yet." + }, + "resource_type": { + "type": "string" + }, + "has_serializer": { + "type": "boolean", + "readOnly": true + }, + "resource_data": {}, + "url": { + "type": "string", + "readOnly": true + }, + "additional_data": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "additional_data", + "has_serializer", + "name", + "object_id", + "resource_data", + "url" + ] + }, + "ResourceAccessListElement": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "username": { + "type": "string", + "nullable": true, + "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + "pattern": "^[\\w.@+-]+$", + "maxLength": 150 + }, + "first_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "last_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "email": { + "type": "string", + "nullable": true, + "title": "Email address", + "maxLength": 254 + }, + "is_superuser": { + "type": "boolean", + "nullable": true, + "default": false, + "title": "Superuser status", + "description": "Designates that this user has all permissions without explicitly assigning them." + }, + "is_system_auditor": { + "type": "boolean", + "default": false + }, + "password": { + "type": "string", + "default": "", + "description": "Field used to change the password." + }, + "ldap_dn": { + "type": "string", + "readOnly": true + }, + "preferred_language": { + "type": "string", + "default": "" + }, + "last_login": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "external_account": { + "type": "string", + "readOnly": true, + "description": "Set if the account is managed by an external service" + } + }, + "required": [ + "created", + "external_account", + "id", + "last_login", + "ldap_dn", + "modified", + "related", + "summary_fields", + "type", + "url", + "username" + ] + }, + "ResourceList": { + "type": "object", + "properties": { + "object_id": { + "type": "string", + "readOnly": true, + "description": "The object id for this resource." + }, + "name": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The name of this resource." + }, + "ansible_id": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "service_id": { + "type": "string", + "format": "uuid", + "description": "ID of the service responsible for managing this resource." + }, + "is_partially_migrated": { + "type": "boolean", + "description": "A flag indicating that the resource has been copied into the resource server, but the service_id hasn't been updated yet." + }, + "resource_type": { + "type": "string" + }, + "has_serializer": { + "type": "boolean", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "has_serializer", + "name", + "object_id", + "url" + ] + }, + "ResourceRequest": { + "type": "object", + "properties": { + "ansible_id": { + "type": "string", + "format": "uuid", + "description": "A unique ID identifying this resource by the resource server." + }, + "service_id": { + "type": "string", + "format": "uuid", + "description": "ID of the service responsible for managing this resource." + }, + "is_partially_migrated": { + "type": "boolean", + "description": "A flag indicating that the resource has been copied into the resource server, but the service_id hasn't been updated yet." + }, + "resource_type": { + "type": "string", + "minLength": 1 + }, + "resource_data": {} + }, + "required": [ + "resource_data" + ] + }, + "ResourceType": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "name": { + "type": "string", + "readOnly": true, + "description": "The name of this resource type." + }, + "externally_managed": { + "type": "boolean", + "description": "Is this resource type managed externally from this service." + }, + "shared_resource_type": { + "type": "string", + "nullable": true, + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "externally_managed", + "id", + "name", + "shared_resource_type", + "url" + ] + }, + "Role": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "description", + "id", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "RoleSerializerWithParentAccess": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "description", + "id", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "SUBSCRIPTIONUSAGEMODELEnum": { + "enum": [ + "unique_managed_hosts" + ], + "type": "string", + "description": "* `` - Default model for AWX - no subscription. Deletion of host_metrics will not be considered for purposes of managed host counting\n* `unique_managed_hosts` - Usage based on unique managed nodes in a large historical time frame and delete functionality for no longer used managed nodes" + }, + "Schedule": { + "type": "object", + "properties": { + "rrule": { + "type": "string", + "nullable": true, + "description": "A value representing the schedules iCal recurrence rule." + }, + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Enables processing of this schedule." + }, + "dtstart": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The first occurrence of the schedule occurs on or after this time." + }, + "dtend": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The last occurrence of the schedule occurs before this time, aftewards the schedule expires." + }, + "next_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The next time that the scheduled action will run." + }, + "timezone": { + "type": "string", + "readOnly": true, + "description": "The timezone this schedule runs in. This field is extracted from the RRULE. If the timezone in the RRULE is a link to another timezone, the link will be reflected in this field." + }, + "until": { + "type": "string", + "readOnly": true, + "description": "The date this schedule will end. This field is computed from the RRULE. If the schedule does not end an empty string will be returned" + } + }, + "required": [ + "created", + "dtend", + "dtstart", + "id", + "modified", + "name", + "next_run", + "related", + "rrule", + "summary_fields", + "timezone", + "type", + "unified_job_template", + "until", + "url" + ] + }, + "SchedulePreview": { + "type": "object", + "properties": { + "rrule": { + "type": "string", + "nullable": true, + "description": "A value representing the schedules iCal recurrence rule." + } + }, + "required": [ + "rrule" + ] + }, + "SchedulePreviewRequest": { + "type": "object", + "properties": { + "rrule": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "A value representing the schedules iCal recurrence rule." + } + }, + "required": [ + "rrule" + ] + }, + "ScheduleRequest": { + "type": "object", + "properties": { + "rrule": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "A value representing the schedules iCal recurrence rule." + }, + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer" + }, + "enabled": { + "type": "boolean", + "nullable": true, + "default": true, + "description": "Enables processing of this schedule." + } + }, + "required": [ + "name", + "rrule", + "unified_job_template" + ] + }, + "ScmTypeEnum": { + "enum": [ + "git", + "svn", + "archive" + ], + "type": "string", + "description": "* `` - Manual\n* `git` - Git\n* `svn` - Subversion\n* `archive` - Remote Archive" + }, + "SettingCategory": { + "type": "object", + "description": "Serialize setting category", + "properties": { + "url": { + "type": "string", + "readOnly": true + }, + "slug": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "name", + "slug", + "url" + ] + }, + "SettingSingleton": { + "type": "object", + "description": "Present a group of settings (by category) as a single object.", + "properties": { + "ACTIVITY_STREAM_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Activity Stream", + "description": "Enable capturing activity for the activity stream." + }, + "ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC": { + "type": "boolean", + "default": false, + "title": "Enable Activity Stream for Inventory Sync", + "description": "Enable capturing activity for the activity stream when running inventory sync." + }, + "ORG_ADMINS_CAN_SEE_ALL_USERS": { + "type": "boolean", + "default": true, + "title": "All Users Visible to Organization Admins", + "description": "Controls whether any Organization Admin can view all users and teams, even those not associated with their Organization." + }, + "MANAGE_ORGANIZATION_AUTH": { + "type": "boolean", + "default": true, + "title": "Organization Admins Can Manage Users and Teams", + "description": "Controls whether any Organization Admin has the privileges to create and manage users and teams. You may want to disable this ability if you are using an LDAP or SAML integration." + }, + "TOWER_URL_BASE": { + "type": "string", + "default": "https://ascenderhost", + "title": "Base URL of the service", + "description": "This setting is used by services like notifications to render a valid url to the service.", + "format": "uri" + }, + "REMOTE_HOST_HEADERS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "REMOTE_ADDR", + "REMOTE_HOST" + ], + "description": "HTTP headers and meta keys to search to determine remote host name or IP. Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if behind a reverse proxy. See the \"Proxy Support\" section of the AAP Installation guide for more details." + }, + "PROXY_IP_ALLOWED_LIST": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "If the service is behind a reverse proxy/load balancer, use this setting to configure the proxy IP addresses from which the service should trust custom REMOTE_HOST_HEADERS header values. If this setting is an empty list (the default), the headers specified by REMOTE_HOST_HEADERS will be trusted unconditionally')" + }, + "CSRF_TRUSTED_ORIGINS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "title": "CSRF Trusted Origins List", + "description": "If the service is behind a reverse proxy/load balancer, use this setting to configure the schema://addresses from which the service should trust Origin header values. " + }, + "LICENSE": { + "type": "object", + "additionalProperties": {}, + "readOnly": true, + "description": "The license controls which features and functionality are enabled. Use /api/v2/config/ to update or change the license." + }, + "REDHAT_USERNAME": { + "type": "string", + "default": "", + "title": "Red Hat customer username", + "description": "This username is used to send data to Automation Analytics" + }, + "REDHAT_PASSWORD": { + "type": "string", + "default": "", + "title": "Red Hat customer password", + "description": "This password is used to send data to Automation Analytics" + }, + "SUBSCRIPTIONS_USERNAME": { + "type": "string", + "default": "", + "title": "Red Hat or Satellite username", + "description": "This username is used to retrieve subscription and content information" + }, + "SUBSCRIPTIONS_PASSWORD": { + "type": "string", + "default": "", + "title": "Red Hat or Satellite password", + "description": "This password is used to retrieve subscription and content information" + }, + "AUTOMATION_ANALYTICS_URL": { + "type": "string", + "default": "https://example.com", + "title": "Automation Analytics upload URL", + "description": "This setting is used to to configure the upload URL for data collection for Automation Analytics.", + "format": "uri" + }, + "INSTALL_UUID": { + "type": "string", + "readOnly": true, + "default": "00000000-0000-0000-0000-000000000000", + "title": "Unique identifier for an installation" + }, + "DEFAULT_CONTROL_PLANE_QUEUE_NAME": { + "type": "string", + "readOnly": true, + "default": "controlplane", + "title": "The instance group where control plane tasks run" + }, + "DEFAULT_EXECUTION_QUEUE_NAME": { + "type": "string", + "readOnly": true, + "default": "default", + "title": "The instance group where user jobs run (currently only on non-VM installs)" + }, + "DEFAULT_EXECUTION_ENVIRONMENT": { + "type": "integer", + "nullable": true, + "title": "Global default execution environment", + "description": "The Execution Environment to be used when one has not been configured for a job template." + }, + "AD_HOC_COMMANDS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "command", + "shell", + "yum", + "apt", + "apt_key", + "apt_repository", + "apt_rpm", + "service", + "group", + "user", + "mount", + "ping", + "selinux", + "setup", + "win_ping", + "win_service", + "win_updates", + "win_group", + "win_user" + ], + "title": "Ansible Modules Allowed for Ad Hoc Jobs", + "description": "List of modules allowed to be used by ad-hoc jobs." + }, + "ALLOW_JINJA_IN_EXTRA_VARS": { + "allOf": [ + { + "$ref": "#/components/schemas/ALLOWJINJAINEXTRAVARSEnum" + } + ], + "default": "template", + "title": "When can extra variables contain Jinja templates?", + "description": "Ansible allows variable substitution via the Jinja2 templating language for --extra-vars. This poses a potential security risk where users with the ability to specify extra vars at job launch time can use Jinja2 templates to run arbitrary Python. It is recommended that this value be set to \"template\" or \"never\".\n\n* `always` - Always\n* `never` - Never\n* `template` - Only On Job Template Definitions" + }, + "AWX_ISOLATION_BASE_PATH": { + "type": "string", + "default": "/tmp", + "title": "Job execution path", + "description": "The directory in which the service will create new temporary directories for job execution and isolation (such as credential files)." + }, + "AWX_ISOLATION_SHOW_PATHS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "title": "Paths to expose to isolated jobs", + "description": "List of paths that would otherwise be hidden to expose to isolated jobs. Enter one path per line. Volumes will be mounted from the execution node to the container. The supported format is HOST-DIR[:CONTAINER-DIR[:OPTIONS]]. " + }, + "AWX_TASK_ENV": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "Extra Environment Variables", + "description": "Additional environment variables set for playbook runs, inventory updates, project updates, and notification sending." + }, + "AWX_RUNNER_KEEPALIVE_SECONDS": { + "type": "integer", + "default": 0, + "title": "K8S Ansible Runner Keep-Alive Message Interval", + "description": "Only applies to jobs running in a Container Group. If not 0, send a message every so-many seconds to keep connection open." + }, + "GALAXY_TASK_ENV": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": { + "ANSIBLE_FORCE_COLOR": "false", + "GIT_SSH_COMMAND": "ssh -o StrictHostKeyChecking=no" + }, + "title": "Environment Variables for Galaxy Commands", + "description": "Additional environment variables set for invocations of ansible-galaxy within project updates. Useful if you must use a proxy server for ansible-galaxy but not git." + }, + "INSIGHTS_TRACKING_STATE": { + "type": "boolean", + "default": false, + "title": "Gather data for Automation Analytics", + "description": "Enables the service to gather data on automation and send it to Automation Analytics." + }, + "PROJECT_UPDATE_VVV": { + "type": "boolean", + "default": false, + "title": "Run Project Updates With Higher Verbosity", + "description": "Adds the CLI -vvv flag to ansible-playbook runs of project_update.yml used for project updates." + }, + "AWX_ROLES_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Role Download", + "description": "Allows roles to be dynamically downloaded from a requirements.yml file for SCM projects." + }, + "ASCENDER_AUTO_STATS_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Automatic Job Stats Artifacts", + "description": "Automatically add ascender_stats_* keys (changed/failed flags and host name lists derived from the playbook stats) to the artifacts of every finished playbook job (jobs launched from job templates; project updates, inventory syncs and ad hoc commands are not affected), so they can be used by downstream workflow nodes and conditional connectors without requiring set_stats in the playbook. Can be overridden per job or workflow with an ASCENDER_AUTO_STATS_ENABLED extra variable." + }, + "ASCENDER_AUTO_STATS_MAX_HOSTS": { + "type": "integer", + "minimum": 0, + "default": 100, + "title": "Maximum Hosts in Automatic Job Stats Artifacts", + "description": "When a play involves more hosts than this, the ascender_stats_* host name lists are omitted from the automatic job stats artifacts (the boolean flags are always kept) and ascender_stats_hosts_truncated is set instead. Can be overridden per job or workflow with an ASCENDER_AUTO_STATS_MAX_HOSTS extra variable." + }, + "AWX_COLLECTIONS_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Collection(s) Download", + "description": "Allows collections to be dynamically downloaded from a requirements.yml file for SCM projects." + }, + "ENABLE_ANSIBLE_29": { + "type": "boolean", + "default": false, + "title": "Enable Ansible 2.9 Compatibility", + "description": "If enabled, sets ANSIBLE_COLLECTIONS_PATHS for legacy Ansible 2.9 compatibility." + }, + "AWX_SHOW_PLAYBOOK_LINKS": { + "type": "boolean", + "default": false, + "title": "Follow symlinks", + "description": "Follow symbolic links when scanning for playbooks. Be aware that setting this to True can lead to infinite recursion if a link points to a parent directory of itself." + }, + "AWX_MOUNT_ISOLATED_PATHS_ON_K8S": { + "type": "boolean", + "default": false, + "title": "Expose host paths for Container Groups", + "description": "Expose paths via hostPath for the Pods created by a Container Group. HostPath volumes present many security risks, and it is a best practice to avoid the use of HostPaths when possible. " + }, + "GALAXY_IGNORE_CERTS": { + "type": "boolean", + "default": false, + "title": "Ignore Ansible Galaxy SSL Certificate Verification", + "description": "If set to true, certificate validation will not be done when installing content from any Galaxy server." + }, + "STDOUT_MAX_BYTES_DISPLAY": { + "type": "integer", + "minimum": 0, + "default": 1048576, + "title": "Standard Output Maximum Display Size", + "description": "Maximum Size of Standard Output in bytes to display before requiring the output be downloaded." + }, + "EVENT_STDOUT_MAX_BYTES_DISPLAY": { + "type": "integer", + "minimum": 0, + "default": 1024, + "title": "Job Event Standard Output Maximum Display Size", + "description": "Maximum Size of Standard Output in bytes to display for a single job or ad hoc command event. `stdout` will end with `…` when truncated." + }, + "MAX_WEBSOCKET_EVENT_RATE": { + "type": "integer", + "minimum": 0, + "default": 30, + "title": "Job Event Maximum Websocket Messages Per Second", + "description": "Maximum number of messages to update the UI live job output with per second. Value of 0 means no limit." + }, + "SCHEDULE_MAX_JOBS": { + "type": "integer", + "minimum": 1, + "default": 10, + "title": "Maximum Scheduled Jobs", + "description": "Maximum number of the same job template that can be waiting to run when launching from a schedule before no more are created." + }, + "AWX_ANSIBLE_CALLBACK_PLUGINS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "title": "Ansible Callback Plugins", + "description": "List of paths to search for extra callback plugins to be used when running jobs. Enter one path per line." + }, + "DEFAULT_JOB_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow jobs to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual job template will override this." + }, + "DEFAULT_JOB_IDLE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "If no output is detected from ansible in this number of seconds the execution will be terminated. Use value of 0 to indicate that no idle timeout should be imposed." + }, + "DEFAULT_INVENTORY_UPDATE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow inventory updates to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual inventory source will override this." + }, + "DEFAULT_PROJECT_UPDATE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow project updates to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual project will override this." + }, + "ANSIBLE_FACT_CACHE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Per-Host Ansible Fact Cache Timeout", + "description": "Maximum time, in seconds, that stored Ansible facts are considered valid since the last time they were modified. Only valid, non-stale, facts will be accessible by a playbook. Note, this does not influence the deletion of ansible_facts from the database. Use a value of 0 to indicate that no timeout should be imposed." + }, + "MAX_FORKS": { + "type": "integer", + "default": 200, + "title": "Maximum number of forks per job", + "description": "Saving a Job Template with more than this number of forks will result in an error. When set to 0, no limit is applied." + }, + "LOG_AGGREGATOR_HOST": { + "type": "string", + "nullable": true, + "title": "Logging Aggregator", + "description": "Hostname/IP where external logs will be sent to." + }, + "LOG_AGGREGATOR_PORT": { + "type": "integer", + "nullable": true, + "title": "Logging Aggregator Port", + "description": "Port on Logging Aggregator to send logs to (if required and not provided in Logging Aggregator)." + }, + "LOG_AGGREGATOR_TYPE": { + "nullable": true, + "title": "Logging Aggregator Type", + "description": "Format messages for the chosen log aggregator.\n\n* `logstash` - logstash\n* `splunk` - splunk\n* `loggly` - loggly\n* `sumologic` - sumologic\n* `ledger` - ledger\n* `other` - other", + "oneOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORTYPEEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "LOG_AGGREGATOR_USERNAME": { + "type": "string", + "default": "", + "title": "Logging Aggregator Username", + "description": "Username for external log aggregator (if required; HTTP/s only)." + }, + "LOG_AGGREGATOR_PASSWORD": { + "type": "string", + "default": "", + "title": "Logging Aggregator Password/Token", + "description": "Password or authentication token for external log aggregator (if required; HTTP/s only)." + }, + "LOG_AGGREGATOR_LOGGERS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "awx", + "activity_stream", + "job_events", + "system_tracking", + "broadcast_websocket", + "job_lifecycle" + ], + "title": "Loggers Sending Data to Log Aggregator Form", + "description": "List of loggers that will send HTTP logs to the collector, these can include any or all of: \nawx - service logs\nactivity_stream - activity stream records\njob_events - callback data from Ansible job events\nsystem_tracking - facts gathered from scan jobs\nbroadcast_websocket - errors pertaining to websockets broadcast metrics\njob_lifecycle - logs related to processing of a job\n" + }, + "LOG_AGGREGATOR_INDIVIDUAL_FACTS": { + "type": "boolean", + "default": false, + "title": "Log System Tracking Facts Individually", + "description": "If set, system tracking facts will be sent for each package, service, or other item found in a scan, allowing for greater search query granularity. If unset, facts will be sent as a single dictionary, allowing for greater efficiency in fact processing." + }, + "LOG_AGGREGATOR_ENABLED": { + "type": "boolean", + "default": false, + "title": "Enable External Logging", + "description": "Enable sending logs to external log aggregator." + }, + "LOG_AGGREGATOR_TOWER_UUID": { + "type": "string", + "default": "", + "title": "Cluster-wide unique identifier.", + "description": "Useful to uniquely identify instances." + }, + "LOG_AGGREGATOR_PROTOCOL": { + "allOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORPROTOCOLEnum" + } + ], + "default": "https", + "title": "Logging Aggregator Protocol", + "description": "Protocol used to communicate with log aggregator. HTTPS/HTTP assumes HTTPS unless http:// is explicitly used in the Logging Aggregator hostname.\n\n* `https` - HTTPS/HTTP\n* `tcp` - TCP\n* `udp` - UDP" + }, + "LOG_AGGREGATOR_TCP_TIMEOUT": { + "type": "integer", + "default": 5, + "title": "TCP Connection Timeout", + "description": "Number of seconds for a TCP connection to external log aggregator to timeout. Applies to HTTPS and TCP log aggregator protocols." + }, + "LOG_AGGREGATOR_VERIFY_CERT": { + "type": "boolean", + "default": true, + "title": "Enable/disable HTTPS certificate verification", + "description": "Flag to control enable/disable of certificate verification when LOG_AGGREGATOR_PROTOCOL is \"https\". If enabled, the log handler will verify certificate sent by external log aggregator before establishing connection." + }, + "LOG_AGGREGATOR_LEVEL": { + "allOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORLEVELEnum" + } + ], + "default": "INFO", + "title": "Logging Aggregator Level Threshold", + "description": "Level threshold used by log handler. Severities from lowest to highest are DEBUG, INFO, WARNING, ERROR, CRITICAL. Messages less severe than the threshold will be ignored by log handler. (messages under category awx.anlytics ignore this setting)\n\n* `DEBUG` - DEBUG\n* `INFO` - INFO\n* `WARNING` - WARNING\n* `ERROR` - ERROR\n* `CRITICAL` - CRITICAL" + }, + "LOG_AGGREGATOR_ACTION_QUEUE_SIZE": { + "type": "integer", + "minimum": 1, + "default": 131072, + "title": "Maximum number of messages that can be stored in the log action queue", + "description": "Defines how large the rsyslog action queue can grow in number of messages stored. This can have an impact on memory utilization. When the queue reaches 75% of this number, the queue will start writing to disk (queue.highWatermark in rsyslog). When it reaches 90%, NOTICE, INFO, and DEBUG messages will start to be discarded (queue.discardMark with queue.discardSeverity=5)." + }, + "LOG_AGGREGATOR_ACTION_MAX_DISK_USAGE_GB": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Maximum disk persistence for rsyslogd action queuing (in GB)", + "description": "Amount of data to store (in gigabytes) if an rsyslog action takes time to process an incoming message (defaults to 1). Equivalent to the rsyslogd queue.maxdiskspace setting on the action (e.g. omhttp). It stores files in the directory specified by LOG_AGGREGATOR_MAX_DISK_USAGE_PATH." + }, + "LOG_AGGREGATOR_MAX_DISK_USAGE_PATH": { + "type": "string", + "default": "/var/lib/awx", + "title": "File system location for rsyslogd disk persistence", + "description": "Location to persist logs that should be retried after an outage of the external log aggregator (defaults to /var/lib/awx). Equivalent to the rsyslogd queue.spoolDirectory setting." + }, + "LOG_AGGREGATOR_RSYSLOGD_DEBUG": { + "type": "boolean", + "default": false, + "title": "Enable rsyslogd debugging", + "description": "Enabled high verbosity debugging for rsyslogd. Useful for debugging connection issues for external log aggregation." + }, + "API_400_ERROR_LOG_FORMAT": { + "type": "string", + "default": "status {status_code} received by user {user_name} attempting to access {url_path} from {remote_addr}", + "title": "Log Format For API 4XX Errors", + "description": "The format of logged messages when an API 4XX error occurs, the following variables will be substituted: \nstatus_code - The HTTP status code of the error\nuser_name - The user name attempting to use the API\nurl_path - The URL path to the API endpoint called\nremote_addr - The remote address seen for the user\nerror - The error set by the api endpoint\nVariables need to be in the format {}." + }, + "AUTOMATION_ANALYTICS_LAST_GATHER": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last gather date for Automation Analytics." + }, + "AUTOMATION_ANALYTICS_LAST_ENTRIES": { + "type": "string", + "default": "", + "title": "Last gathered entries from the data collection service of Automation Analytics" + }, + "AUTOMATION_ANALYTICS_GATHER_INTERVAL": { + "type": "integer", + "minimum": 1800, + "default": 14400, + "description": "Interval (in seconds) between data gathering." + }, + "IS_K8S": { + "type": "boolean", + "readOnly": true, + "default": false, + "description": "Indicates whether the instance is part of a kubernetes-based deployment." + }, + "BULK_JOB_MAX_LAUNCH": { + "type": "integer", + "default": 100, + "title": "Max jobs to allow bulk jobs to launch", + "description": "Max jobs to allow bulk jobs to launch" + }, + "BULK_HOST_MAX_CREATE": { + "type": "integer", + "default": 100, + "title": "Max number of hosts to allow to be created in a single bulk action", + "description": "Max number of hosts to allow to be created in a single bulk action" + }, + "BULK_HOST_MAX_DELETE": { + "type": "integer", + "default": 250, + "title": "Max number of hosts to allow to be deleted in a single bulk action", + "description": "Max number of hosts to allow to be deleted in a single bulk action" + }, + "SUBSCRIPTION_USAGE_MODEL": { + "default": "", + "title": "Defines subscription usage model and shows Host Metrics", + "oneOf": [ + { + "$ref": "#/components/schemas/SUBSCRIPTIONUSAGEMODELEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + } + ] + }, + "CLEANUP_HOST_METRICS_LAST_TS": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last cleanup date for HostMetrics" + }, + "HOST_METRIC_SUMMARY_TASK_LAST_TS": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last computing date of HostMetricSummaryMonthly" + }, + "AWX_CLEANUP_PATHS": { + "type": "boolean", + "default": true, + "title": "Enable or Disable tmp dir cleanup", + "description": "Enable or Disable TMP Dir cleanup" + }, + "AWX_REQUEST_PROFILE": { + "type": "boolean", + "default": false, + "title": "Debug Web Requests", + "description": "Debug web request python timing" + }, + "DEFAULT_CONTAINER_RUN_OPTIONS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "--network", + "slirp4netns:enable_ipv6=true" + ], + "title": "Container Run Options", + "description": "List of options to pass to podman run example: ['--network', 'slirp4netns:enable_ipv6=true', '--log-level', 'debug']" + }, + "RECEPTOR_RELEASE_WORK": { + "type": "boolean", + "default": true, + "title": "Release Receptor Work", + "description": "Release receptor work" + }, + "SESSION_COOKIE_AGE": { + "type": "integer", + "maximum": 30000000000, + "minimum": 60, + "format": "int64", + "default": 1800, + "title": "Idle Time Force Log Out", + "description": "Number of seconds that a user is inactive before they will need to login again." + }, + "SESSIONS_PER_USER": { + "type": "integer", + "minimum": -1, + "default": -1, + "title": "Maximum number of simultaneous logged in sessions", + "description": "Maximum number of simultaneous logged in sessions a user may have. To disable enter -1." + }, + "DISABLE_LOCAL_AUTH": { + "type": "boolean", + "default": false, + "title": "Disable the built-in authentication system", + "description": "Controls whether users are prevented from using the built-in authentication system. You probably want to do this if you are using an LDAP or SAML integration." + }, + "AUTH_BASIC_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable HTTP Basic Auth", + "description": "Enable HTTP Basic Auth for the API Browser." + }, + "OAUTH2_PROVIDER": { + "type": "object", + "additionalProperties": { + "type": "integer", + "minimum": 1 + }, + "default": { + "ACCESS_TOKEN_EXPIRE_SECONDS": 31536000000, + "AUTHORIZATION_CODE_EXPIRE_SECONDS": 600, + "REFRESH_TOKEN_EXPIRE_SECONDS": 2628000 + }, + "title": "OAuth 2 Timeout Settings", + "description": "Dictionary for customizing OAuth 2 timeouts, available items are `ACCESS_TOKEN_EXPIRE_SECONDS`, the duration of access tokens in the number of seconds, `AUTHORIZATION_CODE_EXPIRE_SECONDS`, the duration of authorization codes in the number of seconds, and `REFRESH_TOKEN_EXPIRE_SECONDS`, the duration of refresh tokens, after expired access tokens, in the number of seconds." + }, + "ALLOW_OAUTH2_FOR_EXTERNAL_USERS": { + "type": "boolean", + "default": false, + "title": "Allow External Users to Create OAuth2 Tokens", + "description": "For security reasons, users from external auth providers (LDAP, SAML, SSO, Radius, and others) are not allowed to create OAuth2 tokens. To change this behavior, enable this setting. Existing tokens will not be deleted when this setting is toggled off." + }, + "LOGIN_REDIRECT_OVERRIDE": { + "type": "string", + "default": "", + "title": "Login redirect override URL", + "description": "URL to which unauthorized users will be redirected to log in. If blank, users will be sent to the login page." + }, + "ALLOW_METRICS_FOR_ANONYMOUS_USERS": { + "type": "boolean", + "default": false, + "title": "Allow anonymous users to poll metrics", + "description": "If true, anonymous users are allowed to poll metrics." + }, + "PENDO_TRACKING_STATE": { + "allOf": [ + { + "$ref": "#/components/schemas/PENDOTRACKINGSTATEEnum" + } + ], + "readOnly": true, + "default": "off", + "title": "User Analytics Tracking State", + "description": "Enable or Disable User Analytics Tracking.\n\n* `off` - Off\n* `anonymous` - Anonymous\n* `detailed` - Detailed" + }, + "CUSTOM_LOGIN_INFO": { + "type": "string", + "default": "", + "description": "If needed, you can add specific information (such as a legal notice or a disclaimer) to a text box in the login modal using this setting. Any content added must be in plain text or an HTML fragment, as other markup languages are not supported." + }, + "CUSTOM_TITLE": { + "type": "string", + "default": "", + "title": "Custom Browser Title", + "description": "If set, this text will replace the default brand name in the browser tab title throughout the application." + }, + "CUSTOM_LOGO": { + "type": "string", + "default": "", + "title": "Custom Login Logo", + "description": "To set up a custom logo, provide a file that you create. For the custom logo to look its best, use a .png file with a transparent background. GIF, PNG and JPEG formats are supported." + }, + "CUSTOM_HEADER_LOGO": { + "type": "string", + "default": "", + "description": "To set up a custom logo for the application header, provide a file that you create. For the custom logo to look its best, use a .png file with a transparent background. GIF, PNG and JPEG formats are supported." + }, + "CUSTOM_THEME": { + "type": "string", + "default": "", + "description": "The contents of a CSS file, offered in the theme list alongside the themes that ship with the product. Scope the rules to html[data-theme=\"custom\"], the way the shipped themes scope theirs, and add html.pf-v6-theme-dark[data-theme=\"custom\"] for a dark theme. @import and remote URLs are rejected: use a relative path or a data: URI for fonts and images." + }, + "CUSTOM_THEME_NAME": { + "type": "string", + "default": "", + "description": "Name shown for the custom theme in the theme list. Defaults to Custom when left blank." + }, + "MAX_UI_JOB_EVENTS": { + "type": "integer", + "minimum": 100, + "default": 4000, + "title": "Max Job Events Retrieved by UI", + "description": "Maximum number of job events for the UI to retrieve within a single request." + }, + "UI_LIVE_UPDATES_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Live Updates in the UI", + "description": "If disabled, the page will not refresh when events are received. Reloading the page will be required to get the latest details." + }, + "AUTHENTICATION_BACKENDS": { + "type": "array", + "items": { + "type": "string" + }, + "readOnly": true, + "description": "List of authentication backends that are enabled based on license features and other authentication settings." + }, + "SOCIAL_AUTH_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_USER_FIELDS": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "description": "When set to an empty list `[]`, this setting prevents new user accounts from being created. Only users who have previously logged in using social auth or have a user account with a matching email address will be able to login." + }, + "SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL": { + "type": "boolean", + "default": false, + "title": "Use Email address for usernames", + "description": "Enabling this setting will tell social auth to use the full Email as username instead of the full name" + }, + "AUTH_LDAP_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAPGROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_1_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_1_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_1_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_1_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_1_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_1_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_1_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_1_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_1_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_1_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP1GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_1_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_1_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_1_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_1_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_1_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_1_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_2_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_2_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_2_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_2_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_2_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_2_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_2_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_2_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_2_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_2_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP2GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_2_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_2_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_2_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_2_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_3_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_3_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_3_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_3_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_3_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_3_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_3_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_3_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_3_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_3_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP3GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_3_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_3_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_3_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_3_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_3_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_3_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_4_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_4_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_4_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_4_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_4_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_4_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_4_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_4_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_4_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_4_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP4GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_4_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_4_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_4_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_4_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_4_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_4_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_5_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_5_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_5_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_5_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_5_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_5_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_5_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_5_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_5_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_5_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP5GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_5_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_5_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_5_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_5_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_5_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_5_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "RADIUS_SERVER": { + "type": "string", + "default": "", + "description": "Hostname/IP of RADIUS server. RADIUS authentication is disabled if this setting is empty." + }, + "RADIUS_PORT": { + "type": "integer", + "maximum": 65535, + "minimum": 1, + "default": 1812, + "description": "Port of RADIUS server." + }, + "RADIUS_SECRET": { + "type": "string", + "default": "", + "description": "Shared secret for authenticating to RADIUS server." + }, + "TACACSPLUS_HOST": { + "type": "string", + "default": "", + "title": "TACACS+ Server", + "description": "Hostname of TACACS+ server." + }, + "TACACSPLUS_PORT": { + "type": "integer", + "maximum": 65535, + "minimum": 1, + "default": 49, + "title": "TACACS+ Port", + "description": "Port number of TACACS+ server." + }, + "TACACSPLUS_SECRET": { + "type": "string", + "default": "", + "title": "TACACS+ Secret", + "description": "Shared secret for authenticating to TACACS+ server." + }, + "TACACSPLUS_SESSION_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 5, + "title": "TACACS+ Auth Session Timeout", + "description": "TACACS+ session timeout value in seconds, 0 disables timeout." + }, + "TACACSPLUS_AUTH_PROTOCOL": { + "allOf": [ + { + "$ref": "#/components/schemas/TACACSPLUSAUTHPROTOCOLEnum" + } + ], + "default": "ascii", + "title": "TACACS+ Authentication Protocol", + "description": "Choose the authentication protocol used by TACACS+ client.\n\n* `ascii` - ascii\n* `pap` - pap" + }, + "TACACSPLUS_REM_ADDR": { + "type": "boolean", + "default": false, + "title": "TACACS+ client address sending enabled", + "description": "Enable the client address sending by TACACS+ client." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "Google OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Google OAuth2 Key", + "description": "The OAuth2 key from your web application." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Google OAuth2 Secret", + "description": "The OAuth2 secret from your web application." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "title": "Google OAuth2 Allowed Domains", + "description": "Update this setting to restrict the domains who are allowed to login using Google OAuth2." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "Google OAuth2 Extra Arguments", + "description": "Extra arguments for Google OAuth2 login. You can restrict it to only allow a single domain to authenticate, even if the user is logged in with multple Google accounts. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Google OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Google OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "GitHub OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GITHUB_KEY": { + "type": "string", + "default": "", + "title": "GitHub OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub developer application." + }, + "SOCIAL_AUTH_GITHUB_SECRET": { + "type": "string", + "default": "", + "title": "GitHub OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub developer application." + }, + "SOCIAL_AUTH_GITHUB_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ORG_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "GitHub Organization OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GITHUB_ORG_KEY": { + "type": "string", + "default": "", + "title": "GitHub Organization OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_ORG_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Organization OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_ORG_NAME": { + "type": "string", + "default": "", + "title": "GitHub Organization Name", + "description": "The name of your GitHub organization, as used in your organization's URL: https://github.com//." + }, + "SOCIAL_AUTH_GITHUB_ORG_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Organization OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ORG_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Organization OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "GitHub Team OAuth2 Callback URL", + "description": "Create an organization-owned application at https://github.com/organizations//settings/applications and obtain an OAuth2 key (Client ID) and secret (Client Secret). Provide this URL as the callback URL for your application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_KEY": { + "type": "string", + "default": "", + "title": "GitHub Team OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Team OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_ID": { + "type": "string", + "default": "", + "title": "GitHub Team ID", + "description": "Find the numeric team ID using the Github API: http://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." + }, + "SOCIAL_AUTH_GITHUB_TEAM_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Team OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Team OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "GitHub Enterprise OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise developer application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise developer application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "GitHub Enterprise Organization OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_NAME": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization Name", + "description": "The name of your GitHub Enterprise organization, as used in your organization's URL: https://github.com//." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Organization OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Organization OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "GitHub Enterprise Team OAuth2 Callback URL", + "description": "Create an organization-owned application at https://github.com/organizations//settings/applications and obtain an OAuth2 key (Client ID) and secret (Client Secret). Provide this URL as the callback URL for your application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_ID": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team ID", + "description": "Find the numeric team ID using the Github Enterprise API: http://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Team OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Team OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "Azure AD OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail. " + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Azure AD OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Azure AD OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "Azure AD Tenant OAuth2 Callback URL", + "description": "Provide this URL as the callback URL for your application as part of your registration process. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Azure AD Tenant OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Azure AD Tenant OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID": { + "type": "string", + "default": "", + "title": "Azure AD Tenant ID", + "description": "The directory/tenant ID of your Azure AD application. This limits authentication to a single tenant." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD Tenant OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD Tenant OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_OIDC_KEY": { + "type": "string", + "title": "OIDC Key", + "description": "The OIDC key (Client ID) from your IDP." + }, + "SOCIAL_AUTH_OIDC_SECRET": { + "type": "string", + "default": "", + "title": "OIDC Secret", + "description": "The OIDC secret (Client Secret) from your IDP." + }, + "SOCIAL_AUTH_OIDC_OIDC_ENDPOINT": { + "type": "string", + "default": "", + "title": "OIDC Provider URL", + "description": "The URL for your OIDC provider including the path up to /.well-known/openid-configuration" + }, + "SOCIAL_AUTH_OIDC_VERIFY_SSL": { + "type": "boolean", + "default": true, + "title": "Verify OIDC Provider Certificate", + "description": "Verify the OIDC provider ssl certificate." + }, + "SAML_AUTO_CREATE_OBJECTS": { + "type": "boolean", + "default": true, + "title": "Automatically Create Organizations and Teams on SAML Login", + "description": "When enabled (the default), mapped Organizations and Teams will be created automatically on successful SAML login." + }, + "SOCIAL_AUTH_SAML_CALLBACK_URL": { + "type": "string", + "readOnly": true, + "title": "SAML Assertion Consumer Service (ACS) URL", + "description": "Register the service as a service provider (SP) with each identity provider (IdP) you have configured. Provide your SP Entity ID and this ACS URL for your application." + }, + "SOCIAL_AUTH_SAML_METADATA_URL": { + "type": "string", + "readOnly": true, + "title": "SAML Service Provider Metadata URL", + "description": "If your identity provider (IdP) allows uploading an XML metadata file, you can download one from this URL." + }, + "SOCIAL_AUTH_SAML_SP_ENTITY_ID": { + "type": "string", + "default": "", + "title": "SAML Service Provider Entity ID", + "description": "The application-defined unique identifier used as the audience of the SAML service provider (SP) configuration. This is usually the URL for the service." + }, + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT": { + "type": "string", + "default": "", + "title": "SAML Service Provider Public Certificate", + "description": "Create a keypair to use as a service provider (SP) and include the certificate content here." + }, + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY": { + "type": "string", + "default": "", + "title": "SAML Service Provider Private Key", + "description": "Create a keypair to use as a service provider (SP) and include the private key content here." + }, + "SOCIAL_AUTH_SAML_ORG_INFO": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": {} + }, + "default": {}, + "title": "SAML Service Provider Organization Info", + "description": "Provide the URL, display name, and the name of your app. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_TECHNICAL_CONTACT": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "SAML Service Provider Technical Contact", + "description": "Provide the name and email address of the technical contact for your service provider. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_SUPPORT_CONTACT": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "SAML Service Provider Support Contact", + "description": "Provide the name and email address of the support contact for your service provider. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_ENABLED_IDPS": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": {} + }, + "default": {}, + "title": "SAML Enabled Identity Providers", + "description": "Configure the Entity ID, SSO URL and certificate for each identity provider (IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user data using attribute names that differ from the default OIDs. Attribute names may be overridden for each IdP. An optional label may be set for each IdP to control the text of its login button. Refer to the Ansible documentation for additional details and syntax." + }, + "SOCIAL_AUTH_SAML_SECURITY_CONFIG": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "default": { + "requestedAuthnContext": false + }, + "title": "SAML Security Config", + "description": "A dict of key value pairs that are passed to the underlying python-saml security setting https://github.com/onelogin/python-saml#settings" + }, + "SOCIAL_AUTH_SAML_SP_EXTRA": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "title": "SAML Service Provider extra configuration data", + "description": "A dict of key value pairs to be passed to the underlying python-saml Service Provider configuration setting." + }, + "SOCIAL_AUTH_SAML_EXTRA_DATA": { + "type": "array", + "items": {}, + "nullable": true, + "title": "SAML IDP to extra_data attribute mapping", + "description": "A list of tuples that maps IDP attributes to extra_attributes. Each attribute will be a list of values, even if only 1 value." + }, + "SOCIAL_AUTH_SAML_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "SAML Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_SAML_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "SAML Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_SAML_ORGANIZATION_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML Organization Attribute Mapping", + "description": "Used to translate user organization membership." + }, + "SOCIAL_AUTH_SAML_TEAM_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML Team Attribute Mapping", + "description": "Used to translate user team membership." + }, + "SOCIAL_AUTH_SAML_USER_FLAGS_BY_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML User Flags Attribute Mapping", + "description": "Used to map super users and system auditors from SAML." + }, + "LOCAL_PASSWORD_MIN_LENGTH": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of characters in local password", + "description": "Minimum number of characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_DIGITS": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of digit characters in local password", + "description": "Minimum number of digit characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_UPPER": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of uppercase characters in local password", + "description": "Minimum number of uppercase characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_SPECIAL": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of special characters in local password", + "description": "Minimum number of special characters required in a local password. 0 means no minimum" + } + }, + "required": [ + "ACTIVITY_STREAM_ENABLED", + "ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC", + "ALLOW_JINJA_IN_EXTRA_VARS", + "AUTHENTICATION_BACKENDS", + "AUTH_BASIC_ENABLED", + "AUTOMATION_ANALYTICS_LAST_GATHER", + "AWX_ISOLATION_BASE_PATH", + "AWX_RUNNER_KEEPALIVE_SECONDS", + "CLEANUP_HOST_METRICS_LAST_TS", + "DEFAULT_CONTROL_PLANE_QUEUE_NAME", + "DEFAULT_EXECUTION_QUEUE_NAME", + "DISABLE_LOCAL_AUTH", + "EVENT_STDOUT_MAX_BYTES_DISPLAY", + "GALAXY_TASK_ENV", + "HOST_METRIC_SUMMARY_TASK_LAST_TS", + "INSTALL_UUID", + "IS_K8S", + "LICENSE", + "MANAGE_ORGANIZATION_AUTH", + "MAX_UI_JOB_EVENTS", + "ORG_ADMINS_CAN_SEE_ALL_USERS", + "PENDO_TRACKING_STATE", + "PROJECT_UPDATE_VVV", + "PROXY_IP_ALLOWED_LIST", + "REMOTE_HOST_HEADERS", + "SCHEDULE_MAX_JOBS", + "SESSIONS_PER_USER", + "SESSION_COOKIE_AGE", + "SOCIAL_AUTH_AZUREAD_OAUTH2_CALLBACK_URL", + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_CALLBACK_URL", + "SOCIAL_AUTH_GITHUB_CALLBACK_URL", + "SOCIAL_AUTH_GITHUB_ENTERPRISE_CALLBACK_URL", + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_CALLBACK_URL", + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_CALLBACK_URL", + "SOCIAL_AUTH_GITHUB_ORG_CALLBACK_URL", + "SOCIAL_AUTH_GITHUB_TEAM_CALLBACK_URL", + "SOCIAL_AUTH_GOOGLE_OAUTH2_CALLBACK_URL", + "SOCIAL_AUTH_SAML_CALLBACK_URL", + "SOCIAL_AUTH_SAML_METADATA_URL", + "SOCIAL_AUTH_SAML_ORG_INFO", + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY", + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT", + "SOCIAL_AUTH_SAML_SUPPORT_CONTACT", + "SOCIAL_AUTH_SAML_TECHNICAL_CONTACT", + "STDOUT_MAX_BYTES_DISPLAY", + "TOWER_URL_BASE", + "UI_LIVE_UPDATES_ENABLED" + ] + }, + "SettingSingletonRequest": { + "type": "object", + "description": "Present a group of settings (by category) as a single object.", + "properties": { + "ACTIVITY_STREAM_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Activity Stream", + "description": "Enable capturing activity for the activity stream." + }, + "ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC": { + "type": "boolean", + "default": false, + "title": "Enable Activity Stream for Inventory Sync", + "description": "Enable capturing activity for the activity stream when running inventory sync." + }, + "ORG_ADMINS_CAN_SEE_ALL_USERS": { + "type": "boolean", + "default": true, + "title": "All Users Visible to Organization Admins", + "description": "Controls whether any Organization Admin can view all users and teams, even those not associated with their Organization." + }, + "MANAGE_ORGANIZATION_AUTH": { + "type": "boolean", + "default": true, + "title": "Organization Admins Can Manage Users and Teams", + "description": "Controls whether any Organization Admin has the privileges to create and manage users and teams. You may want to disable this ability if you are using an LDAP or SAML integration." + }, + "TOWER_URL_BASE": { + "type": "string", + "minLength": 1, + "default": "https://ascenderhost", + "title": "Base URL of the service", + "description": "This setting is used by services like notifications to render a valid url to the service.", + "format": "uri" + }, + "REMOTE_HOST_HEADERS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "REMOTE_ADDR", + "REMOTE_HOST" + ], + "description": "HTTP headers and meta keys to search to determine remote host name or IP. Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if behind a reverse proxy. See the \"Proxy Support\" section of the AAP Installation guide for more details." + }, + "PROXY_IP_ALLOWED_LIST": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "description": "If the service is behind a reverse proxy/load balancer, use this setting to configure the proxy IP addresses from which the service should trust custom REMOTE_HOST_HEADERS header values. If this setting is an empty list (the default), the headers specified by REMOTE_HOST_HEADERS will be trusted unconditionally')" + }, + "CSRF_TRUSTED_ORIGINS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "CSRF Trusted Origins List", + "description": "If the service is behind a reverse proxy/load balancer, use this setting to configure the schema://addresses from which the service should trust Origin header values. " + }, + "REDHAT_USERNAME": { + "type": "string", + "default": "", + "title": "Red Hat customer username", + "description": "This username is used to send data to Automation Analytics" + }, + "REDHAT_PASSWORD": { + "type": "string", + "default": "", + "title": "Red Hat customer password", + "description": "This password is used to send data to Automation Analytics" + }, + "SUBSCRIPTIONS_USERNAME": { + "type": "string", + "default": "", + "title": "Red Hat or Satellite username", + "description": "This username is used to retrieve subscription and content information" + }, + "SUBSCRIPTIONS_PASSWORD": { + "type": "string", + "default": "", + "title": "Red Hat or Satellite password", + "description": "This password is used to retrieve subscription and content information" + }, + "AUTOMATION_ANALYTICS_URL": { + "type": "string", + "minLength": 1, + "default": "https://example.com", + "title": "Automation Analytics upload URL", + "description": "This setting is used to to configure the upload URL for data collection for Automation Analytics.", + "format": "uri" + }, + "DEFAULT_EXECUTION_ENVIRONMENT": { + "type": "integer", + "nullable": true, + "title": "Global default execution environment", + "description": "The Execution Environment to be used when one has not been configured for a job template." + }, + "AD_HOC_COMMANDS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "command", + "shell", + "yum", + "apt", + "apt_key", + "apt_repository", + "apt_rpm", + "service", + "group", + "user", + "mount", + "ping", + "selinux", + "setup", + "win_ping", + "win_service", + "win_updates", + "win_group", + "win_user" + ], + "title": "Ansible Modules Allowed for Ad Hoc Jobs", + "description": "List of modules allowed to be used by ad-hoc jobs." + }, + "ALLOW_JINJA_IN_EXTRA_VARS": { + "allOf": [ + { + "$ref": "#/components/schemas/ALLOWJINJAINEXTRAVARSEnum" + } + ], + "default": "template", + "title": "When can extra variables contain Jinja templates?", + "description": "Ansible allows variable substitution via the Jinja2 templating language for --extra-vars. This poses a potential security risk where users with the ability to specify extra vars at job launch time can use Jinja2 templates to run arbitrary Python. It is recommended that this value be set to \"template\" or \"never\".\n\n* `always` - Always\n* `never` - Never\n* `template` - Only On Job Template Definitions" + }, + "AWX_ISOLATION_BASE_PATH": { + "type": "string", + "minLength": 1, + "default": "/tmp", + "title": "Job execution path", + "description": "The directory in which the service will create new temporary directories for job execution and isolation (such as credential files)." + }, + "AWX_ISOLATION_SHOW_PATHS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "Paths to expose to isolated jobs", + "description": "List of paths that would otherwise be hidden to expose to isolated jobs. Enter one path per line. Volumes will be mounted from the execution node to the container. The supported format is HOST-DIR[:CONTAINER-DIR[:OPTIONS]]. " + }, + "AWX_TASK_ENV": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "Extra Environment Variables", + "description": "Additional environment variables set for playbook runs, inventory updates, project updates, and notification sending." + }, + "AWX_RUNNER_KEEPALIVE_SECONDS": { + "type": "integer", + "default": 0, + "title": "K8S Ansible Runner Keep-Alive Message Interval", + "description": "Only applies to jobs running in a Container Group. If not 0, send a message every so-many seconds to keep connection open." + }, + "GALAXY_TASK_ENV": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": { + "ANSIBLE_FORCE_COLOR": "false", + "GIT_SSH_COMMAND": "ssh -o StrictHostKeyChecking=no" + }, + "title": "Environment Variables for Galaxy Commands", + "description": "Additional environment variables set for invocations of ansible-galaxy within project updates. Useful if you must use a proxy server for ansible-galaxy but not git." + }, + "INSIGHTS_TRACKING_STATE": { + "type": "boolean", + "default": false, + "title": "Gather data for Automation Analytics", + "description": "Enables the service to gather data on automation and send it to Automation Analytics." + }, + "PROJECT_UPDATE_VVV": { + "type": "boolean", + "default": false, + "title": "Run Project Updates With Higher Verbosity", + "description": "Adds the CLI -vvv flag to ansible-playbook runs of project_update.yml used for project updates." + }, + "AWX_ROLES_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Role Download", + "description": "Allows roles to be dynamically downloaded from a requirements.yml file for SCM projects." + }, + "ASCENDER_AUTO_STATS_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Automatic Job Stats Artifacts", + "description": "Automatically add ascender_stats_* keys (changed/failed flags and host name lists derived from the playbook stats) to the artifacts of every finished playbook job (jobs launched from job templates; project updates, inventory syncs and ad hoc commands are not affected), so they can be used by downstream workflow nodes and conditional connectors without requiring set_stats in the playbook. Can be overridden per job or workflow with an ASCENDER_AUTO_STATS_ENABLED extra variable." + }, + "ASCENDER_AUTO_STATS_MAX_HOSTS": { + "type": "integer", + "minimum": 0, + "default": 100, + "title": "Maximum Hosts in Automatic Job Stats Artifacts", + "description": "When a play involves more hosts than this, the ascender_stats_* host name lists are omitted from the automatic job stats artifacts (the boolean flags are always kept) and ascender_stats_hosts_truncated is set instead. Can be overridden per job or workflow with an ASCENDER_AUTO_STATS_MAX_HOSTS extra variable." + }, + "AWX_COLLECTIONS_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Collection(s) Download", + "description": "Allows collections to be dynamically downloaded from a requirements.yml file for SCM projects." + }, + "ENABLE_ANSIBLE_29": { + "type": "boolean", + "default": false, + "title": "Enable Ansible 2.9 Compatibility", + "description": "If enabled, sets ANSIBLE_COLLECTIONS_PATHS for legacy Ansible 2.9 compatibility." + }, + "AWX_SHOW_PLAYBOOK_LINKS": { + "type": "boolean", + "default": false, + "title": "Follow symlinks", + "description": "Follow symbolic links when scanning for playbooks. Be aware that setting this to True can lead to infinite recursion if a link points to a parent directory of itself." + }, + "AWX_MOUNT_ISOLATED_PATHS_ON_K8S": { + "type": "boolean", + "default": false, + "title": "Expose host paths for Container Groups", + "description": "Expose paths via hostPath for the Pods created by a Container Group. HostPath volumes present many security risks, and it is a best practice to avoid the use of HostPaths when possible. " + }, + "GALAXY_IGNORE_CERTS": { + "type": "boolean", + "default": false, + "title": "Ignore Ansible Galaxy SSL Certificate Verification", + "description": "If set to true, certificate validation will not be done when installing content from any Galaxy server." + }, + "STDOUT_MAX_BYTES_DISPLAY": { + "type": "integer", + "minimum": 0, + "default": 1048576, + "title": "Standard Output Maximum Display Size", + "description": "Maximum Size of Standard Output in bytes to display before requiring the output be downloaded." + }, + "EVENT_STDOUT_MAX_BYTES_DISPLAY": { + "type": "integer", + "minimum": 0, + "default": 1024, + "title": "Job Event Standard Output Maximum Display Size", + "description": "Maximum Size of Standard Output in bytes to display for a single job or ad hoc command event. `stdout` will end with `…` when truncated." + }, + "MAX_WEBSOCKET_EVENT_RATE": { + "type": "integer", + "minimum": 0, + "default": 30, + "title": "Job Event Maximum Websocket Messages Per Second", + "description": "Maximum number of messages to update the UI live job output with per second. Value of 0 means no limit." + }, + "SCHEDULE_MAX_JOBS": { + "type": "integer", + "minimum": 1, + "default": 10, + "title": "Maximum Scheduled Jobs", + "description": "Maximum number of the same job template that can be waiting to run when launching from a schedule before no more are created." + }, + "AWX_ANSIBLE_CALLBACK_PLUGINS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "Ansible Callback Plugins", + "description": "List of paths to search for extra callback plugins to be used when running jobs. Enter one path per line." + }, + "DEFAULT_JOB_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow jobs to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual job template will override this." + }, + "DEFAULT_JOB_IDLE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "If no output is detected from ansible in this number of seconds the execution will be terminated. Use value of 0 to indicate that no idle timeout should be imposed." + }, + "DEFAULT_INVENTORY_UPDATE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow inventory updates to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual inventory source will override this." + }, + "DEFAULT_PROJECT_UPDATE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "Maximum time in seconds to allow project updates to run. Use value of 0 to indicate that no timeout should be imposed. A timeout set on an individual project will override this." + }, + "ANSIBLE_FACT_CACHE_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Per-Host Ansible Fact Cache Timeout", + "description": "Maximum time, in seconds, that stored Ansible facts are considered valid since the last time they were modified. Only valid, non-stale, facts will be accessible by a playbook. Note, this does not influence the deletion of ansible_facts from the database. Use a value of 0 to indicate that no timeout should be imposed." + }, + "MAX_FORKS": { + "type": "integer", + "default": 200, + "title": "Maximum number of forks per job", + "description": "Saving a Job Template with more than this number of forks will result in an error. When set to 0, no limit is applied." + }, + "LOG_AGGREGATOR_HOST": { + "type": "string", + "nullable": true, + "minLength": 1, + "title": "Logging Aggregator", + "description": "Hostname/IP where external logs will be sent to." + }, + "LOG_AGGREGATOR_PORT": { + "type": "integer", + "nullable": true, + "title": "Logging Aggregator Port", + "description": "Port on Logging Aggregator to send logs to (if required and not provided in Logging Aggregator)." + }, + "LOG_AGGREGATOR_TYPE": { + "nullable": true, + "title": "Logging Aggregator Type", + "description": "Format messages for the chosen log aggregator.\n\n* `logstash` - logstash\n* `splunk` - splunk\n* `loggly` - loggly\n* `sumologic` - sumologic\n* `ledger` - ledger\n* `other` - other", + "oneOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORTYPEEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "LOG_AGGREGATOR_USERNAME": { + "type": "string", + "default": "", + "title": "Logging Aggregator Username", + "description": "Username for external log aggregator (if required; HTTP/s only)." + }, + "LOG_AGGREGATOR_PASSWORD": { + "type": "string", + "default": "", + "title": "Logging Aggregator Password/Token", + "description": "Password or authentication token for external log aggregator (if required; HTTP/s only)." + }, + "LOG_AGGREGATOR_LOGGERS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "awx", + "activity_stream", + "job_events", + "system_tracking", + "broadcast_websocket", + "job_lifecycle" + ], + "title": "Loggers Sending Data to Log Aggregator Form", + "description": "List of loggers that will send HTTP logs to the collector, these can include any or all of: \nawx - service logs\nactivity_stream - activity stream records\njob_events - callback data from Ansible job events\nsystem_tracking - facts gathered from scan jobs\nbroadcast_websocket - errors pertaining to websockets broadcast metrics\njob_lifecycle - logs related to processing of a job\n" + }, + "LOG_AGGREGATOR_INDIVIDUAL_FACTS": { + "type": "boolean", + "default": false, + "title": "Log System Tracking Facts Individually", + "description": "If set, system tracking facts will be sent for each package, service, or other item found in a scan, allowing for greater search query granularity. If unset, facts will be sent as a single dictionary, allowing for greater efficiency in fact processing." + }, + "LOG_AGGREGATOR_ENABLED": { + "type": "boolean", + "default": false, + "title": "Enable External Logging", + "description": "Enable sending logs to external log aggregator." + }, + "LOG_AGGREGATOR_TOWER_UUID": { + "type": "string", + "default": "", + "title": "Cluster-wide unique identifier.", + "description": "Useful to uniquely identify instances." + }, + "LOG_AGGREGATOR_PROTOCOL": { + "allOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORPROTOCOLEnum" + } + ], + "default": "https", + "title": "Logging Aggregator Protocol", + "description": "Protocol used to communicate with log aggregator. HTTPS/HTTP assumes HTTPS unless http:// is explicitly used in the Logging Aggregator hostname.\n\n* `https` - HTTPS/HTTP\n* `tcp` - TCP\n* `udp` - UDP" + }, + "LOG_AGGREGATOR_TCP_TIMEOUT": { + "type": "integer", + "default": 5, + "title": "TCP Connection Timeout", + "description": "Number of seconds for a TCP connection to external log aggregator to timeout. Applies to HTTPS and TCP log aggregator protocols." + }, + "LOG_AGGREGATOR_VERIFY_CERT": { + "type": "boolean", + "default": true, + "title": "Enable/disable HTTPS certificate verification", + "description": "Flag to control enable/disable of certificate verification when LOG_AGGREGATOR_PROTOCOL is \"https\". If enabled, the log handler will verify certificate sent by external log aggregator before establishing connection." + }, + "LOG_AGGREGATOR_LEVEL": { + "allOf": [ + { + "$ref": "#/components/schemas/LOGAGGREGATORLEVELEnum" + } + ], + "default": "INFO", + "title": "Logging Aggregator Level Threshold", + "description": "Level threshold used by log handler. Severities from lowest to highest are DEBUG, INFO, WARNING, ERROR, CRITICAL. Messages less severe than the threshold will be ignored by log handler. (messages under category awx.anlytics ignore this setting)\n\n* `DEBUG` - DEBUG\n* `INFO` - INFO\n* `WARNING` - WARNING\n* `ERROR` - ERROR\n* `CRITICAL` - CRITICAL" + }, + "LOG_AGGREGATOR_ACTION_QUEUE_SIZE": { + "type": "integer", + "minimum": 1, + "default": 131072, + "title": "Maximum number of messages that can be stored in the log action queue", + "description": "Defines how large the rsyslog action queue can grow in number of messages stored. This can have an impact on memory utilization. When the queue reaches 75% of this number, the queue will start writing to disk (queue.highWatermark in rsyslog). When it reaches 90%, NOTICE, INFO, and DEBUG messages will start to be discarded (queue.discardMark with queue.discardSeverity=5)." + }, + "LOG_AGGREGATOR_ACTION_MAX_DISK_USAGE_GB": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Maximum disk persistence for rsyslogd action queuing (in GB)", + "description": "Amount of data to store (in gigabytes) if an rsyslog action takes time to process an incoming message (defaults to 1). Equivalent to the rsyslogd queue.maxdiskspace setting on the action (e.g. omhttp). It stores files in the directory specified by LOG_AGGREGATOR_MAX_DISK_USAGE_PATH." + }, + "LOG_AGGREGATOR_MAX_DISK_USAGE_PATH": { + "type": "string", + "minLength": 1, + "default": "/var/lib/awx", + "title": "File system location for rsyslogd disk persistence", + "description": "Location to persist logs that should be retried after an outage of the external log aggregator (defaults to /var/lib/awx). Equivalent to the rsyslogd queue.spoolDirectory setting." + }, + "LOG_AGGREGATOR_RSYSLOGD_DEBUG": { + "type": "boolean", + "default": false, + "title": "Enable rsyslogd debugging", + "description": "Enabled high verbosity debugging for rsyslogd. Useful for debugging connection issues for external log aggregation." + }, + "API_400_ERROR_LOG_FORMAT": { + "type": "string", + "minLength": 1, + "default": "status {status_code} received by user {user_name} attempting to access {url_path} from {remote_addr}", + "title": "Log Format For API 4XX Errors", + "description": "The format of logged messages when an API 4XX error occurs, the following variables will be substituted: \nstatus_code - The HTTP status code of the error\nuser_name - The user name attempting to use the API\nurl_path - The URL path to the API endpoint called\nremote_addr - The remote address seen for the user\nerror - The error set by the api endpoint\nVariables need to be in the format {}." + }, + "AUTOMATION_ANALYTICS_LAST_GATHER": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last gather date for Automation Analytics." + }, + "AUTOMATION_ANALYTICS_LAST_ENTRIES": { + "type": "string", + "default": "", + "title": "Last gathered entries from the data collection service of Automation Analytics" + }, + "AUTOMATION_ANALYTICS_GATHER_INTERVAL": { + "type": "integer", + "minimum": 1800, + "default": 14400, + "description": "Interval (in seconds) between data gathering." + }, + "BULK_JOB_MAX_LAUNCH": { + "type": "integer", + "default": 100, + "title": "Max jobs to allow bulk jobs to launch", + "description": "Max jobs to allow bulk jobs to launch" + }, + "BULK_HOST_MAX_CREATE": { + "type": "integer", + "default": 100, + "title": "Max number of hosts to allow to be created in a single bulk action", + "description": "Max number of hosts to allow to be created in a single bulk action" + }, + "BULK_HOST_MAX_DELETE": { + "type": "integer", + "default": 250, + "title": "Max number of hosts to allow to be deleted in a single bulk action", + "description": "Max number of hosts to allow to be deleted in a single bulk action" + }, + "SUBSCRIPTION_USAGE_MODEL": { + "default": "", + "title": "Defines subscription usage model and shows Host Metrics", + "oneOf": [ + { + "$ref": "#/components/schemas/SUBSCRIPTIONUSAGEMODELEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + } + ] + }, + "CLEANUP_HOST_METRICS_LAST_TS": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last cleanup date for HostMetrics" + }, + "HOST_METRIC_SUMMARY_TASK_LAST_TS": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Last computing date of HostMetricSummaryMonthly" + }, + "AWX_CLEANUP_PATHS": { + "type": "boolean", + "default": true, + "title": "Enable or Disable tmp dir cleanup", + "description": "Enable or Disable TMP Dir cleanup" + }, + "AWX_REQUEST_PROFILE": { + "type": "boolean", + "default": false, + "title": "Debug Web Requests", + "description": "Debug web request python timing" + }, + "DEFAULT_CONTAINER_RUN_OPTIONS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [ + "--network", + "slirp4netns:enable_ipv6=true" + ], + "title": "Container Run Options", + "description": "List of options to pass to podman run example: ['--network', 'slirp4netns:enable_ipv6=true', '--log-level', 'debug']" + }, + "RECEPTOR_RELEASE_WORK": { + "type": "boolean", + "default": true, + "title": "Release Receptor Work", + "description": "Release receptor work" + }, + "SESSION_COOKIE_AGE": { + "type": "integer", + "maximum": 30000000000, + "minimum": 60, + "format": "int64", + "default": 1800, + "title": "Idle Time Force Log Out", + "description": "Number of seconds that a user is inactive before they will need to login again." + }, + "SESSIONS_PER_USER": { + "type": "integer", + "minimum": -1, + "default": -1, + "title": "Maximum number of simultaneous logged in sessions", + "description": "Maximum number of simultaneous logged in sessions a user may have. To disable enter -1." + }, + "DISABLE_LOCAL_AUTH": { + "type": "boolean", + "default": false, + "title": "Disable the built-in authentication system", + "description": "Controls whether users are prevented from using the built-in authentication system. You probably want to do this if you are using an LDAP or SAML integration." + }, + "AUTH_BASIC_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable HTTP Basic Auth", + "description": "Enable HTTP Basic Auth for the API Browser." + }, + "OAUTH2_PROVIDER": { + "type": "object", + "additionalProperties": { + "type": "integer", + "minimum": 1 + }, + "default": { + "ACCESS_TOKEN_EXPIRE_SECONDS": 31536000000, + "AUTHORIZATION_CODE_EXPIRE_SECONDS": 600, + "REFRESH_TOKEN_EXPIRE_SECONDS": 2628000 + }, + "title": "OAuth 2 Timeout Settings", + "description": "Dictionary for customizing OAuth 2 timeouts, available items are `ACCESS_TOKEN_EXPIRE_SECONDS`, the duration of access tokens in the number of seconds, `AUTHORIZATION_CODE_EXPIRE_SECONDS`, the duration of authorization codes in the number of seconds, and `REFRESH_TOKEN_EXPIRE_SECONDS`, the duration of refresh tokens, after expired access tokens, in the number of seconds." + }, + "ALLOW_OAUTH2_FOR_EXTERNAL_USERS": { + "type": "boolean", + "default": false, + "title": "Allow External Users to Create OAuth2 Tokens", + "description": "For security reasons, users from external auth providers (LDAP, SAML, SSO, Radius, and others) are not allowed to create OAuth2 tokens. To change this behavior, enable this setting. Existing tokens will not be deleted when this setting is toggled off." + }, + "LOGIN_REDIRECT_OVERRIDE": { + "type": "string", + "default": "", + "title": "Login redirect override URL", + "description": "URL to which unauthorized users will be redirected to log in. If blank, users will be sent to the login page." + }, + "ALLOW_METRICS_FOR_ANONYMOUS_USERS": { + "type": "boolean", + "default": false, + "title": "Allow anonymous users to poll metrics", + "description": "If true, anonymous users are allowed to poll metrics." + }, + "CUSTOM_LOGIN_INFO": { + "type": "string", + "default": "", + "description": "If needed, you can add specific information (such as a legal notice or a disclaimer) to a text box in the login modal using this setting. Any content added must be in plain text or an HTML fragment, as other markup languages are not supported." + }, + "CUSTOM_TITLE": { + "type": "string", + "default": "", + "title": "Custom Browser Title", + "description": "If set, this text will replace the default brand name in the browser tab title throughout the application." + }, + "CUSTOM_LOGO": { + "type": "string", + "default": "", + "title": "Custom Login Logo", + "description": "To set up a custom logo, provide a file that you create. For the custom logo to look its best, use a .png file with a transparent background. GIF, PNG and JPEG formats are supported." + }, + "CUSTOM_HEADER_LOGO": { + "type": "string", + "default": "", + "description": "To set up a custom logo for the application header, provide a file that you create. For the custom logo to look its best, use a .png file with a transparent background. GIF, PNG and JPEG formats are supported." + }, + "CUSTOM_THEME": { + "type": "string", + "default": "", + "description": "The contents of a CSS file, offered in the theme list alongside the themes that ship with the product. Scope the rules to html[data-theme=\"custom\"], the way the shipped themes scope theirs, and add html.pf-v6-theme-dark[data-theme=\"custom\"] for a dark theme. @import and remote URLs are rejected: use a relative path or a data: URI for fonts and images." + }, + "CUSTOM_THEME_NAME": { + "type": "string", + "default": "", + "description": "Name shown for the custom theme in the theme list. Defaults to Custom when left blank." + }, + "MAX_UI_JOB_EVENTS": { + "type": "integer", + "minimum": 100, + "default": 4000, + "title": "Max Job Events Retrieved by UI", + "description": "Maximum number of job events for the UI to retrieve within a single request." + }, + "UI_LIVE_UPDATES_ENABLED": { + "type": "boolean", + "default": true, + "title": "Enable Live Updates in the UI", + "description": "If disabled, the page will not refresh when events are received. Reloading the page will be required to get the latest details." + }, + "SOCIAL_AUTH_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_USER_FIELDS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "nullable": true, + "description": "When set to an empty list `[]`, this setting prevents new user accounts from being created. Only users who have previously logged in using social auth or have a user account with a matching email address will be able to login." + }, + "SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL": { + "type": "boolean", + "default": false, + "title": "Use Email address for usernames", + "description": "Enabling this setting will tell social auth to use the full Email as username instead of the full name" + }, + "AUTH_LDAP_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAPGROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_1_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_1_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_1_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_1_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_1_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_1_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_1_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_1_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_1_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_1_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP1GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_1_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_1_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_1_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_1_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_1_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_1_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_2_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_2_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_2_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_2_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_2_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_2_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_2_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_2_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_2_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_2_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP2GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_2_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_2_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_2_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_2_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_3_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_3_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_3_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_3_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_3_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_3_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_3_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_3_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_3_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_3_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP3GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_3_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_3_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_3_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_3_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_3_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_3_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_4_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_4_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_4_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_4_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_4_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_4_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_4_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_4_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_4_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_4_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP4GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_4_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_4_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_4_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_4_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_4_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_4_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "AUTH_LDAP_5_SERVER_URI": { + "title": "LDAP Server URI", + "description": "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be specified by separating with spaces or commas. LDAP authentication is disabled if this parameter is empty.", + "oneOf": [ + { + "type": "string", + "default": "", + "format": "uri" + }, + { + "type": "string", + "maxLength": 0 + } + ] + }, + "AUTH_LDAP_5_BIND_DN": { + "type": "string", + "default": "", + "title": "LDAP Bind DN", + "description": "DN (Distinguished Name) of user to bind for all search queries. This is the system user account we will use to login to query LDAP for other user information. Refer to the documentation for example syntax." + }, + "AUTH_LDAP_5_BIND_PASSWORD": { + "type": "string", + "default": "", + "title": "LDAP Bind Password", + "description": "Password used to bind LDAP user account." + }, + "AUTH_LDAP_5_START_TLS": { + "type": "boolean", + "default": false, + "title": "LDAP Start TLS", + "description": "Whether to enable TLS when the LDAP connection is not using SSL." + }, + "AUTH_LDAP_5_CONNECTION_OPTIONS": { + "type": "object", + "additionalProperties": {}, + "default": { + "OPT_REFERRALS": 0, + "OPT_NETWORK_TIMEOUT": 30 + }, + "title": "LDAP Connection Options", + "description": "Additional options to set for the LDAP connection. LDAP referrals are disabled by default (to prevent certain LDAP queries from hanging with AD). Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://www.python-ldap.org/doc/html/ldap.html#options for possible options and values that can be set." + }, + "AUTH_LDAP_5_USER_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP User Search", + "description": "LDAP search query to find users. Any user that matches the given pattern will be able to login to the service. The user should also be mapped into an organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). If multiple search queries need to be supported use of \"LDAPUnion\" is possible. See the documentation for details." + }, + "AUTH_LDAP_5_USER_DN_TEMPLATE": { + "type": "string", + "nullable": true, + "title": "LDAP User DN Template", + "description": "Alternative to user search, if user DNs are all of the same format. This approach is more efficient for user lookups than searching if it is usable in your organizational environment. If this setting has a value it will be used instead of AUTH_LDAP_USER_SEARCH." + }, + "AUTH_LDAP_5_USER_ATTR_MAP": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + }, + "default": {}, + "title": "LDAP User Attribute Map", + "description": "Mapping of LDAP user schema to API user attributes. The default setting is valid for ActiveDirectory but users with other LDAP configurations may need to change the values. Refer to the documentation for additional details." + }, + "AUTH_LDAP_5_GROUP_SEARCH": { + "type": "array", + "items": {}, + "default": [], + "title": "LDAP Group Search", + "description": "Users are mapped to organizations based on their membership in LDAP groups. This setting defines the LDAP search query to find groups. Unlike the user search, group search does not support LDAPSearchUnion." + }, + "AUTH_LDAP_5_GROUP_TYPE": { + "allOf": [ + { + "$ref": "#/components/schemas/AUTHLDAP5GROUPTYPEEnum" + } + ], + "default": "MemberDNGroupType", + "title": "LDAP Group Type", + "description": "The group type may need to be changed based on the type of the LDAP server. Values are listed at: https://django-auth-ldap.readthedocs.io/en/stable/groups.html#types-of-groups\n\n* `PosixGroupType` - PosixGroupType\n* `GroupOfNamesType` - GroupOfNamesType\n* `GroupOfUniqueNamesType` - GroupOfUniqueNamesType\n* `ActiveDirectoryGroupType` - ActiveDirectoryGroupType\n* `OrganizationalRoleGroupType` - OrganizationalRoleGroupType\n* `MemberDNGroupType` - MemberDNGroupType\n* `NestedGroupOfNamesType` - NestedGroupOfNamesType\n* `NestedGroupOfUniqueNamesType` - NestedGroupOfUniqueNamesType\n* `NestedActiveDirectoryGroupType` - NestedActiveDirectoryGroupType\n* `NestedOrganizationalRoleGroupType` - NestedOrganizationalRoleGroupType\n* `NestedMemberDNGroupType` - NestedMemberDNGroupType\n* `PosixUIDGroupType` - PosixUIDGroupType" + }, + "AUTH_LDAP_5_GROUP_TYPE_PARAMS": { + "type": "object", + "additionalProperties": {}, + "default": { + "member_attr": "member", + "name_attr": "cn" + }, + "title": "LDAP Group Type Parameters", + "description": "Key value parameters to send the chosen group type init method." + }, + "AUTH_LDAP_5_REQUIRE_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Require Group", + "description": "Group DN required to login. If specified, user must be a member of this group to login via LDAP. If not set, everyone in LDAP that matches the user search will be able to login to the service. Only one require group is supported." + }, + "AUTH_LDAP_5_DENY_GROUP": { + "type": "string", + "nullable": true, + "title": "LDAP Deny Group", + "description": "Group DN denied from login. If specified, user will not be allowed to login if a member of this group. Only one deny group is supported." + }, + "AUTH_LDAP_5_USER_FLAGS_BY_GROUP": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "default": {}, + "title": "LDAP User Flags By Group", + "description": "Retrieve users from a given group. At this time, superuser and system auditors are the only groups supported. Refer to the documentation for more detail." + }, + "AUTH_LDAP_5_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Organization Map", + "description": "Mapping between organization admins/users and LDAP groups. This controls which users are placed into which organizations relative to their LDAP group memberships. Configuration details are available in the documentation." + }, + "AUTH_LDAP_5_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "default": {}, + "title": "LDAP Team Map", + "description": "Mapping between team members (users) and LDAP groups. Configuration details are available in the documentation." + }, + "RADIUS_SERVER": { + "type": "string", + "default": "", + "description": "Hostname/IP of RADIUS server. RADIUS authentication is disabled if this setting is empty." + }, + "RADIUS_PORT": { + "type": "integer", + "maximum": 65535, + "minimum": 1, + "default": 1812, + "description": "Port of RADIUS server." + }, + "RADIUS_SECRET": { + "type": "string", + "default": "", + "description": "Shared secret for authenticating to RADIUS server." + }, + "TACACSPLUS_HOST": { + "type": "string", + "default": "", + "title": "TACACS+ Server", + "description": "Hostname of TACACS+ server." + }, + "TACACSPLUS_PORT": { + "type": "integer", + "maximum": 65535, + "minimum": 1, + "default": 49, + "title": "TACACS+ Port", + "description": "Port number of TACACS+ server." + }, + "TACACSPLUS_SECRET": { + "type": "string", + "default": "", + "title": "TACACS+ Secret", + "description": "Shared secret for authenticating to TACACS+ server." + }, + "TACACSPLUS_SESSION_TIMEOUT": { + "type": "integer", + "minimum": 0, + "default": 5, + "title": "TACACS+ Auth Session Timeout", + "description": "TACACS+ session timeout value in seconds, 0 disables timeout." + }, + "TACACSPLUS_AUTH_PROTOCOL": { + "allOf": [ + { + "$ref": "#/components/schemas/TACACSPLUSAUTHPROTOCOLEnum" + } + ], + "default": "ascii", + "title": "TACACS+ Authentication Protocol", + "description": "Choose the authentication protocol used by TACACS+ client.\n\n* `ascii` - ascii\n* `pap` - pap" + }, + "TACACSPLUS_REM_ADDR": { + "type": "boolean", + "default": false, + "title": "TACACS+ client address sending enabled", + "description": "Enable the client address sending by TACACS+ client." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Google OAuth2 Key", + "description": "The OAuth2 key from your web application." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Google OAuth2 Secret", + "description": "The OAuth2 secret from your web application." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "default": [], + "title": "Google OAuth2 Allowed Domains", + "description": "Update this setting to restrict the domains who are allowed to login using Google OAuth2." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "Google OAuth2 Extra Arguments", + "description": "Extra arguments for Google OAuth2 login. You can restrict it to only allow a single domain to authenticate, even if the user is logged in with multple Google accounts. Refer to the documentation for more detail." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Google OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GOOGLE_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Google OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_KEY": { + "type": "string", + "default": "", + "title": "GitHub OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub developer application." + }, + "SOCIAL_AUTH_GITHUB_SECRET": { + "type": "string", + "default": "", + "title": "GitHub OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub developer application." + }, + "SOCIAL_AUTH_GITHUB_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ORG_KEY": { + "type": "string", + "default": "", + "title": "GitHub Organization OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_ORG_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Organization OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_ORG_NAME": { + "type": "string", + "default": "", + "title": "GitHub Organization Name", + "description": "The name of your GitHub organization, as used in your organization's URL: https://github.com//." + }, + "SOCIAL_AUTH_GITHUB_ORG_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Organization OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ORG_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Organization OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_KEY": { + "type": "string", + "default": "", + "title": "GitHub Team OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Team OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub organization application." + }, + "SOCIAL_AUTH_GITHUB_TEAM_ID": { + "type": "string", + "default": "", + "title": "GitHub Team ID", + "description": "Find the numeric team ID using the Github API: http://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." + }, + "SOCIAL_AUTH_GITHUB_TEAM_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Team OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_TEAM_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Team OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise developer application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise developer application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_NAME": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Organization Name", + "description": "The name of your GitHub Enterprise organization, as used in your organization's URL: https://github.com//." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Organization OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_ORG_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Organization OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team URL", + "description": "The URL for your Github Enterprise instance, e.g.: http(s)://hostname/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_API_URL": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team API URL", + "description": "The API URL for your GitHub Enterprise instance, e.g.: http(s)://hostname/api/v3/. Refer to Github Enterprise documentation for more details." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_KEY": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_SECRET": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your GitHub Enterprise organization application." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_ID": { + "type": "string", + "default": "", + "title": "GitHub Enterprise Team ID", + "description": "Find the numeric team ID using the Github Enterprise API: http://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Team OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_GITHUB_ENTERPRISE_TEAM_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "GitHub Enterprise Team OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Azure AD OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Azure AD OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_AZUREAD_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY": { + "type": "string", + "default": "", + "title": "Azure AD Tenant OAuth2 Key", + "description": "The OAuth2 key (Client ID) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET": { + "type": "string", + "default": "", + "title": "Azure AD Tenant OAuth2 Secret", + "description": "The OAuth2 secret (Client Secret) from your Azure AD application." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID": { + "type": "string", + "default": "", + "title": "Azure AD Tenant ID", + "description": "The directory/tenant ID of your Azure AD application. This limits authentication to a single tenant." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD Tenant OAuth2 Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "Azure AD Tenant OAuth2 Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_OIDC_KEY": { + "type": "string", + "minLength": 1, + "title": "OIDC Key", + "description": "The OIDC key (Client ID) from your IDP." + }, + "SOCIAL_AUTH_OIDC_SECRET": { + "type": "string", + "default": "", + "title": "OIDC Secret", + "description": "The OIDC secret (Client Secret) from your IDP." + }, + "SOCIAL_AUTH_OIDC_OIDC_ENDPOINT": { + "type": "string", + "default": "", + "title": "OIDC Provider URL", + "description": "The URL for your OIDC provider including the path up to /.well-known/openid-configuration" + }, + "SOCIAL_AUTH_OIDC_VERIFY_SSL": { + "type": "boolean", + "default": true, + "title": "Verify OIDC Provider Certificate", + "description": "Verify the OIDC provider ssl certificate." + }, + "SAML_AUTO_CREATE_OBJECTS": { + "type": "boolean", + "default": true, + "title": "Automatically Create Organizations and Teams on SAML Login", + "description": "When enabled (the default), mapped Organizations and Teams will be created automatically on successful SAML login." + }, + "SOCIAL_AUTH_SAML_SP_ENTITY_ID": { + "type": "string", + "default": "", + "title": "SAML Service Provider Entity ID", + "description": "The application-defined unique identifier used as the audience of the SAML service provider (SP) configuration. This is usually the URL for the service." + }, + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT": { + "type": "string", + "default": "", + "title": "SAML Service Provider Public Certificate", + "description": "Create a keypair to use as a service provider (SP) and include the certificate content here." + }, + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY": { + "type": "string", + "default": "", + "title": "SAML Service Provider Private Key", + "description": "Create a keypair to use as a service provider (SP) and include the private key content here." + }, + "SOCIAL_AUTH_SAML_ORG_INFO": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": {} + }, + "default": {}, + "title": "SAML Service Provider Organization Info", + "description": "Provide the URL, display name, and the name of your app. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_TECHNICAL_CONTACT": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "SAML Service Provider Technical Contact", + "description": "Provide the name and email address of the technical contact for your service provider. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_SUPPORT_CONTACT": { + "type": "object", + "additionalProperties": {}, + "default": {}, + "title": "SAML Service Provider Support Contact", + "description": "Provide the name and email address of the support contact for your service provider. Refer to the documentation for example syntax." + }, + "SOCIAL_AUTH_SAML_ENABLED_IDPS": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": {} + }, + "default": {}, + "title": "SAML Enabled Identity Providers", + "description": "Configure the Entity ID, SSO URL and certificate for each identity provider (IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user data using attribute names that differ from the default OIDs. Attribute names may be overridden for each IdP. An optional label may be set for each IdP to control the text of its login button. Refer to the Ansible documentation for additional details and syntax." + }, + "SOCIAL_AUTH_SAML_SECURITY_CONFIG": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "default": { + "requestedAuthnContext": false + }, + "title": "SAML Security Config", + "description": "A dict of key value pairs that are passed to the underlying python-saml security setting https://github.com/onelogin/python-saml#settings" + }, + "SOCIAL_AUTH_SAML_SP_EXTRA": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "title": "SAML Service Provider extra configuration data", + "description": "A dict of key value pairs to be passed to the underlying python-saml Service Provider configuration setting." + }, + "SOCIAL_AUTH_SAML_EXTRA_DATA": { + "type": "array", + "items": {}, + "nullable": true, + "title": "SAML IDP to extra_data attribute mapping", + "description": "A list of tuples that maps IDP attributes to extra_attributes. Each attribute will be a list of values, even if only 1 value." + }, + "SOCIAL_AUTH_SAML_ORGANIZATION_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "SAML Organization Map", + "description": "Mapping to organization admins/users from social auth accounts. This setting\ncontrols which users are placed into which organizations based on their\nusername and email address. Configuration details are available in the\ndocumentation." + }, + "SOCIAL_AUTH_SAML_TEAM_MAP": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "nullable": true, + "title": "SAML Team Map", + "description": "Mapping of team members (users) from social auth accounts. Configuration\ndetails are available in the documentation." + }, + "SOCIAL_AUTH_SAML_ORGANIZATION_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML Organization Attribute Mapping", + "description": "Used to translate user organization membership." + }, + "SOCIAL_AUTH_SAML_TEAM_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML Team Attribute Mapping", + "description": "Used to translate user team membership." + }, + "SOCIAL_AUTH_SAML_USER_FLAGS_BY_ATTR": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "nullable": true, + "default": {}, + "title": "SAML User Flags Attribute Mapping", + "description": "Used to map super users and system auditors from SAML." + }, + "LOCAL_PASSWORD_MIN_LENGTH": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of characters in local password", + "description": "Minimum number of characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_DIGITS": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of digit characters in local password", + "description": "Minimum number of digit characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_UPPER": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of uppercase characters in local password", + "description": "Minimum number of uppercase characters required in a local password. 0 means no minimum" + }, + "LOCAL_PASSWORD_MIN_SPECIAL": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Minimum number of special characters in local password", + "description": "Minimum number of special characters required in a local password. 0 means no minimum" + } + }, + "required": [ + "ACTIVITY_STREAM_ENABLED", + "ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC", + "ALLOW_JINJA_IN_EXTRA_VARS", + "AUTH_BASIC_ENABLED", + "AUTOMATION_ANALYTICS_LAST_GATHER", + "AWX_ISOLATION_BASE_PATH", + "AWX_RUNNER_KEEPALIVE_SECONDS", + "CLEANUP_HOST_METRICS_LAST_TS", + "DISABLE_LOCAL_AUTH", + "EVENT_STDOUT_MAX_BYTES_DISPLAY", + "GALAXY_TASK_ENV", + "HOST_METRIC_SUMMARY_TASK_LAST_TS", + "MANAGE_ORGANIZATION_AUTH", + "MAX_UI_JOB_EVENTS", + "ORG_ADMINS_CAN_SEE_ALL_USERS", + "PROJECT_UPDATE_VVV", + "PROXY_IP_ALLOWED_LIST", + "REMOTE_HOST_HEADERS", + "SCHEDULE_MAX_JOBS", + "SESSIONS_PER_USER", + "SESSION_COOKIE_AGE", + "SOCIAL_AUTH_SAML_ORG_INFO", + "SOCIAL_AUTH_SAML_SP_PRIVATE_KEY", + "SOCIAL_AUTH_SAML_SP_PUBLIC_CERT", + "SOCIAL_AUTH_SAML_SUPPORT_CONTACT", + "SOCIAL_AUTH_SAML_TECHNICAL_CONTACT", + "STDOUT_MAX_BYTES_DISPLAY", + "TOWER_URL_BASE", + "UI_LIVE_UPDATES_ENABLED" + ] + }, + "SourceEnum": { + "enum": [ + "file", + "constructed", + "scm", + "ec2", + "gce", + "azure_rm", + "vmware", + "satellite6", + "openstack", + "terraform", + "ascender" + ], + "type": "string", + "description": "* `file` - File, Directory or Script\n* `constructed` - Template additional groups and hostvars at runtime\n* `scm` - Sourced from a Project\n* `ec2` - Amazon EC2\n* `gce` - Google Compute Engine\n* `azure_rm` - Microsoft Azure Resource Manager\n* `vmware` - VMware vCenter\n* `satellite6` - Red Hat Satellite 6\n* `openstack` - OpenStack\n* `terraform` - Terraform State\n* `ascender` - CIQ Ascender Automation Platform" + }, + "Status602Enum": { + "enum": [ + "new", + "pending", + "waiting", + "running", + "successful", + "failed", + "error", + "canceled" + ], + "type": "string", + "description": "* `new` - New\n* `pending` - Pending\n* `waiting` - Waiting\n* `running` - Running\n* `successful` - Successful\n* `failed` - Failed\n* `error` - Error\n* `canceled` - Canceled" + }, + "StatusB38Enum": { + "enum": [ + "new", + "pending", + "waiting", + "running", + "successful", + "failed", + "error", + "canceled", + "never updated", + "ok", + "missing", + "none", + "updating" + ], + "type": "string", + "description": "* `new` - New\n* `pending` - Pending\n* `waiting` - Waiting\n* `running` - Running\n* `successful` - Successful\n* `failed` - Failed\n* `error` - Error\n* `canceled` - Canceled\n* `never updated` - Never Updated\n* `ok` - OK\n* `missing` - Missing\n* `none` - No External Source\n* `updating` - Updating" + }, + "SystemJob": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "event_processing_finished": { + "type": "boolean", + "readOnly": true, + "description": "Indicates whether all of the events generated by this unified job have been saved to the database." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "system_job_template": { + "type": "integer", + "nullable": true + }, + "job_type": { + "nullable": true, + "default": "", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType75cEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "result_stdout": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "canceled_on", + "created", + "elapsed", + "event_processing_finished", + "execution_node", + "failed", + "finished", + "id", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "result_stdout", + "result_traceback", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "SystemJobCancel": { + "type": "object", + "properties": { + "can_cancel": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_cancel" + ] + }, + "SystemJobEvent": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "event": { + "type": "string", + "readOnly": true + }, + "counter": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "event_display": { + "type": "string", + "readOnly": true + }, + "event_data": { + "default": {} + }, + "failed": { + "type": "string", + "readOnly": true + }, + "changed": { + "type": "string", + "readOnly": true + }, + "uuid": { + "type": "string", + "readOnly": true + }, + "stdout": { + "type": "string", + "readOnly": true + }, + "start_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "end_line": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "verbosity": { + "type": "integer", + "minimum": 0, + "readOnly": true + }, + "system_job": { + "type": "integer", + "readOnly": true + } + }, + "required": [ + "changed", + "counter", + "created", + "end_line", + "event", + "event_display", + "failed", + "id", + "modified", + "related", + "start_line", + "stdout", + "summary_fields", + "system_job", + "type", + "url", + "uuid", + "verbosity" + ] + }, + "SystemJobList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "system_job_template": { + "type": "integer", + "nullable": true + }, + "job_type": { + "nullable": true, + "default": "", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType75cEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "result_stdout": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "canceled_on", + "created", + "elapsed", + "execution_node", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "result_stdout", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "SystemJobTemplate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusB38Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "job_type": { + "nullable": true, + "default": "", + "oneOf": [ + { + "$ref": "#/components/schemas/JobType75cEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "created", + "id", + "last_job_failed", + "last_job_run", + "modified", + "name", + "next_job_run", + "related", + "status", + "summary_fields", + "type", + "url" + ] + }, + "TACACSPLUSAUTHPROTOCOLEnum": { + "enum": [ + "ascii", + "pap" + ], + "type": "string", + "description": "* `ascii` - ascii\n* `pap` - pap" + }, + "Team": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer" + } + }, + "required": [ + "created", + "id", + "modified", + "name", + "organization", + "related", + "summary_fields", + "type", + "url" + ] + }, + "TeamCredentialSerializerCreate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "kind": { + "type": "string", + "readOnly": true + }, + "cloud": { + "type": "string", + "readOnly": true + }, + "kubernetes": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "cloud", + "created", + "credential_type", + "id", + "kind", + "kubernetes", + "managed", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "TeamCredentialSerializerCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "team": { + "type": "integer", + "writeOnly": true, + "nullable": true, + "description": "Write-only field used to add team to owner role. If provided, do not give either user or organization. Only valid for creation." + } + }, + "required": [ + "credential_type", + "name" + ] + }, + "TeamRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer" + } + }, + "required": [ + "name", + "organization" + ] + }, + "UnifiedJobList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "execution_node": { + "type": "string", + "readOnly": true, + "description": "The node the job executed on." + }, + "controller_node": { + "type": "string", + "readOnly": true, + "description": "The instance that managed the execution environment." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + } + }, + "required": [ + "canceled_on", + "controller_node", + "created", + "elapsed", + "execution_node", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "UnifiedJobStdout": { + "type": "object", + "properties": { + "result_stdout": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "result_stdout" + ] + }, + "UnifiedJobTemplate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusB38Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + } + }, + "required": [ + "created", + "id", + "last_job_failed", + "last_job_run", + "modified", + "name", + "next_job_run", + "related", + "status", + "summary_fields", + "type", + "url" + ] + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "username": { + "type": "string", + "nullable": true, + "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + "pattern": "^[\\w.@+-]+$", + "maxLength": 150 + }, + "first_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "last_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "email": { + "type": "string", + "nullable": true, + "title": "Email address", + "maxLength": 254 + }, + "is_superuser": { + "type": "boolean", + "nullable": true, + "default": false, + "title": "Superuser status", + "description": "Designates that this user has all permissions without explicitly assigning them." + }, + "is_system_auditor": { + "type": "boolean", + "default": false + }, + "password": { + "type": "string", + "default": "", + "description": "Field used to change the password." + }, + "ldap_dn": { + "type": "string", + "readOnly": true + }, + "preferred_language": { + "type": "string", + "default": "" + }, + "last_login": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "external_account": { + "type": "string", + "readOnly": true, + "description": "Set if the account is managed by an external service" + } + }, + "required": [ + "created", + "external_account", + "id", + "last_login", + "ldap_dn", + "modified", + "related", + "summary_fields", + "type", + "url", + "username" + ] + }, + "UserAuthorizedToken": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "user": { + "type": "integer", + "readOnly": true, + "description": "The user representing the token owner" + }, + "token": { + "type": "string", + "readOnly": true + }, + "refresh_token": { + "type": "string", + "readOnly": true + }, + "application": { + "type": "integer" + }, + "expires": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + }, + "required": [ + "application", + "created", + "expires", + "id", + "modified", + "refresh_token", + "related", + "summary_fields", + "token", + "type", + "url", + "user" + ] + }, + "UserAuthorizedTokenRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "application": { + "type": "integer" + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + }, + "required": [ + "application" + ] + }, + "UserCredentialSerializerCreate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "managed": { + "type": "boolean", + "readOnly": true + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "kind": { + "type": "string", + "readOnly": true + }, + "cloud": { + "type": "string", + "readOnly": true + }, + "kubernetes": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "cloud", + "created", + "credential_type", + "id", + "kind", + "kubernetes", + "managed", + "modified", + "name", + "related", + "summary_fields", + "type", + "url" + ] + }, + "UserCredentialSerializerCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "credential_type": { + "type": "integer", + "description": "Specify the type of credential you want to create. Refer to the documentation for details on each type." + }, + "inputs": { + "default": {}, + "description": "Enter inputs using either JSON or YAML syntax. Refer to the documentation for example syntax." + }, + "user": { + "type": "integer", + "writeOnly": true, + "nullable": true, + "description": "Write-only field used to add user to owner role. If provided, do not give either team or organization. Only valid for creation." + } + }, + "required": [ + "credential_type", + "name" + ] + }, + "UserPersonalToken": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "user": { + "type": "integer", + "readOnly": true, + "description": "The user representing the token owner" + }, + "token": { + "type": "string", + "readOnly": true + }, + "refresh_token": { + "type": "string", + "readOnly": true + }, + "application": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "expires": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + }, + "required": [ + "application", + "created", + "expires", + "id", + "modified", + "refresh_token", + "related", + "summary_fields", + "token", + "type", + "url", + "user" + ] + }, + "UserPersonalTokenRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "scope": { + "type": "string", + "nullable": true, + "default": "write", + "description": "Allowed scopes, further restricts user's permissions. Must be a simple space-separated string with allowed scopes ['read', 'write']." + } + } + }, + "UserRequest": { + "type": "object", + "properties": { + "username": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + "pattern": "^[\\w.@+-]+$", + "maxLength": 150 + }, + "first_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "last_name": { + "type": "string", + "nullable": true, + "maxLength": 150 + }, + "email": { + "type": "string", + "nullable": true, + "title": "Email address", + "maxLength": 254 + }, + "is_superuser": { + "type": "boolean", + "nullable": true, + "default": false, + "title": "Superuser status", + "description": "Designates that this user has all permissions without explicitly assigning them." + }, + "is_system_auditor": { + "type": "boolean", + "default": false + }, + "password": { + "type": "string", + "default": "", + "description": "Field used to change the password." + }, + "preferred_language": { + "type": "string", + "default": "" + } + }, + "required": [ + "username" + ] + }, + "Verbosity481Enum": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "description": "* `0` - 0 (WARNING)\n* `1` - 1 (INFO)\n* `2` - 2 (DEBUG)" + }, + "Verbosity8cfEnum": { + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "type": "integer", + "description": "* `0` - 0 (Normal)\n* `1` - 1 (Verbose)\n* `2` - 2 (More Verbose)\n* `3` - 3 (Debug)\n* `4` - 4 (Connection Debug)\n* `5` - 5 (WinRM Debug)" + }, + "VoteEnum": { + "enum": [ + "approve", + "deny" + ], + "type": "string", + "description": "* `approve` - Approve\n* `deny` - Deny" + }, + "WebhookServiceEnum": { + "enum": [ + "github", + "gitlab", + "bitbucket_dc" + ], + "type": "string", + "description": "* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter" + }, + "WorkflowApproval": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "event_processing_finished": { + "type": "boolean", + "readOnly": true, + "description": "Indicates whether all of the events generated by this unified job have been saved to the database." + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "can_approve_or_deny": { + "type": "string", + "readOnly": true + }, + "approval_expiration": { + "type": "string", + "readOnly": true + }, + "timed_out": { + "type": "boolean", + "description": "Shows when an approval node (with a timeout assigned to it) has timed out.", + "readOnly": true + }, + "context_message": { + "type": "string", + "nullable": true, + "default": "", + "description": "The rendered context from the approval template's context_template, populated with upstream set_stats artifacts when the approval is created." + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "approvals_received": { + "type": "string", + "readOnly": true + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "user_has_voted": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "approval_expiration", + "approvals_received", + "can_approve_or_deny", + "canceled_on", + "created", + "elapsed", + "event_processing_finished", + "failed", + "finished", + "id", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "result_traceback", + "started", + "status", + "summary_fields", + "timed_out", + "type", + "unified_job_template", + "url", + "user_has_voted", + "work_unit_id" + ] + }, + "WorkflowApprovalList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "can_approve_or_deny": { + "type": "string", + "readOnly": true + }, + "approval_expiration": { + "type": "string", + "readOnly": true + }, + "timed_out": { + "type": "boolean", + "description": "Shows when an approval node (with a timeout assigned to it) has timed out.", + "readOnly": true + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "approvals_received": { + "type": "string", + "readOnly": true + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "user_has_voted": { + "type": "string", + "readOnly": true + } + }, + "required": [ + "approval_expiration", + "approvals_received", + "can_approve_or_deny", + "canceled_on", + "created", + "elapsed", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "started", + "status", + "summary_fields", + "timed_out", + "type", + "unified_job_template", + "url", + "user_has_voted", + "work_unit_id" + ] + }, + "WorkflowApprovalTemplate": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusB38Enum" + } + ], + "readOnly": true + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) before the approval node expires and fails." + }, + "context_template": { + "type": "string", + "nullable": true, + "default": "", + "description": "A Jinja2 template rendered with upstream set_stats artifacts when the approval is created. The result is stored on the approval as context_message and shown to the approver." + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "created", + "id", + "last_job_failed", + "last_job_run", + "modified", + "name", + "next_job_run", + "related", + "status", + "summary_fields", + "type", + "url" + ] + }, + "WorkflowApprovalTemplateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) before the approval node expires and fails." + }, + "context_template": { + "type": "string", + "nullable": true, + "default": "", + "description": "A Jinja2 template rendered with upstream set_stats artifacts when the approval is created. The result is stored on the approval as context_message and shown to the approver." + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "name" + ] + }, + "WorkflowApprovalVote": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "workflow_approval": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "user": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "vote": { + "allOf": [ + { + "$ref": "#/components/schemas/VoteEnum" + } + ], + "readOnly": true, + "description": "Whether this user approved or denied the workflow approval.\n\n* `approve` - Approve\n* `deny` - Deny" + }, + "comment": { + "type": "string", + "readOnly": true, + "description": "Optional comment the user submitted along with their vote." + }, + "workflow_approval_name": { + "type": "string", + "readOnly": true, + "description": "Name of the approval node at the time of the vote, kept after the approval is deleted." + }, + "workflow_job_id": { + "type": "integer", + "readOnly": true, + "nullable": true, + "description": "ID of the workflow job the approval belonged to, kept after the approval is deleted." + }, + "workflow_job_name": { + "type": "string", + "readOnly": true, + "description": "Name of the workflow job the approval belonged to, kept after the approval is deleted." + }, + "user_name": { + "type": "string", + "readOnly": true, + "description": "Username of the voter at the time of the vote, kept after the user is deleted." + } + }, + "required": [ + "comment", + "created", + "id", + "related", + "summary_fields", + "type", + "url", + "user", + "user_name", + "vote", + "workflow_approval", + "workflow_approval_name", + "workflow_job_id", + "workflow_job_name" + ] + }, + "WorkflowJob": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "readOnly": true + }, + "job_cwd": { + "type": "string", + "readOnly": true + }, + "job_env": { + "readOnly": true + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "result_traceback": { + "type": "string", + "readOnly": true + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "workflow_job_template": { + "type": "integer", + "nullable": true + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "job_template": { + "type": "integer", + "nullable": true, + "description": "If automatically created for a sliced job run, the job template the workflow job was created from." + }, + "is_sliced_job": { + "type": "boolean", + "nullable": true, + "default": false + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "limit": { + "type": "string", + "nullable": true + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "job_tags": { + "type": "string", + "nullable": true + } + }, + "required": [ + "canceled_on", + "created", + "elapsed", + "failed", + "finished", + "id", + "job_args", + "job_cwd", + "job_env", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "result_traceback", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "WorkflowJobCancel": { + "type": "object", + "properties": { + "can_cancel": { + "type": "boolean", + "readOnly": true + } + }, + "required": [ + "can_cancel" + ] + }, + "WorkflowJobLaunch": { + "type": "object", + "properties": { + "ask_inventory_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_limit_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "can_start_without_user_input": { + "type": "boolean", + "readOnly": true + }, + "defaults": { + "type": "string", + "readOnly": true + }, + "survey_enabled": { + "type": "string", + "readOnly": true + }, + "variables_needed_to_start": { + "type": "string", + "readOnly": true + }, + "node_templates_missing": { + "type": "string", + "readOnly": true + }, + "node_prompts_rejected": { + "type": "string", + "readOnly": true + }, + "workflow_job_template_data": { + "type": "string", + "readOnly": true + }, + "ask_variables_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_labels_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + }, + "ask_tags_on_launch": { + "type": "boolean", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "ask_inventory_on_launch", + "ask_labels_on_launch", + "ask_limit_on_launch", + "ask_scm_branch_on_launch", + "ask_skip_tags_on_launch", + "ask_tags_on_launch", + "ask_variables_on_launch", + "can_start_without_user_input", + "defaults", + "node_prompts_rejected", + "node_templates_missing", + "survey_enabled", + "variables_needed_to_start", + "workflow_job_template_data" + ] + }, + "WorkflowJobLaunchRequest": { + "type": "object", + "properties": { + "extra_vars": { + "type": "string", + "writeOnly": true + }, + "inventory": { + "type": "integer", + "writeOnly": true + }, + "limit": { + "type": "string", + "writeOnly": true + }, + "scm_branch": { + "type": "string", + "writeOnly": true, + "maxLength": 1024 + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "writeOnly": true + }, + "writeOnly": true + }, + "skip_tags": { + "type": "string", + "writeOnly": true + }, + "job_tags": { + "type": "string", + "writeOnly": true + } + } + }, + "WorkflowJobList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "unified_job_template": { + "type": "integer", + "readOnly": true, + "nullable": true + }, + "launch_type": { + "allOf": [ + { + "$ref": "#/components/schemas/LaunchTypeEnum" + } + ], + "readOnly": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/Status602Enum" + } + ], + "readOnly": true + }, + "failed": { + "type": "boolean", + "readOnly": true + }, + "started": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job was queued for starting." + }, + "finished": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time the job finished execution." + }, + "canceled_on": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The date and time when the cancel request was sent." + }, + "elapsed": { + "type": "string", + "format": "decimal", + "pattern": "^-?\\d{0,9}(?:\\.\\d{0,3})?$", + "readOnly": true, + "description": "Elapsed time in seconds that the job ran." + }, + "job_explanation": { + "type": "string", + "readOnly": true, + "description": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "launched_by": { + "type": "string", + "readOnly": true + }, + "work_unit_id": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "The Receptor work unit ID associated with this job." + }, + "workflow_job_template": { + "type": "integer", + "nullable": true + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "job_template": { + "type": "integer", + "nullable": true, + "description": "If automatically created for a sliced job run, the job template the workflow job was created from." + }, + "is_sliced_job": { + "type": "boolean", + "nullable": true, + "default": false + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "limit": { + "type": "string", + "nullable": true + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "job_tags": { + "type": "string", + "nullable": true + } + }, + "required": [ + "canceled_on", + "created", + "elapsed", + "failed", + "finished", + "id", + "job_explanation", + "launch_type", + "launched_by", + "modified", + "name", + "related", + "started", + "status", + "summary_fields", + "type", + "unified_job_template", + "url", + "work_unit_id" + ] + }, + "WorkflowJobListRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "workflow_job_template": { + "type": "integer", + "nullable": true + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "job_template": { + "type": "integer", + "nullable": true, + "description": "If automatically created for a sliced job run, the job template the workflow job was created from." + }, + "is_sliced_job": { + "type": "boolean", + "nullable": true, + "default": false + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "limit": { + "type": "string", + "nullable": true + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_guid": { + "type": "string", + "nullable": true, + "description": "Unique identifier of the event that triggered this webhook", + "maxLength": 128 + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "job_tags": { + "type": "string", + "nullable": true + } + }, + "required": [ + "name" + ] + }, + "WorkflowJobNodeDetail": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "job": { + "type": "integer", + "nullable": true + }, + "workflow_job": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "success_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "failure_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "always_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_edges": { + "type": "string", + "readOnly": true, + "description": "List of condition data for each conditional edge originating from this node; id is the target node." + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "do_not_run": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Indicates that a job will not be created when True. Workflow runtime semantics will mark this True if the node is in a path that will decidedly not be ran. A value of False means the node may not run." + }, + "prior_run_succeeded": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set when a workflow is relaunched from a failed node: the node's job succeeded in the prior run, so it is carried forward as already-successful. It spawns no new job, but the scheduler treats it as a successful parent so its success/always paths are still traversed." + }, + "prior_run_elapsed": { + "type": "number", + "format": "double", + "readOnly": true, + "nullable": true, + "description": "Elapsed time (seconds) of this node's job in the run it was carried forward from." + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "retry_attempts": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Number of times this node's job has been automatically retried after failing." + }, + "retried_jobs": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "identifier": { + "type": "string", + "nullable": true, + "description": "An identifier coresponding to the workflow job template node that this node was created from.", + "maxLength": 512 + } + }, + "required": [ + "always_nodes", + "condition_edges", + "condition_nodes", + "created", + "failure_nodes", + "id", + "modified", + "prior_run_elapsed", + "related", + "retried_jobs", + "retry_attempts", + "success_nodes", + "summary_fields", + "type", + "url" + ] + }, + "WorkflowJobNodeList": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "job": { + "type": "integer", + "nullable": true + }, + "workflow_job": { + "type": "integer", + "nullable": true + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "success_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "failure_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "always_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_edges": { + "type": "string", + "readOnly": true, + "description": "List of condition data for each conditional edge originating from this node; id is the target node." + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "do_not_run": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Indicates that a job will not be created when True. Workflow runtime semantics will mark this True if the node is in a path that will decidedly not be ran. A value of False means the node may not run." + }, + "prior_run_succeeded": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "Set when a workflow is relaunched from a failed node: the node's job succeeded in the prior run, so it is carried forward as already-successful. It spawns no new job, but the scheduler treats it as a successful parent so its success/always paths are still traversed." + }, + "prior_run_elapsed": { + "type": "number", + "format": "double", + "readOnly": true, + "nullable": true, + "description": "Elapsed time (seconds) of this node's job in the run it was carried forward from." + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "retry_attempts": { + "type": "integer", + "minimum": 0, + "readOnly": true, + "description": "Number of times this node's job has been automatically retried after failing." + }, + "retried_jobs": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "identifier": { + "type": "string", + "nullable": true, + "description": "An identifier coresponding to the workflow job template node that this node was created from.", + "maxLength": 512 + } + }, + "required": [ + "always_nodes", + "condition_edges", + "condition_nodes", + "created", + "failure_nodes", + "id", + "modified", + "prior_run_elapsed", + "related", + "retried_jobs", + "retry_attempts", + "success_nodes", + "summary_fields", + "type", + "url" + ] + }, + "WorkflowJobTemplate": { + "type": "object", + "description": "Provide recent jobs and survey details in summary_fields", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "last_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "last_job_failed": { + "type": "boolean", + "readOnly": true + }, + "next_job_run": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusB38Enum" + } + ], + "readOnly": true + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "survey_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_variables_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "limit": { + "type": "string", + "nullable": true + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "ask_inventory_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_limit_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "ask_labels_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "job_tags": { + "type": "string", + "nullable": true + } + }, + "required": [ + "created", + "id", + "last_job_failed", + "last_job_run", + "modified", + "name", + "next_job_run", + "related", + "status", + "summary_fields", + "type", + "url" + ] + }, + "WorkflowJobTemplateNode": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "workflow_job_template": { + "type": "integer" + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "success_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "failure_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "always_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_edges": { + "type": "string", + "readOnly": true, + "description": "List of condition data for each conditional edge originating from this node; id is the target node." + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "identifier": { + "type": "string", + "nullable": true, + "description": "An identifier for this node that is unique within its workflow. It is copied to workflow job nodes corresponding to this node.", + "maxLength": 512 + } + }, + "required": [ + "always_nodes", + "condition_edges", + "condition_nodes", + "created", + "failure_nodes", + "id", + "modified", + "related", + "success_nodes", + "summary_fields", + "type", + "url", + "workflow_job_template" + ] + }, + "WorkflowJobTemplateNodeCreateApproval": { + "type": "object", + "properties": { + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) before the approval node expires and fails." + }, + "name": { + "type": "string", + "nullable": true, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "context_template": { + "type": "string", + "nullable": true, + "default": "", + "description": "A Jinja2 template rendered with upstream set_stats artifacts when the approval is created. The result is stored on the approval as context_message and shown to the approver." + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "name" + ] + }, + "WorkflowJobTemplateNodeCreateApprovalRequest": { + "type": "object", + "properties": { + "timeout": { + "type": "integer", + "maximum": 2147483647, + "minimum": -2147483648, + "default": 0, + "description": "The amount of time (in seconds) before the approval node expires and fails." + }, + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "context_template": { + "type": "string", + "nullable": true, + "default": "", + "description": "A Jinja2 template rendered with upstream set_stats artifacts when the approval is created. The result is stored on the approval as context_message and shown to the approver." + }, + "required_approvals": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0, + "default": 1, + "description": "The number of distinct users that must approve before the node is considered approved. A single denial always denies the node." + }, + "on_timeout": { + "nullable": true, + "default": "deny", + "description": "Whether the approval node is automatically approved or denied when the timeout expires.\n\n* `deny` - Deny\n* `approve` - Approve", + "oneOf": [ + { + "$ref": "#/components/schemas/OnTimeoutEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + } + }, + "required": [ + "name" + ] + }, + "WorkflowJobTemplateNodeDetail": { + "type": "object", + "description": "Influence the api browser sample data to not include workflow_job_template\nwhen editing a WorkflowNode.\n\nNote: I was not able to accomplish this through the use of extra_kwargs.\nMaybe something to do with workflow_job_template being a relational field?", + "properties": { + "id": { + "type": "integer", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true + }, + "url": { + "type": "string", + "readOnly": true + }, + "related": { + "type": "string", + "readOnly": true + }, + "summary_fields": { + "type": "string", + "readOnly": true + }, + "created": { + "type": "string", + "readOnly": true + }, + "modified": { + "type": "string", + "readOnly": true + }, + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "workflow_job_template": { + "type": "integer" + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "success_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "failure_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "always_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_nodes": { + "type": "array", + "items": { + "type": "integer" + }, + "readOnly": true + }, + "condition_edges": { + "type": "string", + "readOnly": true, + "description": "List of condition data for each conditional edge originating from this node; id is the target node." + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "identifier": { + "type": "string", + "nullable": true, + "description": "An identifier for this node that is unique within its workflow. It is copied to workflow job nodes corresponding to this node.", + "maxLength": 512 + } + }, + "required": [ + "always_nodes", + "condition_edges", + "condition_nodes", + "created", + "failure_nodes", + "id", + "modified", + "related", + "success_nodes", + "summary_fields", + "type", + "url", + "workflow_job_template" + ] + }, + "WorkflowJobTemplateNodeDetailRequest": { + "type": "object", + "description": "Influence the api browser sample data to not include workflow_job_template\nwhen editing a WorkflowNode.\n\nNote: I was not able to accomplish this through the use of extra_kwargs.\nMaybe something to do with workflow_job_template being a relational field?", + "properties": { + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "workflow_job_template": { + "type": "integer" + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "identifier": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "An identifier for this node that is unique within its workflow. It is copied to workflow job nodes corresponding to this node.", + "maxLength": 512 + } + }, + "required": [ + "workflow_job_template" + ] + }, + "WorkflowJobTemplateNodeRequest": { + "type": "object", + "properties": { + "extra_data": { + "default": {} + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "job_type": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/JobType726Enum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "job_tags": { + "type": "string", + "nullable": true + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "limit": { + "type": "string", + "nullable": true + }, + "diff_mode": { + "type": "boolean", + "nullable": true + }, + "verbosity": { + "nullable": true, + "oneOf": [ + { + "$ref": "#/components/schemas/Verbosity8cfEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "execution_environment": { + "type": "integer", + "nullable": true, + "description": "The container image to be used for execution." + }, + "forks": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "job_slice_count": { + "type": "integer", + "minimum": 0, + "nullable": true + }, + "timeout": { + "type": "integer", + "nullable": true + }, + "workflow_job_template": { + "type": "integer" + }, + "unified_job_template": { + "type": "integer", + "nullable": true + }, + "all_parents_must_converge": { + "type": "boolean", + "nullable": true, + "default": false, + "description": "If enabled then the node will only run if all of the parent nodes have met the criteria to reach this node" + }, + "max_retries": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "default": 0, + "description": "Maximum number of times this node's job is automatically retried after failing before its failure paths are followed. Canceled jobs are never retried." + }, + "identifier": { + "type": "string", + "nullable": true, + "minLength": 1, + "description": "An identifier for this node that is unique within its workflow. It is copied to workflow job nodes corresponding to this node.", + "maxLength": 512 + } + }, + "required": [ + "workflow_job_template" + ] + }, + "WorkflowJobTemplateRequest": { + "type": "object", + "description": "Provide recent jobs and survey details in summary_fields", + "properties": { + "name": { + "type": "string", + "nullable": true, + "minLength": 1, + "maxLength": 512 + }, + "description": { + "type": "string", + "nullable": true, + "default": "" + }, + "extra_vars": { + "type": "string", + "nullable": true, + "default": "" + }, + "organization": { + "type": "integer", + "nullable": true, + "description": "The organization used to determine access to this template." + }, + "survey_enabled": { + "type": "boolean", + "nullable": true, + "default": false + }, + "allow_simultaneous": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_variables_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "inventory": { + "type": "integer", + "nullable": true, + "description": "Inventory applied as a prompt, assuming job template prompts for inventory" + }, + "limit": { + "type": "string", + "nullable": true + }, + "scm_branch": { + "type": "string", + "nullable": true, + "maxLength": 1024 + }, + "ask_inventory_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_scm_branch_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_limit_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "webhook_service": { + "nullable": true, + "description": "Service that webhook requests will be accepted from\n\n* `github` - GitHub\n* `gitlab` - GitLab\n* `bitbucket_dc` - BitBucket DataCenter", + "oneOf": [ + { + "$ref": "#/components/schemas/WebhookServiceEnum" + }, + { + "$ref": "#/components/schemas/BlankEnum" + }, + { + "$ref": "#/components/schemas/NullEnum" + } + ] + }, + "webhook_credential": { + "type": "integer", + "nullable": true, + "description": "Personal Access Token for posting back the status to the service API" + }, + "webhook_key": { + "type": "string", + "writeOnly": true, + "description": "Shared secret that the webhook service will use to sign requests. Leave blank to generate a new one when the webhook service is set.", + "maxLength": 64 + }, + "ask_labels_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_skip_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "ask_tags_on_launch": { + "type": "boolean", + "nullable": true, + "default": false + }, + "skip_tags": { + "type": "string", + "nullable": true + }, + "job_tags": { + "type": "string", + "nullable": true + } + }, + "required": [ + "name" + ] + } + } + } +} \ No newline at end of file diff --git a/awx/ui/CONTRIBUTING.md b/awx/ui/CONTRIBUTING.md index c41e1f8fb..2871f2655 100644 --- a/awx/ui/CONTRIBUTING.md +++ b/awx/ui/CONTRIBUTING.md @@ -25,7 +25,7 @@ Have questions about this document or anything not covered here? Feel free to re - [Naming components that use the context api](#naming-components-that-use-the-context-api) - [Class constructors vs Class properties](#class-constructors-vs-class-properties) - [Binding](#binding) - - [Typechecking with PropTypes](#typechecking-with-proptypes) + - [Typechecking with TypeScript](#typechecking-with-typescript) - [Custom Hooks](#custom-hooks) - [Naming Functions](#naming-functions) - [Default State Initialization](#default-state-initialization) @@ -57,7 +57,7 @@ The UI is built using [ReactJS](https://reactjs.org/docs/getting-started.html) a The AWX UI requires the following: - Node >= 16.13.1 LTS -- NPM 8.x +- NPM 8.x Run the following to install all the dependencies: @@ -170,24 +170,20 @@ Inside these folders, the internal structure is: In the root of `/src`, there are a few files which are used to initialize the react app. These are -- **index.js** +- **index.tsx** - Connects react app to root dom node. - - Sets up root route structure, navigation grouping and login modal - - Calls base context providers - - Imports .scss styles. -- **app.js** - - Sets standard page layout, about modal, and root dialog modal. -- **RootProvider.js** - - Sets up all context providers. - - Initializes i18n and router + - Imports the PatternFly base stylesheet and the content security policy. +- **App.tsx** + - Sets up the router, the context providers and i18n. + - Sets root route structure, navigation grouping and the login route. ### Naming files -Ideally, files should be named the same as the component they export, and tests with `.test` appended. In other words, `` would be defined in `FooBar.js`, and its tests would be defined in `FooBar.test.js`. +Ideally, files should be named the same as the component they export, and tests with `.test` appended. In other words, `` would be defined in `FooBar.tsx`, and its tests would be defined in `FooBar.test.tsx`. #### Naming components that use the context api -**File naming** - Since contexts export both consumer and provider (and potentially in withContext function form), the file can be simplified to be named after the consumer export. In other words, the file containing the `Network` context components would be named `Network.js`. +**File naming** - Since contexts export both consumer and provider (and potentially in withContext function form), the file can be simplified to be named after the consumer export. In other words, the file containing the `Network` context components would be named `Network.tsx`. **Component naming and conventions** - In order to provide a consistent interface with react-router and [lingui](https://lingui.js.org/), as well as make their usage easier and less verbose, context components follow these conventions: @@ -239,25 +235,39 @@ It is good practice to bind our class methods within our class constructor metho 2. [Performance advantages](https://stackoverflow.com/a/44844916). 3. Ease of testing. -### Typechecking with PropTypes +### Typechecking with TypeScript -Shared components should have their prop values typechecked. This will help catch bugs when components get refactored/renamed. +`src` and `testUtils` are TypeScript, checked under `strict` with +`noUncheckedIndexedAccess`. `npm run type-check` runs the checker, and CI runs it +as its own job, so a type error fails the pull request the way a lint error does. -```javascript -About.propTypes = { - ansible_version: PropTypes.string, - isOpen: PropTypes.bool, - onClose: PropTypes.func.isRequired, - version: PropTypes.string, -}; +A component declares its props as an exported interface named after it, and a +prop is optional when the component copes without it: when it gives the prop a +default, guards every read of it, or hands it to a child that declares it +optional. A prop the component calls or dereferences on its own stays required, +and the caller passes it. -About.defaultProps = { - ansible_version: null, - isOpen: false, - version: null, -}; +```typescript +export interface AboutProps { + ansibleVersion?: string; + isOpen?: boolean; + onClose: () => void; + version?: string; +} + +function About({ ansibleVersion, isOpen = false, onClose, version }: AboutProps) { ``` +Nothing under `src` or `testUtils` is `any`. Where a shape genuinely cannot be +described, say so with `unknown` and narrow at the point of use, or cast a test +fixture once at its literal. Do not reach for `any` to silence a checker that is +right. + +The API types in `src/types/api.generated.ts` come from the platform's own +OpenAPI schema, via `npm run generate-api-types`. Prefer them over describing a +response by hand, and give a partial fixture in a test an explicit cast rather +than loosening the type the application uses. + ### Custom Hooks There are currently a few custom hooks: @@ -303,7 +313,7 @@ this.state = { ### Testing components that use contexts -We have several React contexts that wrap much of the app, including those from react-router, lingui, and some of our own. When testing a component that depends on one or more of these, use the `renderWithContexts()` helper function found in `testUtils/rtlContexts.js`. It wraps the component tree with the necessary context providers and basic stub data, then returns [React Testing Library](https://testing-library.com/docs/react-testing-library/intro)'s `render` result plus a `history` object and a configured `user` (from `@testing-library/user-event`). +We have several React contexts that wrap much of the app, including those from react-router, lingui, and some of our own. When testing a component that depends on one or more of these, use the `renderWithContexts()` helper function found in `testUtils/rtlContexts.tsx`. It wraps the component tree with the necessary context providers and basic stub data, then returns [React Testing Library](https://testing-library.com/docs/react-testing-library/intro)'s `render` result plus a `history` object and a configured `user` (from `@testing-library/user-event`). If you want to stub the value of a context, or assert actions taken on it, you can customize a context's value by passing a `context` object as the second parameter. For example, this provides a custom value for the `Config` context: @@ -340,16 +350,26 @@ The lingui library provides various React helpers for dealing with both marking **Note:** We try to avoid the `I18n` consumer, or `i18nMark` function lingui gives us access to in this repo. i18nMark does not actually replace the string in the UI (leading to the potential for untranslated bugs), and the other helpers are redundant. Settling on a consistent, single pattern helps us ease the mental overhead of the need to understand the ins and outs of the lingui API. -**Note:** Pluralization can be complicated so it is best to allow lingui handle cases where we have a string that may need to be pluralized based on number of items, or count. In that case lingui provides a `` component, and a `plural()` function. When adding or updating strings in a `` tag you must run `npm run extra-strings` and submit the new `.po` files with your pull request. See documentation [here](https://lingui.js.org/guides/plurals.html?highlight=pluralization). +**Note:** Pluralization can be complicated so it is best to allow lingui handle cases where we have a string that may need to be pluralized based on number of items, or count. In that case lingui provides a `` component, and a `plural()` function. When adding or updating strings in a `` tag you must run `npm run extract-strings` and submit the new `.po` files with your pull request. See documentation [here](https://lingui.js.org/guides/plurals.html?highlight=pluralization). You can learn more about the ways lingui and its React helpers at [this link](https://lingui.js.org/tutorials/react-patterns.html). +`npm run check-strings` fails when the catalogues no longer match the source, and +`ui-lint` runs it in CI. Nothing else catches this: a message id is built from the +string and from the names of whatever is interpolated into it, so an edit as small +as guarding a value changes one. `` names its placeholder +`{forks}` and `` names it `{0}`, and the renamed id +matches nothing in the catalogues, so the string falls back to English in every +translated locale while types, lint, tests and the build all stay green. Where a +guard is needed, put it where the value is made rather than at the point of use, +so the name the id is built from does not change. + ### Setting up .po files to give to translation team 1. Make sure that the languages you intend to translate are set correctly in the `.linguirc` configuration file. 2. `npm run extract-strings` to create .po files for each language specified. The .po files will be placed in src/locales. When updating strings that are used by `` or `plural()` you will need to run this command to get the strings to render properly. This command will create `.po` files for each of the supported languages that will need to be committed with your PR. 3. Open up the .po file for the language you want to test and add some translations. In production we would pass this .po file off to the translation team. -4. Once you've edited your .po file (or we've gotten a .po file back from the translation team) run `npm run compile-strings`. This command takes the .po files and turns them into a minified JSON object and can be seen in the `messages.js` file in each locale directory. These files get loaded at the App root level (see: App.js). +4. Once you've edited your .po file (or we've gotten a .po file back from the translation team) run `npm run compile-strings`. This command takes the .po files and turns them into a minified JSON object and can be seen in the `messages.mjs` file in each locale directory. These files get loaded at the App root level (see: App.tsx). 5. Change the language in your browser and reload the page. You should see your specified translations in place of English strings. ### Marking an issue to be translated diff --git a/awx/ui/README.md b/awx/ui/README.md index 4c7bb9d58..db5a48576 100644 --- a/awx/ui/README.md +++ b/awx/ui/README.md @@ -49,7 +49,7 @@ npm --prefix awx/ui run lint npm --prefix awx/ui run test # run a single test (in this case the login page test): -npm --prefix awx/ui test -- src/screens/Login/Login.test.jsx +npm --prefix awx/ui test -- src/screens/Login/Login.test.tsx # start the test watcher and run tests on files that you've changed npm --prefix awx/ui run test-watch diff --git a/awx/ui/SEARCH.md b/awx/ui/SEARCH.md index 0b98a1698..2ae036e44 100644 --- a/awx/ui/SEARCH.md +++ b/awx/ui/SEARCH.md @@ -317,7 +317,7 @@ Concatenating terms in this way gives you the intersection of both terms (i.e. f #### Working with REST API -The REST API is coupled with the qs util through the `paramsSerializer` (the `encodeQueryString` function), due to the fact we need to support the array for duplicate key values in the object representation of the params to pass to the get request. This is done where the HTTP client is configured in the Base.js file, so all requests and request types should support our array syntax for duplicate keys automatically. +The REST API is coupled with the qs util through the `paramsSerializer` (the `encodeQueryString` function), due to the fact we need to support the array for duplicate key values in the object representation of the params to pass to the get request. This is done where the HTTP client is configured in the Base.ts file, so all requests and request types should support our array syntax for duplicate keys automatically. # Advanced Search - this section is a mess, update eventually diff --git a/awx/ui/config/build/aliases.mjs b/awx/ui/config/build/aliases.mjs index 8417c912a..839586482 100644 --- a/awx/ui/config/build/aliases.mjs +++ b/awx/ui/config/build/aliases.mjs @@ -15,11 +15,11 @@ const srcPath = fileURLToPath(new URL('../../src', import.meta.url)); export const srcAliases = [ { // Anchored, so node's own util is still reachable as node:util. - find: /^(api|components|contexts|hooks|screens|util)(\/|$)/, + find: /^(api|components|contexts|hooks|screens|types|util)(\/|$)/, replacement: `${srcPath}/$1$2`, }, - { find: /^i18nLoader$/, replacement: `${srcPath}/i18nLoader.js` }, - { find: /^themeRegistry$/, replacement: `${srcPath}/themeRegistry.js` }, + { find: /^i18nLoader$/, replacement: `${srcPath}/i18nLoader.ts` }, + { find: /^themeRegistry$/, replacement: `${srcPath}/themeRegistry.ts` }, ]; export default srcAliases; diff --git a/awx/ui/config/build/babel.mjs b/awx/ui/config/build/babel.mjs index 92f6bc12a..431a378f8 100644 --- a/awx/ui/config/build/babel.mjs +++ b/awx/ui/config/build/babel.mjs @@ -36,7 +36,16 @@ export function babelTransform() { babelrc: false, configFile: false, sourceMaps: true, - presets: [['@babel/preset-react', { runtime: 'automatic' }]], + presets: [ + ['@babel/preset-react', { runtime: 'automatic' }], + // Types are erased here rather than by oxc, because this pass has to + // parse the file anyway to run the lingui macro, and a .ts file it + // cannot parse is a build failure rather than a fallback. No options: + // the preset picks TS or TSX off the extension on its own, and the + // .js and .jsx files it skips carry no types to erase. JSX syntax in + // .tsx comes from preset-react above, which runs for every extension. + '@babel/preset-typescript', + ], plugins: [ '@lingui/babel-plugin-lingui-macro', resolvePath('../babel/jsx-compat-plugin.js'), diff --git a/awx/ui/config/i18n/checkCatalogs.mjs b/awx/ui/config/i18n/checkCatalogs.mjs new file mode 100644 index 000000000..8240bf60c --- /dev/null +++ b/awx/ui/config/i18n/checkCatalogs.mjs @@ -0,0 +1,157 @@ +/** + * Fails when the checked in message catalogues no longer match the strings in + * the source. + * + * Nothing else catches this. A message id is built from the string and from + * the names of whatever is interpolated into it, so an edit as small as + * guarding a value can change one: `` names its + * placeholder {forks}, and `` names it {0}. The + * id no longer matches the catalogues, and the string silently falls back to + * English in every translated locale. Types, lint, tests and the build all + * pass either way, which is how four of them reached this branch. + * + * Only the ids are compared, not the files. The catalogues carry source + * references with line numbers, so comparing them whole would fail on any + * change that shifts a line, which is most of them. + * + * Extraction runs against a temporary catalogue, so the working tree is left + * alone whether this passes or fails. + */ +import { execFileSync } from 'node:child_process'; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const uiRoot = resolve(fileURLToPath(new URL('../..', import.meta.url))); +const sourceCatalog = join(uiRoot, 'src/locales/en/messages.po'); + +/** + * How many entries a catalogue holds under each message id. + * + * Counted rather than collected into a set, because one id can hold two + * entries: lingui keeps a message given an explicit id apart from one whose + * id it generated from the same text. A set would hide one of such a pair + * going missing. + * + * Args: + * po: The contents of a .po file. + * + * Returns: + * A Map of id to the number of entries carrying it. Obsolete entries (the + * ones gettext comments out with `#~`) and the header are left out, and an + * id split over several lines is joined back together. + */ +function messageIds(po) { + const ids = new Map(); + const bump = (id) => ids.set(id, (ids.get(id) ?? 0) + 1); + const lines = po.split('\n'); + let current = null; + + lines.forEach((line) => { + if (line.startsWith('#~')) { + // An entry gettext has retired. It is not in the source any more. + current = null; + return; + } + if (line.startsWith('msgid ')) { + current = line.slice('msgid '.length).trim(); + return; + } + if (current !== null && line.startsWith('"')) { + // A continuation of the id above, which gettext splits at newlines. + current = current.slice(0, -1) + line.trim().slice(1); + return; + } + if (current !== null) { + // The id ended at the line before this one. `""` is the header. + if (current !== '""') { + bump(current); + } + current = null; + } + }); + if (current !== null && current !== '""') { + bump(current); + } + return ids; +} + +const work = mkdtempSync(join(tmpdir(), 'ascender-i18n-')); +try { + // The real config, with the catalogue redirected somewhere disposable. + const config = join(work, 'lingui.config.mjs'); + writeFileSync( + config, + [ + `import base from ${JSON.stringify(join(uiRoot, 'lingui.config.js'))};`, + 'export default {', + ' ...base,', + ` catalogs: base.catalogs.map((catalog) => ({`, + ' ...catalog,', + ` path: ${JSON.stringify(join(work, '{locale}/messages'))},`, + ' })),', + '};', + '', + ].join('\n') + ); + + try { + execFileSync( + join(uiRoot, 'node_modules/.bin/lingui'), + ['extract', '--config', config, '--locale', 'en'], + { cwd: uiRoot, stdio: 'pipe' } + ); + } catch (error) { + // Say what the extractor said. Left to itself node prints the failure as + // a dump of its stdio buffers, byte by byte. + const said = [error.stdout, error.stderr] + .map((buffer) => buffer?.toString().trim()) + .filter(Boolean) + .join('\n'); + process.stderr.write( + ['Could not extract the strings.', '', said, ''].join('\n') + ); + process.exit(1); + } + + const fromSource = messageIds( + readFileSync(join(work, 'en/messages.po'), 'utf8') + ); + const fromCatalog = messageIds(readFileSync(sourceCatalog, 'utf8')); + + const count = (ids, id) => ids.get(id) ?? 0; + const every = new Set([...fromSource.keys(), ...fromCatalog.keys()]); + const added = [...every].filter( + (id) => count(fromSource, id) > count(fromCatalog, id) + ); + const removed = [...every].filter( + (id) => count(fromCatalog, id) > count(fromSource, id) + ); + + if (added.length || removed.length) { + const report = (label, ids) => + ids.length + ? [` ${label} (${ids.length}):`, ...ids.map((id) => ` ${id}`)] + : []; + process.stderr.write( + [ + 'The message catalogues are out of step with the source.', + '', + ...report('in the source, missing from the catalogues', added), + ...report('in the catalogues, no longer in the source', removed), + '', + 'Run `npm run extract-strings` and commit the result. Check any id', + 'that changed rather than being added or removed: a renamed', + 'placeholder orphans every translation of that string.', + '', + ].join('\n') + ); + process.exit(1); + } + + const entries = [...fromCatalog.values()].reduce((a, b) => a + b, 0); + process.stdout.write(`Message catalogues are in step: ${entries} entries.\n`); +} finally { + rmSync(work, { recursive: true, force: true }); +} diff --git a/awx/ui/eslint.config.mjs b/awx/ui/eslint.config.mjs index 03606d2c0..88765d3f0 100644 --- a/awx/ui/eslint.config.mjs +++ b/awx/ui/eslint.config.mjs @@ -1,7 +1,10 @@ import babelParser from '@babel/eslint-parser'; import { defineConfig } from 'eslint/config'; import path from 'node:path'; -import { configs as airbnb, plugins as airbnbPlugins } from 'eslint-config-airbnb-extended'; +import { + configs as airbnb, + plugins as airbnbPlugins, +} from 'eslint-config-airbnb-extended'; import { createNodeResolver } from 'eslint-plugin-import-x'; import prettier from 'eslint-config-prettier'; import i18next from 'eslint-plugin-i18next'; @@ -10,6 +13,195 @@ import i18next from 'eslint-plugin-i18next'; import i18nextDefaults from 'eslint-plugin-i18next/lib/options/defaults.js'; import jsxA11y from 'eslint-plugin-jsx-a11y'; import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +// The rules this codebase has settled on, applied to every source file. +// Extracted rather than written into the JavaScript block below, because which +// of them a file gets should not depend on whether it has been converted to +// TypeScript yet. +const sharedRules = { + 'i18next/no-literal-string': [ + 2, + { + mode: 'jsx-text-only', + 'jsx-attributes': { + exclude: [ + ...i18nextDefaults['jsx-attributes'].exclude, + 'data-testid', + 'dateFieldName', + 'timeFieldName', + 'to', + 'streamType', + 'path', + 'component', + 'variant', + 'key', + 'position', + 'promptName', + 'color', + 'promptId', + 'headingLevel', + 'size', + 'target', + 'autoComplete', + 'trigger', + 'from', + 'name', + 'fieldId', + 'css', + 'gutter', + 'dataCy', + 'tooltipMaxWidth', + 'mode', + 'aria-labelledby', + 'aria-hidden', + 'aria-controls', + 'aria-pressed', + 'sortKey', + 'ouiaId', + 'credentialTypeNamespace', + 'link', + 'value', + 'credentialTypeKind', + 'linkTo', + 'scrollToAlignment', + 'displayKey', + 'sortedColumnKey', + 'maxHeight', + 'maxWidth', + 'role', + 'aria-haspopup', + 'dropDirection', + 'resizeOrientation', + 'src', + 'theme', + 'gridColumns', + 'rows', + 'href', + 'modifier', + 'data-cy', + 'fieldName', + 'splitButtonVariant', + 'pageKey', + 'textId', + 'rel', + ], + }, + words: { + exclude: [ + ...i18nextDefaults.words.exclude, + 'Ansible', + 'Tower', + 'JSON:?', + 'YAML:?', + 'lg', + 'hh:mm AM/PM', + 'Twilio', + ], + }, + 'jsx-components': { + exclude: [ + // lingui translation components (v5 ignored these by default) + 'Trans', + 'AboutModal', + 'code', + 'Omit', + 'PotentialLink', + 'TypeRedirect', + 'Radio', + 'RunOnRadio', + 'NodeTypeLetter', + 'SelectableItem', + 'Dash', + 'Plural', + ], + }, + callees: { + exclude: [...i18nextDefaults.callees.exclude, 'describe'], + }, + }, + ], + camelcase: 'off', + // history is supplied by an alias in the test config, over + // react-router's own, and the resolver here does not read that. + 'import-x/no-unresolved': ['error', { ignore: ['^history$'] }], + // Imports are written without an extension throughout, and which + // extension a module has is exactly what this migration keeps changing. + // Requiring one would mean editing every importer each time a module is + // converted, in both directions. + 'import-x/extensions': [ + 'error', + 'ignorePackages', + { js: 'never', jsx: 'never', ts: 'never', tsx: 'never', mjs: 'never' }, + ], + '@stylistic/arrow-parens': 'off', + '@stylistic/comma-dangle': 'off', + 'import-x/no-cycle': 'off', + // https://github.com/benmosher/eslint-plugin-import/issues/479#issuecomment-252500896 + 'import-x/no-extraneous-dependencies': 'off', + '@stylistic/max-len': [ + 'error', + { + code: 100, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }, + ], + 'no-continue': 'off', + 'no-debugger': 'off', + 'no-param-reassign': 'off', + 'no-plusplus': 'off', + 'no-underscore-dangle': 'off', + 'no-use-before-define': 'off', + '@stylistic/no-multiple-empty-lines': ['error', { max: 1 }], + 'object-curly-newline': 'off', + '@stylistic/no-trailing-spaces': ['error'], + 'no-unused-expressions': ['error', { allowShortCircuit: true }], + // airbnb@19 options; eslint 9 changed the caughtErrors default to 'all' + 'no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'after-used', + ignoreRestSiblings: true, + caughtErrors: 'none', + }, + ], + // rules newer than the airbnb@19 baseline this codebase was linted with + 'prefer-object-has-own': 'off', + 'import-x/no-rename-default': 'off', + 'react/jsx-no-useless-fragment': 'error', + 'react/jsx-props-no-spreading': ['off'], + 'react/prefer-stateless-function': 'off', + 'react/prop-types': 'off', + // default values are expressed via ES default parameters (the React + // 18.3/19 migration away from the deprecated defaultProps), so accept a + // destructured default argument in place of a defaultProps entry + 'react/require-default-props': ['error', { functions: 'defaultArguments' }], + 'react/sort-comp': ['error', {}], + 'jsx-a11y/label-has-for': 'off', + 'jsx-a11y/label-has-associated-control': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + // react-hooks 7.x ships React Compiler-powered rules; the codebase + // predates them. Off until addressed as their own effort. + 'react-hooks/set-state-in-effect': 'off', + 'react-hooks/immutability': 'off', + 'react-hooks/refs': 'off', + 'react-hooks/purity': 'off', + 'react/jsx-filename-extension': 'off', + 'no-restricted-exports': 'off', + 'react/function-component-definition': 'off', + 'prefer-regex-literals': 'off', + // Resolve these 2 rules later + 'react/no-unknown-property': [ + 'error', + { ignore: ['css', 'ouia-component-id'] }, + ], + 'react/forbid-prop-types': 'off', + // PF5 Dropdown requires toggle={(toggleRef) => } + 'react/no-unstable-nested-components': ['error', { allowAsProps: true }], +}; export default defineConfig([ { @@ -22,7 +214,6 @@ export default defineConfig([ 'node_modules/**', 'dist/**', 'images/**', - '**/*test*.js', 'config/**', 'scripts/**', 'eslint.config.mjs', @@ -43,6 +234,34 @@ export default defineConfig([ { rules: jsxA11y.flatConfigs.strict.rules }, i18next.configs['flat/recommended'], prettier, + // TypeScript files are parsed by typescript-eslint rather than babel, and + // take airbnb's TypeScript rule sets on top of the shared ones above. Only + // these two extensions: the JavaScript block below is unchanged, which is + // what lets the two live side by side while the tree converts. + { ...airbnbPlugins.typescriptEslint, files: ['**/*.ts', '**/*.tsx'] }, + ...airbnb.base.typescript.map((c) => ({ + ...c, + files: ['**/*.ts', '**/*.tsx'], + })), + ...airbnb.react.typescript.map((c) => ({ + ...c, + files: ['**/*.ts', '**/*.tsx'], + })), + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parser: tseslint.parser, + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + globals: { + ...globals.browser, + ...globals.node, + }, + }, + }, + prettier, { files: ['**/*.js', '**/*.jsx'], languageOptions: { @@ -69,181 +288,101 @@ export default defineConfig([ // module resolution mirrors jsconfig.json baseUrl: src 'import-x/resolver-next': [ createNodeResolver({ - extensions: ['.mjs', '.cjs', '.js', '.json', '.jsx', '.node'], + extensions: [ + '.mjs', + '.cjs', + '.js', + '.json', + '.jsx', + '.ts', + '.tsx', + '.node', + ], modules: ['node_modules', path.resolve(import.meta.dirname, 'src')], }), ], }, - rules: { - 'i18next/no-literal-string': [ - 2, - { - mode: 'jsx-text-only', - 'jsx-attributes': { - exclude: [ - ...i18nextDefaults['jsx-attributes'].exclude, - 'data-testid', - 'dateFieldName', - 'timeFieldName', - 'to', - 'streamType', - 'path', - 'component', - 'variant', - 'key', - 'position', - 'promptName', - 'color', - 'promptId', - 'headingLevel', - 'size', - 'target', - 'autoComplete', - 'trigger', - 'from', - 'name', - 'fieldId', - 'css', - 'gutter', - 'dataCy', - 'tooltipMaxWidth', - 'mode', - 'aria-labelledby', - 'aria-hidden', - 'aria-controls', - 'aria-pressed', - 'sortKey', - 'ouiaId', - 'credentialTypeNamespace', - 'link', - 'value', - 'credentialTypeKind', - 'linkTo', - 'scrollToAlignment', - 'displayKey', - 'sortedColumnKey', - 'maxHeight', - 'maxWidth', - 'role', - 'aria-haspopup', - 'dropDirection', - 'resizeOrientation', - 'src', - 'theme', - 'gridColumns', - 'rows', - 'href', - 'modifier', - 'data-cy', - 'fieldName', - 'splitButtonVariant', - 'pageKey', - 'textId', - 'rel', - ], - }, - words: { - exclude: [ - ...i18nextDefaults.words.exclude, - 'Ansible', - 'Tower', - 'JSON:?', - 'YAML:?', - 'lg', - 'hh:mm AM/PM', - 'Twilio', - ], - }, - 'jsx-components': { - exclude: [ - // lingui translation components (v5 ignored these by default) - 'Trans', - 'AboutModal', - 'code', - 'Omit', - 'PotentialLink', - 'TypeRedirect', - 'Radio', - 'RunOnRadio', - 'NodeTypeLetter', - 'SelectableItem', - 'Dash', - 'Plural', - ], - }, - callees: { - exclude: [...i18nextDefaults.callees.exclude, 'describe'], - }, - }, - ], - camelcase: 'off', - '@stylistic/arrow-parens': 'off', - '@stylistic/comma-dangle': 'off', - 'import-x/no-cycle': 'off', - // https://github.com/benmosher/eslint-plugin-import/issues/479#issuecomment-252500896 - 'import-x/no-extraneous-dependencies': 'off', - '@stylistic/max-len': [ - 'error', - { - code: 100, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }, + rules: sharedRules, + }, + { + files: ['**/*.ts', '**/*.tsx'], + settings: { + react: { + version: 'detect', + }, + // module resolution mirrors tsconfig.json baseUrl: src + 'import-x/resolver-next': [ + createNodeResolver({ + extensions: [ + '.mjs', + '.cjs', + '.js', + '.json', + '.jsx', + '.ts', + '.tsx', + '.node', + ], + modules: ['node_modules', path.resolve(import.meta.dirname, 'src')], + }), ], - 'no-continue': 'off', - 'no-debugger': 'off', - 'no-param-reassign': 'off', - 'no-plusplus': 'off', - 'no-underscore-dangle': 'off', - 'no-use-before-define': 'off', - '@stylistic/no-multiple-empty-lines': ['error', { max: 1 }], - 'object-curly-newline': 'off', - '@stylistic/no-trailing-spaces': ['error'], - 'no-unused-expressions': ['error', { allowShortCircuit: true }], - // airbnb@19 options; eslint 9 changed the caughtErrors default to 'all' - 'no-unused-vars': [ + }, + rules: { + ...sharedRules, + // the TypeScript-aware counterparts of the rules above, which the airbnb + // TypeScript config turns on in place of the base ones. The base + // no-unused-vars does not know about types, and reports every imported + // one as unused. + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-shadow': 'off', + // nothing under src or testUtils is any: where a shape cannot be + // described it is unknown, narrowed where it is read, and a partial + // test fixture is cast once at its literal. Base.ts is the exception + // it names: a mixin's constructor signature has to take any[]. + '@typescript-eslint/no-explicit-any': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ 'error', { vars: 'all', args: 'after-used', + // a parameter a stub has to declare but does not read, which is + // what the leading underscore says + argsIgnorePattern: '^_', ignoreRestSiblings: true, caughtErrors: 'none', }, ], - // rules newer than the airbnb@19 baseline this codebase was linted with - 'prefer-object-has-own': 'off', - 'import-x/no-rename-default': 'off', - 'react/jsx-no-useless-fragment': 'error', - 'react/jsx-props-no-spreading': ['off'], - 'react/prefer-stateless-function': 'off', - 'react/prop-types': 'off', - // default values are expressed via ES default parameters (the React - // 18.3/19 migration away from the deprecated defaultProps), so accept a - // destructured default argument in place of a defaultProps entry - 'react/require-default-props': ['error', { functions: 'defaultArguments' }], - 'react/sort-comp': ['error', {}], - 'jsx-a11y/label-has-for': 'off', - 'jsx-a11y/label-has-associated-control': 'off', - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'warn', - // react-hooks 7.x ships React Compiler-powered rules; the codebase - // predates them. Off until addressed as their own effort. - 'react-hooks/set-state-in-effect': 'off', - 'react-hooks/immutability': 'off', - 'react-hooks/refs': 'off', - 'react-hooks/purity': 'off', - 'react/jsx-filename-extension': 'off', - 'no-restricted-exports': 'off', - 'react/function-component-definition': 'off', - 'prefer-regex-literals': 'off', - // Resolve these 2 rules later - 'react/no-unknown-property': [ + // types express what a value may be; the parameter defaults beside them + // are the defaults, and there is no separate propTypes to check against + 'react/require-default-props': 'off', + // a class's field declarations are a block of one-line members, and a + // blank line between each of them reads as noise rather than structure + '@stylistic/lines-between-class-members': [ 'error', - { ignore: ['css', 'ouia-component-id'] }, + 'always', + { exceptAfterSingleLine: true }, ], - 'react/forbid-prop-types': 'off', - // PF5 Dropdown requires toggle={(toggleRef) => } - 'react/no-unstable-nested-components': ['error', { allowAsProps: true }], + }, + }, + // The test files take the same rules as the source, less the handful that + // describe an application rather than a test of one. + { + files: ['**/*.{spec,test}.{ts,tsx}', 'testUtils/**/*.{ts,tsx}'], + rules: { + // an assertion names the string the user sees, which is the point of it + 'i18next/no-literal-string': 'off', + // the console is what several of these silence or spy on + 'no-console': 'off', + // a test file has no default export to be the module's subject + 'import-x/prefer-default-export': 'off', + // the runner and the testing library are development dependencies, and + // a test is where they belong + 'import-x/no-extraneous-dependencies': 'off', + // a stub component takes whatever the real one is given, and reads it + // the same way the real one would + 'react/destructuring-assignment': 'off', + 'react/prop-types': 'off', }, }, ]); diff --git a/awx/ui/index.html b/awx/ui/index.html index 7422680b3..4583a6443 100644 --- a/awx/ui/index.html +++ b/awx/ui/index.html @@ -20,6 +20,6 @@
- + diff --git a/awx/ui/package-lock.json b/awx/ui/package-lock.json index f48ec81ac..680697a97 100644 --- a/awx/ui/package-lock.json +++ b/awx/ui/package-lock.json @@ -34,6 +34,7 @@ "@babel/core": "^8.0.1", "@babel/eslint-parser": "^8.0.1", "@babel/preset-react": "^8.0.1", + "@babel/preset-typescript": "^8.0.1", "@babel/runtime": "^8.0.0", "@lingui/babel-plugin-lingui-macro": "^6.6.0", "@lingui/cli": "^6.6.0", @@ -43,6 +44,9 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "14.6.7", + "@types/d3": "7.4.3", + "@types/luxon": "^3.7.5", + "@types/react-dom": "19.3.0", "@vitejs/plugin-basic-ssl": "^2.3.0", "@vitejs/plugin-react": "^6.1.1", "babel-plugin-macros": "3.1.0", @@ -57,6 +61,8 @@ "postcss": "^8.5.28", "prettier": "3.9.1", "styled-components": "^6.4.3", + "typescript": "^6.0.3", + "typescript-eslint": "^8.70.0", "vite": "^8.2.2", "vitest": "^5.0.0", "vitest-websocket-mock": "^0.7.0" @@ -228,6 +234,28 @@ "node": "^22.18.0 || >=24.11.0" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.1.tgz", + "integrity": "sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-optimise-call-expression": "^8.0.0", + "@babel/helper-replace-supers": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/traverse": "^8.0.0", + "semver": "^7.7.3" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/helper-globals": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", @@ -238,6 +266,20 @@ "node": "^22.18.0 || >=24.11.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.0.tgz", + "integrity": "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-8.0.0.tgz", @@ -252,6 +294,37 @@ "node": "^22.18.0 || >=24.11.0" } }, + "node_modules/@babel/helper-module-transforms": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-8.0.1.tgz", + "integrity": "sha512-UgAhl1kqiW5ciE0yCXqqvnb4H2n3IELJ7lIIQRezwDPilPEZX5i+Rvbja9MFTkwUn2biEiSMeV31aUzR4Lwakw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.0", + "@babel/traverse": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-8.0.0.tgz", + "integrity": "sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", @@ -265,6 +338,38 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/helper-replace-supers": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-8.0.1.tgz", + "integrity": "sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-optimise-call-expression": "^8.0.0", + "@babel/traverse": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-8.0.0.tgz", + "integrity": "sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", @@ -341,6 +446,39 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-8.0.3.tgz", + "integrity": "sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-8.0.1.tgz", + "integrity": "sha512-PMuzulWrrzFNmY3lXSk/tV9NRb7y0eZZLJY4UEo2TKszroxvUZHAPPi+T9FDyrQhod+TQA+t+8/QYaaMpiEuhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-8.0.1.tgz", @@ -410,6 +548,26 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-8.0.1.tgz", + "integrity": "sha512-0Svqp3413Eg0GElldykF/T7SNsxQO5YVGD70fZyAdZTnX8WRgcopmbiU7GTa5xY5ZnJcEpNbfns8/GjX+/1yeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-create-class-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/plugin-syntax-typescript": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/preset-react": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-8.0.1.tgz", @@ -431,6 +589,25 @@ "@babel/core": "^8.0.0" } }, + "node_modules/@babel/preset-typescript": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-8.0.1.tgz", + "integrity": "sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-validator-option": "^8.0.0", + "@babel/plugin-transform-modules-commonjs": "^8.0.1", + "@babel/plugin-transform-typescript": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" + } + }, "node_modules/@babel/runtime": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-8.0.0.tgz", @@ -2168,6 +2345,290 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -2196,6 +2657,13 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", @@ -2253,6 +2721,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/luxon": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.5.tgz", + "integrity": "sha512-jJ41Q4z6ZVO260MNDdHfW7+7a5iMiX8Mr6ZJHcmgrvhZha6dz5704o/lF2kKl6URjH6ivEL97w9xS/MgpJEphg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "26.4.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", @@ -2270,15 +2745,25 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", "license": "MIT", "peer": true, "dependencies": { "csstype": "^3.2.2" } }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -2302,17 +2787,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.68.0.tgz", - "integrity": "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz", + "integrity": "sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.68.0", - "@typescript-eslint/type-utils": "8.68.0", - "@typescript-eslint/utils": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0", + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/type-utils": "8.70.0", + "@typescript-eslint/utils": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -2325,15 +2810,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.68.0", + "@typescript-eslint/parser": "^8.70.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz", + "integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==", "dev": true, "license": "MIT", "engines": { @@ -2341,16 +2826,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.68.0.tgz", - "integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.0.tgz", + "integrity": "sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.68.0", - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0", + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", "debug": "^4.4.3" }, "engines": { @@ -2366,14 +2851,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", - "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.0.tgz", + "integrity": "sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.68.0", - "@typescript-eslint/types": "^8.68.0", + "@typescript-eslint/tsconfig-utils": "^8.70.0", + "@typescript-eslint/types": "^8.70.0", "debug": "^4.4.3" }, "engines": { @@ -2388,14 +2873,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", - "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz", + "integrity": "sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0" + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2406,9 +2891,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", - "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz", + "integrity": "sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==", "dev": true, "license": "MIT", "engines": { @@ -2423,15 +2908,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.68.0.tgz", - "integrity": "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz", + "integrity": "sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0", - "@typescript-eslint/utils": "8.68.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/utils": "8.70.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -2448,9 +2933,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", - "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.0.tgz", + "integrity": "sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==", "dev": true, "license": "MIT", "engines": { @@ -2462,16 +2947,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", - "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz", + "integrity": "sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.68.0", - "@typescript-eslint/tsconfig-utils": "8.68.0", - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0", + "@typescript-eslint/project-service": "8.70.0", + "@typescript-eslint/tsconfig-utils": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2529,16 +3014,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", - "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.0.tgz", + "integrity": "sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.68.0", - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0" + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2553,13 +3038,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", - "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz", + "integrity": "sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/types": "8.70.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3833,9 +4318,9 @@ } }, "node_modules/comment-parser": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.8.tgz", - "integrity": "sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.9.tgz", + "integrity": "sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==", "dev": true, "license": "MIT", "engines": { @@ -10053,7 +10538,6 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10063,16 +10547,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.68.0.tgz", - "integrity": "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.0.tgz", + "integrity": "sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.68.0", - "@typescript-eslint/parser": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0", - "@typescript-eslint/utils": "8.68.0" + "@typescript-eslint/eslint-plugin": "8.70.0", + "@typescript-eslint/parser": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/utils": "8.70.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/awx/ui/package.json b/awx/ui/package.json index a3c45cc06..a08bee458 100644 --- a/awx/ui/package.json +++ b/awx/ui/package.json @@ -3,7 +3,7 @@ "homepage": ".", "private": true, "engines": { - "node": ">=22.22.0" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" }, "dependencies": { "@dagrejs/dagre": "^3.0.0", @@ -34,6 +34,7 @@ "@babel/core": "^8.0.1", "@babel/eslint-parser": "^8.0.1", "@babel/preset-react": "^8.0.1", + "@babel/preset-typescript": "^8.0.1", "@babel/runtime": "^8.0.0", "@lingui/babel-plugin-lingui-macro": "^6.6.0", "@lingui/cli": "^6.6.0", @@ -43,6 +44,9 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "14.6.7", + "@types/d3": "7.4.3", + "@types/luxon": "^3.7.5", + "@types/react-dom": "19.3.0", "@vitejs/plugin-basic-ssl": "^2.3.0", "@vitejs/plugin-react": "^6.1.1", "babel-plugin-macros": "3.1.0", @@ -57,6 +61,8 @@ "postcss": "^8.5.28", "prettier": "3.9.1", "styled-components": "^6.4.3", + "typescript": "^6.0.3", + "typescript-eslint": "^8.70.0", "vite": "^8.2.2", "vitest": "^5.0.0", "vitest-websocket-mock": "^0.7.0" @@ -126,11 +132,14 @@ "test-general": "TZ='UTC' vitest run --exclude 'src/screens/**'", "test-watch": "TZ='UTC' vitest", "lint": "NODE_ENV=development eslint .", + "type-check": "tsc --noEmit", + "check-strings": "node config/i18n/checkCatalogs.mjs", + "generate-api-types": "npx --yes openapi-typescript@7 .schema.json -o src/types/api.generated.ts", "extract-strings": "lingui extract", "extract-template": "lingui extract-template", "compile-strings": "lingui compile", - "prettier": "prettier --cache --write \"src/**/*.{js,jsx,scss}\"", - "prettier-check": "prettier --cache --check \"src/**/*.{js,jsx,scss}\"" + "prettier": "prettier --cache --write \"{src,testUtils}/**/*.{ts,tsx,scss}\"", + "prettier-check": "prettier --cache --check \"{src,testUtils}/**/*.{ts,tsx,scss}\"" }, "browserslist": [ "chrome >= 111", diff --git a/awx/ui/src/App.js b/awx/ui/src/App.js deleted file mode 100644 index fa6a344b3..000000000 --- a/awx/ui/src/App.js +++ /dev/null @@ -1,231 +0,0 @@ -import React, { useEffect, useLayoutEffect, useState } from 'react'; -import { - HashRouter, - Routes, - Route, - Navigate, - useLocation, - useNavigate, -} from 'react-router'; -import { ErrorBoundary } from 'react-error-boundary'; -import locationReplace from 'util/navigation'; -import { I18nProvider } from '@lingui/react'; -import { i18n } from '@lingui/core'; -import { Card, PageSection } from '@patternfly/react-core'; -import { - ConfigProvider, - useAuthorizedPath, - useUserProfile, -} from 'contexts/Config'; -import { SessionProvider, useSession } from 'contexts/Session'; -import AppContainer from 'components/AppContainer'; -import ContentError from 'components/ContentError'; -import NotFound from 'screens/NotFound'; -import Login from 'screens/Login'; -import { isAuthenticated } from 'util/auth'; -import { getLanguageWithoutRegionCode } from 'util/language'; -import Metrics from 'screens/Metrics'; -import SubscriptionEdit from 'screens/Setting/Subscription/SubscriptionEdit'; -import { dynamicActivate, locales } from './i18nLoader'; -import getRouteConfig from './routeConfig'; -import { getStoredThemeId, applyTheme } from './themeRegistry'; -import { SESSION_REDIRECT_URL } from './constants'; - -function ErrorFallback({ error }) { - return ( - - - - - - ); -} - -const RenderAppContainer = () => { - const userProfile = useUserProfile(); - const navRouteConfig = getRouteConfig(userProfile); - - return ( - - - - ); -}; - -const AuthorizedRoutes = ({ routeConfig }) => { - const isAuthorized = useAuthorizedPath(); - - if (!isAuthorized) { - return ( - - - - - - - - - } - /> - } - /> - - ); - } - - return ( - - {routeConfig - .flatMap(({ routes }) => routes) - .map(({ path, screen: Screen }) => ( - // /* so each screen's own nested can match the rest - - - - } - /> - )) - .concat( - - - - } - />, - - - - } - /> - )} - - ); -}; - -export function ProtectedRoute({ children }) { - const { - authRedirectTo, - isUserBeingLoggedOut, - loginRedirectOverride, - setAuthRedirectTo, - } = useSession(); - const location = useLocation(); - - useEffect(() => { - setAuthRedirectTo( - authRedirectTo === '/logout' - ? '/' - : `${location.pathname}${location.search}` - ); - }); - - if (isAuthenticated(document.cookie)) { - return ( - - {children} - - ); - } - - if ( - loginRedirectOverride && - !window.location.href.includes('/login') && - !isUserBeingLoggedOut - ) { - locationReplace(loginRedirectOverride); - return null; - } - return ; -} - -function App() { - const [isLoading, setIsLoading] = useState(true); - - useLayoutEffect(() => { - applyTheme(getStoredThemeId()); - }, []); - const navigate = useNavigate(); - const { search } = useLocation(); - const searchParams = Object.fromEntries(new URLSearchParams(search)); - const pseudolocalization = - searchParams.pseudolocalization === 'true' || false; - let language = - searchParams.lang || - localStorage.getItem('preferred_language') || - getLanguageWithoutRegionCode(navigator) || - 'en'; - - if (!Object.keys(locales).includes(language)) { - // If there isn't a string catalog available for the browser's - // preferred language, default to one that has strings. - language = 'en'; - } - - useEffect(() => { - dynamicActivate(language, pseudolocalization).then(() => { - setIsLoading(false); - }); - }, [language, pseudolocalization]); - - const redirectURL = window.sessionStorage.getItem(SESSION_REDIRECT_URL); - if (redirectURL) { - window.sessionStorage.removeItem(SESSION_REDIRECT_URL); - if (redirectURL !== '/' && redirectURL !== '/home') - navigate(redirectURL, { replace: true }); - } - - if (isLoading) { - return ( - // Don't render I18nProvider until i18n is activated - - // eslint-disable-next-line i18next/no-literal-string -
Loading...
- ); - } - - return ( - - - - } - /> - } /> - - - - - - } - /> - - - - ); -} - -export default () => ( - - - -); diff --git a/awx/ui/src/App.test.js b/awx/ui/src/App.test.js deleted file mode 100644 index a466e8f19..000000000 --- a/awx/ui/src/App.test.js +++ /dev/null @@ -1,118 +0,0 @@ -import React from 'react'; -import { render, screen, waitFor } from '@testing-library/react'; -import { RootAPI } from 'api'; -import * as SessionContext from 'contexts/Session'; -import * as navigation from 'util/navigation'; -import * as auth from 'util/auth'; -import { renderWithContexts } from '../testUtils/rtlContexts'; -import App, { ProtectedRoute } from './App'; - -vi.mock('./api'); -vi.mock('util/webWorker', () => ({ default: vi.fn() })); - -// Keep the real `locales` map (App.js validates the active language against it) -// but hold i18n activation pending so App stays on its top-level loading shell. -// This mirrors the original shallow render — it asserts App mounts without -// driving the deep provider tree, whose ConfigProvider/SessionProvider are -// globally mocked in setupTests and warn when mounted without a `value` prop. -vi.mock('./i18nLoader', async () => ({ - ...(await vi.importActual('./i18nLoader')), - // plain function, not vi.fn — resetMocks would strip a vi.fn's impl and - // make App.js's `dynamicActivate(...).then(...)` throw on undefined. - dynamicActivate: () => new Promise(() => {}), -})); - -describe('', () => { - beforeEach(() => { - RootAPI.readAssetVariables.mockResolvedValue({ - data: { - BRAND_NAME: 'AWX', - }, - }); - }); - - afterEach(() => { - // restoreAllMocks (not clearAllMocks) so vi.spyOn spies are actually - // restored — with resetMocks:true a leftover spy leaks into later tests - // (or partial reruns) as a reset spy that returns undefined. - vi.restoreAllMocks(); - }); - - test('renders ok', async () => { - const contextValues = { - setAuthRedirectTo: vi.fn(), - isSessionExpired: false, - isUserBeingLoggedOut: false, - loginRedirectOverride: null, - }; - vi.spyOn(SessionContext, 'useSession').mockImplementation( - () => contextValues - ); - - // The default export self-mounts the real HashRouter, which logs React - // Router v6 future-flag warnings ("v7_startTransition" / "v7_relativeSplatPath") - // on mount. Those are framework deprecation notices, not app warnings — let - // them through without tripping the setupTests console-warn trap, while any - // other warning still surfaces. - const realWarn = global.console.warn; - vi.spyOn(global.console, 'warn').mockImplementation((...args) => { - if ( - typeof args[0] === 'string' && - args[0].includes('React Router Future Flag Warning') - ) { - return; - } - realWarn(...args); - }); - - // dynamicActivate is held pending (see mock above) so App stays on its - // loading shell — asserting the app mounted, the RTL counterpart of the - // original shallow length check. - const { container } = render(); - expect(container).toHaveTextContent('Loading...'); - }); - - test('redirect to login override', async () => { - const replaceSpy = vi - .spyOn(navigation, 'default') - .mockImplementation(() => {}); - - expect(replaceSpy).not.toHaveBeenCalled(); - - const contextValues = { - setAuthRedirectTo: vi.fn(), - isSessionExpired: false, - isUserBeingLoggedOut: false, - loginRedirectOverride: '/sso/test', - }; - vi.spyOn(SessionContext, 'useSession').mockImplementation( - () => contextValues - ); - - renderWithContexts( - -
foo
-
- ); - - await waitFor(() => expect(replaceSpy).toHaveBeenCalled()); - }); - - test('renders children when authenticated', async () => { - vi.spyOn(SessionContext, 'useSession').mockImplementation(() => ({ - setAuthRedirectTo: vi.fn(), - isSessionExpired: false, - isUserBeingLoggedOut: false, - loginRedirectOverride: null, - })); - vi.spyOn(auth, 'isAuthenticated').mockReturnValue(true); - - renderWithContexts( - -
foo
-
- ); - - expect(await screen.findByText('foo')).toBeInTheDocument(); - }); -}); diff --git a/awx/ui/src/App.test.tsx b/awx/ui/src/App.test.tsx new file mode 100644 index 000000000..a1a601e8e --- /dev/null +++ b/awx/ui/src/App.test.tsx @@ -0,0 +1,123 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import { RootAPI } from 'api'; +import * as SessionContext from 'contexts/Session'; +import * as navigation from 'util/navigation'; +import * as auth from 'util/auth'; +import type { SessionValue } from 'contexts/Session'; +import type { ResponseOf } from '../testUtils/responseOf'; +import { renderWithContexts } from '../testUtils/rtlContexts'; +import App, { ProtectedRoute } from './App'; + +vi.mock('./api'); +vi.mock('util/webWorker', () => ({ default: vi.fn() })); + +// Keep the real `locales` map (App.js validates the active language against it) +// but hold i18n activation pending so App stays on its top-level loading shell. +// This mirrors the original shallow render — it asserts App mounts without +// driving the deep provider tree, whose ConfigProvider/SessionProvider are +// globally mocked in setupTests and warn when mounted without a `value` prop. +vi.mock('./i18nLoader', async () => ({ + ...(await vi.importActual('./i18nLoader')), + // plain function, not vi.fn — resetMocks would strip a vi.fn's impl and + // make App.js's `dynamicActivate(...).then(...)` throw on undefined. + dynamicActivate: () => new Promise(() => {}), +})); + +describe('', () => { + beforeEach(() => { + vi.mocked(RootAPI.readAssetVariables).mockResolvedValue({ + data: { + BRAND_NAME: 'AWX', + }, + } as unknown as ResponseOf); + }); + + afterEach(() => { + // restoreAllMocks (not clearAllMocks) so vi.spyOn spies are actually + // restored — with resetMocks:true a leftover spy leaks into later tests + // (or partial reruns) as a reset spy that returns undefined. + vi.restoreAllMocks(); + }); + + test('renders ok', async () => { + const contextValues = { + setAuthRedirectTo: vi.fn(), + isSessionExpired: false, + isUserBeingLoggedOut: false, + loginRedirectOverride: null, + }; + vi.spyOn(SessionContext, 'useSession').mockImplementation( + () => contextValues as unknown as SessionValue + ); + + // The default export self-mounts the real HashRouter, which logs React + // Router v6 future-flag warnings ("v7_startTransition" / "v7_relativeSplatPath") + // on mount. Those are framework deprecation notices, not app warnings — let + // them through without tripping the setupTests console-warn trap, while any + // other warning still surfaces. + const realWarn = global.console.warn; + vi.spyOn(global.console, 'warn').mockImplementation((...args) => { + if ( + typeof args[0] === 'string' && + args[0].includes('React Router Future Flag Warning') + ) { + return; + } + realWarn(...args); + }); + + // dynamicActivate is held pending (see mock above) so App stays on its + // loading shell — asserting the app mounted, the RTL counterpart of the + // original shallow length check. + const { container } = render(); + expect(container).toHaveTextContent('Loading...'); + }); + + test('redirect to login override', async () => { + const replaceSpy = vi + .spyOn(navigation, 'default') + .mockImplementation(() => {}); + + expect(replaceSpy).not.toHaveBeenCalled(); + + const contextValues = { + setAuthRedirectTo: vi.fn(), + isSessionExpired: false, + isUserBeingLoggedOut: false, + loginRedirectOverride: '/sso/test', + }; + vi.spyOn(SessionContext, 'useSession').mockImplementation( + () => contextValues as unknown as SessionValue + ); + + renderWithContexts( + +
foo
+
+ ); + + await waitFor(() => expect(replaceSpy).toHaveBeenCalled()); + }); + + test('renders children when authenticated', async () => { + vi.spyOn(SessionContext, 'useSession').mockImplementation( + () => + ({ + setAuthRedirectTo: vi.fn(), + isSessionExpired: false, + isUserBeingLoggedOut: false, + loginRedirectOverride: null, + }) as unknown as SessionValue + ); + vi.spyOn(auth, 'isAuthenticated').mockReturnValue(true); + + renderWithContexts( + +
foo
+
+ ); + + expect(await screen.findByText('foo')).toBeInTheDocument(); + }); +}); diff --git a/awx/ui/src/App.tsx b/awx/ui/src/App.tsx new file mode 100644 index 000000000..5a5a83be6 --- /dev/null +++ b/awx/ui/src/App.tsx @@ -0,0 +1,241 @@ +import React, { useEffect, useLayoutEffect, useState } from 'react'; +import { + HashRouter, + Routes, + Route, + Navigate, + useLocation, + useNavigate, +} from 'react-router'; +import { ErrorBoundary } from 'react-error-boundary'; +import locationReplace from 'util/navigation'; +import { I18nProvider } from '@lingui/react'; +import { i18n } from '@lingui/core'; +import { Card, PageSection } from '@patternfly/react-core'; +import { + ConfigProvider, + useAuthorizedPath, + useUserProfile, +} from 'contexts/Config'; +import { SessionProvider, useSession } from 'contexts/Session'; +import AppContainer from 'components/AppContainer'; +import ContentError from 'components/ContentError'; +import NotFound from 'screens/NotFound'; +import Login from 'screens/Login'; +import { isAuthenticated } from 'util/auth'; +import { getLanguageWithoutRegionCode } from 'util/language'; +import Metrics from 'screens/Metrics'; +import SubscriptionEdit from 'screens/Setting/Subscription/SubscriptionEdit'; +import type { AppRouteGroup } from './routeConfig'; +import { dynamicActivate, locales } from './i18nLoader'; +import getRouteConfig from './routeConfig'; +import { getStoredThemeId, applyTheme } from './themeRegistry'; +import { SESSION_REDIRECT_URL } from './constants'; + +export interface ErrorFallbackProps { + error: unknown; + [key: string]: unknown; +} + +function ErrorFallback({ error }: ErrorFallbackProps) { + return ( + + + + + + ); +} + +const RenderAppContainer = () => { + const userProfile = useUserProfile(); + const navRouteConfig = getRouteConfig(userProfile); + + return ( + + + + ); +}; + +export interface AuthorizedRoutesProps { + routeConfig: AppRouteGroup[]; +} + +const AuthorizedRoutes = ({ routeConfig }: AuthorizedRoutesProps) => { + const isAuthorized = useAuthorizedPath(); + + if (!isAuthorized) { + return ( + + + + + + + + + } + /> + } + /> + + ); + } + + return ( + + {routeConfig + .flatMap(({ routes }) => routes) + .map(({ path, screen: Screen }) => ( + // /* so each screen's own nested can match the rest + + + + } + /> + )) + .concat( + + + + } + />, + + + + } + /> + )} + + ); +}; + +export function ProtectedRoute({ children }: { children: React.ReactNode }) { + const { + authRedirectTo, + isUserBeingLoggedOut, + loginRedirectOverride, + setAuthRedirectTo, + } = useSession(); + const location = useLocation(); + + useEffect(() => { + setAuthRedirectTo( + authRedirectTo === '/logout' + ? '/' + : `${location.pathname}${location.search}` + ); + }); + + if (isAuthenticated(document.cookie)) { + return ( + + {children} + + ); + } + + if ( + loginRedirectOverride && + !window.location.href.includes('/login') && + !isUserBeingLoggedOut + ) { + locationReplace(loginRedirectOverride); + return null; + } + return ; +} + +function App() { + const [isLoading, setIsLoading] = useState(true); + + useLayoutEffect(() => { + applyTheme(getStoredThemeId()); + }, []); + const navigate = useNavigate(); + const { search } = useLocation(); + const searchParams = Object.fromEntries(new URLSearchParams(search)); + const pseudolocalization = + searchParams.pseudolocalization === 'true' || false; + let language = + searchParams.lang || + localStorage.getItem('preferred_language') || + getLanguageWithoutRegionCode(navigator) || + 'en'; + + if (!Object.keys(locales).includes(language)) { + // If there isn't a string catalog available for the browser's + // preferred language, default to one that has strings. + language = 'en'; + } + + useEffect(() => { + dynamicActivate(language, pseudolocalization).then(() => { + setIsLoading(false); + }); + }, [language, pseudolocalization]); + + const redirectURL = window.sessionStorage.getItem(SESSION_REDIRECT_URL); + if (redirectURL) { + window.sessionStorage.removeItem(SESSION_REDIRECT_URL); + if (redirectURL !== '/' && redirectURL !== '/home') + navigate(redirectURL, { replace: true }); + } + + if (isLoading) { + return ( + // Don't render I18nProvider until i18n is activated + + // eslint-disable-next-line i18next/no-literal-string +
Loading...
+ ); + } + + return ( + + + + } + /> + } /> + + + + + + } + /> + + + + ); +} + +export default () => ( + + + +); diff --git a/awx/ui/src/api/Base.js b/awx/ui/src/api/Base.js deleted file mode 100644 index 7056b361b..000000000 --- a/awx/ui/src/api/Base.js +++ /dev/null @@ -1,176 +0,0 @@ -/* eslint-disable default-param-last */ -import { encodeQueryString } from 'util/qs'; -import debounce from 'util/debounce'; -import { SESSION_TIMEOUT_KEY } from '../constants'; - -const updateStorage = debounce((key, val) => { - window.localStorage.setItem(key, val); - window.dispatchEvent(new Event('storage')); -}, 500); - -export function getCookie(name) { - const match = document.cookie.match(new RegExp(`(?:^|;\\s*)${name}=([^;]*)`)); - return match ? decodeURIComponent(match[1]) : null; -} - -function headersToObject(fetchHeaders) { - const obj = {}; - fetchHeaders.forEach((value, key) => { - obj[key] = value; - }); - return obj; -} - -async function handleResponse(fetchResponse) { - const headers = headersToObject(fetchResponse.headers); - const { status } = fetchResponse; - let data; - const contentType = headers['content-type'] || ''; - if (contentType.includes('application/json')) { - const text = await fetchResponse.text(); - if (text.trim()) { - try { - data = JSON.parse(text); - } catch { - data = text; - } - } else { - data = null; - } - } else { - const text = await fetchResponse.text(); - try { - data = JSON.parse(text); - } catch { - data = text; - } - } - - const response = { data, status, headers }; - - if (!fetchResponse.ok) { - const error = new Error(`Request failed with status code ${status}`); - error.response = response; - throw error; - } - - const timeout = headers['session-timeout']; - if (timeout) { - const timeoutDate = new Date().getTime() + Number(timeout) * 1000; - updateStorage(SESSION_TIMEOUT_KEY, String(timeoutDate)); - } - - return response; -} - -function buildUrl(url, params) { - if (!params) return url; - const qs = encodeQueryString(params); - if (!qs) return url; - const separator = url.includes('?') ? '&' : '?'; - return `${url}${separator}${qs}`; -} - -function makeRequest(method, url, dataOrConfig, config) { - const hasBody = ['POST', 'PUT', 'PATCH'].includes(method); - const body = hasBody ? dataOrConfig : undefined; - const reqConfig = hasBody ? config : dataOrConfig; - const params = reqConfig?.params; - - const fetchUrl = buildUrl(url, params); - const headers = { Accept: 'application/json, text/plain, */*' }; - - const csrfToken = getCookie('csrftoken'); - if (csrfToken) { - headers['X-CSRFToken'] = csrfToken; - } - - if (reqConfig?.headers) { - Object.assign(headers, reqConfig.headers); - } - - const fetchOptions = { method, headers, credentials: 'same-origin' }; - - // Pass through fetch-specific options - const fetchOptionKeys = [ - 'signal', - 'cache', - 'redirect', - 'referrer', - 'referrerPolicy', - 'mode', - 'credentials', - ]; - if (reqConfig) { - fetchOptionKeys.forEach((key) => { - if (reqConfig[key] !== undefined) { - fetchOptions[key] = reqConfig[key]; - } - }); - } - - if (body !== undefined) { - if (typeof body === 'string') { - fetchOptions.body = body; - } else { - if (!new Headers(headers).has('content-type')) { - headers['Content-Type'] = 'application/json'; - } - fetchOptions.body = JSON.stringify(body); - } - } - - return fetch(fetchUrl, fetchOptions).then(handleResponse); -} - -const defaultHttp = { - get: (url, config) => makeRequest('GET', url, config), - post: (url, data, config) => makeRequest('POST', url, data, config), - put: (url, data, config) => makeRequest('PUT', url, data, config), - patch: (url, data, config) => makeRequest('PATCH', url, data, config), - delete: (url, config) => makeRequest('DELETE', url, config), - options: (url, config) => makeRequest('OPTIONS', url, config), -}; - -class Base { - constructor(http = defaultHttp, baseURL) { - this.http = http; - this.baseUrl = baseURL; - } - - create(data) { - return this.http.post(this.baseUrl, data); - } - - destroy(id) { - return this.http.delete(`${this.baseUrl}${id}/`); - } - - read(params) { - return this.http.get(this.baseUrl, { - params, - }); - } - - readDetail(id) { - return this.http.get(`${this.baseUrl}${id}/`); - } - - readOptions() { - return this.http.options(this.baseUrl); - } - - replace(id, data) { - return this.http.put(`${this.baseUrl}${id}/`, data); - } - - update(id, data) { - return this.http.patch(`${this.baseUrl}${id}/`, data); - } - - copy(id, data) { - return this.http.post(`${this.baseUrl}${id}/copy/`, data); - } -} - -export default Base; diff --git a/awx/ui/src/api/Base.test.js b/awx/ui/src/api/Base.test.js deleted file mode 100644 index c1ec03fa0..000000000 --- a/awx/ui/src/api/Base.test.js +++ /dev/null @@ -1,301 +0,0 @@ -import Base from './Base'; - -function mockFetchResponse(overrides = {}) { - const headers = new Headers(overrides.headers || {}); - const text = - overrides.text !== undefined - ? overrides.text - : JSON.stringify(overrides.json || {}); - return { - ok: overrides.ok !== undefined ? overrides.ok : true, - status: overrides.status || 200, - headers, - json: vi.fn(() => Promise.resolve(JSON.parse(text))), - text: vi.fn(() => Promise.resolve(text)), - }; -} - -describe('Base', () => { - const mockBaseURL = '/api/v2/organizations/'; - - let BaseAPI; - let mockHttp; - - beforeEach(() => { - const createPromise = () => Promise.resolve(); - mockHttp = { - delete: vi.fn(createPromise), - get: vi.fn(createPromise), - options: vi.fn(createPromise), - patch: vi.fn(createPromise), - post: vi.fn(createPromise), - put: vi.fn(createPromise), - }; - BaseAPI = new Base(mockHttp, mockBaseURL); - }); - - afterEach(() => { - vi.resetAllMocks(); - }); - - test('create calls http method with expected data', async () => { - const data = { name: 'test ' }; - await BaseAPI.create(data); - - expect(mockHttp.post).toHaveBeenCalledTimes(1); - expect(mockHttp.post.mock.calls[0][1]).toEqual(data); - }); - - test('destroy calls http method with expected data', async () => { - const resourceId = 1; - await BaseAPI.destroy(resourceId); - - expect(mockHttp.delete).toHaveBeenCalledTimes(1); - expect(mockHttp.delete.mock.calls[0][0]).toEqual( - `${mockBaseURL}${resourceId}/` - ); - }); - - test('read calls http method with expected data', async () => { - const testParams = { foo: 'bar' }; - const testParamsDuplicates = { foo: ['bar', 'baz'] }; - - await BaseAPI.read(testParams); - await BaseAPI.read(); - await BaseAPI.read(testParamsDuplicates); - - expect(mockHttp.get).toHaveBeenCalledTimes(3); - expect(mockHttp.get.mock.calls[0][0]).toEqual(`${mockBaseURL}`); - expect(mockHttp.get.mock.calls[0][1]).toEqual({ params: { foo: 'bar' } }); - expect(mockHttp.get.mock.calls[1][0]).toEqual(`${mockBaseURL}`); - expect(mockHttp.get.mock.calls[1][1]).toEqual({ params: undefined }); - expect(mockHttp.get.mock.calls[2][0]).toEqual(`${mockBaseURL}`); - expect(mockHttp.get.mock.calls[2][1]).toEqual({ - params: { foo: ['bar', 'baz'] }, - }); - }); - - test('readDetail calls http method with expected data', async () => { - const resourceId = 1; - - await BaseAPI.readDetail(resourceId); - - expect(mockHttp.get).toHaveBeenCalledTimes(1); - expect(mockHttp.get.mock.calls[0][0]).toEqual( - `${mockBaseURL}${resourceId}/` - ); - }); - - test('readOptions calls http method with expected data', async () => { - await BaseAPI.readOptions(); - - expect(mockHttp.options).toHaveBeenCalledTimes(1); - expect(mockHttp.options.mock.calls[0][0]).toEqual(`${mockBaseURL}`); - }); - - test('replace calls http method with expected data', async () => { - const resourceId = 1; - const data = { name: 'test ' }; - - await BaseAPI.replace(resourceId, data); - - expect(mockHttp.put).toHaveBeenCalledTimes(1); - expect(mockHttp.put.mock.calls[0][0]).toEqual( - `${mockBaseURL}${resourceId}/` - ); - expect(mockHttp.put.mock.calls[0][1]).toEqual(data); - }); - - test('update calls http method with expected data', async () => { - const resourceId = 1; - const data = { name: 'test ' }; - - await BaseAPI.update(resourceId, data); - - expect(mockHttp.patch).toHaveBeenCalledTimes(1); - expect(mockHttp.patch.mock.calls[0][0]).toEqual( - `${mockBaseURL}${resourceId}/` - ); - expect(mockHttp.patch.mock.calls[0][1]).toEqual(data); - }); -}); - -describe('defaultHttp (fetch-based client)', () => { - const mockBaseURL = '/api/v2/items/'; - let api; - - beforeEach(() => { - global.fetch = vi.fn(() => - Promise.resolve( - mockFetchResponse({ - headers: { 'content-type': 'application/json' }, - json: { results: [] }, - }) - ) - ); - // Clear any cookies from previous tests - document.cookie = 'csrftoken=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - api = new Base(undefined, mockBaseURL); - }); - - afterEach(() => { - vi.resetAllMocks(); - document.cookie = 'csrftoken=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - }); - - test('GET appends query string from params', async () => { - await api.read({ page: 1, page_size: 5 }); - - const [url] = global.fetch.mock.calls[0]; - expect(url).toContain('page=1'); - expect(url).toContain('page_size=5'); - }); - - test('GET appends params to URLs that already have query strings', async () => { - await api.http.get('/api/existing?a=1&b=2', { params: { c: 3, d: 4 } }); - - const [url] = global.fetch.mock.calls[0]; - expect(url).toBe('/api/existing?a=1&b=2&c=3&d=4'); - }); - - test('GET without params does not append query string', async () => { - await api.readDetail(42); - - const [url] = global.fetch.mock.calls[0]; - expect(url).toBe(`${mockBaseURL}42/`); - }); - - test('POST sends JSON body with Content-Type header', async () => { - const data = { name: 'test' }; - await api.create(data); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.method).toBe('POST'); - expect(options.headers['Content-Type']).toBe('application/json'); - expect(options.body).toBe(JSON.stringify(data)); - }); - - test('POST with string body sends it as-is without overriding Content-Type', async () => { - const formData = 'username=foo&password=bar'; - const customHeaders = { - 'Content-Type': 'application/x-www-form-urlencoded', - }; - - await api.http.post('/api/login/', formData, { headers: customHeaders }); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.body).toBe(formData); - expect(options.headers['Content-Type']).toBe( - 'application/x-www-form-urlencoded' - ); - }); - - test('custom config headers are merged onto defaults', async () => { - await api.http.get('/api/login/', { - headers: { 'X-Custom': 'value' }, - }); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.headers['X-Custom']).toBe('value'); - expect(options.headers.Accept).toBe('application/json, text/plain, */*'); - }); - - test('CSRF token is included when cookie is set', async () => { - document.cookie = 'csrftoken=abc123'; - - await api.read(); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.headers['X-CSRFToken']).toBe('abc123'); - }); - - test('CSRF token is omitted when cookie is not set', async () => { - document.cookie = ''; - - await api.read(); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.headers['X-CSRFToken']).toBeUndefined(); - }); - - test('response contains data, status, and headers', async () => { - global.fetch.mockResolvedValueOnce( - mockFetchResponse({ - status: 200, - headers: { 'content-type': 'application/json' }, - json: { id: 1, name: 'org' }, - }) - ); - - const response = await api.readDetail(1); - - expect(response.status).toBe(200); - expect(response.data).toEqual({ id: 1, name: 'org' }); - expect(response.headers).toBeDefined(); - }); - - test('non-2xx response throws error with response attached', async () => { - global.fetch.mockResolvedValueOnce( - mockFetchResponse({ - ok: false, - status: 404, - headers: { 'content-type': 'application/json' }, - json: { detail: 'Not found.' }, - }) - ); - - let caughtError; - try { - await api.readDetail(999); - } catch (e) { - caughtError = e; - } - - expect(caughtError).toBeDefined(); - expect(caughtError.message).toBe('Request failed with status code 404'); - expect(caughtError.response.status).toBe(404); - expect(caughtError.response.data).toEqual({ detail: 'Not found.' }); - expect(caughtError.response.headers).toBeDefined(); - }); - - test('non-JSON response body is returned as text', async () => { - global.fetch.mockResolvedValueOnce( - mockFetchResponse({ - headers: { 'content-type': 'text/html' }, - text: 'OK', - }) - ); - - const response = await api.readDetail(1); - - expect(response.data).toBe('OK'); - }); - - test('empty JSON response body returns null', async () => { - global.fetch.mockResolvedValueOnce( - mockFetchResponse({ - headers: { 'content-type': 'application/json' }, - text: '', - }) - ); - - const response = await api.readDetail(1); - - expect(response.data).toBe(null); - }); - - test('fetch options like signal are passed through to fetch', async () => { - const abortController = new AbortController(); - await api.http.get('/api/test/', { signal: abortController.signal }); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.signal).toBe(abortController.signal); - }); - - test('credentials are set to same-origin', async () => { - await api.read(); - - const [, options] = global.fetch.mock.calls[0]; - expect(options.credentials).toBe('same-origin'); - }); -}); diff --git a/awx/ui/src/api/Base.test.ts b/awx/ui/src/api/Base.test.ts new file mode 100644 index 000000000..2575f0ce3 --- /dev/null +++ b/awx/ui/src/api/Base.test.ts @@ -0,0 +1,327 @@ +import type { Mock } from 'vitest'; +import type { ApiError, Http } from './Base'; +import Base from './Base'; + +/** Only the members mockFetchResponse is ever handed, all of them optional. */ +interface FetchResponseOverrides { + ok?: boolean; + status?: number; + headers?: Record; + json?: unknown; + text?: string; +} + +// Enough of a Response for the client under test: it reads ok, status, the +// content type and one of json or text. +function mockFetchResponse(overrides: FetchResponseOverrides = {}): Response { + const headers = new Headers(overrides.headers || {}); + const text = + overrides.text !== undefined + ? overrides.text + : JSON.stringify(overrides.json || {}); + return { + ok: overrides.ok !== undefined ? overrides.ok : true, + status: overrides.status || 200, + headers, + json: vi.fn(() => Promise.resolve(JSON.parse(text))), + text: vi.fn(() => Promise.resolve(text)), + } as unknown as Response; +} + +describe('Base', () => { + const mockBaseURL = '/api/v2/organizations/'; + + let BaseAPI: Base; + // Each method is a vi.fn, so the assertions below can read its calls. + let mockHttp: Record; + + beforeEach(() => { + const createPromise = () => Promise.resolve(); + mockHttp = { + delete: vi.fn(createPromise), + get: vi.fn(createPromise), + options: vi.fn(createPromise), + patch: vi.fn(createPromise), + post: vi.fn(createPromise), + put: vi.fn(createPromise), + }; + BaseAPI = new Base(mockHttp as unknown as Http, mockBaseURL); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + test('create calls http method with expected data', async () => { + const data = { name: 'test ' }; + await BaseAPI.create(data); + + expect(mockHttp.post).toHaveBeenCalledTimes(1); + expect(mockHttp.post.mock.calls[0]?.[1]).toEqual(data); + }); + + test('destroy calls http method with expected data', async () => { + const resourceId = 1; + await BaseAPI.destroy(resourceId); + + expect(mockHttp.delete).toHaveBeenCalledTimes(1); + expect(mockHttp.delete.mock.calls[0]?.[0]).toEqual( + `${mockBaseURL}${resourceId}/` + ); + }); + + test('read calls http method with expected data', async () => { + const testParams = { foo: 'bar' }; + const testParamsDuplicates = { foo: ['bar', 'baz'] }; + + await BaseAPI.read(testParams); + await BaseAPI.read(); + await BaseAPI.read(testParamsDuplicates); + + expect(mockHttp.get).toHaveBeenCalledTimes(3); + expect(mockHttp.get.mock.calls[0]?.[0]).toEqual(`${mockBaseURL}`); + expect(mockHttp.get.mock.calls[0]?.[1]).toEqual({ params: { foo: 'bar' } }); + expect(mockHttp.get.mock.calls[1]?.[0]).toEqual(`${mockBaseURL}`); + expect(mockHttp.get.mock.calls[1]?.[1]).toEqual({ params: undefined }); + expect(mockHttp.get.mock.calls[2]?.[0]).toEqual(`${mockBaseURL}`); + expect(mockHttp.get.mock.calls[2]?.[1]).toEqual({ + params: { foo: ['bar', 'baz'] }, + }); + }); + + test('readDetail calls http method with expected data', async () => { + const resourceId = 1; + + await BaseAPI.readDetail(resourceId); + + expect(mockHttp.get).toHaveBeenCalledTimes(1); + expect(mockHttp.get.mock.calls[0]?.[0]).toEqual( + `${mockBaseURL}${resourceId}/` + ); + }); + + test('readOptions calls http method with expected data', async () => { + await BaseAPI.readOptions(); + + expect(mockHttp.options).toHaveBeenCalledTimes(1); + expect(mockHttp.options.mock.calls[0]?.[0]).toEqual(`${mockBaseURL}`); + }); + + test('replace calls http method with expected data', async () => { + const resourceId = 1; + const data = { name: 'test ' }; + + await BaseAPI.replace(resourceId, data); + + expect(mockHttp.put).toHaveBeenCalledTimes(1); + expect(mockHttp.put.mock.calls[0]?.[0]).toEqual( + `${mockBaseURL}${resourceId}/` + ); + expect(mockHttp.put.mock.calls[0]?.[1]).toEqual(data); + }); + + test('update calls http method with expected data', async () => { + const resourceId = 1; + const data = { name: 'test ' }; + + await BaseAPI.update(resourceId, data); + + expect(mockHttp.patch).toHaveBeenCalledTimes(1); + expect(mockHttp.patch.mock.calls[0]?.[0]).toEqual( + `${mockBaseURL}${resourceId}/` + ); + expect(mockHttp.patch.mock.calls[0]?.[1]).toEqual(data); + }); +}); + +/** The url and options the client passed to fetch, as this suite reads them. */ +function fetchCall(): [ + string, + RequestInit & { headers: Record }, +] { + const [url, options] = vi.mocked(global.fetch).mock.calls[0] as unknown as [ + string, + RequestInit & { headers: Record }, + ]; + return [url, options]; +} + +describe('defaultHttp (fetch-based client)', () => { + const mockBaseURL = '/api/v2/items/'; + let api: Base; + + beforeEach(() => { + global.fetch = vi.fn(() => + Promise.resolve( + mockFetchResponse({ + headers: { 'content-type': 'application/json' }, + json: { results: [] }, + }) + ) + ); + // Clear any cookies from previous tests + document.cookie = 'csrftoken=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + api = new Base(undefined, mockBaseURL); + }); + + afterEach(() => { + vi.resetAllMocks(); + document.cookie = 'csrftoken=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + }); + + test('GET appends query string from params', async () => { + await api.read({ page: 1, page_size: 5 }); + + const [url] = fetchCall(); + expect(url).toContain('page=1'); + expect(url).toContain('page_size=5'); + }); + + test('GET appends params to URLs that already have query strings', async () => { + await api.http.get('/api/existing?a=1&b=2', { params: { c: 3, d: 4 } }); + + const [url] = fetchCall(); + expect(url).toBe('/api/existing?a=1&b=2&c=3&d=4'); + }); + + test('GET without params does not append query string', async () => { + await api.readDetail(42); + + const [url] = fetchCall(); + expect(url).toBe(`${mockBaseURL}42/`); + }); + + test('POST sends JSON body with Content-Type header', async () => { + const data = { name: 'test' }; + await api.create(data); + + const [, options] = fetchCall(); + expect(options.method).toBe('POST'); + expect(options.headers['Content-Type']).toBe('application/json'); + expect(options.body).toBe(JSON.stringify(data)); + }); + + test('POST with string body sends it as-is without overriding Content-Type', async () => { + const formData = 'username=foo&password=bar'; + const customHeaders = { + 'Content-Type': 'application/x-www-form-urlencoded', + }; + + await api.http.post('/api/login/', formData, { headers: customHeaders }); + + const [, options] = fetchCall(); + expect(options.body).toBe(formData); + expect(options.headers['Content-Type']).toBe( + 'application/x-www-form-urlencoded' + ); + }); + + test('custom config headers are merged onto defaults', async () => { + await api.http.get('/api/login/', { + headers: { 'X-Custom': 'value' }, + }); + + const [, options] = fetchCall(); + expect(options.headers['X-Custom']).toBe('value'); + expect(options.headers.Accept).toBe('application/json, text/plain, */*'); + }); + + test('CSRF token is included when cookie is set', async () => { + document.cookie = 'csrftoken=abc123'; + + await api.read(); + + const [, options] = fetchCall(); + expect(options.headers['X-CSRFToken']).toBe('abc123'); + }); + + test('CSRF token is omitted when cookie is not set', async () => { + document.cookie = ''; + + await api.read(); + + const [, options] = fetchCall(); + expect(options.headers['X-CSRFToken']).toBeUndefined(); + }); + + test('response contains data, status, and headers', async () => { + vi.mocked(global.fetch).mockResolvedValueOnce( + mockFetchResponse({ + status: 200, + headers: { 'content-type': 'application/json' }, + json: { id: 1, name: 'org' }, + }) + ); + + const response = await api.readDetail(1); + + expect(response.status).toBe(200); + expect(response.data).toEqual({ id: 1, name: 'org' }); + expect(response.headers).toBeDefined(); + }); + + test('non-2xx response throws error with response attached', async () => { + vi.mocked(global.fetch).mockResolvedValueOnce( + mockFetchResponse({ + ok: false, + status: 404, + headers: { 'content-type': 'application/json' }, + json: { detail: 'Not found.' }, + }) + ); + + let caughtError: ApiError | undefined; + try { + await api.readDetail(999); + } catch (e) { + caughtError = e as ApiError; + } + + expect(caughtError).toBeDefined(); + expect(caughtError?.message).toBe('Request failed with status code 404'); + expect(caughtError?.response?.status).toBe(404); + expect(caughtError?.response?.data).toEqual({ detail: 'Not found.' }); + expect(caughtError?.response?.headers).toBeDefined(); + }); + + test('non-JSON response body is returned as text', async () => { + vi.mocked(global.fetch).mockResolvedValueOnce( + mockFetchResponse({ + headers: { 'content-type': 'text/html' }, + text: 'OK', + }) + ); + + const response = await api.readDetail(1); + + expect(response.data).toBe('OK'); + }); + + test('empty JSON response body returns null', async () => { + vi.mocked(global.fetch).mockResolvedValueOnce( + mockFetchResponse({ + headers: { 'content-type': 'application/json' }, + text: '', + }) + ); + + const response = await api.readDetail(1); + + expect(response.data).toBe(null); + }); + + test('fetch options like signal are passed through to fetch', async () => { + const abortController = new AbortController(); + await api.http.get('/api/test/', { signal: abortController.signal }); + + const [, options] = fetchCall(); + expect(options.signal).toBe(abortController.signal); + }); + + test('credentials are set to same-origin', async () => { + await api.read(); + + const [, options] = fetchCall(); + expect(options.credentials).toBe('same-origin'); + }); +}); diff --git a/awx/ui/src/api/Base.ts b/awx/ui/src/api/Base.ts new file mode 100644 index 000000000..22fbab303 --- /dev/null +++ b/awx/ui/src/api/Base.ts @@ -0,0 +1,283 @@ +// The http transport is defaulted and the base url is not, which reads +// backwards but is the constructor every model already calls. Renaming it is +// a change to 40 subclasses, not to this file. + +// These three are still JavaScript. allowJs means their types are inferred +// rather than declared, which is the point of adopting this a file at a time. +import { encodeQueryString } from 'util/qs'; +import type { QSParams } from 'util/qs'; +import debounce from 'util/debounce'; +import type { ApiResponse, OptionsResponse, Paginated } from '../types/api'; +import { SESSION_TIMEOUT_KEY } from '../constants'; + +// Declared with the api types, and re-exported here because every caller +// reaches it through the transport rather than through the type module. +export type { ApiResponse }; + +/** An error thrown by a failed request, carrying the response with it. */ +export interface ApiError extends Error { + response?: ApiResponse; +} + +/** The per-request options this client accepts, a subset of fetch's own. */ +export interface RequestConfig extends Partial> { + params?: QSParams; + headers?: Record; +} + +type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS'; + +/** + * The transport every model talks through. Declared as an interface because + * the test suite substitutes its own, and typing it is what makes a mock that + * does not match the real client a build error rather than a runtime surprise. + */ +export interface Http { + get( + url: string, + config?: RequestConfig + ): Promise>; + post( + url: string, + data?: unknown, + config?: RequestConfig + ): Promise>; + put( + url: string, + data?: unknown, + config?: RequestConfig + ): Promise>; + patch( + url: string, + data?: unknown, + config?: RequestConfig + ): Promise>; + delete( + url: string, + config?: RequestConfig + ): Promise>; + options( + url: string, + config?: RequestConfig + ): Promise>; +} + +const updateStorage = debounce((key: string, val: string) => { + window.localStorage.setItem(key, val); + window.dispatchEvent(new Event('storage')); +}, 500); + +export function getCookie(name: string): string | null { + const match = document.cookie.match(new RegExp(`(?:^|;\\s*)${name}=([^;]*)`)); + // match[1] is only present when the pattern matched with its group, which + // the old code assumed. An empty cookie value reaches here as ''. + return match?.[1] !== undefined ? decodeURIComponent(match[1]) : null; +} + +function headersToObject(fetchHeaders: Headers): Record { + const obj: Record = {}; + fetchHeaders.forEach((value, key) => { + obj[key] = value; + }); + return obj; +} + +async function handleResponse(fetchResponse: Response): Promise { + const headers = headersToObject(fetchResponse.headers); + const { status } = fetchResponse; + let data: unknown; + const contentType = headers['content-type'] || ''; + if (contentType.includes('application/json')) { + const text = await fetchResponse.text(); + if (text.trim()) { + try { + data = JSON.parse(text); + } catch { + data = text; + } + } else { + data = null; + } + } else { + const text = await fetchResponse.text(); + try { + data = JSON.parse(text); + } catch { + data = text; + } + } + + const response = { data, status, headers }; + + if (!fetchResponse.ok) { + const error: ApiError = new Error( + `Request failed with status code ${status}` + ); + error.response = response; + throw error; + } + + const timeout = headers['session-timeout']; + if (timeout) { + const timeoutDate = new Date().getTime() + Number(timeout) * 1000; + updateStorage(SESSION_TIMEOUT_KEY, String(timeoutDate)); + } + + return response; +} + +function buildUrl(url: string, params?: QSParams): string { + if (!params) return url; + const qs = encodeQueryString(params); + if (!qs) return url; + const separator = url.includes('?') ? '&' : '?'; + return `${url}${separator}${qs}`; +} + +function makeRequest( + method: HttpMethod, + url: string, + dataOrConfig?: unknown, + config?: RequestConfig +): Promise> { + const hasBody = ['POST', 'PUT', 'PATCH'].includes(method); + const body = hasBody ? dataOrConfig : undefined; + const reqConfig = (hasBody ? config : dataOrConfig) as + RequestConfig | undefined; + const params = reqConfig?.params; + + const fetchUrl = buildUrl(url, params); + const headers: Record = { + Accept: 'application/json, text/plain, */*', + }; + + const csrfToken = getCookie('csrftoken'); + if (csrfToken) { + headers['X-CSRFToken'] = csrfToken; + } + + if (reqConfig?.headers) { + Object.assign(headers, reqConfig.headers); + } + + const fetchOptions: RequestInit = { + method, + headers, + credentials: 'same-origin', + }; + + // Pass through fetch-specific options + const fetchOptionKeys: (keyof RequestInit)[] = [ + 'signal', + 'cache', + 'redirect', + 'referrer', + 'referrerPolicy', + 'mode', + 'credentials', + ]; + if (reqConfig) { + fetchOptionKeys.forEach((key) => { + const value = (reqConfig as Record)[key]; + if (value !== undefined) { + (fetchOptions as Record)[key] = value; + } + }); + } + + if (body !== undefined) { + if (typeof body === 'string') { + fetchOptions.body = body; + } else { + if (!new Headers(headers).has('content-type')) { + headers['Content-Type'] = 'application/json'; + } + fetchOptions.body = JSON.stringify(body); + } + } + + return fetch(fetchUrl, fetchOptions).then(handleResponse) as Promise< + ApiResponse + >; +} + +const defaultHttp: Http = { + get: (url, config) => makeRequest('GET', url, config), + post: (url, data, config) => makeRequest('POST', url, data, config), + put: (url, data, config) => makeRequest('PUT', url, data, config), + patch: (url, data, config) => makeRequest('PATCH', url, data, config), + delete: (url, config) => makeRequest('DELETE', url, config), + options: (url, config) => makeRequest('OPTIONS', url, config), +}; + +/** + * The endpoints every model gets for free, over whichever resource it serves. + * + * The resource is the type parameter, so `Base` answers a page of teams + * from read() and one team from readDetail(). A subclass reached through a + * mixin cannot pass it along, so those models override the calls they use + * instead. Every method still takes its own type argument, for the endpoints + * that answer with something other than the resource. + */ +class Base { + http: Http; + + baseUrl: string; + + // baseURL is optional because almost every subclass calls super(http) and + // then assigns this.baseUrl itself, which is the pattern all 51 models use. + constructor(http: Http = defaultHttp, baseURL = '') { + this.http = http; + this.baseUrl = baseURL; + } + + create(data?: unknown) { + return this.http.post(this.baseUrl, data); + } + + destroy(id: number | string) { + return this.http.delete(`${this.baseUrl}${id}/`); + } + + read>(params?: QSParams) { + return this.http.get(this.baseUrl, { + params, + }); + } + + readDetail(id: number | string) { + return this.http.get(`${this.baseUrl}${id}/`); + } + + readOptions() { + return this.http.options(this.baseUrl); + } + + replace(id: number | string, data?: unknown) { + return this.http.put(`${this.baseUrl}${id}/`, data); + } + + update(id: number | string, data?: unknown) { + return this.http.patch(`${this.baseUrl}${id}/`, data); + } + + copy(id: number | string, data?: unknown) { + return this.http.post(`${this.baseUrl}${id}/copy/`, data); + } +} + +/** + * What a mixin factory accepts. The mixins in api/mixins are functions taking + * a class and returning a subclass of it, so each needs its parent constrained + * to something that actually has an http and a baseUrl to call through. + */ +// any[] rather than never[] or unknown[] is required here, not a shortcut: +// TypeScript only recognises a class as a mixin base when its constructor +// takes a single rest parameter of exactly any[], and rejects it as TS2545 +// otherwise. + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Constructor = new (...args: any[]) => T; +export type BaseConstructor = Constructor; + +export default Base; diff --git a/awx/ui/src/api/index.js b/awx/ui/src/api/index.ts similarity index 100% rename from awx/ui/src/api/index.js rename to awx/ui/src/api/index.ts diff --git a/awx/ui/src/api/mixins/InstanceGroups.mixin.js b/awx/ui/src/api/mixins/InstanceGroups.mixin.js deleted file mode 100644 index e2e230122..000000000 --- a/awx/ui/src/api/mixins/InstanceGroups.mixin.js +++ /dev/null @@ -1,44 +0,0 @@ -function isEqual(array1, array2) { - return ( - array1.length === array2.length && - array1.every((element, index) => element.id === array2[index].id) - ); -} - -const InstanceGroupsMixin = (parent) => - class extends parent { - readInstanceGroups(resourceId, params) { - return this.http.get(`${this.baseUrl}${resourceId}/instance_groups/`, { - params, - }); - } - - associateInstanceGroup(resourceId, instanceGroupId) { - return this.http.post(`${this.baseUrl}${resourceId}/instance_groups/`, { - id: instanceGroupId, - }); - } - - disassociateInstanceGroup(resourceId, instanceGroupId) { - return this.http.post(`${this.baseUrl}${resourceId}/instance_groups/`, { - id: instanceGroupId, - disassociate: true, - }); - } - - async orderInstanceGroups(resourceId, current, original) { - /* eslint-disable no-await-in-loop, no-restricted-syntax */ - // Resolve Promises sequentially to maintain order and avoid race condition - if (!isEqual(current, original)) { - for (const group of original) { - await this.disassociateInstanceGroup(resourceId, group.id); - } - for (const group of current) { - await this.associateInstanceGroup(resourceId, group.id); - } - } - } - /* eslint-enable no-await-in-loop, no-restricted-syntax */ - }; - -export default InstanceGroupsMixin; diff --git a/awx/ui/src/api/mixins/InstanceGroups.mixin.ts b/awx/ui/src/api/mixins/InstanceGroups.mixin.ts new file mode 100644 index 000000000..b9cac0006 --- /dev/null +++ b/awx/ui/src/api/mixins/InstanceGroups.mixin.ts @@ -0,0 +1,64 @@ +import type { QSParams } from 'util/qs'; +import type { InstanceGroup, Paginated } from '../../types/api'; +import type { BaseConstructor } from '../Base'; + +function isEqual( + array1: { id: number | string }[], + array2: { id: number | string }[] +): boolean { + return ( + array1.length === array2.length && + array1.every((element, index) => element.id === array2[index]?.id) + ); +} + +const InstanceGroupsMixin = (parent: T) => + class extends parent { + readInstanceGroups(resourceId: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${resourceId}/instance_groups/`, + { + params, + } + ); + } + + associateInstanceGroup( + resourceId: number | string, + instanceGroupId: number | string + ) { + return this.http.post(`${this.baseUrl}${resourceId}/instance_groups/`, { + id: instanceGroupId, + }); + } + + disassociateInstanceGroup( + resourceId: number | string, + instanceGroupId: number | string + ) { + return this.http.post(`${this.baseUrl}${resourceId}/instance_groups/`, { + id: instanceGroupId, + disassociate: true, + }); + } + + async orderInstanceGroups( + resourceId: number | string, + current: { id: number | string }[], + original: { id: number | string }[] + ) { + /* eslint-disable no-await-in-loop, no-restricted-syntax */ + // Resolve Promises sequentially to maintain order and avoid race condition + if (!isEqual(current, original)) { + for (const group of original) { + await this.disassociateInstanceGroup(resourceId, group.id); + } + for (const group of current) { + await this.associateInstanceGroup(resourceId, group.id); + } + } + } + /* eslint-enable no-await-in-loop, no-restricted-syntax */ + }; + +export default InstanceGroupsMixin; diff --git a/awx/ui/src/api/mixins/Labels.mixin.js b/awx/ui/src/api/mixins/Labels.mixin.js deleted file mode 100644 index 98aae1203..000000000 --- a/awx/ui/src/api/mixins/Labels.mixin.js +++ /dev/null @@ -1,49 +0,0 @@ -const LabelsMixin = (parent) => - class extends parent { - readLabels(id, params) { - return this.http.get(`${this.baseUrl}${id}/labels/`, { - params, - }); - } - - readAllLabels(id) { - const fetchLabels = async (pageNo = 1, labels = []) => { - try { - const { data } = await this.http.get(`${this.baseUrl}${id}/labels/`, { - params: { - page: pageNo, - page_size: 200, - }, - }); - if (data?.next) { - return fetchLabels(pageNo + 1, labels.concat(data.results)); - } - return Promise.resolve({ - data: { - results: labels.concat(data.results), - }, - }); - } catch (error) { - return Promise.reject(error); - } - }; - - return fetchLabels(); - } - - associateLabel(id, label, orgId) { - return this.http.post(`${this.baseUrl}${id}/labels/`, { - name: label.name, - organization: orgId, - }); - } - - disassociateLabel(id, label) { - return this.http.post(`${this.baseUrl}${id}/labels/`, { - id: label.id, - disassociate: true, - }); - } - }; - -export default LabelsMixin; diff --git a/awx/ui/src/api/mixins/Labels.mixin.ts b/awx/ui/src/api/mixins/Labels.mixin.ts new file mode 100644 index 000000000..32e48cc26 --- /dev/null +++ b/awx/ui/src/api/mixins/Labels.mixin.ts @@ -0,0 +1,64 @@ +import type { QSParams } from 'util/qs'; +import type { BaseConstructor } from '../Base'; +import type { Label, Paginated } from '../../types/api'; + +const LabelsMixin = (parent: T) => + class extends parent { + readLabels(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/labels/`, { + params, + }); + } + + readAllLabels(id: number | string) { + const fetchLabels = async ( + pageNo = 1, + labels: Label[] = [] + ): Promise<{ data: { results: Label[] } }> => { + try { + const { data } = await this.http.get>( + `${this.baseUrl}${id}/labels/`, + { + params: { + page: pageNo, + page_size: 200, + }, + } + ); + if (data?.next) { + return fetchLabels(pageNo + 1, labels.concat(data.results)); + } + return Promise.resolve({ + data: { + results: labels.concat(data.results), + }, + }); + } catch (error) { + return Promise.reject(error); + } + }; + + return fetchLabels(); + } + + associateLabel( + id: number | string, + label: { name?: string | null }, + /** Null where the caller has no organization to put the label under. */ + orgId: number | string | null + ) { + return this.http.post(`${this.baseUrl}${id}/labels/`, { + name: label.name, + organization: orgId, + }); + } + + disassociateLabel(id: number | string, label: { id: number }) { + return this.http.post(`${this.baseUrl}${id}/labels/`, { + id: label.id, + disassociate: true, + }); + } + }; + +export default LabelsMixin; diff --git a/awx/ui/src/api/mixins/LaunchUpdate.mixin.js b/awx/ui/src/api/mixins/LaunchUpdate.mixin.js deleted file mode 100644 index cad3c0e53..000000000 --- a/awx/ui/src/api/mixins/LaunchUpdate.mixin.js +++ /dev/null @@ -1,12 +0,0 @@ -const LaunchUpdateMixin = (parent) => - class extends parent { - launchUpdate(id, data) { - return this.http.post(`${this.baseUrl}${id}/update/`, data); - } - - readLaunchUpdate(id) { - return this.http.get(`${this.baseUrl}${id}/update/`); - } - }; - -export default LaunchUpdateMixin; diff --git a/awx/ui/src/api/mixins/LaunchUpdate.mixin.ts b/awx/ui/src/api/mixins/LaunchUpdate.mixin.ts new file mode 100644 index 000000000..b31587ab0 --- /dev/null +++ b/awx/ui/src/api/mixins/LaunchUpdate.mixin.ts @@ -0,0 +1,15 @@ +import type { RelaunchConfig, UnifiedJob } from '../../types/api'; +import type { BaseConstructor } from '../Base'; + +const LaunchUpdateMixin = (parent: T) => + class extends parent { + launchUpdate(id: number | string, data?: unknown) { + return this.http.post(`${this.baseUrl}${id}/update/`, data); + } + + readLaunchUpdate(id: number | string) { + return this.http.get(`${this.baseUrl}${id}/update/`); + } + }; + +export default LaunchUpdateMixin; diff --git a/awx/ui/src/api/mixins/Notifications.mixin.js b/awx/ui/src/api/mixins/Notifications.mixin.js deleted file mode 100644 index 49d0ffd44..000000000 --- a/awx/ui/src/api/mixins/Notifications.mixin.js +++ /dev/null @@ -1,207 +0,0 @@ -const NotificationsMixin = (parent) => - class extends parent { - readOptionsNotificationTemplates(id) { - return this.http.options(`${this.baseUrl}${id}/notification_templates/`); - } - - readNotificationTemplates(id, params) { - return this.http.get( - `${this.baseUrl}${id}/notification_templates/`, - params - ); - } - - readNotificationTemplatesStarted(id, params) { - return this.http.get( - `${this.baseUrl}${id}/notification_templates_started/`, - { params } - ); - } - - readNotificationTemplatesSuccess(id, params) { - return this.http.get( - `${this.baseUrl}${id}/notification_templates_success/`, - { params } - ); - } - - readNotificationTemplatesError(id, params) { - return this.http.get( - `${this.baseUrl}${id}/notification_templates_error/`, - { params } - ); - } - - readNotificationTemplatesChanged(id, params) { - return this.http.get( - `${this.baseUrl}${id}/notification_templates_changed/`, - { params } - ); - } - - associateNotificationTemplatesStarted(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_started/`, - { id: notificationId } - ); - } - - disassociateNotificationTemplatesStarted(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_started/`, - { id: notificationId, disassociate: true } - ); - } - - associateNotificationTemplatesSuccess(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_success/`, - { id: notificationId } - ); - } - - disassociateNotificationTemplatesSuccess(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_success/`, - { id: notificationId, disassociate: true } - ); - } - - associateNotificationTemplatesError(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_error/`, - { id: notificationId } - ); - } - - disassociateNotificationTemplatesError(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_error/`, - { id: notificationId, disassociate: true } - ); - } - - associateNotificationTemplatesChanged(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_changed/`, - { id: notificationId } - ); - } - - disassociateNotificationTemplatesChanged(resourceId, notificationId) { - return this.http.post( - `${this.baseUrl}${resourceId}/notification_templates_changed/`, - { id: notificationId, disassociate: true } - ); - } - - /** - * This is a helper method meant to simplify setting the "on" status of - * a related notification. - * - * @param[resourceId] - id of the base resource - * @param[notificationId] - id of the notification - * @param[notificationType] - the type of notification, options are "approvals", - * "started", "success", "error" and "changed" - */ - associateNotificationTemplate( - resourceId, - notificationId, - notificationType - ) { - if (notificationType === 'approvals') { - return this.associateNotificationTemplatesApprovals( - resourceId, - notificationId - ); - } - - if (notificationType === 'started') { - return this.associateNotificationTemplatesStarted( - resourceId, - notificationId - ); - } - - if (notificationType === 'success') { - return this.associateNotificationTemplatesSuccess( - resourceId, - notificationId - ); - } - - if (notificationType === 'error') { - return this.associateNotificationTemplatesError( - resourceId, - notificationId - ); - } - - if (notificationType === 'changed') { - return this.associateNotificationTemplatesChanged( - resourceId, - notificationId - ); - } - - throw new Error( - `Unsupported notificationType for association: ${notificationType}` - ); - } - - /** - * This is a helper method meant to simplify setting the "off" status of - * a related notification. - * - * @param[resourceId] - id of the base resource - * @param[notificationId] - id of the notification - * @param[notificationType] - the type of notification, options are "approvals", - * "started", "success", "error" and "changed" - */ - disassociateNotificationTemplate( - resourceId, - notificationId, - notificationType - ) { - if (notificationType === 'approvals') { - return this.disassociateNotificationTemplatesApprovals( - resourceId, - notificationId - ); - } - - if (notificationType === 'started') { - return this.disassociateNotificationTemplatesStarted( - resourceId, - notificationId - ); - } - - if (notificationType === 'success') { - return this.disassociateNotificationTemplatesSuccess( - resourceId, - notificationId - ); - } - - if (notificationType === 'error') { - return this.disassociateNotificationTemplatesError( - resourceId, - notificationId - ); - } - - if (notificationType === 'changed') { - return this.disassociateNotificationTemplatesChanged( - resourceId, - notificationId - ); - } - - throw new Error( - `Unsupported notificationType for disassociation: ${notificationType}` - ); - } - }; - -export default NotificationsMixin; diff --git a/awx/ui/src/api/mixins/Notifications.mixin.ts b/awx/ui/src/api/mixins/Notifications.mixin.ts new file mode 100644 index 000000000..f61e296f9 --- /dev/null +++ b/awx/ui/src/api/mixins/Notifications.mixin.ts @@ -0,0 +1,265 @@ +import type { QSParams } from 'util/qs'; +import type { + NotificationTemplate, + OptionsResponse, + Paginated, +} from '../../types/api'; +import type { BaseConstructor } from '../Base'; + +const NotificationsMixin = (parent: T) => + class extends parent { + readOptionsNotificationTemplates(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/notification_templates/` + ); + } + + readNotificationTemplates(id: number | string, params?: QSParams) { + return this.http.get( + `${this.baseUrl}${id}/notification_templates/`, + params + ); + } + + readNotificationTemplatesStarted(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/notification_templates_started/`, + { params } + ); + } + + readNotificationTemplatesSuccess(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/notification_templates_success/`, + { params } + ); + } + + readNotificationTemplatesError(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/notification_templates_error/`, + { params } + ); + } + + readNotificationTemplatesChanged(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/notification_templates_changed/`, + { params } + ); + } + + // The approvals pair, which associateNotificationTemplate below has always + // dispatched to and which never existed, so toggling the Approval switch + // on a workflow template threw a TypeError instead of calling the API. + // The endpoint has been there the whole time. + associateNotificationTemplatesApprovals( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_approvals/`, + { id: notificationId } + ); + } + + disassociateNotificationTemplatesApprovals( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_approvals/`, + { id: notificationId, disassociate: true } + ); + } + + associateNotificationTemplatesStarted( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_started/`, + { id: notificationId } + ); + } + + disassociateNotificationTemplatesStarted( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_started/`, + { id: notificationId, disassociate: true } + ); + } + + associateNotificationTemplatesSuccess( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_success/`, + { id: notificationId } + ); + } + + disassociateNotificationTemplatesSuccess( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_success/`, + { id: notificationId, disassociate: true } + ); + } + + associateNotificationTemplatesError( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_error/`, + { id: notificationId } + ); + } + + disassociateNotificationTemplatesError( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_error/`, + { id: notificationId, disassociate: true } + ); + } + + associateNotificationTemplatesChanged( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_changed/`, + { id: notificationId } + ); + } + + disassociateNotificationTemplatesChanged( + resourceId: number | string, + notificationId: number | string + ) { + return this.http.post( + `${this.baseUrl}${resourceId}/notification_templates_changed/`, + { id: notificationId, disassociate: true } + ); + } + + /** + * This is a helper method meant to simplify setting the "on" status of + * a related notification. + * + * @param[resourceId] - id of the base resource + * @param[notificationId] - id of the notification + * @param[notificationType] - the type of notification, options are "approvals", + * "started", "success", "error" and "changed" + */ + associateNotificationTemplate( + resourceId: number | string, + notificationId: number | string, + notificationType: string + ) { + if (notificationType === 'approvals') { + return this.associateNotificationTemplatesApprovals( + resourceId, + notificationId + ); + } + + if (notificationType === 'started') { + return this.associateNotificationTemplatesStarted( + resourceId, + notificationId + ); + } + + if (notificationType === 'success') { + return this.associateNotificationTemplatesSuccess( + resourceId, + notificationId + ); + } + + if (notificationType === 'error') { + return this.associateNotificationTemplatesError( + resourceId, + notificationId + ); + } + + if (notificationType === 'changed') { + return this.associateNotificationTemplatesChanged( + resourceId, + notificationId + ); + } + + throw new Error( + `Unsupported notificationType for association: ${notificationType}` + ); + } + + /** + * This is a helper method meant to simplify setting the "off" status of + * a related notification. + * + * @param[resourceId] - id of the base resource + * @param[notificationId] - id of the notification + * @param[notificationType] - the type of notification, options are "approvals", + * "started", "success", "error" and "changed" + */ + disassociateNotificationTemplate( + resourceId: number | string, + notificationId: number | string, + notificationType: string + ) { + if (notificationType === 'approvals') { + return this.disassociateNotificationTemplatesApprovals( + resourceId, + notificationId + ); + } + + if (notificationType === 'started') { + return this.disassociateNotificationTemplatesStarted( + resourceId, + notificationId + ); + } + + if (notificationType === 'success') { + return this.disassociateNotificationTemplatesSuccess( + resourceId, + notificationId + ); + } + + if (notificationType === 'error') { + return this.disassociateNotificationTemplatesError( + resourceId, + notificationId + ); + } + + if (notificationType === 'changed') { + return this.disassociateNotificationTemplatesChanged( + resourceId, + notificationId + ); + } + + throw new Error( + `Unsupported notificationType for disassociation: ${notificationType}` + ); + } + }; + +export default NotificationsMixin; diff --git a/awx/ui/src/api/mixins/Runnable.mixin.js b/awx/ui/src/api/mixins/Runnable.mixin.js deleted file mode 100644 index 2c9b27b28..000000000 --- a/awx/ui/src/api/mixins/Runnable.mixin.js +++ /dev/null @@ -1,48 +0,0 @@ -const Runnable = (parent) => - class extends parent { - jobEventSlug = '/events/'; - - cancel(id) { - const endpoint = `${this.baseUrl}${id}/cancel/`; - - return this.http.post(endpoint); - } - - launchUpdate(id, data) { - const endpoint = `${this.baseUrl}${id}/update/`; - - return this.http.post(endpoint, data); - } - - readLaunchUpdate(id) { - const endpoint = `${this.baseUrl}${id}/update/`; - - return this.http.get(endpoint); - } - - readEvents(id, params = {}) { - const endpoint = `${this.baseUrl}${id}${this.jobEventSlug}`; - - return this.http.get(endpoint, { params }); - } - - readEventOptions(id) { - const endpoint = `${this.baseUrl}${id}${this.jobEventSlug}`; - - return this.http.options(endpoint); - } - - readRelaunch(id) { - const endpoint = `${this.baseUrl}${id}/relaunch/`; - - return this.http.get(endpoint); - } - - relaunch(id, data) { - const endpoint = `${this.baseUrl}${id}/relaunch/`; - - return this.http.post(endpoint, data); - } - }; - -export default Runnable; diff --git a/awx/ui/src/api/mixins/Runnable.mixin.ts b/awx/ui/src/api/mixins/Runnable.mixin.ts new file mode 100644 index 000000000..cb6c5676d --- /dev/null +++ b/awx/ui/src/api/mixins/Runnable.mixin.ts @@ -0,0 +1,58 @@ +import type { QSParams } from 'util/qs'; +import type { + JobEventRecord, + OptionsResponse, + Paginated, + RelaunchConfig, + UnifiedJob, +} from '../../types/api'; +import type { BaseConstructor } from '../Base'; + +const Runnable = (parent: T) => + class extends parent { + jobEventSlug = '/events/'; + + cancel(id: number | string) { + const endpoint = `${this.baseUrl}${id}/cancel/`; + + return this.http.post(endpoint); + } + + launchUpdate(id: number | string, data?: unknown) { + const endpoint = `${this.baseUrl}${id}/update/`; + + return this.http.post(endpoint, data); + } + + readLaunchUpdate(id: number | string) { + const endpoint = `${this.baseUrl}${id}/update/`; + + return this.http.get(endpoint); + } + + readEvents(id: number | string, params: QSParams = {}) { + const endpoint = `${this.baseUrl}${id}${this.jobEventSlug}`; + + return this.http.get>(endpoint, { params }); + } + + readEventOptions(id: number | string) { + const endpoint = `${this.baseUrl}${id}${this.jobEventSlug}`; + + return this.http.options(endpoint); + } + + readRelaunch(id: number | string) { + const endpoint = `${this.baseUrl}${id}/relaunch/`; + + return this.http.get(endpoint); + } + + relaunch(id: number | string, data?: unknown) { + const endpoint = `${this.baseUrl}${id}/relaunch/`; + + return this.http.post(endpoint, data); + } + }; + +export default Runnable; diff --git a/awx/ui/src/api/mixins/Schedules.mixin.js b/awx/ui/src/api/mixins/Schedules.mixin.js deleted file mode 100644 index 450e7c727..000000000 --- a/awx/ui/src/api/mixins/Schedules.mixin.js +++ /dev/null @@ -1,16 +0,0 @@ -const SchedulesMixin = (parent) => - class extends parent { - createSchedule(id, data) { - return this.http.post(`${this.baseUrl}${id}/schedules/`, data); - } - - readSchedules(id, params) { - return this.http.get(`${this.baseUrl}${id}/schedules/`, { params }); - } - - readScheduleOptions(id) { - return this.http.options(`${this.baseUrl}${id}/schedules/`); - } - }; - -export default SchedulesMixin; diff --git a/awx/ui/src/api/mixins/Schedules.mixin.ts b/awx/ui/src/api/mixins/Schedules.mixin.ts new file mode 100644 index 000000000..b24fa409e --- /dev/null +++ b/awx/ui/src/api/mixins/Schedules.mixin.ts @@ -0,0 +1,25 @@ +import type { QSParams } from 'util/qs'; +import type { OptionsResponse, Paginated, Schedule } from '../../types/api'; +import type { BaseConstructor } from '../Base'; + +const SchedulesMixin = (parent: T) => + class extends parent { + createSchedule(id: number | string, data: unknown) { + return this.http.post(`${this.baseUrl}${id}/schedules/`, data); + } + + readSchedules(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/schedules/`, + { params } + ); + } + + readScheduleOptions(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/schedules/` + ); + } + }; + +export default SchedulesMixin; diff --git a/awx/ui/src/api/models/ActivityStream.js b/awx/ui/src/api/models/ActivityStream.js deleted file mode 100644 index 68f748dc1..000000000 --- a/awx/ui/src/api/models/ActivityStream.js +++ /dev/null @@ -1,10 +0,0 @@ -import Base from '../Base'; - -class ActivityStream extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/activity_stream/'; - } -} - -export default ActivityStream; diff --git a/awx/ui/src/api/models/ActivityStream.ts b/awx/ui/src/api/models/ActivityStream.ts new file mode 100644 index 000000000..678f3755e --- /dev/null +++ b/awx/ui/src/api/models/ActivityStream.ts @@ -0,0 +1,12 @@ +import type { ActivityStreamEntry } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class ActivityStream extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/activity_stream/'; + } +} + +export default ActivityStream; diff --git a/awx/ui/src/api/models/AdHocCommands.js b/awx/ui/src/api/models/AdHocCommands.js deleted file mode 100644 index 0bec670de..000000000 --- a/awx/ui/src/api/models/AdHocCommands.js +++ /dev/null @@ -1,15 +0,0 @@ -import Base from '../Base'; -import RunnableMixin from '../mixins/Runnable.mixin'; - -class AdHocCommands extends RunnableMixin(Base) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/ad_hoc_commands/'; - } - - readCredentials(id) { - return this.http.get(`${this.baseUrl}${id}/credentials/`); - } -} - -export default AdHocCommands; diff --git a/awx/ui/src/api/models/AdHocCommands.ts b/awx/ui/src/api/models/AdHocCommands.ts new file mode 100644 index 000000000..2304da286 --- /dev/null +++ b/awx/ui/src/api/models/AdHocCommands.ts @@ -0,0 +1,42 @@ +import type { QSParams } from 'util/qs'; +import type { AdHocCommand, Credential, Paginated } from '../../types/api'; +import Base from '../Base'; +import RunnableMixin from '../mixins/Runnable.mixin'; +import type { Http } from '../Base'; + +class AdHocCommands extends RunnableMixin(Base) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/ad_hoc_commands/'; + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with an ad hoc command say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + readCredentials(id: number | string) { + return this.http.get>( + `${this.baseUrl}${id}/credentials/` + ); + } +} + +export default AdHocCommands; diff --git a/awx/ui/src/api/models/Applications.js b/awx/ui/src/api/models/Applications.js deleted file mode 100644 index d53f911db..000000000 --- a/awx/ui/src/api/models/Applications.js +++ /dev/null @@ -1,20 +0,0 @@ -import Base from '../Base'; - -class Applications extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/applications/'; - } - - readTokens(appId, params) { - return this.http.get(`${this.baseUrl}${appId}/tokens/`, { - params, - }); - } - - readTokenOptions(appId) { - return this.http.options(`${this.baseUrl}${appId}/tokens/`); - } -} - -export default Applications; diff --git a/awx/ui/src/api/models/Applications.ts b/awx/ui/src/api/models/Applications.ts new file mode 100644 index 000000000..81557db5e --- /dev/null +++ b/awx/ui/src/api/models/Applications.ts @@ -0,0 +1,33 @@ +import type { QSParams } from 'util/qs'; +import type { + OAuth2Application, + OAuth2Token, + OptionsResponse, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class Applications extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/applications/'; + } + + readTokens(appId: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${appId}/tokens/`, + { + params, + } + ); + } + + readTokenOptions(appId: number | string) { + return this.http.options( + `${this.baseUrl}${appId}/tokens/` + ); + } +} + +export default Applications; diff --git a/awx/ui/src/api/models/Auth.js b/awx/ui/src/api/models/Auth.js deleted file mode 100644 index cae34f8fc..000000000 --- a/awx/ui/src/api/models/Auth.js +++ /dev/null @@ -1,10 +0,0 @@ -import Base from '../Base'; - -class Auth extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/auth/'; - } -} - -export default Auth; diff --git a/awx/ui/src/api/models/Auth.ts b/awx/ui/src/api/models/Auth.ts new file mode 100644 index 000000000..49ec42dab --- /dev/null +++ b/awx/ui/src/api/models/Auth.ts @@ -0,0 +1,29 @@ +import Base from '../Base'; +import type { Http } from '../Base'; + +/** One social or enterprise login the server offers, by its backend name. */ +export interface AuthProvider { + login_url: string; + complete_url?: string; + metadata_url?: string; + type?: string; + /** Set for an enterprise login, which names the organization it signs in. */ + label?: string; +} + +/** Every login the server offers besides the username and password form. */ +export type AuthProviders = Record; + +class Auth extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/auth/'; + } + + // The providers come back as one object keyed by backend, not as a page. + read() { + return this.http.get(this.baseUrl); + } +} + +export default Auth; diff --git a/awx/ui/src/api/models/Config.js b/awx/ui/src/api/models/Config.js deleted file mode 100644 index ae73f88d6..000000000 --- a/awx/ui/src/api/models/Config.js +++ /dev/null @@ -1,22 +0,0 @@ -import Base from '../Base'; - -class Config extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/config/'; - this.read = this.read.bind(this); - } - - readSubscriptions(username, password) { - return this.http.post(`${this.baseUrl}subscriptions/`, { - subscriptions_username: username, - subscriptions_password: password, - }); - } - - attach(data) { - return this.http.post(`${this.baseUrl}attach/`, data); - } -} - -export default Config; diff --git a/awx/ui/src/api/models/Config.ts b/awx/ui/src/api/models/Config.ts new file mode 100644 index 000000000..ec9eb270e --- /dev/null +++ b/awx/ui/src/api/models/Config.ts @@ -0,0 +1,59 @@ +import Base from '../Base'; +import type { Http } from '../Base'; + +/** + * One subscription the account holds, as the subscriptions endpoint lists it. + * + * The list is keyed by pool, and two entries can share a pool id, so the + * screen numbers them itself before it puts them in a table. + */ +export interface SubscriptionPool { + id?: number; + pool_id?: string; + subscription_name?: string; + instance_count?: number; + license_date?: number; + trial?: boolean; + [key: string]: unknown; +} + +/** What /api/v2/config/ reports about the install and its subscription. */ +export interface ConfigResponse { + version?: string; + eula?: string; + license_info?: Record; + analytics_status?: string; + ansible_version?: string; + project_base_dir?: string; + project_local_paths?: string[]; + custom_virtualenvs?: string[]; + time_zone?: string; + become_method_choices?: [string, string][]; + [key: string]: unknown; +} + +class Config extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/config/'; + this.read = this.read.bind(this); + } + + // The config answers with one object rather than a page of them. + read() { + return this.http.get(this.baseUrl); + } + + readSubscriptions(username: unknown, password: unknown) { + return this.http.post(`${this.baseUrl}subscriptions/`, { + subscriptions_username: username, + subscriptions_password: password, + }); + } + + attach(data: unknown) { + return this.http.post(`${this.baseUrl}attach/`, data); + } +} + +export default Config; diff --git a/awx/ui/src/api/models/ConstructedInventories.js b/awx/ui/src/api/models/ConstructedInventories.js deleted file mode 100644 index 4ab8417d4..000000000 --- a/awx/ui/src/api/models/ConstructedInventories.js +++ /dev/null @@ -1,25 +0,0 @@ -import Base from '../Base'; -import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; - -class ConstructedInventories extends InstanceGroupsMixin(Base) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/constructed_inventories/'; - } - - async readConstructedInventoryOptions(id, method) { - const { - data: { actions }, - } = await this.http.options(`${this.baseUrl}${id}/`); - - if (actions[method]) { - return actions[method]; - } - - throw new Error( - `You have insufficient access to this Constructed Inventory. - Please contact your system administrator if there is an issue with your access.` - ); - } -} -export default ConstructedInventories; diff --git a/awx/ui/src/api/models/ConstructedInventories.test.js b/awx/ui/src/api/models/ConstructedInventories.test.js deleted file mode 100644 index e26307700..000000000 --- a/awx/ui/src/api/models/ConstructedInventories.test.js +++ /dev/null @@ -1,51 +0,0 @@ -import ConstructedInventories from './ConstructedInventories'; - -describe('ConstructedInventoriesAPI', () => { - const constructedInventoryId = 1; - const constructedInventoryMethod = 'PUT'; - let ConstructedInventoriesAPI; - let mockHttp; - - beforeEach(() => { - const optionsPromise = () => - Promise.resolve({ - data: { - actions: { - PUT: {}, - }, - }, - }); - mockHttp = { - options: vi.fn(optionsPromise), - }; - ConstructedInventoriesAPI = new ConstructedInventories(mockHttp); - }); - - afterEach(() => { - vi.resetAllMocks(); - }); - - test('readConstructedInventoryOptions calls options with the expected params', async () => { - await ConstructedInventoriesAPI.readConstructedInventoryOptions( - constructedInventoryId, - constructedInventoryMethod - ); - expect(mockHttp.options).toHaveBeenCalledTimes(1); - expect(mockHttp.options).toHaveBeenCalledWith( - `api/v2/constructed_inventories/${constructedInventoryId}/` - ); - }); - - test('readConstructedInventory should throw an error if action method is missing', async () => { - try { - await ConstructedInventoriesAPI.readConstructedInventoryOptions( - constructedInventoryId, - 'POST' - ); - } catch (error) { - expect(error.message).toContain( - 'You have insufficient access to this Constructed Inventory.' - ); - } - }); -}); diff --git a/awx/ui/src/api/models/ConstructedInventories.test.ts b/awx/ui/src/api/models/ConstructedInventories.test.ts new file mode 100644 index 000000000..7280f6482 --- /dev/null +++ b/awx/ui/src/api/models/ConstructedInventories.test.ts @@ -0,0 +1,56 @@ +import type { Mock } from 'vitest'; +import type { Http } from '../Base'; +import ConstructedInventories from './ConstructedInventories'; + +describe('ConstructedInventoriesAPI', () => { + const constructedInventoryId = 1; + const constructedInventoryMethod = 'PUT'; + let ConstructedInventoriesAPI: ConstructedInventories; + // Only the methods this model calls, each a vi.fn so its calls can be read. + let mockHttp: Partial>; + + beforeEach(() => { + const optionsPromise = () => + Promise.resolve({ + data: { + actions: { + PUT: {}, + }, + }, + }); + mockHttp = { + options: vi.fn(optionsPromise), + }; + ConstructedInventoriesAPI = new ConstructedInventories( + mockHttp as unknown as Http + ); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + test('readConstructedInventoryOptions calls options with the expected params', async () => { + await ConstructedInventoriesAPI.readConstructedInventoryOptions( + constructedInventoryId, + constructedInventoryMethod + ); + expect(mockHttp.options).toHaveBeenCalledTimes(1); + expect(mockHttp.options).toHaveBeenCalledWith( + `api/v2/constructed_inventories/${constructedInventoryId}/` + ); + }); + + test('readConstructedInventory should throw an error if action method is missing', async () => { + try { + await ConstructedInventoriesAPI.readConstructedInventoryOptions( + constructedInventoryId, + 'POST' + ); + } catch (error) { + expect((error as Error).message).toContain( + 'You have insufficient access to this Constructed Inventory.' + ); + } + }); +}); diff --git a/awx/ui/src/api/models/ConstructedInventories.ts b/awx/ui/src/api/models/ConstructedInventories.ts new file mode 100644 index 000000000..c28e3d5cb --- /dev/null +++ b/awx/ui/src/api/models/ConstructedInventories.ts @@ -0,0 +1,56 @@ +import type { QSParams } from 'util/qs'; +import type { + ConstructedInventory, + OptionsField, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; +import type { Http } from '../Base'; + +class ConstructedInventories extends InstanceGroupsMixin(Base) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/constructed_inventories/'; + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with a constructed inventory say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + async readConstructedInventoryOptions(id: number | string, method: string) { + const { + data: { actions }, + } = await this.http.options<{ + actions: Record>; + }>(`${this.baseUrl}${id}/`); + + if (actions[method]) { + return actions[method]; + } + + throw new Error( + `You have insufficient access to this Constructed Inventory. + Please contact your system administrator if there is an issue with your access.` + ); + } +} +export default ConstructedInventories; diff --git a/awx/ui/src/api/models/CredentialInputSources.js b/awx/ui/src/api/models/CredentialInputSources.js deleted file mode 100644 index c82f27a22..000000000 --- a/awx/ui/src/api/models/CredentialInputSources.js +++ /dev/null @@ -1,10 +0,0 @@ -import Base from '../Base'; - -class CredentialInputSources extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/credential_input_sources/'; - } -} - -export default CredentialInputSources; diff --git a/awx/ui/src/api/models/CredentialInputSources.ts b/awx/ui/src/api/models/CredentialInputSources.ts new file mode 100644 index 000000000..52f32f3b3 --- /dev/null +++ b/awx/ui/src/api/models/CredentialInputSources.ts @@ -0,0 +1,12 @@ +import type { CredentialInputSource } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class CredentialInputSources extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/credential_input_sources/'; + } +} + +export default CredentialInputSources; diff --git a/awx/ui/src/api/models/CredentialTypes.js b/awx/ui/src/api/models/CredentialTypes.js deleted file mode 100644 index 72f641c11..000000000 --- a/awx/ui/src/api/models/CredentialTypes.js +++ /dev/null @@ -1,44 +0,0 @@ -import Base from '../Base'; - -class CredentialTypes extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/credential_types/'; - } - - async loadAllTypes( - acceptableKinds = [ - 'machine', - 'cloud', - 'net', - 'ssh', - 'vault', - 'kubernetes', - 'cryptography', - ] - ) { - const pageSize = 200; - // The number of credential types a user can have is unlimited. In practice, it is unlikely for - // users to have more than a page at the maximum request size. - const { - data: { next, results }, - } = await this.read({ page_size: pageSize }); - let nextResults = []; - if (next) { - const { data } = await this.read({ - page_size: pageSize, - page: 2, - }); - nextResults = data.results; - } - return results - .concat(nextResults) - .filter((type) => acceptableKinds.includes(type.kind)); - } - - test(id, data) { - return this.http.post(`${this.baseUrl}${id}/test/`, data); - } -} - -export default CredentialTypes; diff --git a/awx/ui/src/api/models/CredentialTypes.test.js b/awx/ui/src/api/models/CredentialTypes.test.js deleted file mode 100644 index c4e83c581..000000000 --- a/awx/ui/src/api/models/CredentialTypes.test.js +++ /dev/null @@ -1,68 +0,0 @@ -import CredentialTypes from './CredentialTypes'; - -const typesData = [ - { id: 1, kind: 'machine' }, - { id: 2, kind: 'cloud' }, -]; - -describe('CredentialTypesAPI', () => { - test('should load all types', async () => { - const getPromise = () => - Promise.resolve({ - data: { - results: typesData, - }, - }); - const mockHttp = { get: vi.fn(getPromise) }; - const CredentialTypesAPI = new CredentialTypes(mockHttp); - - const types = await CredentialTypesAPI.loadAllTypes(); - - expect(mockHttp.get).toHaveBeenCalledTimes(1); - expect(mockHttp.get.mock.calls[0]).toEqual([ - `api/v2/credential_types/`, - { params: { page_size: 200 } }, - ]); - expect(types).toEqual(typesData); - }); - - test('should load all types (2 pages)', async () => { - const getPromise = () => - Promise.resolve({ - data: { - results: typesData, - next: 2, - }, - }); - const mockHttp = { get: vi.fn(getPromise) }; - const CredentialTypesAPI = new CredentialTypes(mockHttp); - - const types = await CredentialTypesAPI.loadAllTypes(); - - expect(mockHttp.get).toHaveBeenCalledTimes(2); - expect(mockHttp.get.mock.calls[0]).toEqual([ - `api/v2/credential_types/`, - { params: { page_size: 200 } }, - ]); - expect(mockHttp.get.mock.calls[1]).toEqual([ - `api/v2/credential_types/`, - { params: { page_size: 200, page: 2 } }, - ]); - expect(types).toHaveLength(4); - }); - - test('should filter by acceptable kinds', async () => { - const getPromise = () => - Promise.resolve({ - data: { - results: typesData, - }, - }); - const mockHttp = { get: vi.fn(getPromise) }; - const CredentialTypesAPI = new CredentialTypes(mockHttp); - - const types = await CredentialTypesAPI.loadAllTypes(['machine']); - - expect(types).toEqual([typesData[0]]); - }); -}); diff --git a/awx/ui/src/api/models/CredentialTypes.test.ts b/awx/ui/src/api/models/CredentialTypes.test.ts new file mode 100644 index 000000000..141aaab71 --- /dev/null +++ b/awx/ui/src/api/models/CredentialTypes.test.ts @@ -0,0 +1,69 @@ +import type { Http } from 'api/Base'; +import CredentialTypes from './CredentialTypes'; + +const typesData = [ + { id: 1, kind: 'machine' }, + { id: 2, kind: 'cloud' }, +]; + +describe('CredentialTypesAPI', () => { + test('should load all types', async () => { + const getPromise = () => + Promise.resolve({ + data: { + results: typesData, + }, + }); + const mockHttp = { get: vi.fn(getPromise) }; + const CredentialTypesAPI = new CredentialTypes(mockHttp as unknown as Http); + + const types = await CredentialTypesAPI.loadAllTypes(); + + expect(mockHttp.get).toHaveBeenCalledTimes(1); + expect(mockHttp.get.mock.calls[0]).toEqual([ + `api/v2/credential_types/`, + { params: { page_size: 200 } }, + ]); + expect(types).toEqual(typesData); + }); + + test('should load all types (2 pages)', async () => { + const getPromise = () => + Promise.resolve({ + data: { + results: typesData, + next: 2, + }, + }); + const mockHttp = { get: vi.fn(getPromise) }; + const CredentialTypesAPI = new CredentialTypes(mockHttp as unknown as Http); + + const types = await CredentialTypesAPI.loadAllTypes(); + + expect(mockHttp.get).toHaveBeenCalledTimes(2); + expect(mockHttp.get.mock.calls[0]).toEqual([ + `api/v2/credential_types/`, + { params: { page_size: 200 } }, + ]); + expect(mockHttp.get.mock.calls[1]).toEqual([ + `api/v2/credential_types/`, + { params: { page_size: 200, page: 2 } }, + ]); + expect(types).toHaveLength(4); + }); + + test('should filter by acceptable kinds', async () => { + const getPromise = () => + Promise.resolve({ + data: { + results: typesData, + }, + }); + const mockHttp = { get: vi.fn(getPromise) }; + const CredentialTypesAPI = new CredentialTypes(mockHttp as unknown as Http); + + const types = await CredentialTypesAPI.loadAllTypes(['machine']); + + expect(types).toEqual([typesData[0]]); + }); +}); diff --git a/awx/ui/src/api/models/CredentialTypes.ts b/awx/ui/src/api/models/CredentialTypes.ts new file mode 100644 index 000000000..093d446d1 --- /dev/null +++ b/awx/ui/src/api/models/CredentialTypes.ts @@ -0,0 +1,46 @@ +import type { CredentialType, Paginated } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class CredentialTypes extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/credential_types/'; + } + + async loadAllTypes( + acceptableKinds: string[] = [ + 'machine', + 'cloud', + 'net', + 'ssh', + 'vault', + 'kubernetes', + 'cryptography', + ] + ) { + const pageSize = 200; + // The number of credential types a user can have is unlimited. In practice, it is unlikely for + // users to have more than a page at the maximum request size. + const { + data: { next, results }, + } = await this.read>({ page_size: pageSize }); + let nextResults: CredentialType[] = []; + if (next) { + const { data } = await this.read>({ + page_size: pageSize, + page: 2, + }); + nextResults = data.results; + } + return results + .concat(nextResults) + .filter((type) => acceptableKinds.includes(type.kind as string)); + } + + test(id: number | string, data: unknown) { + return this.http.post(`${this.baseUrl}${id}/test/`, data); + } +} + +export default CredentialTypes; diff --git a/awx/ui/src/api/models/Credentials.js b/awx/ui/src/api/models/Credentials.js deleted file mode 100644 index 44bfbb9d0..000000000 --- a/awx/ui/src/api/models/Credentials.js +++ /dev/null @@ -1,62 +0,0 @@ -import Base from '../Base'; - -class Credentials extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/credentials/'; - - this.readAccessList = this.readAccessList.bind(this); - this.readAccessOptions = this.readAccessOptions.bind(this); - this.readInputSources = this.readInputSources.bind(this); - } - - readAccessList(id, params) { - return this.http.get(`${this.baseUrl}${id}/access_list/`, { - params, - }); - } - - readAccessOptions(id) { - return this.http.options(`${this.baseUrl}${id}/access_list/`); - } - - readInputSources(id) { - const maxRequests = 5; - let requestCounter = 0; - const fetchInputSources = async (pageNo = 1, inputSources = []) => { - try { - requestCounter++; - const { data } = await this.http.get( - `${this.baseUrl}${id}/input_sources/`, - { - params: { - page: pageNo, - page_size: 200, - }, - } - ); - if (data?.next && requestCounter <= maxRequests) { - return fetchInputSources( - pageNo + 1, - inputSources.concat(data.results) - ); - } - return Promise.resolve({ - data: { - results: inputSources.concat(data.results), - }, - }); - } catch (error) { - return Promise.reject(error); - } - }; - - return fetchInputSources(); - } - - test(id, data) { - return this.http.post(`${this.baseUrl}${id}/test/`, data); - } -} - -export default Credentials; diff --git a/awx/ui/src/api/models/Credentials.ts b/awx/ui/src/api/models/Credentials.ts new file mode 100644 index 000000000..5bbbcbbac --- /dev/null +++ b/awx/ui/src/api/models/Credentials.ts @@ -0,0 +1,79 @@ +import type { QSParams } from 'util/qs'; +import type { + AccessListEntry, + Credential, + CredentialInputSource, + OptionsResponse, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class Credentials extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/credentials/'; + + this.readAccessList = this.readAccessList.bind(this); + this.readAccessOptions = this.readAccessOptions.bind(this); + this.readInputSources = this.readInputSources.bind(this); + } + + readAccessList(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/access_list/`, + { + params, + } + ); + } + + readAccessOptions(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/access_list/` + ); + } + + readInputSources(id: number | string) { + const maxRequests = 5; + let requestCounter = 0; + const fetchInputSources = async ( + pageNo = 1, + inputSources: CredentialInputSource[] = [] + ) => { + try { + requestCounter++; + const { data } = await this.http.get>( + `${this.baseUrl}${id}/input_sources/`, + { + params: { + page: pageNo, + page_size: 200, + }, + } + ); + if (data?.next && requestCounter <= maxRequests) { + return fetchInputSources( + pageNo + 1, + inputSources.concat(data.results) + ); + } + return Promise.resolve({ + data: { + results: inputSources.concat(data.results), + }, + }); + } catch (error) { + return Promise.reject(error); + } + }; + + return fetchInputSources(); + } + + test(id: number | string, data: unknown) { + return this.http.post(`${this.baseUrl}${id}/test/`, data); + } +} + +export default Credentials; diff --git a/awx/ui/src/api/models/Dashboard.js b/awx/ui/src/api/models/Dashboard.js deleted file mode 100644 index 06c00f191..000000000 --- a/awx/ui/src/api/models/Dashboard.js +++ /dev/null @@ -1,16 +0,0 @@ -import Base from '../Base'; - -class Dashboard extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/dashboard/'; - } - - readJobGraph(params) { - return this.http.get(`${this.baseUrl}graphs/jobs/`, { - params, - }); - } -} - -export default Dashboard; diff --git a/awx/ui/src/api/models/Dashboard.ts b/awx/ui/src/api/models/Dashboard.ts new file mode 100644 index 000000000..87019b33f --- /dev/null +++ b/awx/ui/src/api/models/Dashboard.ts @@ -0,0 +1,56 @@ +import type { QSParams } from 'util/qs'; +import Base from '../Base'; +import type { Http } from '../Base'; + +/** How many of a thing there are, and how many of those are in a bad way. */ +export interface DashboardCount { + total?: number; + failed?: number; + /** Inventories only: how many have a source that last failed to sync. */ + inventory_failed?: number; + /** Job templates only: the ten most recently used, for the quick links. */ + [key: string]: unknown; +} + +/** The counts the dashboard's tiles are drawn from. */ +export interface DashboardCounts { + inventories?: DashboardCount; + inventory_sources?: DashboardCount; + groups?: DashboardCount; + hosts?: DashboardCount; + projects?: DashboardCount; + organizations?: DashboardCount; + users?: DashboardCount; + teams?: DashboardCount; + credentials?: DashboardCount; + job_templates?: DashboardCount; + [key: string]: DashboardCount | undefined; +} + +/** One point of the dashboard's job chart: a day and what ran that day. */ +export interface JobGraphPoint { + jobs: { + successful: [number, number][]; + failed: [number, number][]; + }; +} + +class Dashboard extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/dashboard/'; + } + + // The dashboard answers with the counts themselves, not a page of them. + read() { + return this.http.get(this.baseUrl); + } + + readJobGraph(params?: QSParams) { + return this.http.get(`${this.baseUrl}graphs/jobs/`, { + params, + }); + } +} + +export default Dashboard; diff --git a/awx/ui/src/api/models/ExecutionEnvironments.js b/awx/ui/src/api/models/ExecutionEnvironments.js deleted file mode 100644 index 8c2fff9a0..000000000 --- a/awx/ui/src/api/models/ExecutionEnvironments.js +++ /dev/null @@ -1,20 +0,0 @@ -import Base from '../Base'; - -class ExecutionEnvironments extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/execution_environments/'; - } - - readUnifiedJobTemplates(id, params) { - return this.http.get(`${this.baseUrl}${id}/unified_job_templates/`, { - params, - }); - } - - readUnifiedJobTemplateOptions(id) { - return this.http.options(`${this.baseUrl}${id}/unified_job_templates/`); - } -} - -export default ExecutionEnvironments; diff --git a/awx/ui/src/api/models/ExecutionEnvironments.ts b/awx/ui/src/api/models/ExecutionEnvironments.ts new file mode 100644 index 000000000..a4e7f1f7d --- /dev/null +++ b/awx/ui/src/api/models/ExecutionEnvironments.ts @@ -0,0 +1,33 @@ +import type { QSParams } from 'util/qs'; +import type { + AnyUnifiedJobTemplate, + ExecutionEnvironment, + OptionsResponse, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class ExecutionEnvironments extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/execution_environments/'; + } + + readUnifiedJobTemplates(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/unified_job_templates/`, + { + params, + } + ); + } + + readUnifiedJobTemplateOptions(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/unified_job_templates/` + ); + } +} + +export default ExecutionEnvironments; diff --git a/awx/ui/src/api/models/FederatedInventories.js b/awx/ui/src/api/models/FederatedInventories.js deleted file mode 100644 index a12751ff7..000000000 --- a/awx/ui/src/api/models/FederatedInventories.js +++ /dev/null @@ -1,23 +0,0 @@ -import Base from '../Base'; - -class FederatedInventories extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/federated_inventories/'; - } - - async readFederatedInventoryOptions(id, method) { - const { - data: { actions }, - } = await this.http.options(`${this.baseUrl}${id}/`); - - if (actions[method]) { - return actions[method]; - } - - throw new Error( - 'You have insufficient access to this Federated Inventory. Please contact your system administrator if there is an issue with your access.' - ); - } -} -export default FederatedInventories; diff --git a/awx/ui/src/api/models/FederatedInventories.test.js b/awx/ui/src/api/models/FederatedInventories.test.js deleted file mode 100644 index 3215ea717..000000000 --- a/awx/ui/src/api/models/FederatedInventories.test.js +++ /dev/null @@ -1,49 +0,0 @@ -import FederatedInventories from './FederatedInventories'; - -describe('FederatedInventoriesAPI', () => { - const federatedInventoryId = 1; - const federatedInventoryMethod = 'PUT'; - let FederatedInventoriesAPI; - let mockHttp; - - beforeEach(() => { - const optionsPromise = () => - Promise.resolve({ - data: { - actions: { - PUT: {}, - }, - }, - }); - mockHttp = { - options: vi.fn(optionsPromise), - }; - FederatedInventoriesAPI = new FederatedInventories(mockHttp); - }); - - afterEach(() => { - vi.resetAllMocks(); - }); - - test('readFederatedInventoryOptions calls OPTIONS on the correct URL', async () => { - await FederatedInventoriesAPI.readFederatedInventoryOptions( - federatedInventoryId, - federatedInventoryMethod - ); - expect(mockHttp.options).toHaveBeenCalledTimes(1); - expect(mockHttp.options).toHaveBeenCalledWith( - `api/v2/federated_inventories/${federatedInventoryId}/` - ); - }); - - test('readFederatedInventoryOptions throws a helpful error when the method is missing from actions', async () => { - await expect( - FederatedInventoriesAPI.readFederatedInventoryOptions( - federatedInventoryId, - 'POST' - ) - ).rejects.toThrow( - 'You have insufficient access to this Federated Inventory.' - ); - }); -}); diff --git a/awx/ui/src/api/models/FederatedInventories.test.ts b/awx/ui/src/api/models/FederatedInventories.test.ts new file mode 100644 index 000000000..3079fdee0 --- /dev/null +++ b/awx/ui/src/api/models/FederatedInventories.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from 'vitest'; +import type { Http } from '../Base'; +import FederatedInventories from './FederatedInventories'; + +describe('FederatedInventoriesAPI', () => { + const federatedInventoryId = 1; + const federatedInventoryMethod = 'PUT'; + let FederatedInventoriesAPI: FederatedInventories; + // Only the methods this model calls, each a vi.fn so its calls can be read. + let mockHttp: Partial>; + + beforeEach(() => { + const optionsPromise = () => + Promise.resolve({ + data: { + actions: { + PUT: {}, + }, + }, + }); + mockHttp = { + options: vi.fn(optionsPromise), + }; + FederatedInventoriesAPI = new FederatedInventories( + mockHttp as unknown as Http + ); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + test('readFederatedInventoryOptions calls OPTIONS on the correct URL', async () => { + await FederatedInventoriesAPI.readFederatedInventoryOptions( + federatedInventoryId, + federatedInventoryMethod + ); + expect(mockHttp.options).toHaveBeenCalledTimes(1); + expect(mockHttp.options).toHaveBeenCalledWith( + `api/v2/federated_inventories/${federatedInventoryId}/` + ); + }); + + test('readFederatedInventoryOptions throws a helpful error when the method is missing from actions', async () => { + await expect( + FederatedInventoriesAPI.readFederatedInventoryOptions( + federatedInventoryId, + 'POST' + ) + ).rejects.toThrow( + 'You have insufficient access to this Federated Inventory.' + ); + }); +}); diff --git a/awx/ui/src/api/models/FederatedInventories.ts b/awx/ui/src/api/models/FederatedInventories.ts new file mode 100644 index 000000000..3349cf4ea --- /dev/null +++ b/awx/ui/src/api/models/FederatedInventories.ts @@ -0,0 +1,27 @@ +import type { FederatedInventory } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class FederatedInventories extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/federated_inventories/'; + } + + async readFederatedInventoryOptions(id: number | string, method: string) { + const { + data: { actions }, + } = await this.http.options<{ actions: Record }>( + `${this.baseUrl}${id}/` + ); + + if (actions[method]) { + return actions[method]; + } + + throw new Error( + 'You have insufficient access to this Federated Inventory. Please contact your system administrator if there is an issue with your access.' + ); + } +} +export default FederatedInventories; diff --git a/awx/ui/src/api/models/Groups.js b/awx/ui/src/api/models/Groups.js deleted file mode 100644 index 6677a9e27..000000000 --- a/awx/ui/src/api/models/Groups.js +++ /dev/null @@ -1,59 +0,0 @@ -import Base from '../Base'; - -class Groups extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/groups/'; - - this.associateHost = this.associateHost.bind(this); - this.createHost = this.createHost.bind(this); - this.readAllHosts = this.readAllHosts.bind(this); - this.disassociateHost = this.disassociateHost.bind(this); - } - - associateHost(id, hostId) { - return this.http.post(`${this.baseUrl}${id}/hosts/`, { - id: hostId, - }); - } - - createHost(id, data) { - return this.http.post(`${this.baseUrl}${id}/hosts/`, data); - } - - readAllHosts(id, params) { - return this.http.get(`${this.baseUrl}${id}/all_hosts/`, { - params, - }); - } - - disassociateHost(id, host) { - return this.http.post(`${this.baseUrl}${id}/hosts/`, { - id: host.id, - disassociate: true, - }); - } - - readChildren(id, params) { - return this.http.get(`${this.baseUrl}${id}/children/`, { params }); - } - - associateChildGroup(id, childId) { - return this.http.post(`${this.baseUrl}${id}/children/`, { id: childId }); - } - - disassociateChildGroup(id, childId) { - return this.http.post(`${this.baseUrl}${id}/children/`, { - disassociate: id, - id: childId, - }); - } - - readPotentialGroups(id, params) { - return this.http.get(`${this.baseUrl}${id}/potential_children/`, { - params, - }); - } -} - -export default Groups; diff --git a/awx/ui/src/api/models/Groups.ts b/awx/ui/src/api/models/Groups.ts new file mode 100644 index 000000000..b147ebe0c --- /dev/null +++ b/awx/ui/src/api/models/Groups.ts @@ -0,0 +1,67 @@ +import type { QSParams } from 'util/qs'; +import type { Group, Host, Paginated } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class Groups extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/groups/'; + + this.associateHost = this.associateHost.bind(this); + this.createHost = this.createHost.bind(this); + this.readAllHosts = this.readAllHosts.bind(this); + this.disassociateHost = this.disassociateHost.bind(this); + } + + associateHost(id: number | string, hostId: number | string) { + return this.http.post(`${this.baseUrl}${id}/hosts/`, { + id: hostId, + }); + } + + createHost(id: number | string, data: unknown) { + return this.http.post(`${this.baseUrl}${id}/hosts/`, data); + } + + readAllHosts(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/all_hosts/`, { + params, + }); + } + + disassociateHost(id: number | string, host: { id: number }) { + return this.http.post(`${this.baseUrl}${id}/hosts/`, { + id: host.id, + disassociate: true, + }); + } + + readChildren(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/children/`, { + params, + }); + } + + associateChildGroup(id: number | string, childId: number | string) { + return this.http.post(`${this.baseUrl}${id}/children/`, { id: childId }); + } + + disassociateChildGroup(id: number | string, childId: number | string) { + return this.http.post(`${this.baseUrl}${id}/children/`, { + disassociate: id, + id: childId, + }); + } + + readPotentialGroups(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/potential_children/`, + { + params, + } + ); + } +} + +export default Groups; diff --git a/awx/ui/src/api/models/HostMetrics.js b/awx/ui/src/api/models/HostMetrics.js deleted file mode 100644 index d8ca8f4c8..000000000 --- a/awx/ui/src/api/models/HostMetrics.js +++ /dev/null @@ -1,10 +0,0 @@ -import Base from '../Base'; - -class HostMetrics extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/host_metrics/'; - } -} - -export default HostMetrics; diff --git a/awx/ui/src/api/models/HostMetrics.ts b/awx/ui/src/api/models/HostMetrics.ts new file mode 100644 index 000000000..759570ee8 --- /dev/null +++ b/awx/ui/src/api/models/HostMetrics.ts @@ -0,0 +1,12 @@ +import type { HostMetric } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class HostMetrics extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/host_metrics/'; + } +} + +export default HostMetrics; diff --git a/awx/ui/src/api/models/Hosts.js b/awx/ui/src/api/models/Hosts.js deleted file mode 100644 index 0422407da..000000000 --- a/awx/ui/src/api/models/Hosts.js +++ /dev/null @@ -1,43 +0,0 @@ -import Base from '../Base'; - -class Hosts extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/hosts/'; - - this.readFacts = this.readFacts.bind(this); - this.readAllGroups = this.readAllGroups.bind(this); - this.readGroupsOptions = this.readGroupsOptions.bind(this); - this.associateGroup = this.associateGroup.bind(this); - this.disassociateGroup = this.disassociateGroup.bind(this); - } - - readFacts(id) { - return this.http.get(`${this.baseUrl}${id}/ansible_facts/`); - } - - readAllGroups(id, params) { - return this.http.get(`${this.baseUrl}${id}/all_groups/`, { params }); - } - - readGroups(id, params) { - return this.http.get(`${this.baseUrl}${id}/groups/`, { params }); - } - - readGroupsOptions(id) { - return this.http.options(`${this.baseUrl}${id}/groups/`); - } - - associateGroup(id, groupId) { - return this.http.post(`${this.baseUrl}${id}/groups/`, { id: groupId }); - } - - disassociateGroup(id, group) { - return this.http.post(`${this.baseUrl}${id}/groups/`, { - id: group.id, - disassociate: true, - }); - } -} - -export default Hosts; diff --git a/awx/ui/src/api/models/Hosts.ts b/awx/ui/src/api/models/Hosts.ts new file mode 100644 index 000000000..541e3abf3 --- /dev/null +++ b/awx/ui/src/api/models/Hosts.ts @@ -0,0 +1,52 @@ +import type { QSParams } from 'util/qs'; +import type { Group, Host, OptionsResponse, Paginated } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class Hosts extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/hosts/'; + + this.readFacts = this.readFacts.bind(this); + this.readAllGroups = this.readAllGroups.bind(this); + this.readGroupsOptions = this.readGroupsOptions.bind(this); + this.associateGroup = this.associateGroup.bind(this); + this.disassociateGroup = this.disassociateGroup.bind(this); + } + + readFacts(id: number | string) { + return this.http.get>( + `${this.baseUrl}${id}/ansible_facts/` + ); + } + + readAllGroups(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/all_groups/`, { + params, + }); + } + + readGroups(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/groups/`, { + params, + }); + } + + readGroupsOptions(id: number | string) { + return this.http.options(`${this.baseUrl}${id}/groups/`); + } + + associateGroup(id: number | string, groupId: number | string) { + return this.http.post(`${this.baseUrl}${id}/groups/`, { id: groupId }); + } + + disassociateGroup(id: number | string, group: { id: number }) { + return this.http.post(`${this.baseUrl}${id}/groups/`, { + id: group.id, + disassociate: true, + }); + } +} + +export default Hosts; diff --git a/awx/ui/src/api/models/InstanceGroups.js b/awx/ui/src/api/models/InstanceGroups.js deleted file mode 100644 index 082268fa1..000000000 --- a/awx/ui/src/api/models/InstanceGroups.js +++ /dev/null @@ -1,46 +0,0 @@ -import Base from '../Base'; - -class InstanceGroups extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/instance_groups/'; - - this.associateInstance = this.associateInstance.bind(this); - this.disassociateInstance = this.disassociateInstance.bind(this); - this.readInstanceOptions = this.readInstanceOptions.bind(this); - this.readInstanceGroupOptions = this.readInstanceGroupOptions.bind(this); - this.readInstances = this.readInstances.bind(this); - this.readJobs = this.readJobs.bind(this); - } - - associateInstance(instanceGroupId, instanceId) { - return this.http.post(`${this.baseUrl}${instanceGroupId}/instances/`, { - id: instanceId, - }); - } - - disassociateInstance(instanceGroupId, instanceId) { - return this.http.post(`${this.baseUrl}${instanceGroupId}/instances/`, { - id: instanceId, - disassociate: true, - }); - } - - readInstances(id, params) { - return this.http.get(`${this.baseUrl}${id}/instances/`, { params }); - } - - readInstanceOptions(id) { - return this.http.options(`${this.baseUrl}${id}/instances/`); - } - - readInstanceGroupOptions(id) { - return this.http.options(`${this.baseUrl}${id}/`); - } - - readJobs(id) { - return this.http.get(`${this.baseUrl}${id}/jobs/`); - } -} - -export default InstanceGroups; diff --git a/awx/ui/src/api/models/InstanceGroups.ts b/awx/ui/src/api/models/InstanceGroups.ts new file mode 100644 index 000000000..9da37fa75 --- /dev/null +++ b/awx/ui/src/api/models/InstanceGroups.ts @@ -0,0 +1,66 @@ +import type { QSParams } from 'util/qs'; +import type { + Instance, + InstanceGroup, + OptionsResponse, + Paginated, + UnifiedJob, +} from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class InstanceGroups extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/instance_groups/'; + + this.associateInstance = this.associateInstance.bind(this); + this.disassociateInstance = this.disassociateInstance.bind(this); + this.readInstanceOptions = this.readInstanceOptions.bind(this); + this.readInstanceGroupOptions = this.readInstanceGroupOptions.bind(this); + this.readInstances = this.readInstances.bind(this); + this.readJobs = this.readJobs.bind(this); + } + + associateInstance( + instanceGroupId: number | string, + instanceId: number | string + ) { + return this.http.post(`${this.baseUrl}${instanceGroupId}/instances/`, { + id: instanceId, + }); + } + + disassociateInstance( + instanceGroupId: number | string, + instanceId: number | string + ) { + return this.http.post(`${this.baseUrl}${instanceGroupId}/instances/`, { + id: instanceId, + disassociate: true, + }); + } + + readInstances(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/instances/`, + { params } + ); + } + + readInstanceOptions(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/instances/` + ); + } + + readInstanceGroupOptions(id: number | string) { + return this.http.options(`${this.baseUrl}${id}/`); + } + + readJobs(id: number | string) { + return this.http.get>(`${this.baseUrl}${id}/jobs/`); + } +} + +export default InstanceGroups; diff --git a/awx/ui/src/api/models/Instances.js b/awx/ui/src/api/models/Instances.js deleted file mode 100644 index 7730a31df..000000000 --- a/awx/ui/src/api/models/Instances.js +++ /dev/null @@ -1,49 +0,0 @@ -import Base from '../Base'; - -class Instances extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/instances/'; - - this.readHealthCheckDetail = this.readHealthCheckDetail.bind(this); - this.healthCheck = this.healthCheck.bind(this); - this.readInstanceGroup = this.readInstanceGroup.bind(this); - this.readReceptorAddresses = this.readReceptorAddresses.bind(this); - this.deprovisionInstance = this.deprovisionInstance.bind(this); - } - - healthCheck(instanceId) { - return this.http.post(`${this.baseUrl}${instanceId}/health_check/`); - } - - readHealthCheckDetail(instanceId) { - return this.http.get(`${this.baseUrl}${instanceId}/health_check/`); - } - - readPeers(instanceId, params) { - return this.http.get(`${this.baseUrl}${instanceId}/peers/`, { params }); - } - - readInstanceGroup(instanceId) { - return this.http.get(`${this.baseUrl}${instanceId}/instance_groups/`); - } - - readReceptorAddresses(instanceId) { - return this.http.get(`${this.baseUrl}${instanceId}/receptor_addresses/`); - } - - updateReceptorAddresses(instanceId, data) { - return this.http.post( - `${this.baseUrl}${instanceId}/receptor_addresses/`, - data - ); - } - - deprovisionInstance(instanceId) { - return this.http.patch(`${this.baseUrl}${instanceId}/`, { - node_state: 'deprovisioning', - }); - } -} - -export default Instances; diff --git a/awx/ui/src/api/models/Instances.ts b/awx/ui/src/api/models/Instances.ts new file mode 100644 index 000000000..7273b7b97 --- /dev/null +++ b/awx/ui/src/api/models/Instances.ts @@ -0,0 +1,66 @@ +import type { QSParams } from 'util/qs'; +import type { + Instance, + InstanceGroup, + Paginated, + ReceptorAddress, +} from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class Instances extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/instances/'; + + this.readHealthCheckDetail = this.readHealthCheckDetail.bind(this); + this.healthCheck = this.healthCheck.bind(this); + this.readInstanceGroup = this.readInstanceGroup.bind(this); + this.readReceptorAddresses = this.readReceptorAddresses.bind(this); + this.deprovisionInstance = this.deprovisionInstance.bind(this); + } + + healthCheck(instanceId: number | string) { + return this.http.post(`${this.baseUrl}${instanceId}/health_check/`); + } + + readHealthCheckDetail(instanceId: number | string) { + return this.http.get( + `${this.baseUrl}${instanceId}/health_check/` + ); + } + + readPeers(instanceId: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${instanceId}/peers/`, + { params } + ); + } + + readInstanceGroup(instanceId: number | string) { + return this.http.get>( + `${this.baseUrl}${instanceId}/instance_groups/` + ); + } + + readReceptorAddresses(instanceId: number | string) { + return this.http.get>( + `${this.baseUrl}${instanceId}/receptor_addresses/` + ); + } + + updateReceptorAddresses(instanceId: number | string, data: unknown) { + return this.http.post( + `${this.baseUrl}${instanceId}/receptor_addresses/`, + data + ); + } + + deprovisionInstance(instanceId: number | string) { + return this.http.patch(`${this.baseUrl}${instanceId}/`, { + node_state: 'deprovisioning', + }); + } +} + +export default Instances; diff --git a/awx/ui/src/api/models/Inventories.js b/awx/ui/src/api/models/Inventories.js deleted file mode 100644 index 7e53e161d..000000000 --- a/awx/ui/src/api/models/Inventories.js +++ /dev/null @@ -1,157 +0,0 @@ -import Base from '../Base'; -import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; - -class Inventories extends InstanceGroupsMixin(Base) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/inventories/'; - - this.readAccessList = this.readAccessList.bind(this); - this.readAccessOptions = this.readAccessOptions.bind(this); - this.readHosts = this.readHosts.bind(this); - this.readHostDetail = this.readHostDetail.bind(this); - this.readGroups = this.readGroups.bind(this); - this.readGroupsOptions = this.readGroupsOptions.bind(this); - this.promoteGroup = this.promoteGroup.bind(this); - this.readInputInventories = this.readInputInventories.bind(this); - this.associateInventory = this.associateInventory.bind(this); - this.disassociateInventory = this.disassociateInventory.bind(this); - } - - readAccessList(id, params) { - return this.http.get(`${this.baseUrl}${id}/access_list/`, { - params, - }); - } - - readAccessOptions(id) { - return this.http.options(`${this.baseUrl}${id}/access_list/`); - } - - createHost(id, data) { - return this.http.post(`${this.baseUrl}${id}/hosts/`, data); - } - - readHosts(id, params) { - return this.http.get(`${this.baseUrl}${id}/hosts/`, { - params, - }); - } - - async readHostDetail(inventoryId, hostId) { - const { - data: { results }, - } = await this.http.get( - `${this.baseUrl}${inventoryId}/hosts/?id=${hostId}` - ); - - if (Array.isArray(results) && results.length) { - return results[0]; - } - - throw new Error( - `How did you get here? Host not found for Inventory ID: ${inventoryId}` - ); - } - - readGroups(id, params) { - return this.http.get(`${this.baseUrl}${id}/groups/`, { - params, - }); - } - - readGroupsOptions(id) { - return this.http.options(`${this.baseUrl}${id}/groups/`); - } - - readHostsOptions(id) { - return this.http.options(`${this.baseUrl}${id}/hosts/`); - } - - promoteGroup(inventoryId, groupId) { - return this.http.post(`${this.baseUrl}${inventoryId}/groups/`, { - id: groupId, - disassociate: true, - }); - } - - readInputInventories(inventoryId, params) { - return this.http.get(`${this.baseUrl}${inventoryId}/input_inventories/`, { - params, - }); - } - - readSources(inventoryId, params) { - return this.http.get(`${this.baseUrl}${inventoryId}/inventory_sources/`, { - params, - }); - } - - updateSources(inventoryId) { - return this.http.get( - `${this.baseUrl}${inventoryId}/update_inventory_sources/` - ); - } - - async readSourceDetail(inventoryId, sourceId) { - const { - data: { results }, - } = await this.http.get( - `${this.baseUrl}${inventoryId}/inventory_sources/?id=${sourceId}` - ); - - if (Array.isArray(results) && results.length) { - return results[0]; - } - - throw new Error( - `How did you get here? Source not found for Inventory ID: ${inventoryId}` - ); - } - - syncAllSources(inventoryId) { - return this.http.post( - `${this.baseUrl}${inventoryId}/update_inventory_sources/` - ); - } - - readAdHocOptions(inventoryId) { - return this.http.options(`${this.baseUrl}${inventoryId}/ad_hoc_commands/`); - } - - launchAdHocCommands(inventoryId, values) { - return this.http.post( - `${this.baseUrl}${inventoryId}/ad_hoc_commands/`, - values - ); - } - - associateLabel(id, label, orgId) { - return this.http.post(`${this.baseUrl}${id}/labels/`, { - name: label.name, - organization: orgId, - }); - } - - disassociateLabel(id, label) { - return this.http.post(`${this.baseUrl}${id}/labels/`, { - id: label.id, - disassociate: true, - }); - } - - associateInventory(id, inputInventoryId) { - return this.http.post(`${this.baseUrl}${id}/input_inventories/`, { - id: inputInventoryId, - }); - } - - disassociateInventory(id, inputInventoryId) { - return this.http.post(`${this.baseUrl}${id}/input_inventories/`, { - id: inputInventoryId, - disassociate: true, - }); - } -} - -export default Inventories; diff --git a/awx/ui/src/api/models/Inventories.ts b/awx/ui/src/api/models/Inventories.ts new file mode 100644 index 000000000..908a64968 --- /dev/null +++ b/awx/ui/src/api/models/Inventories.ts @@ -0,0 +1,214 @@ +import type { QSParams } from 'util/qs'; +import type { + AccessListEntry, + AdHocCommand, + Group, + Host, + Inventory, + InventorySource, + OptionsResponse, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; +import type { Http } from '../Base'; + +class Inventories extends InstanceGroupsMixin(Base) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/inventories/'; + + this.readAccessList = this.readAccessList.bind(this); + this.readAccessOptions = this.readAccessOptions.bind(this); + this.readHosts = this.readHosts.bind(this); + this.readHostDetail = this.readHostDetail.bind(this); + this.readGroups = this.readGroups.bind(this); + this.readGroupsOptions = this.readGroupsOptions.bind(this); + this.promoteGroup = this.promoteGroup.bind(this); + this.readInputInventories = this.readInputInventories.bind(this); + this.associateInventory = this.associateInventory.bind(this); + this.disassociateInventory = this.disassociateInventory.bind(this); + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with an inventory say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + readAccessList(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/access_list/`, + { + params, + } + ); + } + + readAccessOptions(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/access_list/` + ); + } + + createHost(id: number | string, data: unknown) { + return this.http.post(`${this.baseUrl}${id}/hosts/`, data); + } + + readHosts(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/hosts/`, { + params, + }); + } + + async readHostDetail(inventoryId: number | string, hostId: number | string) { + const { + data: { results }, + } = await this.http.get>( + `${this.baseUrl}${inventoryId}/hosts/?id=${hostId}` + ); + + if (Array.isArray(results) && results.length) { + return results[0]; + } + + throw new Error( + `How did you get here? Host not found for Inventory ID: ${inventoryId}` + ); + } + + readGroups(id: number | string, params?: QSParams) { + return this.http.get>(`${this.baseUrl}${id}/groups/`, { + params, + }); + } + + readGroupsOptions(id: number | string) { + return this.http.options(`${this.baseUrl}${id}/groups/`); + } + + readHostsOptions(id: number | string) { + return this.http.options(`${this.baseUrl}${id}/hosts/`); + } + + promoteGroup(inventoryId: number | string, groupId: number | string) { + return this.http.post(`${this.baseUrl}${inventoryId}/groups/`, { + id: groupId, + disassociate: true, + }); + } + + readInputInventories(inventoryId: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${inventoryId}/input_inventories/`, + { + params, + } + ); + } + + readSources(inventoryId: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${inventoryId}/inventory_sources/`, + { + params, + } + ); + } + + updateSources(inventoryId: number | string) { + return this.http.get( + `${this.baseUrl}${inventoryId}/update_inventory_sources/` + ); + } + + async readSourceDetail( + inventoryId: number | string, + sourceId: number | string + ) { + const { + data: { results }, + } = await this.http.get>( + `${this.baseUrl}${inventoryId}/inventory_sources/?id=${sourceId}` + ); + + if (Array.isArray(results) && results.length) { + return results[0]; + } + + throw new Error( + `How did you get here? Source not found for Inventory ID: ${inventoryId}` + ); + } + + syncAllSources(inventoryId: number | string) { + return this.http.post( + `${this.baseUrl}${inventoryId}/update_inventory_sources/` + ); + } + + readAdHocOptions(inventoryId: number | string) { + return this.http.options( + `${this.baseUrl}${inventoryId}/ad_hoc_commands/` + ); + } + + launchAdHocCommands(inventoryId: number | string, values: unknown) { + return this.http.post( + `${this.baseUrl}${inventoryId}/ad_hoc_commands/`, + values + ); + } + + associateLabel( + id: number | string, + label: { id: number; name: string }, + orgId: number | string + ) { + return this.http.post(`${this.baseUrl}${id}/labels/`, { + name: label.name, + organization: orgId, + }); + } + + disassociateLabel(id: number | string, label: { id: number; name: string }) { + return this.http.post(`${this.baseUrl}${id}/labels/`, { + id: label.id, + disassociate: true, + }); + } + + associateInventory(id: number | string, inputInventoryId: number | string) { + return this.http.post(`${this.baseUrl}${id}/input_inventories/`, { + id: inputInventoryId, + }); + } + + disassociateInventory( + id: number | string, + inputInventoryId: number | string + ) { + return this.http.post(`${this.baseUrl}${id}/input_inventories/`, { + id: inputInventoryId, + disassociate: true, + }); + } +} + +export default Inventories; diff --git a/awx/ui/src/api/models/InventoryScripts.js b/awx/ui/src/api/models/InventoryScripts.js deleted file mode 100644 index 030238e67..000000000 --- a/awx/ui/src/api/models/InventoryScripts.js +++ /dev/null @@ -1,10 +0,0 @@ -import Base from '../Base'; - -class InventoryScripts extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/inventory_scripts/'; - } -} - -export default InventoryScripts; diff --git a/awx/ui/src/api/models/InventoryScripts.ts b/awx/ui/src/api/models/InventoryScripts.ts new file mode 100644 index 000000000..158d8b024 --- /dev/null +++ b/awx/ui/src/api/models/InventoryScripts.ts @@ -0,0 +1,11 @@ +import Base from '../Base'; +import type { Http } from '../Base'; + +class InventoryScripts extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/inventory_scripts/'; + } +} + +export default InventoryScripts; diff --git a/awx/ui/src/api/models/InventorySources.js b/awx/ui/src/api/models/InventorySources.js deleted file mode 100644 index fde348721..000000000 --- a/awx/ui/src/api/models/InventorySources.js +++ /dev/null @@ -1,42 +0,0 @@ -import Base from '../Base'; -import NotificationsMixin from '../mixins/Notifications.mixin'; -import LaunchUpdateMixin from '../mixins/LaunchUpdate.mixin'; -import SchedulesMixin from '../mixins/Schedules.mixin'; -import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; - -class InventorySources extends InstanceGroupsMixin( - LaunchUpdateMixin(NotificationsMixin(SchedulesMixin(Base))) -) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/inventory_sources/'; - - this.createSchedule = this.createSchedule.bind(this); - this.createSyncStart = this.createSyncStart.bind(this); - this.destroyGroups = this.destroyGroups.bind(this); - this.destroyHosts = this.destroyHosts.bind(this); - } - - createSyncStart(sourceId, extraVars) { - return this.http.post(`${this.baseUrl}${sourceId}/update/`, { - extra_vars: extraVars, - }); - } - - readGroups(id) { - return this.http.get(`${this.baseUrl}${id}/groups/`); - } - - readHosts(id) { - return this.http.get(`${this.baseUrl}${id}/hosts/`); - } - - destroyGroups(id) { - return this.http.delete(`${this.baseUrl}${id}/groups/`); - } - - destroyHosts(id) { - return this.http.delete(`${this.baseUrl}${id}/hosts/`); - } -} -export default InventorySources; diff --git a/awx/ui/src/api/models/InventorySources.ts b/awx/ui/src/api/models/InventorySources.ts new file mode 100644 index 000000000..c2fd5168e --- /dev/null +++ b/awx/ui/src/api/models/InventorySources.ts @@ -0,0 +1,76 @@ +import type { QSParams } from 'util/qs'; +import type { + Group, + Host, + InventorySource, + InventoryUpdate, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import NotificationsMixin from '../mixins/Notifications.mixin'; +import LaunchUpdateMixin from '../mixins/LaunchUpdate.mixin'; +import SchedulesMixin from '../mixins/Schedules.mixin'; +import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; +import type { Http } from '../Base'; + +class InventorySources extends InstanceGroupsMixin( + LaunchUpdateMixin(NotificationsMixin(SchedulesMixin(Base))) +) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/inventory_sources/'; + + this.createSchedule = this.createSchedule.bind(this); + this.createSyncStart = this.createSyncStart.bind(this); + this.destroyGroups = this.destroyGroups.bind(this); + this.destroyHosts = this.destroyHosts.bind(this); + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with an inventory source say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + createSyncStart(sourceId: number | string, extraVars?: unknown) { + return this.http.post( + `${this.baseUrl}${sourceId}/update/`, + { + extra_vars: extraVars, + } + ); + } + + readGroups(id: number | string) { + return this.http.get>(`${this.baseUrl}${id}/groups/`); + } + + readHosts(id: number | string) { + return this.http.get>(`${this.baseUrl}${id}/hosts/`); + } + + destroyGroups(id: number | string) { + return this.http.delete(`${this.baseUrl}${id}/groups/`); + } + + destroyHosts(id: number | string) { + return this.http.delete(`${this.baseUrl}${id}/hosts/`); + } +} +export default InventorySources; diff --git a/awx/ui/src/api/models/InventoryUpdates.js b/awx/ui/src/api/models/InventoryUpdates.js deleted file mode 100644 index 3d2e21872..000000000 --- a/awx/ui/src/api/models/InventoryUpdates.js +++ /dev/null @@ -1,19 +0,0 @@ -import Base from '../Base'; -import RunnableMixin from '../mixins/Runnable.mixin'; - -class InventoryUpdates extends RunnableMixin(Base) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/inventory_updates/'; - this.createSyncCancel = this.createSyncCancel.bind(this); - } - - createSyncCancel(sourceId) { - return this.http.post(`${this.baseUrl}${sourceId}/cancel/`); - } - - readCredentials(id) { - return this.http.get(`${this.baseUrl}${id}/credentials/`); - } -} -export default InventoryUpdates; diff --git a/awx/ui/src/api/models/InventoryUpdates.ts b/awx/ui/src/api/models/InventoryUpdates.ts new file mode 100644 index 000000000..9ad912df0 --- /dev/null +++ b/awx/ui/src/api/models/InventoryUpdates.ts @@ -0,0 +1,46 @@ +import type { QSParams } from 'util/qs'; +import type { Credential, InventoryUpdate, Paginated } from '../../types/api'; +import Base from '../Base'; +import RunnableMixin from '../mixins/Runnable.mixin'; +import type { Http } from '../Base'; + +class InventoryUpdates extends RunnableMixin(Base) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/inventory_updates/'; + this.createSyncCancel = this.createSyncCancel.bind(this); + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with an inventory update say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + createSyncCancel(sourceId: number | string) { + return this.http.post(`${this.baseUrl}${sourceId}/cancel/`); + } + + readCredentials(id: number | string) { + return this.http.get>( + `${this.baseUrl}${id}/credentials/` + ); + } +} +export default InventoryUpdates; diff --git a/awx/ui/src/api/models/JobEvents.js b/awx/ui/src/api/models/JobEvents.js deleted file mode 100644 index b4640e388..000000000 --- a/awx/ui/src/api/models/JobEvents.js +++ /dev/null @@ -1,14 +0,0 @@ -import Base from '../Base'; - -class JobEvents extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/job_events/'; - } - - readChildren(id, params) { - return this.http.get(`${this.baseUrl}${id}/children/`, { params }); - } -} - -export default JobEvents; diff --git a/awx/ui/src/api/models/JobEvents.ts b/awx/ui/src/api/models/JobEvents.ts new file mode 100644 index 000000000..ba602c05b --- /dev/null +++ b/awx/ui/src/api/models/JobEvents.ts @@ -0,0 +1,20 @@ +import type { QSParams } from 'util/qs'; +import type { JobEventRecord, Paginated } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class JobEvents extends Base { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/job_events/'; + } + + readChildren(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/children/`, + { params } + ); + } +} + +export default JobEvents; diff --git a/awx/ui/src/api/models/JobTemplates.js b/awx/ui/src/api/models/JobTemplates.js deleted file mode 100644 index d2c1eb7a5..000000000 --- a/awx/ui/src/api/models/JobTemplates.js +++ /dev/null @@ -1,93 +0,0 @@ -import Base from '../Base'; -import NotificationsMixin from '../mixins/Notifications.mixin'; -import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; -import LabelsMixin from '../mixins/Labels.mixin'; -import SchedulesMixin from '../mixins/Schedules.mixin'; - -class JobTemplates extends SchedulesMixin( - InstanceGroupsMixin(NotificationsMixin(LabelsMixin(Base))) -) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/job_templates/'; - - this.createSchedule = this.createSchedule.bind(this); - this.launch = this.launch.bind(this); - this.readLaunch = this.readLaunch.bind(this); - this.associateLabel = this.associateLabel.bind(this); - this.disassociateLabel = this.disassociateLabel.bind(this); - this.readCredentials = this.readCredentials.bind(this); - this.readAccessList = this.readAccessList.bind(this); - this.readAccessOptions = this.readAccessOptions.bind(this); - this.readWebhookKey = this.readWebhookKey.bind(this); - } - - launch(id, data) { - return this.http.post(`${this.baseUrl}${id}/launch/`, data); - } - - readTemplateOptions(id) { - return this.http.options(`${this.baseUrl}${id}/`); - } - - readLaunch(id) { - return this.http.get(`${this.baseUrl}${id}/launch/`); - } - - readCredentials(id, params) { - return this.http.get(`${this.baseUrl}${id}/credentials/`, { - params, - }); - } - - associateCredentials(id, credentialId) { - return this.http.post(`${this.baseUrl}${id}/credentials/`, { - id: credentialId, - }); - } - - disassociateCredentials(id, credentialId) { - return this.http.post(`${this.baseUrl}${id}/credentials/`, { - id: credentialId, - disassociate: true, - }); - } - - readAccessList(id, params) { - return this.http.get(`${this.baseUrl}${id}/access_list/`, { - params, - }); - } - - readAccessOptions(id) { - return this.http.options(`${this.baseUrl}${id}/access_list/`); - } - - readScheduleList(id, params) { - return this.http.get(`${this.baseUrl}${id}/schedules/`, { - params, - }); - } - - readSurvey(id) { - return this.http.get(`${this.baseUrl}${id}/survey_spec/`); - } - - updateSurvey(id, survey) { - return this.http.post(`${this.baseUrl}${id}/survey_spec/`, survey); - } - - destroySurvey(id) { - return this.http.delete(`${this.baseUrl}${id}/survey_spec/`); - } - - readWebhookKey(id) { - return this.http.get(`${this.baseUrl}${id}/webhook_key/`); - } - - updateWebhookKey(id) { - return this.http.post(`${this.baseUrl}${id}/webhook_key/`); - } -} - -export default JobTemplates; diff --git a/awx/ui/src/api/models/JobTemplates.ts b/awx/ui/src/api/models/JobTemplates.ts new file mode 100644 index 000000000..e77d67bf2 --- /dev/null +++ b/awx/ui/src/api/models/JobTemplates.ts @@ -0,0 +1,140 @@ +import type { QSParams } from 'util/qs'; +import type { + AccessListEntry, + Credential, + Job, + JobTemplate, + LaunchConfig, + OptionsResponse, + Paginated, + Schedule, + SurveyConfig, + WebhookKey, +} from '../../types/api'; +import Base from '../Base'; +import NotificationsMixin from '../mixins/Notifications.mixin'; +import InstanceGroupsMixin from '../mixins/InstanceGroups.mixin'; +import LabelsMixin from '../mixins/Labels.mixin'; +import SchedulesMixin from '../mixins/Schedules.mixin'; +import type { Http } from '../Base'; + +class JobTemplates extends SchedulesMixin( + InstanceGroupsMixin(NotificationsMixin(LabelsMixin(Base))) +) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/job_templates/'; + + this.createSchedule = this.createSchedule.bind(this); + this.launch = this.launch.bind(this); + this.readLaunch = this.readLaunch.bind(this); + this.associateLabel = this.associateLabel.bind(this); + this.disassociateLabel = this.disassociateLabel.bind(this); + this.readCredentials = this.readCredentials.bind(this); + this.readAccessList = this.readAccessList.bind(this); + this.readAccessOptions = this.readAccessOptions.bind(this); + this.readWebhookKey = this.readWebhookKey.bind(this); + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with a job template say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + launch(id: number | string, data: unknown) { + return this.http.post(`${this.baseUrl}${id}/launch/`, data); + } + + readTemplateOptions(id: number | string) { + return this.http.options(`${this.baseUrl}${id}/`); + } + + readLaunch(id: number | string) { + return this.http.get(`${this.baseUrl}${id}/launch/`); + } + + readCredentials(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/credentials/`, + { + params, + } + ); + } + + associateCredentials(id: number | string, credentialId: number | string) { + return this.http.post(`${this.baseUrl}${id}/credentials/`, { + id: credentialId, + }); + } + + disassociateCredentials(id: number | string, credentialId: number | string) { + return this.http.post(`${this.baseUrl}${id}/credentials/`, { + id: credentialId, + disassociate: true, + }); + } + + readAccessList(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/access_list/`, + { + params, + } + ); + } + + readAccessOptions(id: number | string) { + return this.http.options( + `${this.baseUrl}${id}/access_list/` + ); + } + + readScheduleList(id: number | string, params?: QSParams) { + return this.http.get>( + `${this.baseUrl}${id}/schedules/`, + { + params, + } + ); + } + + readSurvey(id: number | string) { + return this.http.get(`${this.baseUrl}${id}/survey_spec/`); + } + + updateSurvey(id: number | string, survey: unknown) { + return this.http.post(`${this.baseUrl}${id}/survey_spec/`, survey); + } + + destroySurvey(id: number | string) { + return this.http.delete(`${this.baseUrl}${id}/survey_spec/`); + } + + readWebhookKey(id: number | string) { + return this.http.get(`${this.baseUrl}${id}/webhook_key/`); + } + + updateWebhookKey(id: number | string) { + return this.http.post(`${this.baseUrl}${id}/webhook_key/`); + } +} + +export default JobTemplates; diff --git a/awx/ui/src/api/models/Jobs.js b/awx/ui/src/api/models/Jobs.js deleted file mode 100644 index 2e12c3ceb..000000000 --- a/awx/ui/src/api/models/Jobs.js +++ /dev/null @@ -1,28 +0,0 @@ -import Base from '../Base'; -import RunnableMixin from '../mixins/Runnable.mixin'; - -class Jobs extends RunnableMixin(Base) { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/jobs/'; - this.jobEventSlug = '/job_events/'; - } - - cancel(id) { - return this.http.post(`${this.baseUrl}${id}/cancel/`); - } - - readCredentials(id) { - return this.http.get(`${this.baseUrl}${id}/credentials/`); - } - - readDetail(id) { - return this.http.get(`${this.baseUrl}${id}/`); - } - - readChildrenSummary(id) { - return this.http.get(`${this.baseUrl}${id}/job_events/children_summary/`); - } -} - -export default Jobs; diff --git a/awx/ui/src/api/models/Jobs.ts b/awx/ui/src/api/models/Jobs.ts new file mode 100644 index 000000000..c7f9136b5 --- /dev/null +++ b/awx/ui/src/api/models/Jobs.ts @@ -0,0 +1,58 @@ +import type { QSParams } from 'util/qs'; +import type { + ChildrenSummary, + Credential, + Job, + Paginated, +} from '../../types/api'; +import Base from '../Base'; +import RunnableMixin from '../mixins/Runnable.mixin'; +import type { Http } from '../Base'; + +class Jobs extends RunnableMixin(Base) { + constructor(http?: Http) { + super(http); + this.baseUrl = 'api/v2/jobs/'; + this.jobEventSlug = '/job_events/'; + } + + // Reached through a mixin, which cannot carry the resource type along, so + // the calls that answer with a job say so here. + read>(params?: QSParams) { + return super.read(params); + } + + readDetail(id: number | string) { + return super.readDetail(id); + } + + create(data?: unknown) { + return super.create(data); + } + + update(id: number | string, data?: unknown) { + return super.update(id, data); + } + + copy(id: number | string, data?: unknown) { + return super.copy(id, data); + } + + cancel(id: number | string) { + return this.http.post(`${this.baseUrl}${id}/cancel/`); + } + + readCredentials(id: number | string) { + return this.http.get>( + `${this.baseUrl}${id}/credentials/` + ); + } + + readChildrenSummary(id: number | string) { + return this.http.get( + `${this.baseUrl}${id}/job_events/children_summary/` + ); + } +} + +export default Jobs; diff --git a/awx/ui/src/api/models/Labels.js b/awx/ui/src/api/models/Labels.js deleted file mode 100644 index ecc9d078f..000000000 --- a/awx/ui/src/api/models/Labels.js +++ /dev/null @@ -1,10 +0,0 @@ -import Base from '../Base'; - -class Labels extends Base { - constructor(http) { - super(http); - this.baseUrl = 'api/v2/labels/'; - } -} - -export default Labels; diff --git a/awx/ui/src/api/models/Labels.ts b/awx/ui/src/api/models/Labels.ts new file mode 100644 index 000000000..1a03c9ad2 --- /dev/null +++ b/awx/ui/src/api/models/Labels.ts @@ -0,0 +1,12 @@ +import type { Label } from '../../types/api'; +import Base from '../Base'; +import type { Http } from '../Base'; + +class Labels extends Base