diff --git a/.yarnrc.yml b/.yarnrc.yml index 1479916..93aff9d 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -2,14 +2,14 @@ compressionLevel: mixed enableGlobalCache: true -# Do not track. enableTelemetry: false -# Only hoist dependencies at the workspace level. nmHoistingLimits: workspaces -# Use classic npm link behavior. nodeLinker: node-modules -# Path to the pinned version of yarn. +# Uncomment this when working without the Nexus server running. +# npmAlwaysAuth: false +# npmRegistryServer: "https://registry.yarnpkg.com/" + yarnPath: .yarn/releases/yarn-4.1.1.cjs diff --git a/makefile b/makefile index 77bdf67..4154140 100644 --- a/makefile +++ b/makefile @@ -1,9 +1,16 @@ .DEFAULT_GOAL:=all -all: install-dependencies install check +all: install check + +.PHONY: start-ournexus +start-ournexus: + @echo "Starting ournexus..." + @yarn workspaces focus @ourchitecture/ournexus + @cd ./src/systems/dev/nexus && make start + @echo "Successfully started ournexus." .PHONY: install-dependencies -install-dependencies: +install-dependencies: start-ournexus @echo "Installing monorepo dependencies..." @npm_config_loglevel=error yarn install --immutable @yarn workspaces foreach --all --interlaced run install --immutable @@ -16,7 +23,7 @@ install-dependencies: init: install-dependencies .PHONY: install -install: +install: install-dependencies @echo "Installing independent projects..." @cd ./src/systems/dev/backstage/ourstage && make $@ @echo "Successfully installed independent projects." @@ -75,6 +82,7 @@ format: .PHONY: up up: @echo "Starting the system..." + @cd ./src/systems/dev/nexus && make $@ @cd ./src/systems/dev/backstage/ourstage && make $@ @echo "Successfully started the system." .PHONY: start @@ -90,12 +98,16 @@ run: up down: @echo "Stopping the system..." @cd ./src/systems/dev/backstage/ourstage && make $@ - @echo "Stopping started the system." + @cd ./src/systems/dev/nexus && make $@ + @echo "Successfully stopped the system." .PHONY: stop stop: down .PHONY: shutdown shutdown: down +.PHONY: restart +restart: down up + .PHONY: upgrade upgrade: @echo "Upgrading monorepo..." @@ -115,6 +127,7 @@ clean: @echo "Cleaning independent projects..." @cd ./src/systems/dev/backstage/ourstage && make $@ + @cd ./src/systems/dev/nexus && make $@ @echo "Successfully cleaned independent projects." .PHONY: reset @@ -129,6 +142,7 @@ reset: clean @echo "Resetting independent projects..." @cd ./src/systems/dev/backstage/ourstage && make $@ + @cd ./src/systems/dev/nexus && make $@ @echo "Successfully reset independent projects." ################################################################################ diff --git a/package.json b/package.json index 50ee857..a78b65c 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ }, "workspaces": [ "src/designs/**/*", + "src/systems/dev/nexus", "src/systems/leadof/**/*" ] } diff --git a/src/systems/dev/backstage/catalog/catalog-info.yaml b/src/systems/dev/backstage/catalog/catalog-info.yaml index c82218f..df446a5 100644 --- a/src/systems/dev/backstage/catalog/catalog-info.yaml +++ b/src/systems/dev/backstage/catalog/catalog-info.yaml @@ -10,4 +10,5 @@ metadata: spec: targets: - ./groups/catalog-info.yaml + - ./systems/catalog-info.yaml - ./users/catalog-info.yaml diff --git a/src/systems/dev/backstage/catalog/containerfile b/src/systems/dev/backstage/catalog/containerfile new file mode 100644 index 0000000..d3311b6 --- /dev/null +++ b/src/systems/dev/backstage/catalog/containerfile @@ -0,0 +1,9 @@ +FROM httpd:2.4.58-alpine3.19@sha256:92535cf7f151901ba91b04186292c3bd5bf82aa6ffa6eb7bc405fefbffedd480 + +# Copy the files. +COPY . /usr/local/apache2/htdocs/ + +# Move the configuration file. +# Remove the default "index.html" file. +RUN mv /usr/local/apache2/htdocs/httpd.conf /usr/local/apache2/conf/httpd.conf \ + && rm /usr/local/apache2/htdocs/index.html diff --git a/src/systems/dev/backstage/catalog/groups/catalog-info.yaml b/src/systems/dev/backstage/catalog/groups/catalog-info.yaml index 19649b3..a671e5d 100644 --- a/src/systems/dev/backstage/catalog/groups/catalog-info.yaml +++ b/src/systems/dev/backstage/catalog/groups/catalog-info.yaml @@ -3,13 +3,13 @@ apiVersion: backstage.io/v1alpha1 kind: Group metadata: description: The Ourchitecture team - name: ourchitecture links: - title: Ourchitecture.io url: http://ourchitecture.io - icon: github title: Ourchitecture @GitHub url: http://github.com/ourchitectureio + name: ourchitecture spec: children: [] profile: diff --git a/src/systems/dev/backstage/catalog/httpd.conf b/src/systems/dev/backstage/catalog/httpd.conf new file mode 100644 index 0000000..fa9246f --- /dev/null +++ b/src/systems/dev/backstage/catalog/httpd.conf @@ -0,0 +1,27 @@ +ServerRoot "/usr/local/apache2" +Listen 3005 +LoadModule mpm_event_module modules/mod_mpm_event.so +LoadModule authn_file_module modules/mod_authn_file.so +LoadModule authz_core_module modules/mod_authz_core.so +LoadModule dir_module modules/mod_dir.so +LoadModule log_config_module modules/mod_log_config.so +LoadModule mime_module modules/mod_mime.so +LoadModule unixd_module modules/mod_unixd.so + +ServerAdmin you@example.com +ServerName localhost + +DocumentRoot "/usr/local/apache2/htdocs" + + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + + +ErrorLog "logs/error_log" +LogLevel warn + + + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + CustomLog "logs/access_log" combined + diff --git a/src/systems/dev/backstage/catalog/makefile b/src/systems/dev/backstage/catalog/makefile new file mode 100644 index 0000000..26557d7 --- /dev/null +++ b/src/systems/dev/backstage/catalog/makefile @@ -0,0 +1,61 @@ +.PHONY: install +install: + @echo "Installing ourstage catalog..." + @docker build \ + --tag localhost/ourstage/catalog:latest \ + --file ./containerfile \ + ./ + @echo "Installing started ourstage catalog." + +.PHONY: debug +debug: install + @echo "Debugging ourstage catalog..." + @docker run \ + --name debug-ourstage-catalog \ + --rm \ + --interactive \ + --tty \ + --entrypoint /bin/sh \ + --user root \ + --network host \ + localhost/ourstage/catalog:latest + @echo "Successfully debugged ourstage catalog." + +.PHONY: up +up: install + @echo "Starting ourstage catalog..." + @docker run \ + --detach \ + --name ourstage-catalog \ + --network host \ + --user root \ + localhost/ourstage/catalog:latest + @echo "Ourstage catalog is available at http://localhost:3005." + @echo "Successfully started ourstage catalog." +.PHONY: start +start: up +.PHONY: startup +startup: up +.PHONY: serve +serve: up +.PHONY: run +run: up + +.PHONY: logs +logs: + @echo "Getting ourstage catalog logs..." + @docker logs ourstage-catalog + @echo "Successfully got ourstage catalog logs." + +.PHONY: down +down: + @echo "Stopping ourstage catalog..." + @docker rm -f ourstage-catalog || true + @echo "Successfully stopped ourstage catalog." +.PHONY: stop +stop: down +.PHONY: shutdown +shutdown: down + +.PHONY: restart +restart: down up diff --git a/src/systems/dev/backstage/catalog/systems/apis/ournexus/swagger.json b/src/systems/dev/backstage/catalog/systems/apis/ournexus/swagger.json new file mode 100644 index 0000000..22c70b6 --- /dev/null +++ b/src/systems/dev/backstage/catalog/systems/apis/ournexus/swagger.json @@ -0,0 +1,15111 @@ +{ + "swagger": "2.0", + "info": { + "version": "3.66.0-02", + "title": "Nexus Repository Manager REST API" + }, + "basePath": "/service/rest/", + "tags": [ + { + "name": "Security Management: Anonymous Access" + }, + { + "name": "Security management" + }, + { + "name": "Security management: users" + }, + { + "name": "Security management: privileges" + }, + { + "name": "Security management: realms" + }, + { + "name": "Security management: roles" + }, + { + "name": "Tasks" + }, + { + "name": "Blob store" + }, + { + "name": "Lifecycle" + }, + { + "name": "Read-only" + }, + { + "name": "Security: certificates" + }, + { + "name": "Assets" + }, + { + "name": "Components" + }, + { + "name": "Repository Management" + }, + { + "name": "Content selectors" + }, + { + "name": "Routing rules" + }, + { + "name": "Search" + }, + { + "name": "Formats" + }, + { + "name": "Email" + }, + { + "name": "Status" + }, + { + "name": "Support" + }, + { + "name": "Script" + }, + { + "name": "Security management: LDAP" + }, + { + "name": "Manage Sonatype Repository Firewall configuration" + }, + { + "name": "Product licensing" + }, + { + "name": "Azure blob store" + } + ], + "paths": { + "/v1/security/anonymous": { + "get": { + "tags": [ + "Security Management: Anonymous Access" + ], + "summary": "Get Anonymous Access settings", + "description": "", + "operationId": "read", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AnonymousAccessSettingsXO" + } + }, + "403": { + "description": "Insufficient permissions to update settings" + } + } + }, + "put": { + "tags": [ + "Security Management: Anonymous Access" + ], + "summary": "Update Anonymous Access settings", + "description": "", + "operationId": "update", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AnonymousAccessSettingsXO" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AnonymousAccessSettingsXO" + } + }, + "403": { + "description": "Insufficient permissions to update settings" + } + } + } + }, + "/v1/security/user-sources": { + "get": { + "tags": [ + "Security management" + ], + "summary": "Retrieve a list of the available user sources.", + "description": "", + "operationId": "getUserSources", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiUserSource" + } + } + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/users/{userId}": { + "put": { + "tags": [ + "Security management: users" + ], + "summary": "Update an existing user.", + "description": "", + "operationId": "updateUser", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The userid the request should apply to.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "A representation of the user to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiUser" + } + } + ], + "responses": { + "400": { + "description": "Password was not supplied in the body of the request" + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "User or user source not found in the system." + } + } + }, + "delete": { + "tags": [ + "Security management: users" + ], + "summary": "Delete a user.", + "description": "", + "operationId": "deleteUser", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The userid the request should apply to.", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "There was problem deleting a user. Consult the response body for more details" + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "User or user source not found in the system." + } + } + } + }, + "/v1/security/users/{userId}/change-password": { + "put": { + "tags": [ + "Security management: users" + ], + "summary": "Change a user's password.", + "description": "", + "operationId": "changePassword", + "consumes": [ + "text/plain" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "userId", + "in": "path", + "description": "The userid the request should apply to.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The new password to use.", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Password was not supplied in the body of the request" + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "User not found in the system." + } + } + } + }, + "/v1/security/users": { + "get": { + "tags": [ + "Security management: users" + ], + "summary": "Retrieve a list of users. Note if the source is not 'default' the response is limited to 100 users.", + "description": "", + "operationId": "getUsers", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "userId", + "in": "query", + "description": "An optional term to search userids for.", + "required": false, + "type": "string" + }, + { + "name": "source", + "in": "query", + "description": "An optional user source to restrict the search to.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiUser" + } + } + }, + "400": { + "description": "Password was not supplied in the body of the request" + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + }, + "post": { + "tags": [ + "Security management: users" + ], + "summary": "Create a new user in the default source.", + "description": "", + "operationId": "createUser", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "A representation of the user to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiCreateUser" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiUser" + } + }, + "400": { + "description": "Password was not supplied in the body of the request" + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges": { + "get": { + "tags": [ + "Security management: privileges" + ], + "summary": "Retrieve a list of privileges.", + "description": "", + "operationId": "getPrivileges", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiPrivilege" + } + } + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/application": { + "post": { + "tags": [ + "Security management: privileges" + ], + "summary": "Create an application type privilege.", + "description": "", + "operationId": "createPrivilege", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The privilege to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeApplicationRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/wildcard": { + "post": { + "tags": [ + "Security management: privileges" + ], + "summary": "Create a wildcard type privilege.", + "description": "", + "operationId": "createPrivilege_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The privilege to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeWildcardRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/application/{privilegeName}": { + "put": { + "tags": [ + "Security management: privileges" + ], + "summary": "Update an application type privilege.", + "description": "", + "operationId": "updatePrivilege", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to update.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The privilege to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeApplicationRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/security/privileges/wildcard/{privilegeName}": { + "put": { + "tags": [ + "Security management: privileges" + ], + "summary": "Update a wildcard type privilege.", + "description": "", + "operationId": "updatePrivilege_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to update.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The privilege to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeWildcardRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/security/privileges/{privilegeName}": { + "get": { + "tags": [ + "Security management: privileges" + ], + "summary": "Retrieve a privilege by name.", + "description": "", + "operationId": "getPrivilege", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to retrieve.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiPrivilege" + } + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + }, + "delete": { + "tags": [ + "Security management: privileges" + ], + "summary": "Delete a privilege by name.", + "description": "", + "operationId": "deletePrivilege", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to delete.", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "The privilege is internal and may not be altered." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/security/realms/active": { + "get": { + "tags": [ + "Security management: realms" + ], + "summary": "List the active realm IDs in order", + "description": "", + "operationId": "getActiveRealms", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "put": { + "tags": [ + "Security management: realms" + ], + "summary": "Set the active security realms in the order they should be used", + "description": "", + "operationId": "setActiveRealms", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The realm IDs", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/v1/security/realms/available": { + "get": { + "tags": [ + "Security management: realms" + ], + "summary": "List the available realms", + "description": "", + "operationId": "getRealms", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/RealmApiXO" + } + } + } + } + } + }, + "/v1/security/roles": { + "get": { + "tags": [ + "Security management: roles" + ], + "summary": "List roles", + "description": "", + "operationId": "getRoles", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "source", + "in": "query", + "description": "The id of the user source to filter the roles by, if supplied. Otherwise roles from all user sources will be returned.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/RoleXOResponse" + } + } + }, + "400": { + "description": "The specified source does not exist" + }, + "403": { + "description": "Insufficient permissions to read roles" + } + } + }, + "post": { + "tags": [ + "Security management: roles" + ], + "summary": "Create role", + "description": "", + "operationId": "create", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "A role configuration", + "required": true, + "schema": { + "$ref": "#/definitions/RoleXORequest" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/RoleXOResponse" + } + }, + "403": { + "description": "Insufficient permissions to create role" + } + } + } + }, + "/v1/security/roles/{id}": { + "get": { + "tags": [ + "Security management: roles" + ], + "summary": "Get role", + "description": "", + "operationId": "getRole", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "source", + "in": "query", + "description": "The id of the user source to filter the roles by. Available sources can be fetched using the 'User Sources' endpoint.", + "required": false, + "type": "string", + "default": "default" + }, + { + "name": "id", + "in": "path", + "description": "The id of the role to get", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/RoleXOResponse" + } + }, + "400": { + "description": "The specified source does not exist" + }, + "403": { + "description": "Insufficient permissions to read roles" + }, + "404": { + "description": "Role not found" + } + } + }, + "put": { + "tags": [ + "Security management: roles" + ], + "summary": "Update role", + "description": "", + "operationId": "update_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "The id of the role to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "A role configuration", + "required": true, + "schema": { + "$ref": "#/definitions/RoleXORequest" + } + } + ], + "responses": { + "403": { + "description": "Insufficient permissions to update role" + }, + "404": { + "description": "Role not found" + } + } + }, + "delete": { + "tags": [ + "Security management: roles" + ], + "summary": "Delete role", + "description": "", + "operationId": "delete", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "The id of the role to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "403": { + "description": "Insufficient permissions to delete role" + }, + "404": { + "description": "Role not found" + } + } + } + }, + "/v1/tasks": { + "get": { + "tags": [ + "Tasks" + ], + "summary": "List tasks", + "description": "", + "operationId": "getTasks", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "type", + "in": "query", + "description": "Type of the tasks to get", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PageTaskXO" + } + } + } + } + }, + "/v1/tasks/{id}": { + "get": { + "tags": [ + "Tasks" + ], + "summary": "Get a single task by id", + "description": "", + "operationId": "getTaskById", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Id of the task to get", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TaskXO" + } + }, + "404": { + "description": "Task not found" + } + } + } + }, + "/v1/tasks/{id}/run": { + "post": { + "tags": [ + "Tasks" + ], + "summary": "Run task", + "description": "", + "operationId": "run", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Id of the task to run", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Task was run" + }, + "404": { + "description": "Task not found" + }, + "405": { + "description": "Task is disabled" + } + } + } + }, + "/v1/tasks/{id}/stop": { + "post": { + "tags": [ + "Tasks" + ], + "summary": "Stop task", + "description": "", + "operationId": "stop", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Id of the task to stop", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Task was stopped" + }, + "404": { + "description": "Task not found" + }, + "409": { + "description": "Unable to stop task" + } + } + } + }, + "/v1/blobstores/{name}/quota-status": { + "get": { + "tags": [ + "Blob store" + ], + "summary": "Get quota status for a given blob store", + "description": "", + "operationId": "quotaStatus", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/BlobStoreQuotaResultXO" + } + } + } + } + }, + "/v1/blobstores/{name}": { + "delete": { + "tags": [ + "Blob store" + ], + "summary": "Delete a blob store by name", + "description": "", + "operationId": "deleteBlobStore", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The name of the blob store to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/v1/blobstores": { + "get": { + "tags": [ + "Blob store" + ], + "summary": "List the blob stores", + "description": "", + "operationId": "listBlobStores", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/GenericBlobStoreApiResponse" + } + } + } + } + } + }, + "/v1/blobstores/file": { + "post": { + "tags": [ + "Blob store" + ], + "summary": "Create a file blob store", + "description": "", + "operationId": "createFileBlobStore", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/FileBlobStoreApiCreateRequest" + } + } + ], + "responses": { + "204": { + "description": "Success" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/blobstores/file/{name}": { + "get": { + "tags": [ + "Blob store" + ], + "summary": "Get a file blob store configuration by name", + "description": "", + "operationId": "getFileBlobStoreConfiguration", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The name of the file blob store to read", + "required": true, + "type": "string", + "x-example": "default" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/FileBlobStoreApiModel" + } + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Blob store not found" + } + } + }, + "put": { + "tags": [ + "Blob store" + ], + "summary": "Update a file blob store configuration by name", + "description": "", + "operationId": "updateFileBlobStore", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The name of the file blob store to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/FileBlobStoreApiUpdateRequest" + } + } + ], + "responses": { + "204": { + "description": "Success" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Blob store not found" + } + } + } + }, + "/v1/lifecycle/bounce": { + "put": { + "tags": [ + "Lifecycle" + ], + "summary": "Bounce lifecycle phase", + "description": "Re-runs all phases from the given phase to the current phase", + "operationId": "bounce", + "consumes": [ + "text/plain" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The phase to bounce", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/v1/lifecycle/phase": { + "get": { + "tags": [ + "Lifecycle" + ], + "summary": "Get current lifecycle phase", + "description": "", + "operationId": "getPhase", + "produces": [ + "text/plain" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "string" + } + } + } + }, + "put": { + "tags": [ + "Lifecycle" + ], + "summary": "Move to new lifecycle phase", + "description": "", + "operationId": "setPhase", + "consumes": [ + "text/plain" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The phase to move to", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/v1/read-only/freeze": { + "post": { + "tags": [ + "Read-only" + ], + "summary": "Enable read-only", + "description": "", + "operationId": "freeze", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "204": { + "description": "System is now read-only" + }, + "403": { + "description": "Authentication required" + }, + "404": { + "description": "No change to read-only state" + } + } + } + }, + "/v1/read-only/force-release": { + "post": { + "tags": [ + "Read-only" + ], + "summary": "Forcibly release read-only", + "description": "Forcibly release read-only status, including System initiated tasks. Warning: may result in data loss.", + "operationId": "forceRelease", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "204": { + "description": "System is no longer read-only" + }, + "403": { + "description": "Authentication required" + }, + "404": { + "description": "No change to read-only state" + } + } + } + }, + "/v1/read-only/release": { + "post": { + "tags": [ + "Read-only" + ], + "summary": "Release read-only", + "description": "Release administrator initiated read-only status. Will not release read-only caused by system tasks.", + "operationId": "release", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "204": { + "description": "System is no longer read-only" + }, + "403": { + "description": "Authentication required" + }, + "404": { + "description": "No change to read-only state" + } + } + } + }, + "/v1/read-only": { + "get": { + "tags": [ + "Read-only" + ], + "summary": "Get read-only state", + "description": "", + "operationId": "get", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ReadOnlyState" + } + } + } + } + }, + "/v1/security/ssl": { + "get": { + "tags": [ + "Security: certificates" + ], + "summary": "Helper method to retrieve certificate details from a remote system.", + "description": "", + "operationId": "retrieveCertificate", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "host", + "in": "query", + "description": "The remote system's host name", + "required": true, + "type": "string" + }, + { + "name": "port", + "in": "query", + "description": "The port on the remote system to connect to", + "required": false, + "type": "integer", + "default": 443, + "format": "int32" + }, + { + "name": "protocolHint", + "in": "query", + "description": "An optional hint of the protocol to try for the connection", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiCertificate" + } + }, + "400": { + "description": "A certificate could not be retrieved, see the message for details." + }, + "403": { + "description": "Insufficient permissions to retrieve remote certificate." + } + } + } + }, + "/v1/security/ssl/truststore": { + "get": { + "tags": [ + "Security: certificates" + ], + "summary": "Retrieve a list of certificates added to the trust store.", + "description": "", + "operationId": "getTrustStoreCertificates", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ApiCertificate" + } + } + }, + "403": { + "description": "Insufficient permissions to list certificates in the trust store." + } + } + }, + "post": { + "tags": [ + "Security: certificates" + ], + "summary": "Add a certificate to the trust store.", + "description": "", + "operationId": "addCertificate", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The certificate to add encoded in PEM format", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "The certificate was successfully added.", + "schema": { + "$ref": "#/definitions/ApiCertificate" + } + }, + "403": { + "description": "Insufficient permissions to add certificate to the trust store." + }, + "409": { + "description": "The certificate already exists in the system." + } + } + } + }, + "/v1/security/ssl/truststore/{id}": { + "delete": { + "tags": [ + "Security: certificates" + ], + "summary": "Remove a certificate in the trust store.", + "description": "", + "operationId": "removeCertificate", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "The id of the certificate that should be removed.", + "required": true, + "type": "string" + } + ], + "responses": { + "403": { + "description": "Insufficient permissions to remove certificate from the trust store" + } + } + } + }, + "/v1/assets/{id}": { + "get": { + "tags": [ + "Assets" + ], + "summary": "Get a single asset", + "description": "", + "operationId": "getAssetById", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Id of the asset to get", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AssetXO" + } + }, + "403": { + "description": "Insufficient permissions to get asset" + }, + "404": { + "description": "Asset not found" + }, + "422": { + "description": "Malformed ID" + } + } + }, + "delete": { + "tags": [ + "Assets" + ], + "summary": "Delete a single asset", + "description": "", + "operationId": "deleteAsset", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Id of the asset to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Asset was successfully deleted" + }, + "403": { + "description": "Insufficient permissions to delete asset" + }, + "404": { + "description": "Asset not found" + }, + "422": { + "description": "Malformed ID" + } + } + } + }, + "/v1/assets": { + "get": { + "tags": [ + "Assets" + ], + "summary": "List assets", + "description": "", + "operationId": "getAssets", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "continuationToken", + "in": "query", + "description": "A token returned by a prior request. If present, the next page of results are returned", + "required": false, + "type": "string" + }, + { + "name": "repository", + "in": "query", + "description": "Repository from which you would like to retrieve assets.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PageAssetXO" + } + }, + "403": { + "description": "Insufficient permissions to list assets" + }, + "422": { + "description": "Parameter 'repository' is required" + } + } + } + }, + "/v1/components/{id}": { + "get": { + "tags": [ + "Components" + ], + "summary": "Get a single component", + "description": "", + "operationId": "getComponentById", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the component to retrieve", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ComponentXO" + } + }, + "403": { + "description": "Insufficient permissions to get component" + }, + "404": { + "description": "Component not found" + }, + "422": { + "description": "Malformed ID" + } + } + }, + "delete": { + "tags": [ + "Components" + ], + "summary": "Delete a single component", + "description": "", + "operationId": "deleteComponent", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of the component to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Component was successfully deleted" + }, + "403": { + "description": "Insufficient permissions to delete component" + }, + "404": { + "description": "Component not found" + }, + "422": { + "description": "Malformed ID" + } + } + } + }, + "/v1/components": { + "get": { + "tags": [ + "Components" + ], + "summary": "List components", + "description": "", + "operationId": "getComponents", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "continuationToken", + "in": "query", + "description": "A token returned by a prior request. If present, the next page of results are returned", + "required": false, + "type": "string" + }, + { + "name": "repository", + "in": "query", + "description": "Repository from which you would like to retrieve components", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PageComponentXO" + } + }, + "403": { + "description": "Insufficient permissions to list components" + }, + "422": { + "description": "Parameter 'repository' is required" + } + } + }, + "post": { + "tags": [ + "Components" + ], + "summary": "Upload a single component", + "description": "", + "operationId": "uploadComponent", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repository", + "in": "query", + "description": "Name of the repository to which you would like to upload the component", + "required": true, + "type": "string" + }, + { + "name": "r.asset", + "in": "formData", + "description": "r Asset ", + "required": false, + "type": "file" + }, + { + "name": "r.asset.pathId", + "in": "formData", + "description": "r Asset Package Path", + "required": false, + "type": "string" + }, + { + "name": "pypi.asset", + "in": "formData", + "description": "pypi Asset ", + "required": false, + "type": "file" + }, + { + "name": "helm.asset", + "in": "formData", + "description": "helm Asset ", + "required": false, + "type": "file" + }, + { + "name": "yum.directory", + "in": "formData", + "description": "yum Directory", + "required": false, + "type": "string" + }, + { + "name": "yum.asset", + "in": "formData", + "description": "yum Asset ", + "required": false, + "type": "file" + }, + { + "name": "yum.asset.filename", + "in": "formData", + "description": "yum Asset Filename", + "required": false, + "type": "string" + }, + { + "name": "docker.asset", + "in": "formData", + "description": "docker Asset ", + "required": false, + "type": "file" + }, + { + "name": "rubygems.asset", + "in": "formData", + "description": "rubygems Asset ", + "required": false, + "type": "file" + }, + { + "name": "nuget.asset", + "in": "formData", + "description": "nuget Asset ", + "required": false, + "type": "file" + }, + { + "name": "npm.asset", + "in": "formData", + "description": "npm Asset ", + "required": false, + "type": "file" + }, + { + "name": "raw.directory", + "in": "formData", + "description": "raw Directory", + "required": false, + "type": "string" + }, + { + "name": "raw.asset1", + "in": "formData", + "description": "raw Asset 1", + "required": false, + "type": "file" + }, + { + "name": "raw.asset1.filename", + "in": "formData", + "description": "raw Asset 1 Filename", + "required": false, + "type": "string" + }, + { + "name": "raw.asset2", + "in": "formData", + "description": "raw Asset 2", + "required": false, + "type": "file" + }, + { + "name": "raw.asset2.filename", + "in": "formData", + "description": "raw Asset 2 Filename", + "required": false, + "type": "string" + }, + { + "name": "raw.asset3", + "in": "formData", + "description": "raw Asset 3", + "required": false, + "type": "file" + }, + { + "name": "raw.asset3.filename", + "in": "formData", + "description": "raw Asset 3 Filename", + "required": false, + "type": "string" + }, + { + "name": "apt.asset", + "in": "formData", + "description": "apt Asset ", + "required": false, + "type": "file" + }, + { + "name": "maven2.groupId", + "in": "formData", + "description": "maven2 Group ID", + "required": false, + "type": "string" + }, + { + "name": "maven2.artifactId", + "in": "formData", + "description": "maven2 Artifact ID", + "required": false, + "type": "string" + }, + { + "name": "maven2.version", + "in": "formData", + "description": "maven2 Version", + "required": false, + "type": "string" + }, + { + "name": "maven2.generate-pom", + "in": "formData", + "description": "maven2 Generate a POM file with these coordinates", + "required": false, + "type": "boolean" + }, + { + "name": "maven2.packaging", + "in": "formData", + "description": "maven2 Packaging", + "required": false, + "type": "string" + }, + { + "name": "maven2.asset1", + "in": "formData", + "description": "maven2 Asset 1", + "required": false, + "type": "file" + }, + { + "name": "maven2.asset1.classifier", + "in": "formData", + "description": "maven2 Asset 1 Classifier", + "required": false, + "type": "string" + }, + { + "name": "maven2.asset1.extension", + "in": "formData", + "description": "maven2 Asset 1 Extension", + "required": false, + "type": "string" + }, + { + "name": "maven2.asset2", + "in": "formData", + "description": "maven2 Asset 2", + "required": false, + "type": "file" + }, + { + "name": "maven2.asset2.classifier", + "in": "formData", + "description": "maven2 Asset 2 Classifier", + "required": false, + "type": "string" + }, + { + "name": "maven2.asset2.extension", + "in": "formData", + "description": "maven2 Asset 2 Extension", + "required": false, + "type": "string" + }, + { + "name": "maven2.asset3", + "in": "formData", + "description": "maven2 Asset 3", + "required": false, + "type": "file" + }, + { + "name": "maven2.asset3.classifier", + "in": "formData", + "description": "maven2 Asset 3 Classifier", + "required": false, + "type": "string" + }, + { + "name": "maven2.asset3.extension", + "in": "formData", + "description": "maven2 Asset 3 Extension", + "required": false, + "type": "string" + } + ], + "responses": { + "403": { + "description": "Insufficient permissions to upload a component" + }, + "422": { + "description": "Parameter 'repository' is required" + } + } + } + }, + "/v1/repositories/{repositoryName}/rebuild-index": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Schedule a 'Repair - Rebuild repository search' Task. Hosted or proxy repositories only.", + "description": "", + "operationId": "rebuildIndex", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to rebuild index", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository search index rebuild has been scheduled" + }, + "400": { + "description": "Repository is not of hosted or proxy type" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/{repositoryName}/invalidate-cache": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Invalidate repository cache. Proxy or group repositories only.", + "description": "", + "operationId": "invalidateCache", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to invalidate cache", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository cache invalidated" + }, + "400": { + "description": "Repository is not of proxy or group type" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository details", + "description": "", + "operationId": "getRepository", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to get", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/RepositoryXO" + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + }, + "delete": { + "tags": [ + "Repository Management" + ], + "summary": "Delete repository of any format", + "description": "", + "operationId": "deleteRepository", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository deleted" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositorySettings": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "List repositories", + "description": "", + "operationId": "getRepositories", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Repositories list returned", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/AbstractApiRepository" + } + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/security/content-selectors": { + "get": { + "tags": [ + "Content selectors" + ], + "summary": "List content selectors", + "description": "", + "operationId": "getContentSelectors", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ContentSelectorApiResponse" + } + } + }, + "403": { + "description": "Insufficient permissions to read content selectors" + } + } + }, + "post": { + "tags": [ + "Content selectors" + ], + "summary": "Create a new content selector", + "description": "", + "operationId": "createContentSelector", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/ContentSelectorApiCreateRequest" + } + } + ], + "responses": { + "204": { + "description": "Content selector successfully created" + }, + "400": { + "description": "Invalid request" + }, + "403": { + "description": "Insufficient permissions to create content selectors" + } + } + } + }, + "/v1/security/content-selectors/{name}": { + "get": { + "tags": [ + "Content selectors" + ], + "summary": "Get a content selector by name", + "description": "", + "operationId": "getContentSelector", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The content selector name", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ContentSelectorApiResponse" + } + }, + "403": { + "description": "Insufficient permissions to read the content selector" + } + } + }, + "put": { + "tags": [ + "Content selectors" + ], + "summary": "Update a content selector", + "description": "", + "operationId": "updateContentSelector", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The content selector name", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/ContentSelectorApiUpdateRequest" + } + } + ], + "responses": { + "204": { + "description": "Content selector updated successfully" + }, + "400": { + "description": "Invalid request" + }, + "403": { + "description": "Insufficient permissions to update the content selector" + } + } + }, + "delete": { + "tags": [ + "Content selectors" + ], + "summary": "Delete a content selector", + "description": "", + "operationId": "deleteContentSelector", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Content selector deleted successfully" + }, + "400": { + "description": "Invalid request" + }, + "403": { + "description": "Insufficient permissions to delete the content selector" + } + } + } + }, + "/v1/repositories": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "List repositories", + "description": "", + "operationId": "getRepositories_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/RepositoryXO" + } + } + } + } + } + }, + "/v1/routing-rules/{name}": { + "get": { + "tags": [ + "Routing rules" + ], + "summary": "Get a single routing rule", + "description": "", + "operationId": "getRoutingRule", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The name of the routing rule to get", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/RoutingRuleXO" + } + }, + "403": { + "description": "Insufficient permissions to read routing rules" + }, + "404": { + "description": "Routing rule not found" + } + } + }, + "put": { + "tags": [ + "Routing rules" + ], + "summary": "Update a single routing rule", + "description": "", + "operationId": "updateRoutingRule", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The name of the routing rule to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "A routing rule configuration", + "required": true, + "schema": { + "$ref": "#/definitions/RoutingRuleXO" + } + } + ], + "responses": { + "204": { + "description": "Routing rule was successfully updated" + }, + "400": { + "description": "Another routing rule with the same name already exists or required parameters missing" + }, + "403": { + "description": "Insufficient permissions to edit routing rules" + }, + "404": { + "description": "Routing rule not found" + } + } + }, + "delete": { + "tags": [ + "Routing rules" + ], + "summary": "Delete a single routing rule", + "description": "", + "operationId": "deleteRoutingRule", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "The name of the routing rule to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Routing rule was successfully deleted" + }, + "403": { + "description": "Insufficient permissions to delete routing rules" + }, + "404": { + "description": "Routing rule not found" + } + } + } + }, + "/v1/routing-rules": { + "get": { + "tags": [ + "Routing rules" + ], + "summary": "List routing rules", + "description": "", + "operationId": "getRoutingRules", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/RoutingRuleXO" + } + } + }, + "403": { + "description": "Insufficient permissions to read routing rules" + } + } + }, + "post": { + "tags": [ + "Routing rules" + ], + "summary": "Create a single routing rule", + "description": "", + "operationId": "createRoutingRule", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "A routing rule configuration", + "required": true, + "schema": { + "$ref": "#/definitions/RoutingRuleXO" + } + } + ], + "responses": { + "204": { + "description": "Routing rule was successfully created" + }, + "400": { + "description": "A routing rule with the same name already exists or required parameters missing" + }, + "403": { + "description": "Insufficient permissions to create routing rule" + } + } + } + }, + "/v1/search/assets": { + "get": { + "tags": [ + "Search" + ], + "summary": "Search assets", + "description": "", + "operationId": "searchAssets", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "continuationToken", + "in": "query", + "description": "A token returned by a prior request. If present, the next page of results are returned", + "required": false, + "type": "string" + }, + { + "name": "sort", + "in": "query", + "description": "The field to sort the results against, if left empty, a sort based on match weight will be used.", + "required": false, + "type": "string", + "allowEmptyValue": true, + "enum": [ + "group", + "name", + "version", + "repository" + ] + }, + { + "name": "direction", + "in": "query", + "description": "The direction to sort records in, defaults to ascending ('asc') for all sort fields, except version, which defaults to descending ('desc')", + "required": false, + "type": "string", + "allowEmptyValue": true, + "enum": [ + "asc", + "desc" + ] + }, + { + "name": "timeout", + "in": "query", + "description": "How long to wait for search results in seconds. If this value is not provided, the system default timeout will be used.", + "required": false, + "type": "integer", + "format": "int32", + "allowEmptyValue": true + }, + { + "name": "q", + "in": "query", + "description": "Query by keyword", + "required": false, + "type": "string" + }, + { + "name": "repository", + "in": "query", + "description": "Repository name", + "required": false, + "type": "string" + }, + { + "name": "format", + "in": "query", + "description": "Query by format", + "required": false, + "type": "string" + }, + { + "name": "group", + "in": "query", + "description": "Component group", + "required": false, + "type": "string" + }, + { + "name": "name", + "in": "query", + "description": "Component name", + "required": false, + "type": "string" + }, + { + "name": "version", + "in": "query", + "description": "Component version", + "required": false, + "type": "string" + }, + { + "name": "prerelease", + "in": "query", + "description": "Prerelease version flag", + "required": false, + "type": "string" + }, + { + "name": "md5", + "in": "query", + "description": "Specific MD5 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha1", + "in": "query", + "description": "Specific SHA-1 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha256", + "in": "query", + "description": "Specific SHA-256 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha512", + "in": "query", + "description": "Specific SHA-512 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "conan.baseVersion", + "in": "query", + "description": "Conan base version", + "required": false, + "type": "string" + }, + { + "name": "conan.channel", + "in": "query", + "description": "Conan channel", + "required": false, + "type": "string" + }, + { + "name": "conan.revision", + "in": "query", + "description": "Conan recipe revision", + "required": false, + "type": "string" + }, + { + "name": "conan.packageId", + "in": "query", + "description": "Conan package id", + "required": false, + "type": "string" + }, + { + "name": "conan.packageRevision", + "in": "query", + "description": "Conan package revision", + "required": false, + "type": "string" + }, + { + "name": "docker.imageName", + "in": "query", + "description": "Docker image name", + "required": false, + "type": "string" + }, + { + "name": "docker.imageTag", + "in": "query", + "description": "Docker image tag", + "required": false, + "type": "string" + }, + { + "name": "docker.layerId", + "in": "query", + "description": "Docker layer ID", + "required": false, + "type": "string" + }, + { + "name": "docker.contentDigest", + "in": "query", + "description": "Docker content digest", + "required": false, + "type": "string" + }, + { + "name": "maven.groupId", + "in": "query", + "description": "Maven groupId", + "required": false, + "type": "string" + }, + { + "name": "maven.artifactId", + "in": "query", + "description": "Maven artifactId", + "required": false, + "type": "string" + }, + { + "name": "maven.baseVersion", + "in": "query", + "description": "Maven base version", + "required": false, + "type": "string" + }, + { + "name": "maven.extension", + "in": "query", + "description": "Maven extension of component's asset", + "required": false, + "type": "string" + }, + { + "name": "maven.classifier", + "in": "query", + "description": "Maven classifier of component's asset", + "required": false, + "type": "string" + }, + { + "name": "gavec", + "in": "query", + "description": "Group asset version extension classifier", + "required": false, + "type": "string" + }, + { + "name": "npm.scope", + "in": "query", + "description": "npm scope", + "required": false, + "type": "string" + }, + { + "name": "npm.author", + "in": "query", + "description": "npm author", + "required": false, + "type": "string" + }, + { + "name": "npm.description", + "in": "query", + "description": "npm description", + "required": false, + "type": "string" + }, + { + "name": "npm.keywords", + "in": "query", + "description": "npm keywords", + "required": false, + "type": "string" + }, + { + "name": "npm.license", + "in": "query", + "description": "npm license", + "required": false, + "type": "string" + }, + { + "name": "npm.tagged_is", + "in": "query", + "description": "npm tagged is", + "required": false, + "type": "string" + }, + { + "name": "npm.tagged_not", + "in": "query", + "description": "npm tagged not", + "required": false, + "type": "string" + }, + { + "name": "nuget.id", + "in": "query", + "description": "NuGet id", + "required": false, + "type": "string" + }, + { + "name": "nuget.tags", + "in": "query", + "description": "NuGet tags", + "required": false, + "type": "string" + }, + { + "name": "nuget.title", + "in": "query", + "description": "NuGet title", + "required": false, + "type": "string" + }, + { + "name": "nuget.authors", + "in": "query", + "description": "NuGet authors", + "required": false, + "type": "string" + }, + { + "name": "nuget.description", + "in": "query", + "description": "NuGet description", + "required": false, + "type": "string" + }, + { + "name": "nuget.summary", + "in": "query", + "description": "NuGet summary", + "required": false, + "type": "string" + }, + { + "name": "p2.pluginName", + "in": "query", + "description": "p2 plugin name", + "required": false, + "type": "string" + }, + { + "name": "pypi.classifiers", + "in": "query", + "description": "PyPI classifiers", + "required": false, + "type": "string" + }, + { + "name": "pypi.description", + "in": "query", + "description": "PyPI description", + "required": false, + "type": "string" + }, + { + "name": "pypi.keywords", + "in": "query", + "description": "PyPI keywords", + "required": false, + "type": "string" + }, + { + "name": "pypi.summary", + "in": "query", + "description": "PyPI summary", + "required": false, + "type": "string" + }, + { + "name": "rubygems.description", + "in": "query", + "description": "RubyGems description", + "required": false, + "type": "string" + }, + { + "name": "rubygems.platform", + "in": "query", + "description": "RubyGems platform", + "required": false, + "type": "string" + }, + { + "name": "rubygems.summary", + "in": "query", + "description": "RubyGems summary", + "required": false, + "type": "string" + }, + { + "name": "yum.architecture", + "in": "query", + "description": "Yum architecture", + "required": false, + "type": "string" + }, + { + "name": "yum.name", + "in": "query", + "description": "Yum package name", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PageAssetXO" + } + } + } + } + }, + "/v1/search/assets/download": { + "get": { + "tags": [ + "Search" + ], + "summary": "Search and download asset", + "description": "Returns a 302 Found with location header field set to download URL. Unless a sort parameter is supplied, the search must return a single asset to receive download URL.", + "operationId": "searchAndDownloadAssets", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "sort", + "in": "query", + "description": "The field to sort the results against, if left empty and more than 1 result is returned, the request will fail.", + "required": false, + "type": "string", + "allowEmptyValue": true, + "enum": [ + "group", + "name", + "version", + "repository" + ] + }, + { + "name": "direction", + "in": "query", + "description": "The direction to sort records in, defaults to ascending ('asc') for all sort fields, except version, which defaults to descending ('desc')", + "required": false, + "type": "string", + "allowEmptyValue": true, + "enum": [ + "asc", + "desc" + ] + }, + { + "name": "timeout", + "in": "query", + "description": "How long to wait for search results in seconds. If this value is not provided, the system default timeout will be used.", + "required": false, + "type": "integer", + "format": "int32", + "allowEmptyValue": true + }, + { + "name": "q", + "in": "query", + "description": "Query by keyword", + "required": false, + "type": "string" + }, + { + "name": "repository", + "in": "query", + "description": "Repository name", + "required": false, + "type": "string" + }, + { + "name": "format", + "in": "query", + "description": "Query by format", + "required": false, + "type": "string" + }, + { + "name": "group", + "in": "query", + "description": "Component group", + "required": false, + "type": "string" + }, + { + "name": "name", + "in": "query", + "description": "Component name", + "required": false, + "type": "string" + }, + { + "name": "version", + "in": "query", + "description": "Component version", + "required": false, + "type": "string" + }, + { + "name": "prerelease", + "in": "query", + "description": "Prerelease version flag", + "required": false, + "type": "string" + }, + { + "name": "md5", + "in": "query", + "description": "Specific MD5 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha1", + "in": "query", + "description": "Specific SHA-1 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha256", + "in": "query", + "description": "Specific SHA-256 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha512", + "in": "query", + "description": "Specific SHA-512 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "conan.baseVersion", + "in": "query", + "description": "Conan base version", + "required": false, + "type": "string" + }, + { + "name": "conan.channel", + "in": "query", + "description": "Conan channel", + "required": false, + "type": "string" + }, + { + "name": "conan.revision", + "in": "query", + "description": "Conan recipe revision", + "required": false, + "type": "string" + }, + { + "name": "conan.packageId", + "in": "query", + "description": "Conan package id", + "required": false, + "type": "string" + }, + { + "name": "conan.packageRevision", + "in": "query", + "description": "Conan package revision", + "required": false, + "type": "string" + }, + { + "name": "docker.imageName", + "in": "query", + "description": "Docker image name", + "required": false, + "type": "string" + }, + { + "name": "docker.imageTag", + "in": "query", + "description": "Docker image tag", + "required": false, + "type": "string" + }, + { + "name": "docker.layerId", + "in": "query", + "description": "Docker layer ID", + "required": false, + "type": "string" + }, + { + "name": "docker.contentDigest", + "in": "query", + "description": "Docker content digest", + "required": false, + "type": "string" + }, + { + "name": "maven.groupId", + "in": "query", + "description": "Maven groupId", + "required": false, + "type": "string" + }, + { + "name": "maven.artifactId", + "in": "query", + "description": "Maven artifactId", + "required": false, + "type": "string" + }, + { + "name": "maven.baseVersion", + "in": "query", + "description": "Maven base version", + "required": false, + "type": "string" + }, + { + "name": "maven.extension", + "in": "query", + "description": "Maven extension of component's asset", + "required": false, + "type": "string" + }, + { + "name": "maven.classifier", + "in": "query", + "description": "Maven classifier of component's asset", + "required": false, + "type": "string" + }, + { + "name": "gavec", + "in": "query", + "description": "Group asset version extension classifier", + "required": false, + "type": "string" + }, + { + "name": "npm.scope", + "in": "query", + "description": "npm scope", + "required": false, + "type": "string" + }, + { + "name": "npm.author", + "in": "query", + "description": "npm author", + "required": false, + "type": "string" + }, + { + "name": "npm.description", + "in": "query", + "description": "npm description", + "required": false, + "type": "string" + }, + { + "name": "npm.keywords", + "in": "query", + "description": "npm keywords", + "required": false, + "type": "string" + }, + { + "name": "npm.license", + "in": "query", + "description": "npm license", + "required": false, + "type": "string" + }, + { + "name": "npm.tagged_is", + "in": "query", + "description": "npm tagged is", + "required": false, + "type": "string" + }, + { + "name": "npm.tagged_not", + "in": "query", + "description": "npm tagged not", + "required": false, + "type": "string" + }, + { + "name": "nuget.id", + "in": "query", + "description": "NuGet id", + "required": false, + "type": "string" + }, + { + "name": "nuget.tags", + "in": "query", + "description": "NuGet tags", + "required": false, + "type": "string" + }, + { + "name": "nuget.title", + "in": "query", + "description": "NuGet title", + "required": false, + "type": "string" + }, + { + "name": "nuget.authors", + "in": "query", + "description": "NuGet authors", + "required": false, + "type": "string" + }, + { + "name": "nuget.description", + "in": "query", + "description": "NuGet description", + "required": false, + "type": "string" + }, + { + "name": "nuget.summary", + "in": "query", + "description": "NuGet summary", + "required": false, + "type": "string" + }, + { + "name": "p2.pluginName", + "in": "query", + "description": "p2 plugin name", + "required": false, + "type": "string" + }, + { + "name": "pypi.classifiers", + "in": "query", + "description": "PyPI classifiers", + "required": false, + "type": "string" + }, + { + "name": "pypi.description", + "in": "query", + "description": "PyPI description", + "required": false, + "type": "string" + }, + { + "name": "pypi.keywords", + "in": "query", + "description": "PyPI keywords", + "required": false, + "type": "string" + }, + { + "name": "pypi.summary", + "in": "query", + "description": "PyPI summary", + "required": false, + "type": "string" + }, + { + "name": "rubygems.description", + "in": "query", + "description": "RubyGems description", + "required": false, + "type": "string" + }, + { + "name": "rubygems.platform", + "in": "query", + "description": "RubyGems platform", + "required": false, + "type": "string" + }, + { + "name": "rubygems.summary", + "in": "query", + "description": "RubyGems summary", + "required": false, + "type": "string" + }, + { + "name": "yum.architecture", + "in": "query", + "description": "Yum architecture", + "required": false, + "type": "string" + }, + { + "name": "yum.name", + "in": "query", + "description": "Yum package name", + "required": false, + "type": "string" + } + ], + "responses": { + "400": { + "description": "ValidationErrorXO{id='*', message='Search returned multiple assets, please refine search criteria to find a single asset or use the sort query parameter to retrieve the first result.'}" + }, + "404": { + "description": "Asset search returned no results" + } + } + } + }, + "/v1/search": { + "get": { + "tags": [ + "Search" + ], + "summary": "Search components", + "description": "", + "operationId": "search", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "continuationToken", + "in": "query", + "description": "A token returned by a prior request. If present, the next page of results are returned", + "required": false, + "type": "string", + "allowEmptyValue": true + }, + { + "name": "sort", + "in": "query", + "description": "The field to sort the results against, if left empty, a sort based on match weight will be used.", + "required": false, + "type": "string", + "allowEmptyValue": true, + "enum": [ + "group", + "name", + "version", + "repository" + ] + }, + { + "name": "direction", + "in": "query", + "description": "The direction to sort records in, defaults to ascending ('asc') for all sort fields, except version, which defaults to descending ('desc')", + "required": false, + "type": "string", + "allowEmptyValue": true, + "enum": [ + "asc", + "desc" + ] + }, + { + "name": "timeout", + "in": "query", + "description": "How long to wait for search results in seconds. If this value is not provided, the system default timeout will be used.", + "required": false, + "type": "integer", + "format": "int32", + "allowEmptyValue": true + }, + { + "name": "q", + "in": "query", + "description": "Query by keyword", + "required": false, + "type": "string" + }, + { + "name": "repository", + "in": "query", + "description": "Repository name", + "required": false, + "type": "string" + }, + { + "name": "format", + "in": "query", + "description": "Query by format", + "required": false, + "type": "string" + }, + { + "name": "group", + "in": "query", + "description": "Component group", + "required": false, + "type": "string" + }, + { + "name": "name", + "in": "query", + "description": "Component name", + "required": false, + "type": "string" + }, + { + "name": "version", + "in": "query", + "description": "Component version", + "required": false, + "type": "string" + }, + { + "name": "prerelease", + "in": "query", + "description": "Prerelease version flag", + "required": false, + "type": "string" + }, + { + "name": "md5", + "in": "query", + "description": "Specific MD5 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha1", + "in": "query", + "description": "Specific SHA-1 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha256", + "in": "query", + "description": "Specific SHA-256 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "sha512", + "in": "query", + "description": "Specific SHA-512 hash of component's asset", + "required": false, + "type": "string" + }, + { + "name": "conan.baseVersion", + "in": "query", + "description": "Conan base version", + "required": false, + "type": "string" + }, + { + "name": "conan.channel", + "in": "query", + "description": "Conan channel", + "required": false, + "type": "string" + }, + { + "name": "conan.revision", + "in": "query", + "description": "Conan recipe revision", + "required": false, + "type": "string" + }, + { + "name": "conan.packageId", + "in": "query", + "description": "Conan package id", + "required": false, + "type": "string" + }, + { + "name": "conan.packageRevision", + "in": "query", + "description": "Conan package revision", + "required": false, + "type": "string" + }, + { + "name": "docker.imageName", + "in": "query", + "description": "Docker image name", + "required": false, + "type": "string" + }, + { + "name": "docker.imageTag", + "in": "query", + "description": "Docker image tag", + "required": false, + "type": "string" + }, + { + "name": "docker.layerId", + "in": "query", + "description": "Docker layer ID", + "required": false, + "type": "string" + }, + { + "name": "docker.contentDigest", + "in": "query", + "description": "Docker content digest", + "required": false, + "type": "string" + }, + { + "name": "maven.groupId", + "in": "query", + "description": "Maven groupId", + "required": false, + "type": "string" + }, + { + "name": "maven.artifactId", + "in": "query", + "description": "Maven artifactId", + "required": false, + "type": "string" + }, + { + "name": "maven.baseVersion", + "in": "query", + "description": "Maven base version", + "required": false, + "type": "string" + }, + { + "name": "maven.extension", + "in": "query", + "description": "Maven extension of component's asset", + "required": false, + "type": "string" + }, + { + "name": "maven.classifier", + "in": "query", + "description": "Maven classifier of component's asset", + "required": false, + "type": "string" + }, + { + "name": "gavec", + "in": "query", + "description": "Group asset version extension classifier", + "required": false, + "type": "string" + }, + { + "name": "npm.scope", + "in": "query", + "description": "npm scope", + "required": false, + "type": "string" + }, + { + "name": "npm.author", + "in": "query", + "description": "npm author", + "required": false, + "type": "string" + }, + { + "name": "npm.description", + "in": "query", + "description": "npm description", + "required": false, + "type": "string" + }, + { + "name": "npm.keywords", + "in": "query", + "description": "npm keywords", + "required": false, + "type": "string" + }, + { + "name": "npm.license", + "in": "query", + "description": "npm license", + "required": false, + "type": "string" + }, + { + "name": "npm.tagged_is", + "in": "query", + "description": "npm tagged is", + "required": false, + "type": "string" + }, + { + "name": "npm.tagged_not", + "in": "query", + "description": "npm tagged not", + "required": false, + "type": "string" + }, + { + "name": "nuget.id", + "in": "query", + "description": "NuGet id", + "required": false, + "type": "string" + }, + { + "name": "nuget.tags", + "in": "query", + "description": "NuGet tags", + "required": false, + "type": "string" + }, + { + "name": "nuget.title", + "in": "query", + "description": "NuGet title", + "required": false, + "type": "string" + }, + { + "name": "nuget.authors", + "in": "query", + "description": "NuGet authors", + "required": false, + "type": "string" + }, + { + "name": "nuget.description", + "in": "query", + "description": "NuGet description", + "required": false, + "type": "string" + }, + { + "name": "nuget.summary", + "in": "query", + "description": "NuGet summary", + "required": false, + "type": "string" + }, + { + "name": "p2.pluginName", + "in": "query", + "description": "p2 plugin name", + "required": false, + "type": "string" + }, + { + "name": "pypi.classifiers", + "in": "query", + "description": "PyPI classifiers", + "required": false, + "type": "string" + }, + { + "name": "pypi.description", + "in": "query", + "description": "PyPI description", + "required": false, + "type": "string" + }, + { + "name": "pypi.keywords", + "in": "query", + "description": "PyPI keywords", + "required": false, + "type": "string" + }, + { + "name": "pypi.summary", + "in": "query", + "description": "PyPI summary", + "required": false, + "type": "string" + }, + { + "name": "rubygems.description", + "in": "query", + "description": "RubyGems description", + "required": false, + "type": "string" + }, + { + "name": "rubygems.platform", + "in": "query", + "description": "RubyGems platform", + "required": false, + "type": "string" + }, + { + "name": "rubygems.summary", + "in": "query", + "description": "RubyGems summary", + "required": false, + "type": "string" + }, + { + "name": "yum.architecture", + "in": "query", + "description": "Yum architecture", + "required": false, + "type": "string" + }, + { + "name": "yum.name", + "in": "query", + "description": "Yum package name", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PageComponentXO" + } + } + } + } + }, + "/v1/formats/{format}/upload-specs": { + "get": { + "tags": [ + "Formats" + ], + "summary": "Get upload field requirements for the desired format", + "description": "", + "operationId": "get_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "format", + "in": "path", + "description": "The desired repository format", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UploadDefinitionXO" + } + } + } + } + }, + "/v1/formats/upload-specs": { + "get": { + "tags": [ + "Formats" + ], + "summary": "Get upload field requirements for each supported format", + "description": "", + "operationId": "get_2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UploadDefinitionXO" + } + } + } + } + } + }, + "/v1/security/privileges/repository-content-selector": { + "post": { + "tags": [ + "Security management: privileges" + ], + "summary": "Create a repository content selector type privilege.", + "description": "", + "operationId": "createPrivilege_2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The privilege to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeRepositoryContentSelectorRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/repository-admin": { + "post": { + "tags": [ + "Security management: privileges" + ], + "summary": "Create a repository admin type privilege.", + "description": "", + "operationId": "createPrivilege_3", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The privilege to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeRepositoryAdminRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/repository-view": { + "post": { + "tags": [ + "Security management: privileges" + ], + "summary": "Create a repository view type privilege.", + "description": "", + "operationId": "createPrivilege_4", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The privilege to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeRepositoryViewRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/repository-view/{privilegeName}": { + "put": { + "tags": [ + "Security management: privileges" + ], + "summary": "Update a repository view type privilege.", + "description": "", + "operationId": "updatePrivilege_2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to update.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The privilege to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeRepositoryViewRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/security/privileges/repository-content-selector/{privilegeName}": { + "put": { + "tags": [ + "Security management: privileges" + ], + "summary": "Update a repository content selector type privilege.", + "description": "", + "operationId": "updatePrivilege_3", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to update.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The privilege to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeRepositoryContentSelectorRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/security/privileges/repository-admin/{privilegeName}": { + "put": { + "tags": [ + "Security management: privileges" + ], + "summary": "Update a repository admin type privilege.", + "description": "", + "operationId": "updatePrivilege_4", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to update.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The privilege to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeRepositoryAdminRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/email": { + "get": { + "tags": [ + "Email" + ], + "summary": "Retrieve the current email configuration", + "description": "", + "operationId": "getEmailConfiguration", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiEmailConfiguration" + } + }, + "403": { + "description": "Insufficient permissions to retrieve the email configuration" + } + } + }, + "put": { + "tags": [ + "Email" + ], + "summary": "Set the current email configuration", + "description": "", + "operationId": "setEmailConfiguration", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ApiEmailConfiguration" + } + } + ], + "responses": { + "204": { + "description": "Email configuration was successfully updated" + }, + "400": { + "description": "Invalid request" + }, + "403": { + "description": "Insufficient permissions to update the email configuration" + } + } + }, + "delete": { + "tags": [ + "Email" + ], + "summary": "Disable and clear the email configuration", + "description": "", + "operationId": "deleteEmailConfiguration", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "204": { + "description": "Email configuration was successfully cleared" + } + } + } + }, + "/v1/email/verify": { + "post": { + "tags": [ + "Email" + ], + "summary": "Send a test email to the email address provided in the request body", + "description": "", + "operationId": "testEmailConfiguration", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "An email address to send a test email to", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Validation was complete, look at the body to determine success", + "schema": { + "$ref": "#/definitions/ApiEmailValidation" + } + }, + "403": { + "description": "Insufficient permissions to verify the email configuration" + } + } + } + }, + "/v1/status/check": { + "get": { + "tags": [ + "Status" + ], + "summary": "Health check endpoint that returns the results of the system status checks", + "description": "", + "operationId": "getSystemStatusChecks", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "The system status check results", + "schema": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Result" + } + } + } + } + } + }, + "/v1/status": { + "get": { + "tags": [ + "Status" + ], + "summary": "Health check endpoint that validates server can respond to read requests", + "description": "", + "operationId": "isAvailable", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Available to service requests" + }, + "503": { + "description": "Unavailable to service requests" + } + } + } + }, + "/v1/status/writable": { + "get": { + "tags": [ + "Status" + ], + "summary": "Health check endpoint that validates server can respond to read and write requests", + "description": "", + "operationId": "isWritable", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Available to service requests" + }, + "503": { + "description": "Unavailable to service requests" + } + } + } + }, + "/v1/support/supportzip": { + "post": { + "tags": [ + "Support" + ], + "summary": "Creates and downloads a support zip", + "description": "", + "operationId": "supportzip", + "consumes": [ + "application/json" + ], + "produces": [ + "application/octet-stream" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/SupportZipGeneratorRequest" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/v1/support/supportzippath": { + "post": { + "tags": [ + "Support" + ], + "summary": "Creates a support zip and returns the path", + "description": "", + "operationId": "supportzippath", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/SupportZipGeneratorRequest" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SupportZipXO" + } + } + } + } + }, + "/v1/repositories/maven/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Maven group repository", + "description": "", + "operationId": "createRepository", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/MavenGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/maven/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Maven group repository", + "description": "", + "operationId": "updateRepository", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/MavenGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/maven/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/MavenHostedApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Maven hosted repository", + "description": "", + "operationId": "updateRepository_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/MavenHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/maven/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Maven hosted repository", + "description": "", + "operationId": "createRepository_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/MavenHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/maven/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_3", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/MavenProxyApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Maven proxy repository", + "description": "", + "operationId": "updateRepository_2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/MavenProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/maven/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Maven proxy repository", + "description": "", + "operationId": "createRepository_2", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/MavenProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/security/privileges/script": { + "post": { + "tags": [ + "Security management: privileges" + ], + "summary": "Create a script type privilege.", + "description": "", + "operationId": "createPrivilege_5", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "The privilege to create.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeScriptRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + } + } + } + }, + "/v1/security/privileges/script/{privilegeName}": { + "put": { + "tags": [ + "Security management: privileges" + ], + "summary": "Update a script type privilege.", + "description": "", + "operationId": "updatePrivilege_5", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "privilegeName", + "in": "path", + "description": "The name of the privilege to update.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "The privilege to update.", + "required": false, + "schema": { + "$ref": "#/definitions/ApiPrivilegeScriptRequest" + } + } + ], + "responses": { + "400": { + "description": "Privilege object not configured properly." + }, + "403": { + "description": "The user does not have permission to perform the operation." + }, + "404": { + "description": "Privilege not found in the system." + } + } + } + }, + "/v1/script": { + "get": { + "tags": [ + "Script" + ], + "summary": "List all stored scripts", + "description": "", + "operationId": "browse", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ScriptXO" + } + } + } + } + }, + "post": { + "tags": [ + "Script" + ], + "summary": "Add a new script", + "description": "", + "operationId": "add", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/ScriptXO" + } + } + ], + "responses": { + "204": { + "description": "Script was added" + }, + "410": { + "description": "Script creation is disabled" + } + } + } + }, + "/v1/script/{name}": { + "get": { + "tags": [ + "Script" + ], + "summary": "Read stored script by name", + "description": "", + "operationId": "read_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ScriptXO" + } + }, + "404": { + "description": "No script with the specified name" + } + } + }, + "put": { + "tags": [ + "Script" + ], + "summary": "Update stored script by name", + "description": "", + "operationId": "edit", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/ScriptXO" + } + } + ], + "responses": { + "204": { + "description": "Script was updated" + }, + "404": { + "description": "No script with the specified name" + }, + "410": { + "description": "Script updating is disabled" + } + } + }, + "delete": { + "tags": [ + "Script" + ], + "summary": "Delete stored script by name", + "description": "", + "operationId": "delete_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Script was deleted" + }, + "404": { + "description": "No script with the specified name" + } + } + } + }, + "/v1/script/{name}/run": { + "post": { + "tags": [ + "Script" + ], + "summary": "Run stored script by name", + "description": "", + "operationId": "run_1", + "consumes": [ + "text/plain", + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ScriptResultXO" + } + }, + "404": { + "description": "No script with the specified name" + }, + "500": { + "description": "Script execution failed with exception" + } + } + } + }, + "/v1/blobstores/s3/{name}": { + "get": { + "tags": [ + "Blob store" + ], + "summary": "Get a S3 blob store configuration by name", + "description": "", + "operationId": "getBlobStore", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "Name of the blob store configuration to fetch", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/S3BlobStoreApiModel" + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Specified S3 blob store doesn't exist" + } + } + }, + "put": { + "tags": [ + "Blob store" + ], + "summary": "Update an S3 blob store configuration by name", + "description": "", + "operationId": "updateBlobStore", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/S3BlobStoreApiModel" + } + }, + { + "name": "name", + "in": "path", + "description": "Name of the blob store to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "S3 blob store updated" + }, + "400": { + "description": "Specified S3 blob store doesn't exist" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/blobstores/s3": { + "post": { + "tags": [ + "Blob store" + ], + "summary": "Create an S3 blob store", + "description": "", + "operationId": "createBlobStore", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/S3BlobStoreApiModel" + } + } + ], + "responses": { + "201": { + "description": "S3 blob store created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/apt/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_4", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AptHostedApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update APT hosted repository", + "description": "", + "operationId": "updateRepository_3", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AptHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/apt/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create APT hosted repository", + "description": "", + "operationId": "createRepository_3", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AptHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/apt/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_5", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AptProxyApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update APT proxy repository", + "description": "", + "operationId": "updateRepository_4", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AptProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/apt/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create APT proxy repository", + "description": "", + "operationId": "createRepository_4", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AptProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/raw/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create raw group repository", + "description": "", + "operationId": "createRepository_5", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RawGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/raw/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_6", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update raw group repository", + "description": "", + "operationId": "updateRepository_5", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RawGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/raw/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create raw hosted repository", + "description": "", + "operationId": "createRepository_6", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RawHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/raw/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_7", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update raw hosted repository", + "description": "", + "operationId": "updateRepository_6", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RawHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/raw/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create raw proxy repository", + "description": "", + "operationId": "createRepository_7", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RawProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/raw/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_8", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update raw proxy repository", + "description": "", + "operationId": "updateRepository_7", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RawProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/security/ldap": { + "get": { + "tags": [ + "Security management: LDAP" + ], + "summary": "List LDAP servers", + "description": "", + "operationId": "getLdapServers", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "LDAP server list returned" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + }, + "post": { + "tags": [ + "Security management: LDAP" + ], + "summary": "Create LDAP server", + "description": "", + "operationId": "createLdapServer", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/CreateLdapServerXo" + } + } + ], + "responses": { + "201": { + "description": "LDAP server created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/security/ldap/{name}": { + "get": { + "tags": [ + "Security management: LDAP" + ], + "summary": "Get LDAP server", + "description": "", + "operationId": "getLdapServer", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "Name of the LDAP server to retrieve", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "LDAP server returned" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "LDAP server not found" + } + } + }, + "put": { + "tags": [ + "Security management: LDAP" + ], + "summary": "Update LDAP server", + "description": "", + "operationId": "updateLdapServer", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "Name of the LDAP server to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated values of LDAP server", + "required": false, + "schema": { + "$ref": "#/definitions/UpdateLdapServerXo" + } + } + ], + "responses": { + "204": { + "description": "LDAP server updated" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "LDAP server not found" + } + } + }, + "delete": { + "tags": [ + "Security management: LDAP" + ], + "summary": "Delete LDAP server", + "description": "", + "operationId": "deleteLdapServer", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "Name of the LDAP server to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "LDAP server deleted" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "LDAP server not found" + } + } + } + }, + "/v1/security/ldap/change-order": { + "post": { + "tags": [ + "Security management: LDAP" + ], + "summary": "Change LDAP server order", + "description": "", + "operationId": "changeOrder", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Ordered list of LDAP server names", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "204": { + "description": "LDAP server order changed" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/iq/verify-connection": { + "post": { + "tags": [ + "Manage Sonatype Repository Firewall configuration" + ], + "summary": "Verify Sonatype Repository Firewall connection", + "description": "", + "operationId": "verifyConnection", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Connection verification complete, check response body for result" + } + } + } + }, + "/v1/iq": { + "get": { + "tags": [ + "Manage Sonatype Repository Firewall configuration" + ], + "summary": "Get Sonatype Repository Firewall configuration", + "description": "", + "operationId": "getConfiguration", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Sonatype Repository Firewall configuration returned" + } + } + }, + "put": { + "tags": [ + "Manage Sonatype Repository Firewall configuration" + ], + "summary": "Update Sonatype Repository Firewall configuration", + "description": "", + "operationId": "updateConfiguration", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/IqConnectionXo" + } + } + ], + "responses": { + "204": { + "description": "Sonatype Repository Firewall configuration has been updated" + } + } + } + }, + "/v1/iq/enable": { + "post": { + "tags": [ + "Manage Sonatype Repository Firewall configuration" + ], + "summary": "Enable Sonatype Repository Firewall", + "description": "", + "operationId": "enableIq", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "204": { + "description": "Sonatype Repository Firewall has been enabled" + }, + "400": { + "description": "Sonatype Repository Firewall connection not configured" + } + } + } + }, + "/v1/iq/disable": { + "post": { + "tags": [ + "Manage Sonatype Repository Firewall configuration" + ], + "summary": "Disable Sonatype Repository Firewall", + "description": "", + "operationId": "disableIq", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "204": { + "description": "Sonatype Repository Firewall has been disabled" + }, + "400": { + "description": "Sonatype Repository Firewall connection not configured" + } + } + } + }, + "/v1/repositories/{repositoryName}/health-check": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Enable repository health check. Proxy repositories only.", + "description": "", + "operationId": "enableRepositoryHealthCheck", + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to enable Repository Health Check for", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository Health Check enabled" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + }, + "409": { + "description": "EULA not accepted or Repository Health Check capability not active" + } + } + }, + "delete": { + "tags": [ + "Repository Management" + ], + "summary": "Disable repository health check. Proxy repositories only.", + "description": "", + "operationId": "disableRepositoryHealthCheck", + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to disable Repository Health Check for", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository Health Check disabled" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/system/license": { + "get": { + "tags": [ + "Product licensing" + ], + "summary": "Get the current license status.", + "description": "", + "operationId": "getLicenseStatus", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiLicenseDetailsXO" + } + } + } + }, + "post": { + "tags": [ + "Product licensing" + ], + "summary": "Upload a new license file.", + "description": "Server must be restarted to take effect", + "operationId": "setLicense", + "consumes": [ + "application/octet-stream" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/InputStream" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiLicenseDetailsXO" + } + } + } + }, + "delete": { + "tags": [ + "Product licensing" + ], + "summary": "Uninstall license if present.", + "description": "", + "operationId": "removeLicense", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/v1/repositories/npm/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_9", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupDeployRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update npm group repository", + "description": "", + "operationId": "updateRepository_8", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NpmGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/npm/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create npm group repository", + "description": "", + "operationId": "createRepository_8", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NpmGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/npm/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create npm hosted repository", + "description": "", + "operationId": "createRepository_9", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NpmHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/npm/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_10", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update npm hosted repository", + "description": "", + "operationId": "updateRepository_9", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NpmHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/npm/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_11", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/NpmProxyApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update npm proxy repository", + "description": "", + "operationId": "updateRepository_10", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NpmProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/npm/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create npm proxy repository", + "description": "", + "operationId": "createRepository_10", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NpmProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/nuget/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create NuGet group repository", + "description": "", + "operationId": "createRepository_11", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NugetGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/nuget/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_12", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update NuGet group repository", + "description": "", + "operationId": "updateRepository_11", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NugetGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/nuget/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create NuGet hosted repository", + "description": "", + "operationId": "createRepository_12", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NugetHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/nuget/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_13", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update NuGet hosted repository", + "description": "", + "operationId": "updateRepository_12", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NugetHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/nuget/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_14", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/NugetProxyApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update NuGet proxy repository", + "description": "", + "operationId": "updateRepository_13", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NugetProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/nuget/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create NuGet proxy repository", + "description": "", + "operationId": "createRepository_13", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/NugetProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/rubygems/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create RubyGems group repository", + "description": "", + "operationId": "createRepository_14", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RubyGemsGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/rubygems/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_15", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update RubyGems group repository", + "description": "", + "operationId": "updateRepository_14", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RubyGemsGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/rubygems/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create RubyGems hosted repository", + "description": "", + "operationId": "createRepository_15", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RubyGemsHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/rubygems/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_16", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update RubyGems hosted repository", + "description": "", + "operationId": "updateRepository_15", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RubyGemsHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/rubygems/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create RubyGems proxy repository", + "description": "", + "operationId": "createRepository_16", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RubyGemsProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/rubygems/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_17", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update RubyGems proxy repository", + "description": "", + "operationId": "updateRepository_16", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RubyGemsProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/docker/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_18", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/DockerGroupApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Docker group repository", + "description": "", + "operationId": "updateRepository_17", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/DockerGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/docker/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Docker group repository", + "description": "", + "operationId": "createRepository_17", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/DockerGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/docker/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_19", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/DockerHostedApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Docker hosted repository", + "description": "", + "operationId": "updateRepository_18", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/DockerHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/docker/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Docker hosted repository", + "description": "", + "operationId": "createRepository_18", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/DockerHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/docker/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_20", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/DockerProxyApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Docker proxy repository", + "description": "", + "operationId": "updateRepository_19", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/DockerProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/docker/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Docker proxy repository", + "description": "", + "operationId": "createRepository_19", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/DockerProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/yum/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Yum group repository", + "description": "", + "operationId": "createRepository_20", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/YumGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/yum/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_21", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Yum group repository", + "description": "", + "operationId": "updateRepository_20", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/YumGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/yum/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_22", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/YumHostedApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Yum hosted repository", + "description": "", + "operationId": "updateRepository_21", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/YumHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/yum/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Yum hosted repository", + "description": "", + "operationId": "createRepository_21", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/YumHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/yum/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Yum proxy repository", + "description": "", + "operationId": "createRepository_22", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/YumProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/yum/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_23", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Yum proxy repository", + "description": "", + "operationId": "updateRepository_22", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/YumProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/azureblobstore/test-connection": { + "post": { + "tags": [ + "Azure blob store" + ], + "summary": "Verify connection using supplied Azure Blob Store settings", + "description": "", + "operationId": "verifyConnection_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AzureConnectionXO" + } + } + ], + "responses": { + "204": { + "description": "Azure Blob Store connection was successful" + }, + "400": { + "description": "Azure Blob Store connection failed" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/blobstores/azure/{name}": { + "get": { + "tags": [ + "Blob store" + ], + "summary": "Get an Azure blob store configuration by name", + "description": "", + "operationId": "getBlobStore_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "path", + "description": "Name of the blob store configuration to fetch", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "$ref": "#/definitions/AzureBlobStoreApiModel" + } + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Specified Azure blob store doesn't exist" + } + } + }, + "put": { + "tags": [ + "Blob store" + ], + "summary": "Update an Azure blob store configuration by name", + "description": "", + "operationId": "updateBlobStore_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AzureBlobStoreApiModel" + } + }, + { + "name": "name", + "in": "path", + "description": "Name of the blob store to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Azure blob store updated" + }, + "400": { + "description": "Specified Azure blob store doesn't exist" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/blobstores/azure": { + "post": { + "tags": [ + "Blob store" + ], + "summary": "Create an Azure blob store", + "description": "", + "operationId": "createBlobStore_1", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/AzureBlobStoreApiModel" + } + } + ], + "responses": { + "201": { + "description": "Azure blob store created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/helm/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Helm hosted repository", + "description": "", + "operationId": "createRepository_23", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/HelmHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/helm/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_24", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Helm hosted repository", + "description": "", + "operationId": "updateRepository_23", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/HelmHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/helm/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Helm proxy repository", + "description": "", + "operationId": "createRepository_24", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/HelmProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/helm/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_25", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Helm proxy repository", + "description": "", + "operationId": "updateRepository_24", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/HelmProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/gitlfs/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Git LFS hosted repository", + "description": "", + "operationId": "createRepository_25", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/GitLfsHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/gitlfs/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_26", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Git LFS hosted repository", + "description": "", + "operationId": "updateRepository_25", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/GitLfsHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/pypi/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create PyPI group repository", + "description": "", + "operationId": "createRepository_26", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/PypiGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/pypi/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_27", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update PyPI group repository", + "description": "", + "operationId": "updateRepository_26", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/PypiGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/pypi/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create PyPI hosted repository", + "description": "", + "operationId": "createRepository_27", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/PypiHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/pypi/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_28", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update PyPI hosted repository", + "description": "", + "operationId": "updateRepository_27", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/PypiHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/pypi/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create PyPI proxy repository", + "description": "", + "operationId": "createRepository_28", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/PypiProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/pypi/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_29", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update PyPI proxy repository", + "description": "", + "operationId": "updateRepository_28", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/PypiProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/conda/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create conda proxy repository", + "description": "", + "operationId": "createRepository_29", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/CondaProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/conda/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_30", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update conda proxy repository", + "description": "", + "operationId": "updateRepository_29", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/CondaProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/conan/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Conan proxy repository", + "description": "", + "operationId": "createRepository_30", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/ConanProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/conan/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_31", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Conan proxy repository", + "description": "", + "operationId": "updateRepository_30", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/ConanProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/r/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create R group repository", + "description": "", + "operationId": "createRepository_31", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/r/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_32", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update R group repository", + "description": "", + "operationId": "updateRepository_31", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/r/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create R hosted repository", + "description": "", + "operationId": "createRepository_32", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/r/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_33", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update R hosted repository", + "description": "", + "operationId": "updateRepository_32", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/r/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create R proxy repository", + "description": "", + "operationId": "createRepository_33", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/r/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_34", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update R proxy repository", + "description": "", + "operationId": "updateRepository_33", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/RProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/cocoapods/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Cocoapods proxy repository", + "description": "", + "operationId": "createRepository_34", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/CocoapodsProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/cocoapods/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_35", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Cocoapods proxy repository", + "description": "", + "operationId": "updateRepository_34", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/CocoapodsProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/go/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create a Go group repository", + "description": "", + "operationId": "createRepository_35", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/GolangGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/go/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_36", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update a Go group repository", + "description": "", + "operationId": "updateRepository_35", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/GolangGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/go/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create a Go proxy repository", + "description": "", + "operationId": "createRepository_36", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/GolangProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/go/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_37", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update a Go proxy repository", + "description": "", + "operationId": "updateRepository_36", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/GolangProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "404": { + "description": "Repository not found" + } + } + } + }, + "/v1/repositories/p2/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create p2 proxy repository", + "description": "", + "operationId": "createRepository_37", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/P2ProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + }, + "405": { + "description": "Feature is disabled in High Availability" + } + } + } + }, + "/v1/repositories/p2/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_38", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiProxyRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update p2 proxy repository", + "description": "", + "operationId": "updateRepository_37", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/P2ProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "400": { + "description": "Bad request" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/bower/group": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Bower group repository", + "description": "", + "operationId": "createRepository_38", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/BowerGroupRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/bower/group/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_39", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiGroupRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Bower group repository", + "description": "", + "operationId": "updateRepository_38", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/BowerGroupRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/bower/hosted": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Bower hosted repository", + "description": "", + "operationId": "createRepository_39", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/BowerHostedRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/bower/hosted/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_40", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/SimpleApiHostedRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Bower hosted repository", + "description": "", + "operationId": "updateRepository_39", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/BowerHostedRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/bower/proxy/{repositoryName}": { + "get": { + "tags": [ + "Repository Management" + ], + "summary": "Get repository", + "description": "", + "operationId": "getRepository_41", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "repositoryName", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/BowerProxyApiRepository" + } + } + } + }, + "put": { + "tags": [ + "Repository Management" + ], + "summary": "Update Bower proxy repository", + "description": "", + "operationId": "updateRepository_40", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/BowerProxyRepositoryApiRequest" + } + }, + { + "name": "repositoryName", + "in": "path", + "description": "Name of the repository to update", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Repository updated" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + }, + "/v1/repositories/bower/proxy": { + "post": { + "tags": [ + "Repository Management" + ], + "summary": "Create Bower proxy repository", + "description": "", + "operationId": "createRepository_40", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "required": false, + "schema": { + "$ref": "#/definitions/BowerProxyRepositoryApiRequest" + } + } + ], + "responses": { + "201": { + "description": "Repository created" + }, + "401": { + "description": "Authentication required" + }, + "403": { + "description": "Insufficient permissions" + } + } + } + } + }, + "definitions": { + "AnonymousAccessSettingsXO": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not Anonymous Access is enabled" + }, + "userId": { + "type": "string", + "description": "The username of the anonymous account" + }, + "realmName": { + "type": "string", + "description": "The name of the authentication realm for the anonymous account" + } + } + }, + "ApiUserSource": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "ApiUser": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "userId": { + "type": "string", + "description": "The userid which is required for login. This value cannot be changed." + }, + "firstName": { + "type": "string", + "description": "The first name of the user." + }, + "lastName": { + "type": "string", + "description": "The last name of the user." + }, + "emailAddress": { + "type": "string", + "description": "The email address associated with the user." + }, + "source": { + "type": "string", + "description": "The user source which is the origin of this user. This value cannot be changed." + }, + "status": { + "type": "string", + "description": "The user's status, e.g. active or disabled.", + "enum": [ + "active", + "locked", + "disabled", + "changepassword" + ] + }, + "readOnly": { + "type": "boolean", + "description": "Indicates whether the user's properties could be modified by the Nexus Repository Manager. When false only roles are considered during update." + }, + "roles": { + "type": "array", + "description": "The roles which the user has been assigned within Nexus.", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "externalRoles": { + "type": "array", + "description": "The roles which the user has been assigned in an external source, e.g. LDAP group. These cannot be changed within the Nexus Repository Manager.", + "uniqueItems": true, + "items": { + "type": "string" + } + } + } + }, + "ApiCreateUser": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "userId": { + "type": "string", + "description": "The userid which is required for login. This value cannot be changed." + }, + "firstName": { + "type": "string", + "description": "The first name of the user." + }, + "lastName": { + "type": "string", + "description": "The last name of the user." + }, + "emailAddress": { + "type": "string", + "description": "The email address associated with the user." + }, + "password": { + "type": "string", + "description": "The password for the new user." + }, + "status": { + "type": "string", + "description": "The user's status, e.g. active or disabled.", + "enum": [ + "active", + "locked", + "disabled", + "changepassword" + ] + }, + "roles": { + "type": "array", + "description": "The roles which the user has been assigned within Nexus.", + "uniqueItems": true, + "items": { + "type": "string" + } + } + } + }, + "ApiPrivilege": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of privilege, each type covers different portions of the system. External values supplied to this will be ignored by the system." + }, + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "readOnly": { + "type": "boolean", + "description": "Indicates whether the privilege can be changed. External values supplied to this will be ignored by the system." + } + } + }, + "ApiPrivilegeApplicationRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "actions": { + "type": "array", + "description": "A collection of actions to associate with the privilege, using BREAD syntax (browse,read,edit,add,delete,all) as well as 'run' for script privileges.", + "items": { + "type": "string", + "enum": [ + "READ", + "BROWSE", + "EDIT", + "ADD", + "DELETE", + "RUN", + "ASSOCIATE", + "DISASSOCIATE", + "ALL" + ] + } + }, + "domain": { + "type": "string", + "description": "The domain (i.e. 'blobstores', 'capabilities' or even '*' for all) that this privilege is granting access to. Note that creating new privileges with a domain is only necessary when using plugins that define their own domain(s)." + } + } + }, + "ApiPrivilegeWildcardRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "pattern": { + "type": "string", + "description": "A colon separated list of parts that create a permission string." + } + } + }, + "RealmApiXO": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "RoleXOResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the role." + }, + "source": { + "type": "string", + "description": "The user source which is the origin of this role." + }, + "name": { + "type": "string", + "description": "The name of the role." + }, + "description": { + "type": "string", + "description": "The description of this role." + }, + "readOnly": { + "type": "boolean", + "description": "Indicates whether the role can be changed. The system will ignore any supplied external values." + }, + "privileges": { + "type": "array", + "description": "The list of privileges assigned to this role.", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "roles": { + "type": "array", + "description": "The list of roles assigned to this role.", + "uniqueItems": true, + "items": { + "type": "string" + } + } + } + }, + "RoleXORequest": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The id of the role." + }, + "name": { + "type": "string", + "description": "The name of the role." + }, + "description": { + "type": "string", + "description": "The description of this role." + }, + "privileges": { + "type": "array", + "description": "The list of privileges assigned to this role.", + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "roles": { + "type": "array", + "description": "The list of roles assigned to this role.", + "uniqueItems": true, + "items": { + "type": "string" + } + } + } + }, + "Page": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "type": "object" + } + }, + "continuationToken": { + "type": "string" + } + } + }, + "PageTaskXO": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/TaskXO" + } + }, + "continuationToken": { + "type": "string" + } + } + }, + "TaskXO": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + }, + "currentState": { + "type": "string" + }, + "lastRunResult": { + "type": "string" + }, + "nextRun": { + "type": "string", + "format": "date-time" + }, + "lastRun": { + "type": "string", + "format": "date-time" + } + } + }, + "BlobStoreQuotaResultXO": { + "type": "object", + "properties": { + "isViolation": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "blobStoreName": { + "type": "string" + } + } + }, + "BlobStoreApiSoftQuota": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type to use such as spaceRemainingQuota, or spaceUsedQuota", + "enum": [ + "spaceRemainingQuota", + "spaceUsedQuota" + ] + }, + "limit": { + "type": "integer", + "format": "int64", + "description": "The limit in MB.", + "minimum": 0 + } + } + }, + "GenericBlobStoreApiResponse": { + "type": "object", + "properties": { + "softQuota": { + "description": "Settings to control the soft quota", + "$ref": "#/definitions/BlobStoreApiSoftQuota" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "unavailable": { + "type": "boolean" + }, + "blobCount": { + "type": "integer", + "format": "int64" + }, + "totalSizeInBytes": { + "type": "integer", + "format": "int64" + }, + "availableSpaceInBytes": { + "type": "integer", + "format": "int64" + } + } + }, + "FileBlobStoreApiCreateRequest": { + "type": "object", + "properties": { + "softQuota": { + "description": "Settings to control the soft quota", + "$ref": "#/definitions/BlobStoreApiSoftQuota" + }, + "path": { + "type": "string", + "description": "The path to the blobstore contents. This can be an absolute path to anywhere on the system Nexus Repository Manager has access to or it can be a path relative to the sonatype-work directory." + }, + "name": { + "type": "string" + } + } + }, + "FileBlobStoreApiUpdateRequest": { + "type": "object", + "properties": { + "softQuota": { + "description": "Settings to control the soft quota", + "$ref": "#/definitions/BlobStoreApiSoftQuota" + }, + "path": { + "type": "string", + "description": "The path to the blobstore contents. This can be an absolute path to anywhere on the system Nexus Repository Manager has access to or it can be a path relative to the sonatype-work directory." + } + } + }, + "FileBlobStoreApiModel": { + "type": "object", + "properties": { + "softQuota": { + "description": "Settings to control the soft quota", + "$ref": "#/definitions/BlobStoreApiSoftQuota" + }, + "path": { + "type": "string", + "description": "The path to the blobstore contents. This can be an absolute path to anywhere on the system Nexus Repository Manager has access to or it can be a path relative to the sonatype-work directory." + } + } + }, + "ReadOnlyState": { + "type": "object", + "properties": { + "summaryReason": { + "type": "string" + }, + "systemInitiated": { + "type": "boolean" + }, + "frozen": { + "type": "boolean" + } + } + }, + "ApiCertificate": { + "type": "object", + "properties": { + "expiresOn": { + "type": "integer", + "format": "int64" + }, + "fingerprint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "issuedOn": { + "type": "integer", + "format": "int64" + }, + "issuerCommonName": { + "type": "string" + }, + "issuerOrganization": { + "type": "string" + }, + "issuerOrganizationalUnit": { + "type": "string" + }, + "pem": { + "type": "string" + }, + "serialNumber": { + "type": "string" + }, + "subjectCommonName": { + "type": "string" + }, + "subjectOrganization": { + "type": "string" + }, + "subjectOrganizationalUnit": { + "type": "string" + } + } + }, + "AssetXO": { + "type": "object", + "properties": { + "downloadUrl": { + "type": "string" + }, + "path": { + "type": "string" + }, + "id": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "format": { + "type": "string" + }, + "checksum": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "contentType": { + "type": "string" + }, + "lastModified": { + "type": "string", + "format": "date-time" + }, + "lastDownloaded": { + "type": "string", + "format": "date-time" + }, + "uploader": { + "type": "string" + }, + "uploaderIp": { + "type": "string" + }, + "fileSize": { + "type": "integer", + "format": "int64" + }, + "blobCreated": { + "type": "string", + "format": "date-time" + } + } + }, + "PageAssetXO": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/AssetXO" + } + }, + "continuationToken": { + "type": "string" + } + } + }, + "ComponentXO": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "format": { + "type": "string" + }, + "group": { + "type": "string" + }, + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/AssetXO" + } + } + } + }, + "PageComponentXO": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/ComponentXO" + } + }, + "continuationToken": { + "type": "string" + } + } + }, + "AbstractApiRepository": { + "type": "object", + "required": [ + "online" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "format": { + "type": "string", + "example": "npm", + "description": "Component format held in this repository" + }, + "type": { + "type": "string", + "example": "hosted", + "description": "Controls if deployments of and updates to artifacts are allowed", + "enum": [ + "hosted", + "proxy", + "group" + ] + }, + "url": { + "type": "string", + "description": "URL to the repository" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + } + } + }, + "ContentSelectorApiResponse": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The content selector name cannot be changed after creation" + }, + "type": { + "type": "string", + "description": "The type of content selector the backend is using", + "enum": [ + "csel", + "jexl" + ] + }, + "description": { + "type": "string", + "description": "A human-readable description" + }, + "expression": { + "type": "string", + "example": "format == \"maven2\" and path =^ \"/org/sonatype/nexus\"", + "description": "The expression used to identify content" + } + } + }, + "ContentSelectorApiCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The content selector name cannot be changed after creation", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string", + "description": "A human-readable description", + "allowEmptyValue": true + }, + "expression": { + "type": "string", + "example": "format == \"maven2\" and path =^ \"/org/sonatype/nexus\"", + "description": "The expression used to identify content" + } + } + }, + "ContentSelectorApiUpdateRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "An optional description of this content selector", + "allowEmptyValue": true + }, + "expression": { + "type": "string", + "example": "format == \"maven2\" and path =^ \"/org/sonatype/nexus\"", + "description": "The expression used to identify content" + } + } + }, + "RepositoryXO": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "format": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + }, + "attributes": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + } + }, + "RoutingRuleXO": { + "type": "object", + "properties": { + "name": { + "type": "string", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string", + "allowEmptyValue": true + }, + "mode": { + "type": "string", + "description": "Determines what should be done with requests when their path matches any of the matchers", + "enum": [ + "BLOCK", + "ALLOW" + ] + }, + "matchers": { + "type": "array", + "description": "Regular expressions used to identify request paths that are allowed or blocked (depending on mode)", + "items": { + "type": "string" + } + } + } + }, + "UploadDefinitionXO": { + "type": "object", + "properties": { + "format": { + "type": "string" + }, + "multipleUpload": { + "type": "boolean" + }, + "componentFields": { + "type": "array", + "items": { + "$ref": "#/definitions/UploadFieldDefinitionXO" + } + }, + "assetFields": { + "type": "array", + "items": { + "$ref": "#/definitions/UploadFieldDefinitionXO" + } + } + } + }, + "UploadFieldDefinitionXO": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "optional": { + "type": "boolean" + }, + "group": { + "type": "string" + } + } + }, + "ApiPrivilegeRepositoryContentSelectorRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "actions": { + "type": "array", + "description": "A collection of actions to associate with the privilege, using BREAD syntax (browse,read,edit,add,delete,all) as well as 'run' for script privileges.", + "items": { + "type": "string", + "enum": [ + "READ", + "BROWSE", + "EDIT", + "ADD", + "DELETE", + "RUN", + "ASSOCIATE", + "DISASSOCIATE", + "ALL" + ] + } + }, + "format": { + "type": "string", + "description": "The repository format (i.e 'nuget', 'npm') this privilege will grant access to (or * for all)." + }, + "repository": { + "type": "string", + "description": "The name of the repository this privilege will grant access to (or * for all)." + }, + "contentSelector": { + "type": "string", + "description": "The name of a content selector that will be used to grant access to content via this privilege." + } + } + }, + "ApiPrivilegeRepositoryAdminRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "actions": { + "type": "array", + "description": "A collection of actions to associate with the privilege, using BREAD syntax (browse,read,edit,add,delete,all) as well as 'run' for script privileges.", + "items": { + "type": "string", + "enum": [ + "READ", + "BROWSE", + "EDIT", + "ADD", + "DELETE", + "RUN", + "ASSOCIATE", + "DISASSOCIATE", + "ALL" + ] + } + }, + "format": { + "type": "string", + "description": "The repository format (i.e 'nuget', 'npm') this privilege will grant access to (or * for all)." + }, + "repository": { + "type": "string", + "description": "The name of the repository this privilege will grant access to (or * for all)." + } + } + }, + "ApiPrivilegeRepositoryViewRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "actions": { + "type": "array", + "description": "A collection of actions to associate with the privilege, using BREAD syntax (browse,read,edit,add,delete,all) as well as 'run' for script privileges.", + "items": { + "type": "string", + "enum": [ + "READ", + "BROWSE", + "EDIT", + "ADD", + "DELETE", + "RUN", + "ASSOCIATE", + "DISASSOCIATE", + "ALL" + ] + } + }, + "format": { + "type": "string", + "description": "The repository format (i.e 'nuget', 'npm') this privilege will grant access to (or * for all)." + }, + "repository": { + "type": "string", + "description": "The name of the repository this privilege will grant access to (or * for all)." + } + } + }, + "ApiEmailConfiguration": { + "type": "object", + "required": [ + "port" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "host": { + "type": "string" + }, + "port": { + "type": "integer", + "format": "int32" + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "fromAddress": { + "type": "string", + "example": "nexus@example.org" + }, + "subjectPrefix": { + "type": "string", + "description": "A prefix to add to all email subjects to aid in identifying automated emails" + }, + "startTlsEnabled": { + "type": "boolean", + "description": "Enable STARTTLS Support for Insecure Connections" + }, + "startTlsRequired": { + "type": "boolean", + "description": "Require STARTTLS Support" + }, + "sslOnConnectEnabled": { + "type": "boolean", + "description": "Enable SSL/TLS Encryption upon Connection" + }, + "sslServerIdentityCheckEnabled": { + "type": "boolean", + "description": "Verify the server certificate when using TLS or SSL" + }, + "nexusTrustStoreEnabled": { + "type": "boolean", + "description": "Use the Nexus Repository Manager's certificate truststore" + } + } + }, + "ApiEmailValidation": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "reason": { + "type": "string" + } + } + }, + "Result": { + "type": "object", + "properties": { + "healthy": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Throwable" + }, + "details": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "time": { + "type": "integer", + "format": "int64" + }, + "duration": { + "type": "integer", + "format": "int64" + }, + "timestamp": { + "type": "string" + } + } + }, + "StackTraceElement": { + "type": "object", + "properties": { + "methodName": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "lineNumber": { + "type": "integer", + "format": "int32" + }, + "className": { + "type": "string" + }, + "nativeMethod": { + "type": "boolean" + } + } + }, + "Throwable": { + "type": "object", + "properties": { + "cause": { + "$ref": "#/definitions/Throwable" + }, + "stackTrace": { + "type": "array", + "items": { + "$ref": "#/definitions/StackTraceElement" + } + }, + "message": { + "type": "string" + }, + "localizedMessage": { + "type": "string" + }, + "suppressed": { + "type": "array", + "items": { + "$ref": "#/definitions/Throwable" + } + } + } + }, + "SupportZipGeneratorRequest": { + "type": "object", + "properties": { + "systemInformation": { + "type": "boolean" + }, + "threadDump": { + "type": "boolean" + }, + "metrics": { + "type": "boolean" + }, + "configuration": { + "type": "boolean" + }, + "security": { + "type": "boolean" + }, + "log": { + "type": "boolean" + }, + "taskLog": { + "type": "boolean" + }, + "auditLog": { + "type": "boolean" + }, + "jmx": { + "type": "boolean" + }, + "replication": { + "type": "boolean" + }, + "limitFileSizes": { + "type": "boolean" + }, + "limitZipSize": { + "type": "boolean" + }, + "hostname": { + "type": "string" + } + } + }, + "SupportZipXO": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "name": { + "type": "string" + }, + "size": { + "type": "string" + }, + "truncated": { + "type": "boolean" + } + } + }, + "GroupAttributes": { + "type": "object", + "properties": { + "memberNames": { + "type": "array", + "description": "Member repositories' names", + "items": { + "type": "string" + } + } + } + }, + "MavenGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "StorageAttributes": { + "type": "object", + "required": [ + "blobStoreName", + "strictContentTypeValidation" + ], + "properties": { + "blobStoreName": { + "type": "string", + "example": "default", + "description": "Blob store used to store repository contents" + }, + "strictContentTypeValidation": { + "type": "boolean", + "example": true, + "description": "Whether to validate uploaded content's MIME type appropriate for the repository format" + } + } + }, + "SimpleApiGroupRepository": { + "type": "object", + "required": [ + "group", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "CleanupPolicyAttributes": { + "type": "object", + "properties": { + "policyNames": { + "type": "array", + "description": "Components that match any of the applied policies will be deleted", + "items": { + "type": "string" + } + } + } + }, + "ComponentAttributes": { + "type": "object", + "properties": { + "proprietaryComponents": { + "type": "boolean", + "description": "Components in this repository count as proprietary for namespace conflict attacks (requires Sonatype Nexus Firewall)" + } + } + }, + "HostedStorageAttributes": { + "type": "object", + "required": [ + "blobStoreName", + "strictContentTypeValidation", + "writePolicy" + ], + "properties": { + "blobStoreName": { + "type": "string", + "example": "default", + "description": "Blob store used to store repository contents" + }, + "strictContentTypeValidation": { + "type": "boolean", + "example": true, + "description": "Whether to validate uploaded content's MIME type appropriate for the repository format" + }, + "writePolicy": { + "type": "string", + "example": "allow_once", + "description": "Controls if deployments of and updates to assets are allowed", + "enum": [ + "allow", + "allow_once", + "deny" + ] + } + } + }, + "MavenAttributes": { + "type": "object", + "properties": { + "versionPolicy": { + "type": "string", + "example": "MIXED", + "description": "What type of artifacts does this repository store?", + "enum": [ + "RELEASE", + "SNAPSHOT", + "MIXED" + ] + }, + "layoutPolicy": { + "type": "string", + "example": "STRICT", + "description": "Validate that all paths are maven artifact or metadata paths", + "enum": [ + "STRICT", + "PERMISSIVE" + ] + }, + "contentDisposition": { + "type": "string", + "example": "ATTACHMENT", + "description": "Content Disposition", + "enum": [ + "INLINE", + "ATTACHMENT" + ] + } + } + }, + "MavenHostedApiRepository": { + "type": "object", + "required": [ + "maven", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "maven": { + "$ref": "#/definitions/MavenAttributes" + } + } + }, + "MavenHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "maven", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "maven": { + "$ref": "#/definitions/MavenAttributes" + } + } + }, + "HttpClientAttributes": { + "type": "object", + "required": [ + "autoBlock", + "blocked" + ], + "properties": { + "blocked": { + "type": "boolean", + "example": false, + "description": "Whether to block outbound connections on the repository" + }, + "autoBlock": { + "type": "boolean", + "example": true, + "description": "Whether to auto-block outbound connections if remote peer is detected as unreachable/unresponsive" + }, + "connection": { + "$ref": "#/definitions/HttpClientConnectionAttributes" + }, + "authentication": { + "$ref": "#/definitions/HttpClientConnectionAuthenticationAttributes" + } + } + }, + "HttpClientConnectionAttributes": { + "type": "object", + "properties": { + "retries": { + "type": "integer", + "format": "int32", + "example": 0, + "description": "Total retries if the initial connection attempt suffers a timeout", + "minimum": 0, + "maximum": 10 + }, + "userAgentSuffix": { + "type": "string", + "description": "Custom fragment to append to User-Agent header in HTTP requests" + }, + "timeout": { + "type": "integer", + "format": "int32", + "example": 60, + "description": "Seconds to wait for activity before stopping and retrying the connection", + "minimum": 1, + "maximum": 3600 + }, + "enableCircularRedirects": { + "type": "boolean", + "example": false, + "description": "Whether to enable redirects to the same location (may be required by some servers)" + }, + "enableCookies": { + "type": "boolean", + "example": false, + "description": "Whether to allow cookies to be stored and used" + }, + "useTrustStore": { + "type": "boolean", + "example": false, + "description": "Use certificates stored in the Nexus Repository Manager truststore to connect to external systems" + } + } + }, + "HttpClientConnectionAuthenticationAttributes": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Authentication type", + "enum": [ + "username", + "ntlm" + ] + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "ntlmHost": { + "type": "string" + }, + "ntlmDomain": { + "type": "string" + } + } + }, + "MavenProxyApiRepository": { + "type": "object", + "required": [ + "httpClient", + "maven", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "maven": { + "$ref": "#/definitions/MavenAttributes" + } + } + }, + "NegativeCacheAttributes": { + "type": "object", + "required": [ + "enabled", + "timeToLive" + ], + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Whether to cache responses for content not present in the proxied repository" + }, + "timeToLive": { + "type": "integer", + "format": "int32", + "example": 1440, + "description": "How long to cache the fact that a file was not found in the repository (in minutes)" + } + } + }, + "ProxyAttributes": { + "type": "object", + "required": [ + "contentMaxAge", + "metadataMaxAge" + ], + "properties": { + "remoteUrl": { + "type": "string", + "example": "https://remote.repository.com", + "description": "Location of the remote repository being proxied" + }, + "contentMaxAge": { + "type": "integer", + "format": "int32", + "example": 1440, + "description": "How long to cache artifacts before rechecking the remote repository (in minutes)" + }, + "metadataMaxAge": { + "type": "integer", + "format": "int32", + "example": 1440, + "description": "How long to cache metadata before rechecking the remote repository (in minutes)" + } + } + }, + "ReplicationAttributes": { + "type": "object", + "required": [ + "preemptivePullEnabled" + ], + "properties": { + "preemptivePullEnabled": { + "type": "boolean", + "example": false, + "description": "Whether pre-emptive pull is enabled" + }, + "assetPathRegex": { + "type": "string", + "description": "Regular Expression of Asset Paths to pull pre-emptively pull" + } + } + }, + "HttpClientAttributesWithPreemptiveAuth": { + "type": "object", + "required": [ + "autoBlock", + "blocked" + ], + "properties": { + "blocked": { + "type": "boolean", + "example": false, + "description": "Whether to block outbound connections on the repository" + }, + "autoBlock": { + "type": "boolean", + "example": true, + "description": "Whether to auto-block outbound connections if remote peer is detected as unreachable/unresponsive" + }, + "connection": { + "$ref": "#/definitions/HttpClientConnectionAttributes" + }, + "authentication": { + "$ref": "#/definitions/HttpClientConnectionAuthenticationAttributesWithPreemptive" + } + } + }, + "HttpClientConnectionAuthenticationAttributesWithPreemptive": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Authentication type", + "enum": [ + "username", + "ntlm" + ] + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "ntlmHost": { + "type": "string" + }, + "ntlmDomain": { + "type": "string" + }, + "preemptive": { + "type": "boolean", + "example": false, + "description": "Whether to use pre-emptive authentication. Use with caution. Defaults to false." + } + } + }, + "MavenProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "maven", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributesWithPreemptiveAuth" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "maven": { + "$ref": "#/definitions/MavenAttributes" + } + } + }, + "ApiPrivilegeScriptRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the privilege. This value cannot be changed.", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "description": { + "type": "string" + }, + "actions": { + "type": "array", + "description": "A collection of actions to associate with the privilege, using BREAD syntax (browse,read,edit,add,delete,all) as well as 'run' for script privileges.", + "items": { + "type": "string", + "enum": [ + "READ", + "BROWSE", + "EDIT", + "ADD", + "DELETE", + "RUN", + "ASSOCIATE", + "DISASSOCIATE", + "ALL" + ] + } + }, + "scriptName": { + "type": "string", + "description": "The name of a script to give access to." + } + } + }, + "ScriptXO": { + "type": "object", + "properties": { + "name": { + "type": "string", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "content": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "ScriptResultXO": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "result": { + "type": "string" + } + } + }, + "S3BlobStoreApiAdvancedBucketConnection": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "A custom endpoint URL for third party object stores using the S3 API." + }, + "signerType": { + "type": "string", + "description": "An API signature version which may be required for third party object stores using the S3 API." + }, + "forcePathStyle": { + "type": "boolean", + "description": "Setting this flag will result in path-style access being used for all requests." + }, + "maxConnectionPoolSize": { + "type": "integer", + "format": "int32", + "description": "Setting this value will override the default connection pool size of Nexus of the s3 client for this blobstore." + } + } + }, + "S3BlobStoreApiBucket": { + "type": "object", + "required": [ + "expiration", + "name", + "region" + ], + "properties": { + "region": { + "type": "string", + "example": "DEFAULT", + "description": "The AWS region to create a new S3 bucket in or an existing S3 bucket's region" + }, + "name": { + "type": "string", + "description": "The name of the S3 bucket" + }, + "prefix": { + "type": "string", + "description": "The S3 blob store (i.e S3 object) key prefix" + }, + "expiration": { + "type": "integer", + "format": "int32", + "example": 3, + "description": "How many days until deleted blobs are finally removed from the S3 bucket (-1 to disable)" + } + } + }, + "S3BlobStoreApiBucketConfiguration": { + "type": "object", + "required": [ + "bucket" + ], + "properties": { + "bucket": { + "description": "Details of the S3 bucket such as name and region", + "readOnly": true, + "$ref": "#/definitions/S3BlobStoreApiBucket" + }, + "encryption": { + "description": "The type of encryption to use if any", + "readOnly": true, + "$ref": "#/definitions/S3BlobStoreApiEncryption" + }, + "bucketSecurity": { + "description": "Security details for granting access the S3 API", + "$ref": "#/definitions/S3BlobStoreApiBucketSecurity" + }, + "advancedBucketConnection": { + "description": "A custom endpoint URL, signer type and whether path style access is enabled", + "$ref": "#/definitions/S3BlobStoreApiAdvancedBucketConnection" + } + } + }, + "S3BlobStoreApiBucketSecurity": { + "type": "object", + "properties": { + "accessKeyId": { + "type": "string", + "description": "An IAM access key ID for granting access to the S3 bucket" + }, + "secretAccessKey": { + "type": "string", + "description": "The secret access key associated with the specified IAM access key ID" + }, + "role": { + "type": "string", + "description": "An IAM role to assume in order to access the S3 bucket" + }, + "sessionToken": { + "type": "string", + "description": "An AWS STS session token associated with temporary security credentials which grant access to the S3 bucket" + } + } + }, + "S3BlobStoreApiEncryption": { + "type": "object", + "properties": { + "encryptionType": { + "type": "string", + "description": "The type of S3 server side encryption to use.", + "enum": [ + "s3ManagedEncryption", + "kmsManagedEncryption" + ] + }, + "encryptionKey": { + "type": "string", + "description": "The encryption key." + } + } + }, + "S3BlobStoreApiModel": { + "type": "object", + "required": [ + "bucketConfiguration", + "name" + ], + "properties": { + "name": { + "type": "string", + "example": "s3", + "description": "The name of the S3 blob store." + }, + "softQuota": { + "description": "Settings to control the soft quota.", + "$ref": "#/definitions/BlobStoreApiSoftQuota" + }, + "bucketConfiguration": { + "description": "The S3 specific configuration details for the S3 object that'll contain the blob store.", + "$ref": "#/definitions/S3BlobStoreApiBucketConfiguration" + }, + "type": { + "type": "string", + "example": "S3", + "description": "The blob store type.", + "readOnly": true + } + } + }, + "AptHostedApiRepository": { + "type": "object", + "required": [ + "apt", + "aptSigning", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "apt": { + "$ref": "#/definitions/AptHostedRepositoriesAttributes" + }, + "aptSigning": { + "$ref": "#/definitions/AptSigningRepositoriesAttributes" + } + } + }, + "AptHostedRepositoriesAttributes": { + "type": "object", + "properties": { + "distribution": { + "type": "string", + "example": "bionic", + "description": "Distribution to fetch" + } + } + }, + "AptSigningRepositoriesAttributes": { + "type": "object", + "properties": { + "keypair": { + "type": "string", + "description": "PGP signing key pair (armored private key e.g. gpg --export-secret-key --armor)" + }, + "passphrase": { + "type": "string", + "description": "Passphrase to access PGP signing key" + } + } + }, + "AptHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "apt", + "aptSigning", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "apt": { + "$ref": "#/definitions/AptHostedRepositoriesAttributes" + }, + "aptSigning": { + "$ref": "#/definitions/AptSigningRepositoriesAttributes" + } + } + }, + "AptProxyApiRepository": { + "type": "object", + "required": [ + "apt", + "httpClient", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "apt": { + "$ref": "#/definitions/AptProxyRepositoriesAttributes" + } + } + }, + "AptProxyRepositoriesAttributes": { + "type": "object", + "required": [ + "flat" + ], + "properties": { + "distribution": { + "type": "string", + "example": "bionic", + "description": "Distribution to fetch" + }, + "flat": { + "type": "boolean", + "example": false, + "description": "Whether this repository is flat" + } + } + }, + "AptProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "apt", + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "apt": { + "$ref": "#/definitions/AptProxyRepositoriesAttributes" + } + } + }, + "RawAttributes": { + "type": "object", + "properties": { + "contentDisposition": { + "type": "string", + "example": "ATTACHMENT", + "description": "Content Disposition", + "enum": [ + "INLINE", + "ATTACHMENT" + ] + } + } + }, + "RawGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + }, + "raw": { + "$ref": "#/definitions/RawAttributes" + } + } + }, + "RawHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "raw": { + "$ref": "#/definitions/RawAttributes" + } + } + }, + "SimpleApiHostedRepository": { + "type": "object", + "required": [ + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "RawProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "raw": { + "$ref": "#/definitions/RawAttributes" + } + } + }, + "SimpleApiProxyRepository": { + "type": "object", + "required": [ + "httpClient", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "ReadLdapServerXo": { + "type": "object", + "required": [ + "authScheme", + "connectionRetryDelaySeconds", + "connectionTimeoutSeconds", + "groupType", + "host", + "maxIncidentsCount", + "name", + "port", + "protocol", + "searchBase" + ], + "properties": { + "name": { + "type": "string", + "description": "LDAP server name" + }, + "protocol": { + "type": "string", + "description": "LDAP server connection Protocol to use", + "enum": [ + "ldap", + "ldaps" + ] + }, + "useTrustStore": { + "type": "boolean", + "description": "Whether to use certificates stored in Nexus Repository Manager's truststore" + }, + "host": { + "type": "string", + "description": "LDAP server connection hostname" + }, + "port": { + "type": "integer", + "format": "int32", + "example": 636, + "description": "LDAP server connection port to use" + }, + "searchBase": { + "type": "string", + "example": "dc=example,dc=com", + "description": "LDAP location to be added to the connection URL" + }, + "authScheme": { + "type": "string", + "description": "Authentication scheme used for connecting to LDAP server", + "enum": [ + "NONE", + "SIMPLE", + "DIGEST_MD5", + "CRAM_MD5" + ] + }, + "authRealm": { + "type": "string", + "example": "example.com", + "description": "The SASL realm to bind to. Required if authScheme is CRAM_MD5 or DIGEST_MD5" + }, + "authUsername": { + "type": "string", + "description": "This must be a fully qualified username if simple authentication is used. Required if authScheme other than none." + }, + "connectionTimeoutSeconds": { + "type": "integer", + "format": "int32", + "example": 1, + "description": "How long to wait before timeout", + "minimum": 1, + "maximum": 3600 + }, + "connectionRetryDelaySeconds": { + "type": "integer", + "format": "int32", + "description": "How long to wait before retrying", + "minimum": 0 + }, + "maxIncidentsCount": { + "type": "integer", + "format": "int32", + "description": "How many retry attempts", + "minimum": 0 + }, + "userBaseDn": { + "type": "string", + "example": "ou=people", + "description": "The relative DN where user objects are found (e.g. ou=people). This value will have the Search base DN value appended to form the full User search base DN." + }, + "userSubtree": { + "type": "boolean", + "description": "Are users located in structures below the user base DN?" + }, + "userObjectClass": { + "type": "string", + "example": "inetOrgPerson", + "description": "LDAP class for user objects" + }, + "userLdapFilter": { + "type": "string", + "example": "(|(mail=*@example.com)(uid=dom*))", + "description": "LDAP search filter to limit user search" + }, + "userIdAttribute": { + "type": "string", + "example": "uid", + "description": "This is used to find a user given its user ID" + }, + "userRealNameAttribute": { + "type": "string", + "example": "cn", + "description": "This is used to find a real name given the user ID" + }, + "userEmailAddressAttribute": { + "type": "string", + "example": "mail", + "description": "This is used to find an email address given the user ID" + }, + "userPasswordAttribute": { + "type": "string", + "description": "If this field is blank the user will be authenticated against a bind with the LDAP server" + }, + "ldapGroupsAsRoles": { + "type": "boolean", + "description": "Denotes whether LDAP assigned roles are used as Nexus Repository Manager roles" + }, + "groupType": { + "type": "string", + "description": "Defines a type of groups used: static (a group contains a list of users) or dynamic (a user contains a list of groups). Required if ldapGroupsAsRoles is true.", + "enum": [ + "static", + "dynamic" + ] + }, + "groupBaseDn": { + "type": "string", + "example": "ou=Group", + "description": "The relative DN where group objects are found (e.g. ou=Group). This value will have the Search base DN value appended to form the full Group search base DN." + }, + "groupSubtree": { + "type": "boolean", + "description": "Are groups located in structures below the group base DN" + }, + "groupObjectClass": { + "type": "string", + "example": "posixGroup", + "description": "LDAP class for group objects. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupIdAttribute": { + "type": "string", + "example": "cn", + "description": "This field specifies the attribute of the Object class that defines the Group ID. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupMemberAttribute": { + "type": "string", + "example": "memberUid", + "description": "LDAP attribute containing the usernames for the group. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupMemberFormat": { + "type": "string", + "example": "uid=${username},ou=people,dc=example,dc=com", + "description": "The format of user ID stored in the group member attribute. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "userMemberOfAttribute": { + "type": "string", + "example": "memberOf", + "description": "Set this to the attribute used to store the attribute which holds groups DN in the user object. Required if groupType is dynamic", + "minLength": 0, + "maxLength": 0 + }, + "id": { + "type": "string", + "description": "LDAP server ID" + }, + "order": { + "type": "integer", + "format": "int32", + "description": "Order number in which the server is being used when looking for a user" + } + } + }, + "CreateLdapServerXo": { + "type": "object", + "required": [ + "authPassword", + "authScheme", + "connectionRetryDelaySeconds", + "connectionTimeoutSeconds", + "groupType", + "host", + "maxIncidentsCount", + "name", + "port", + "protocol", + "searchBase" + ], + "properties": { + "name": { + "type": "string", + "description": "LDAP server name" + }, + "protocol": { + "type": "string", + "description": "LDAP server connection Protocol to use", + "enum": [ + "ldap", + "ldaps" + ] + }, + "useTrustStore": { + "type": "boolean", + "description": "Whether to use certificates stored in Nexus Repository Manager's truststore" + }, + "host": { + "type": "string", + "description": "LDAP server connection hostname" + }, + "port": { + "type": "integer", + "format": "int32", + "example": 636, + "description": "LDAP server connection port to use" + }, + "searchBase": { + "type": "string", + "example": "dc=example,dc=com", + "description": "LDAP location to be added to the connection URL" + }, + "authScheme": { + "type": "string", + "description": "Authentication scheme used for connecting to LDAP server", + "enum": [ + "NONE", + "SIMPLE", + "DIGEST_MD5", + "CRAM_MD5" + ] + }, + "authRealm": { + "type": "string", + "example": "example.com", + "description": "The SASL realm to bind to. Required if authScheme is CRAM_MD5 or DIGEST_MD5" + }, + "authUsername": { + "type": "string", + "description": "This must be a fully qualified username if simple authentication is used. Required if authScheme other than none." + }, + "connectionTimeoutSeconds": { + "type": "integer", + "format": "int32", + "example": 1, + "description": "How long to wait before timeout", + "minimum": 1, + "maximum": 3600 + }, + "connectionRetryDelaySeconds": { + "type": "integer", + "format": "int32", + "description": "How long to wait before retrying", + "minimum": 0 + }, + "maxIncidentsCount": { + "type": "integer", + "format": "int32", + "description": "How many retry attempts", + "minimum": 0 + }, + "userBaseDn": { + "type": "string", + "example": "ou=people", + "description": "The relative DN where user objects are found (e.g. ou=people). This value will have the Search base DN value appended to form the full User search base DN." + }, + "userSubtree": { + "type": "boolean", + "description": "Are users located in structures below the user base DN?" + }, + "userObjectClass": { + "type": "string", + "example": "inetOrgPerson", + "description": "LDAP class for user objects" + }, + "userLdapFilter": { + "type": "string", + "example": "(|(mail=*@example.com)(uid=dom*))", + "description": "LDAP search filter to limit user search" + }, + "userIdAttribute": { + "type": "string", + "example": "uid", + "description": "This is used to find a user given its user ID" + }, + "userRealNameAttribute": { + "type": "string", + "example": "cn", + "description": "This is used to find a real name given the user ID" + }, + "userEmailAddressAttribute": { + "type": "string", + "example": "mail", + "description": "This is used to find an email address given the user ID" + }, + "userPasswordAttribute": { + "type": "string", + "description": "If this field is blank the user will be authenticated against a bind with the LDAP server" + }, + "ldapGroupsAsRoles": { + "type": "boolean", + "description": "Denotes whether LDAP assigned roles are used as Nexus Repository Manager roles" + }, + "groupType": { + "type": "string", + "description": "Defines a type of groups used: static (a group contains a list of users) or dynamic (a user contains a list of groups). Required if ldapGroupsAsRoles is true.", + "enum": [ + "static", + "dynamic" + ] + }, + "groupBaseDn": { + "type": "string", + "example": "ou=Group", + "description": "The relative DN where group objects are found (e.g. ou=Group). This value will have the Search base DN value appended to form the full Group search base DN." + }, + "groupSubtree": { + "type": "boolean", + "description": "Are groups located in structures below the group base DN" + }, + "groupObjectClass": { + "type": "string", + "example": "posixGroup", + "description": "LDAP class for group objects. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupIdAttribute": { + "type": "string", + "example": "cn", + "description": "This field specifies the attribute of the Object class that defines the Group ID. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupMemberAttribute": { + "type": "string", + "example": "memberUid", + "description": "LDAP attribute containing the usernames for the group. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupMemberFormat": { + "type": "string", + "example": "uid=${username},ou=people,dc=example,dc=com", + "description": "The format of user ID stored in the group member attribute. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "userMemberOfAttribute": { + "type": "string", + "example": "memberOf", + "description": "Set this to the attribute used to store the attribute which holds groups DN in the user object. Required if groupType is dynamic", + "minLength": 0, + "maxLength": 0 + }, + "authPassword": { + "type": "string", + "description": "The password to bind with. Required if authScheme other than none." + } + } + }, + "UpdateLdapServerXo": { + "type": "object", + "required": [ + "authPassword", + "authScheme", + "connectionRetryDelaySeconds", + "connectionTimeoutSeconds", + "groupType", + "host", + "maxIncidentsCount", + "name", + "port", + "protocol", + "searchBase" + ], + "properties": { + "name": { + "type": "string", + "description": "LDAP server name" + }, + "protocol": { + "type": "string", + "description": "LDAP server connection Protocol to use", + "enum": [ + "ldap", + "ldaps" + ] + }, + "useTrustStore": { + "type": "boolean", + "description": "Whether to use certificates stored in Nexus Repository Manager's truststore" + }, + "host": { + "type": "string", + "description": "LDAP server connection hostname" + }, + "port": { + "type": "integer", + "format": "int32", + "example": 636, + "description": "LDAP server connection port to use" + }, + "searchBase": { + "type": "string", + "example": "dc=example,dc=com", + "description": "LDAP location to be added to the connection URL" + }, + "authScheme": { + "type": "string", + "description": "Authentication scheme used for connecting to LDAP server", + "enum": [ + "NONE", + "SIMPLE", + "DIGEST_MD5", + "CRAM_MD5" + ] + }, + "authRealm": { + "type": "string", + "example": "example.com", + "description": "The SASL realm to bind to. Required if authScheme is CRAM_MD5 or DIGEST_MD5" + }, + "authUsername": { + "type": "string", + "description": "This must be a fully qualified username if simple authentication is used. Required if authScheme other than none." + }, + "connectionTimeoutSeconds": { + "type": "integer", + "format": "int32", + "example": 1, + "description": "How long to wait before timeout", + "minimum": 1, + "maximum": 3600 + }, + "connectionRetryDelaySeconds": { + "type": "integer", + "format": "int32", + "description": "How long to wait before retrying", + "minimum": 0 + }, + "maxIncidentsCount": { + "type": "integer", + "format": "int32", + "description": "How many retry attempts", + "minimum": 0 + }, + "userBaseDn": { + "type": "string", + "example": "ou=people", + "description": "The relative DN where user objects are found (e.g. ou=people). This value will have the Search base DN value appended to form the full User search base DN." + }, + "userSubtree": { + "type": "boolean", + "description": "Are users located in structures below the user base DN?" + }, + "userObjectClass": { + "type": "string", + "example": "inetOrgPerson", + "description": "LDAP class for user objects" + }, + "userLdapFilter": { + "type": "string", + "example": "(|(mail=*@example.com)(uid=dom*))", + "description": "LDAP search filter to limit user search" + }, + "userIdAttribute": { + "type": "string", + "example": "uid", + "description": "This is used to find a user given its user ID" + }, + "userRealNameAttribute": { + "type": "string", + "example": "cn", + "description": "This is used to find a real name given the user ID" + }, + "userEmailAddressAttribute": { + "type": "string", + "example": "mail", + "description": "This is used to find an email address given the user ID" + }, + "userPasswordAttribute": { + "type": "string", + "description": "If this field is blank the user will be authenticated against a bind with the LDAP server" + }, + "ldapGroupsAsRoles": { + "type": "boolean", + "description": "Denotes whether LDAP assigned roles are used as Nexus Repository Manager roles" + }, + "groupType": { + "type": "string", + "description": "Defines a type of groups used: static (a group contains a list of users) or dynamic (a user contains a list of groups). Required if ldapGroupsAsRoles is true.", + "enum": [ + "static", + "dynamic" + ] + }, + "groupBaseDn": { + "type": "string", + "example": "ou=Group", + "description": "The relative DN where group objects are found (e.g. ou=Group). This value will have the Search base DN value appended to form the full Group search base DN." + }, + "groupSubtree": { + "type": "boolean", + "description": "Are groups located in structures below the group base DN" + }, + "groupObjectClass": { + "type": "string", + "example": "posixGroup", + "description": "LDAP class for group objects. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupIdAttribute": { + "type": "string", + "example": "cn", + "description": "This field specifies the attribute of the Object class that defines the Group ID. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupMemberAttribute": { + "type": "string", + "example": "memberUid", + "description": "LDAP attribute containing the usernames for the group. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "groupMemberFormat": { + "type": "string", + "example": "uid=${username},ou=people,dc=example,dc=com", + "description": "The format of user ID stored in the group member attribute. Required if groupType is static", + "minLength": 0, + "maxLength": 0 + }, + "userMemberOfAttribute": { + "type": "string", + "example": "memberOf", + "description": "Set this to the attribute used to store the attribute which holds groups DN in the user object. Required if groupType is dynamic", + "minLength": 0, + "maxLength": 0 + }, + "authPassword": { + "type": "string", + "description": "The password to bind with. Required if authScheme other than none." + }, + "id": { + "type": "string", + "description": "LDAP server ID" + } + } + }, + "IqConnectionVerificationXo": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "reason": { + "type": "string" + } + } + }, + "IqConnectionXo": { + "type": "object", + "required": [ + "authenticationType" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether to use Sonatype Repository Firewall" + }, + "showLink": { + "type": "boolean", + "description": "Show Sonatype Repository Firewall link in Browse menu when server is enabled" + }, + "url": { + "type": "string", + "description": "The address of your Sonatype Repository Firewall" + }, + "authenticationType": { + "type": "string", + "description": "Authentication method", + "enum": [ + "USER", + "PKI" + ] + }, + "username": { + "type": "string", + "description": "User with access to Sonatype Repository Firewall" + }, + "password": { + "type": "string", + "description": "Credentials for the Sonatype Repository Firewall User" + }, + "useTrustStoreForUrl": { + "type": "boolean", + "description": "Use certificates stored in the Nexus Repository Manager truststore to connect to Sonatype Repository Firewall" + }, + "timeoutSeconds": { + "type": "integer", + "format": "int32", + "description": "Seconds to wait for activity before stopping and retrying the connection. Leave blank to use the globally defined HTTP timeout.", + "minimum": 1, + "maximum": 3600 + }, + "properties": { + "type": "string", + "description": "Additional properties to configure for Sonatype Repository Firewall" + }, + "failOpenModeEnabled": { + "type": "boolean", + "description": "Allow by default when quarantine is enabled and the IQ connection fails" + } + } + }, + "ApiLicenseDetailsXO": { + "type": "object", + "properties": { + "contactEmail": { + "type": "string" + }, + "contactCompany": { + "type": "string" + }, + "contactName": { + "type": "string" + }, + "effectiveDate": { + "type": "string", + "format": "date-time" + }, + "expirationDate": { + "type": "string", + "format": "date-time" + }, + "licenseType": { + "type": "string" + }, + "licensedUsers": { + "type": "string" + }, + "fingerprint": { + "type": "string" + }, + "features": { + "type": "string" + } + } + }, + "InputStream": { + "type": "object" + }, + "GroupDeployAttributes": { + "type": "object", + "properties": { + "memberNames": { + "type": "array", + "description": "Member repositories' names", + "items": { + "type": "string" + } + }, + "writableMember": { + "type": "string", + "description": "Pro-only: This field is for the Group Deployment feature available in NXRM Pro." + } + } + }, + "SimpleApiGroupDeployRepository": { + "type": "object", + "required": [ + "group", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "readOnly": true, + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests", + "readOnly": true + }, + "storage": { + "readOnly": true, + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "readOnly": true, + "$ref": "#/definitions/GroupDeployAttributes" + } + } + }, + "NpmGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupDeployAttributes" + } + } + }, + "NpmHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "NpmAttributes": { + "type": "object", + "required": [ + "removeQuarantined" + ], + "properties": { + "removeQuarantined": { + "type": "boolean", + "example": true, + "description": "Remove Quarantined Versions" + } + } + }, + "NpmProxyApiRepository": { + "type": "object", + "required": [ + "httpClient", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "npm": { + "$ref": "#/definitions/NpmAttributes" + } + } + }, + "NpmProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "npm": { + "$ref": "#/definitions/NpmAttributes" + } + } + }, + "NugetGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "NugetHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "NugetAttributes": { + "type": "object", + "properties": { + "queryCacheItemMaxAge": { + "type": "integer", + "format": "int32", + "example": 3600, + "description": "How long to cache query results from the proxied repository (in seconds)" + }, + "nugetVersion": { + "type": "string", + "example": "V3", + "description": "Nuget protocol version", + "enum": [ + "V2", + "V3" + ] + } + } + }, + "NugetProxyApiRepository": { + "type": "object", + "required": [ + "httpClient", + "negativeCache", + "nugetProxy", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "nugetProxy": { + "$ref": "#/definitions/NugetAttributes" + } + } + }, + "NugetProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "nugetProxy", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "nugetProxy": { + "$ref": "#/definitions/NugetAttributes" + } + } + }, + "RubyGemsGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "RubyGemsHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "RubyGemsProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "DockerAttributes": { + "type": "object", + "required": [ + "forceBasicAuth", + "v1Enabled" + ], + "properties": { + "v1Enabled": { + "type": "boolean", + "example": false, + "description": "Whether to allow clients to use the V1 API to interact with this repository" + }, + "forceBasicAuth": { + "type": "boolean", + "example": true, + "description": "Whether to force authentication (Docker Bearer Token Realm required if false)" + }, + "httpPort": { + "type": "integer", + "format": "int32", + "example": 8082, + "description": "Create an HTTP connector at specified port" + }, + "httpsPort": { + "type": "integer", + "format": "int32", + "example": 8083, + "description": "Create an HTTPS connector at specified port" + }, + "subdomain": { + "type": "string", + "example": "docker-a", + "description": "Allows to use subdomain" + } + } + }, + "DockerGroupApiRepository": { + "type": "object", + "required": [ + "docker", + "group", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupDeployAttributes" + }, + "docker": { + "$ref": "#/definitions/DockerAttributes" + } + } + }, + "DockerGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "docker", + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupDeployAttributes" + }, + "docker": { + "$ref": "#/definitions/DockerAttributes" + } + } + }, + "DockerHostedApiRepository": { + "type": "object", + "required": [ + "docker", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "docker": { + "$ref": "#/definitions/DockerAttributes" + } + } + }, + "DockerHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "docker", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/DockerHostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "docker": { + "$ref": "#/definitions/DockerAttributes" + } + } + }, + "DockerHostedStorageAttributes": { + "type": "object", + "required": [ + "blobStoreName", + "strictContentTypeValidation", + "writePolicy" + ], + "properties": { + "blobStoreName": { + "type": "string", + "example": "default", + "description": "Blob store used to store repository contents" + }, + "strictContentTypeValidation": { + "type": "boolean", + "example": true, + "description": "Whether to validate uploaded content's MIME type appropriate for the repository format" + }, + "writePolicy": { + "type": "string", + "example": "allow_once", + "description": "Controls if deployments of and updates to assets are allowed", + "enum": [ + "allow", + "allow_once", + "deny" + ] + }, + "latestPolicy": { + "type": "boolean", + "example": true, + "description": "Whether to allow redeploying the 'latest' tag but defer to the Deployment Policy for all other tags" + } + } + }, + "DockerProxyApiRepository": { + "type": "object", + "required": [ + "docker", + "dockerProxy", + "httpClient", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "docker": { + "$ref": "#/definitions/DockerAttributes" + }, + "dockerProxy": { + "$ref": "#/definitions/DockerProxyAttributes" + } + } + }, + "DockerProxyAttributes": { + "type": "object", + "properties": { + "indexType": { + "type": "string", + "example": "HUB", + "description": "Type of Docker Index", + "enum": [ + "HUB", + "REGISTRY", + "CUSTOM" + ] + }, + "indexUrl": { + "type": "string", + "description": "Url of Docker Index to use" + }, + "cacheForeignLayers": { + "type": "boolean", + "description": "Allow Nexus Repository Manager to download and cache foreign layers" + }, + "foreignLayerUrlWhitelist": { + "type": "array", + "description": "Regular expressions used to identify URLs that are allowed for foreign layer requests", + "items": { + "type": "string" + } + } + } + }, + "DockerProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "docker", + "dockerProxy", + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "docker": { + "$ref": "#/definitions/DockerAttributes" + }, + "dockerProxy": { + "$ref": "#/definitions/DockerProxyAttributes" + } + } + }, + "YumGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + }, + "yumSigning": { + "$ref": "#/definitions/YumSigningRepositoriesAttributes" + } + } + }, + "YumSigningRepositoriesAttributes": { + "type": "object", + "properties": { + "keypair": { + "type": "string", + "description": "PGP signing key pair (armored private key e.g. gpg --export-secret-key --armor)" + }, + "passphrase": { + "type": "string", + "description": "Passphrase to access PGP signing key" + } + } + }, + "YumAttributes": { + "type": "object", + "required": [ + "repodataDepth" + ], + "properties": { + "repodataDepth": { + "type": "integer", + "format": "int32", + "example": 5, + "description": "Specifies the repository depth where repodata folder(s) are created", + "minimum": 0, + "maximum": 5 + }, + "deployPolicy": { + "type": "string", + "example": "STRICT", + "description": "Validate that all paths are RPMs or yum metadata", + "enum": [ + "PERMISSIVE", + "STRICT" + ] + } + } + }, + "YumHostedApiRepository": { + "type": "object", + "required": [ + "online", + "storage", + "yum" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "yum": { + "$ref": "#/definitions/YumAttributes" + } + } + }, + "YumHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage", + "yum" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + }, + "yum": { + "$ref": "#/definitions/YumAttributes" + } + } + }, + "YumProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "yumSigning": { + "$ref": "#/definitions/YumSigningRepositoriesAttributes" + } + } + }, + "AzureConnectionXO": { + "type": "object", + "properties": { + "accountName": { + "type": "string" + }, + "accountKey": { + "type": "string" + }, + "containerName": { + "type": "string" + }, + "authenticationMethod": { + "type": "string" + } + } + }, + "AzureBlobStoreApiAuthentication": { + "type": "object", + "required": [ + "authenticationMethod" + ], + "properties": { + "authenticationMethod": { + "type": "string", + "description": "The type of Azure authentication to use.", + "enum": [ + "ACCOUNTKEY", + "MANAGEDIDENTITY", + "ENVIRONMENTVARIABLE" + ] + }, + "accountKey": { + "type": "string", + "description": "The account key." + } + } + }, + "AzureBlobStoreApiBucketConfiguration": { + "type": "object", + "required": [ + "accountName", + "authentication", + "containerName" + ], + "properties": { + "accountName": { + "type": "string", + "description": "Account name found under Access keys for the storage account." + }, + "containerName": { + "type": "string", + "description": "The name of an existing container to be used for storage.", + "pattern": "^[a-z0-9][a-z0-9-]{2,62}$" + }, + "authentication": { + "description": "The Azure specific authentication details.", + "$ref": "#/definitions/AzureBlobStoreApiAuthentication" + } + } + }, + "AzureBlobStoreApiModel": { + "type": "object", + "required": [ + "bucketConfiguration", + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the Azure blob store." + }, + "softQuota": { + "description": "Settings to control the soft quota.", + "$ref": "#/definitions/BlobStoreApiSoftQuota" + }, + "bucketConfiguration": { + "description": "The Azure specific configuration details for the Azure object that'll contain the blob store.", + "$ref": "#/definitions/AzureBlobStoreApiBucketConfiguration" + } + } + }, + "HelmHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "HelmProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "GitLfsHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "PypiGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "PypiHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "PyPiProxyAttributes": { + "type": "object", + "required": [ + "removeQuarantined" + ], + "properties": { + "removeQuarantined": { + "type": "boolean", + "example": true, + "description": "Remove Quarantined Versions" + } + } + }, + "PypiProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "pypi": { + "$ref": "#/definitions/PyPiProxyAttributes" + } + } + }, + "CondaProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "ConanProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "RGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "RHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "RProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "CocoapodsProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "GolangGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "GolangProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "P2ProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + } + } + }, + "BowerGroupRepositoryApiRequest": { + "type": "object", + "required": [ + "group", + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "group": { + "$ref": "#/definitions/GroupAttributes" + } + } + }, + "BowerHostedRepositoryApiRequest": { + "type": "object", + "required": [ + "name", + "online", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/HostedStorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "component": { + "$ref": "#/definitions/ComponentAttributes" + } + } + }, + "BowerAttributes": { + "type": "object", + "required": [ + "rewritePackageUrls" + ], + "properties": { + "rewritePackageUrls": { + "type": "boolean", + "example": true, + "description": "Whether to force Bower to retrieve packages through this proxy repository" + } + } + }, + "BowerProxyApiRepository": { + "type": "object", + "required": [ + "httpClient", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRuleName": { + "type": "string", + "description": "The name of the routing rule assigned to this repository" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "bower": { + "$ref": "#/definitions/BowerAttributes" + } + } + }, + "BowerProxyRepositoryApiRequest": { + "type": "object", + "required": [ + "httpClient", + "name", + "negativeCache", + "online", + "proxy", + "storage" + ], + "properties": { + "name": { + "type": "string", + "example": "internal", + "description": "A unique identifier for this repository", + "pattern": "^[a-zA-Z0-9\\-]{1}[a-zA-Z0-9_\\-\\.]*$" + }, + "online": { + "type": "boolean", + "example": true, + "description": "Whether this repository accepts incoming requests" + }, + "storage": { + "$ref": "#/definitions/StorageAttributes" + }, + "cleanup": { + "$ref": "#/definitions/CleanupPolicyAttributes" + }, + "proxy": { + "$ref": "#/definitions/ProxyAttributes" + }, + "negativeCache": { + "$ref": "#/definitions/NegativeCacheAttributes" + }, + "httpClient": { + "$ref": "#/definitions/HttpClientAttributes" + }, + "routingRule": { + "type": "string" + }, + "replication": { + "$ref": "#/definitions/ReplicationAttributes" + }, + "bower": { + "$ref": "#/definitions/BowerAttributes" + } + } + } + } +} diff --git a/src/systems/dev/backstage/catalog/systems/catalog-info.yaml b/src/systems/dev/backstage/catalog/systems/catalog-info.yaml new file mode 100644 index 0000000..3709121 --- /dev/null +++ b/src/systems/dev/backstage/catalog/systems/catalog-info.yaml @@ -0,0 +1,57 @@ +# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-system +apiVersion: backstage.io/v1alpha1 +kind: System +metadata: + description: The Ourchitecture Nexus Repository + links: + - title: Ournexus + url: http://localhost:8081/ + - title: Sonatype Nexus Repository Open Source Software + url: https://www.sonatype.com/nexus-repository-oss + name: ournexus +spec: + owner: ourchitecture +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + description: Ournexus website + links: + - title: Ournexus + url: http://localhost:8081/ + name: ourstage-web +spec: + consumesApis: + - ournexus-api + lifecycle: experimental + owner: ourchitecture + system: ournexus + type: website +--- +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + description: Ournexus API + name: ournexus-api +spec: + definition: ./apis/ournexus/swagger.json + lifecycle: experimental + owner: ourchitecture + system: ournexus + type: openapi +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + description: Ournexus Service + links: + - title: Nexus ReST and Integration API + url: https://help.sonatype.com/en/rest-and-integration-api.html + name: ournexus-service +spec: + providesApis: + - ournexus-api + lifecycle: experimental + owner: ourchitecture + system: ournexus + type: service diff --git a/src/systems/dev/backstage/catalog/users/catalog-info.yaml b/src/systems/dev/backstage/catalog/users/catalog-info.yaml index 62c5f25..e36fffb 100644 --- a/src/systems/dev/backstage/catalog/users/catalog-info.yaml +++ b/src/systems/dev/backstage/catalog/users/catalog-info.yaml @@ -2,7 +2,6 @@ apiVersion: backstage.io/v1alpha1 kind: User metadata: - name: ourchitectureio links: - icon: github title: GitHub @@ -10,6 +9,7 @@ metadata: - icon: twitter title: Twitter url: https://twitter.com/ourchitectureio + name: ourchitectureio spec: profile: displayName: Ourchitecture Automation @@ -19,7 +19,6 @@ spec: apiVersion: backstage.io/v1alpha1 kind: User metadata: - name: ericis links: - icon: github title: GitHub @@ -27,6 +26,7 @@ metadata: - icon: linkedin title: LinkedIn url: https://linkedin.com/in/iseric + name: ericis spec: profile: displayName: Eric Swanson diff --git a/src/systems/dev/backstage/ourstage/.dockerignore b/src/systems/dev/backstage/ourstage/.dockerignore index 04a4230..e9a4179 100644 --- a/src/systems/dev/backstage/ourstage/.dockerignore +++ b/src/systems/dev/backstage/ourstage/.dockerignore @@ -13,5 +13,3 @@ packages/backend/dev.containerfile packages/backend/prod.containerfile *.log - -app-config.local.yaml diff --git a/src/systems/dev/backstage/ourstage/catalog-info.yaml b/src/systems/dev/backstage/ourstage/catalog-info.yaml index f05564a..7093298 100644 --- a/src/systems/dev/backstage/ourstage/catalog-info.yaml +++ b/src/systems/dev/backstage/ourstage/catalog-info.yaml @@ -4,30 +4,78 @@ kind: System metadata: annotations: backstage.io/techdocs-ref: dir:. - name: ourstage description: The Ourchitecture Developer Portal + links: + - title: Ourstage + url: https://localhost:7007/ + name: ourstage spec: owner: ourchitecture --- apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: ourstage-web description: Ourstage Developer Portal website + links: + - title: Ourstage + url: http://localhost:7007/ + name: ourstage-web spec: consumesApis: - - ourstage-api + - ourstage-auth-api + - ourstage-catalog-api + - ourstage-search-api lifecycle: experimental owner: ourchitecture system: ourstage type: website --- apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + description: Ourstage Authentication API + name: ourstage-auth-api +spec: + definition: ./catalog/apis/auth.yaml + lifecycle: experimental + owner: ourchitecture + system: ourstage + type: openapi +--- +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + description: Ourstage Catalog API + name: ourstage-catalog-api +spec: + definition: ./catalog/apis/catalog.yaml + lifecycle: experimental + owner: ourchitecture + system: ourstage + type: openapi +--- +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + description: Ourstage Search API + name: ourstage-search-api +spec: + definition: ./catalog/apis/search.yaml + lifecycle: experimental + owner: ourchitecture + system: ourstage + type: openapi +--- +apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: ourstage-service description: Ourstage Developer Portal Service + name: ourstage-service spec: + providesApis: + - ourstage-auth-api + - ourstage-catalog-api + - ourstage-search-api lifecycle: experimental owner: ourchitecture system: ourstage diff --git a/src/systems/dev/backstage/ourstage/catalog/apis/auth.yaml b/src/systems/dev/backstage/ourstage/catalog/apis/auth.yaml new file mode 100644 index 0000000..f6ff93d --- /dev/null +++ b/src/systems/dev/backstage/ourstage/catalog/apis/auth.yaml @@ -0,0 +1,281 @@ +# Source: https://raw.githubusercontent.com/backstage/backstage/master/docs/openapi/definitions/auth.yaml +openapi: 3.0.1 +info: + title: Auth API + description: | + # Backstage's auth-provider API. + + **Provided by `@backstage/auth-backend`.** + + The purpose of the Auth APIs in Backstage are to identify the user, and to provide a way for plugins + to request access to 3rd party services on behalf of that user. + + The API is supplied with a list of providers - such as `Google` or `Github` - and will add the endpoints + described below to each of those providers. + + Read more about [User Authentication and Authorization in Backstage](https://github.com/backstage/backstage/blob/master/docs/auth/overview.md). + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + version: 0.1.1-alpha.8 +externalDocs: + description: Backstage official documentation + url: https://backstage.io/docs +servers: + - url: http://localhost:7007/api/auth/ +tags: + - name: provider + description: List of endpoints per provider +paths: + /start: + get: + tags: + - provider + summary: + Initializes the authorization flow and redirects to a consent screen for + the provider + description: + The popup window is pointed to the `/start` endpoint of the auth + provider in the auth-backend plugin, which then redirects to the OAuth + consent screen of the provider. + parameters: + - name: scope + in: query + description: + Scope requested for the auth session. The scope format and handling + is specific to each provider + required: true + schema: + type: string + example: email + - name: env + in: query + description: Parameter to indicate runtime environment + required: true + schema: + type: string + example: development + responses: + 302: + description: Redirect to the consent popup + headers: + Location: + description: The url to the consent popup + schema: + type: string + Set-Cookie: + description: Nonce cookie + schema: + $ref: '#/components/schemas/Nonce-Cookie' + default: + description: An error occurred + /frame/handler: + get: + tags: + - provider + summary: Handles the response from the consent popup for the provider + description: + If the login request is accepted, the popup window will be redirected + back to the `/handler/frame` endpoint of the auth backend. + parameters: + - name: scope + in: query + description: Scope requested for the auth session + required: true + schema: + type: string + example: email + - name: code + in: query + description: Short-term authorization code used to be exchanged for access tokens + required: true + schema: + type: string + - name: state + in: query + description: Nonce value stored in state + required: true + schema: + type: string + - name: provider-nonce + in: cookie + description: Nonce value stored in cookie + required: true + schema: + type: string + - name: env + in: query + description: Parameter to indicate runtime environment + required: true + schema: + type: string + example: development + responses: + 200: + description: Message received from consent popup + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/AuthResponse' + - $ref: '#/components/schemas/AuthError' + examples: + AuthResponse: + summary: AuthResponse + value: | + { + type: "auth-result", + payload: { + accessToken: "access-token", + idToken: "id-token", + expiresInSecond: 3600, + scope: "email" + } + } + AuthError: + summary: AuthError + value: | + { + type: "auth-result", + error: { + name: "error", + message: "message", + stack: "stack" + } + } + headers: + Set-Cookie: + description: Refresh cookie + schema: + $ref: '#/components/schemas/Refresh-Cookie' + /refresh: + get: + tags: + - provider + summary: Handles refreshing of tokens due to reload or expiry + description: + If supported by the provider, the `/refresh` endpoint is responsible for + refreshing the tokens using a refresh-token stored in a cookie + parameters: + - name: scope + in: query + description: Scope requested for the auth session + required: true + schema: + type: string + example: email + - name: optional + in: query + description: Prevent the popup from being displayed + schema: + type: string + - name: x-requested-with + in: header + description: X-Requested-With header preventing CSRF + required: true + schema: + type: string + example: 'x-requested-with: XMLHttpRequest' + - name: provider-refresh-token + in: cookie + description: Refresh token used to refresh the current session + required: true + schema: + type: string + responses: + 200: + description: Successfully refreshed the session + 401: + description: Validation error + /logout: + post: + tags: + - provider + summary: Logs user out of the current provider + description: + When logging out the current session is removed and if present the + cookie containing the refresh token is also removed + parameters: + - name: x-requested-with + in: header + description: X-Requested-With header preventing CSRF + required: true + schema: + type: string + example: 'x-requested-with: XMLHttpRequest' + responses: + 200: + description: Successfully logged out + headers: + Set-Cookie: + description: Refresh cookie + schema: + $ref: '#/components/schemas/Refresh-Cookie' + 401: + description: Validation error +components: + schemas: + Nonce-Cookie: + type: object + properties: + provider-nonce: + type: string + maxAge: + type: integer + secure: + type: boolean + sameSite: + type: string + domain: + type: string + path: + type: string + httpOnly: + type: boolean + Refresh-Cookie: + type: object + properties: + provider-refresh-token: + type: string + maxAge: + type: integer + secure: + type: boolean + sameSite: + type: string + domain: + type: string + path: + type: string + httpOnly: + type: boolean + AuthResponse: + type: object + properties: + type: + type: string + payload: + type: object + properties: + accessToken: + type: string + idToken: + type: string + expiresInSeconds: + type: number + scope: + type: string + AuthError: + type: object + properties: + type: + type: string + error: + type: object + properties: + name: + type: string + message: + type: string + stack: + type: string diff --git a/src/systems/dev/backstage/ourstage/catalog/apis/catalog.yaml b/src/systems/dev/backstage/ourstage/catalog/apis/catalog.yaml new file mode 100644 index 0000000..dae39ca --- /dev/null +++ b/src/systems/dev/backstage/ourstage/catalog/apis/catalog.yaml @@ -0,0 +1,1176 @@ +# Source: https://raw.githubusercontent.com/backstage/backstage/master/plugins/catalog-backend/src/schema/openapi.yaml +openapi: 3.0.3 +info: + title: catalog + version: '1' + description: The Backstage backend plugin that provides the Backstage catalog + license: + name: Apache-2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + contact: {} +servers: + - url: / +components: + examples: {} + headers: {} + parameters: + kind: + name: kind + in: path + required: true + allowReserved: true + schema: + type: string + namespace: + name: namespace + in: path + required: true + allowReserved: true + schema: + type: string + name: + name: name + in: path + required: true + allowReserved: true + schema: + type: string + uid: + name: uid + in: path + required: true + allowReserved: true + schema: + type: string + cursor: + name: cursor + in: query + description: Cursor to a set page of results. + required: false + allowReserved: true + schema: + type: string + minLength: 1 + after: + name: after + in: query + description: Pointer to the previous page of results. + required: false + allowReserved: true + schema: + type: string + minLength: 1 + fields: + name: fields + in: query + description: Restrict to just these fields in the response. + required: false + allowReserved: true + explode: false + schema: + type: array + items: + type: string + examples: + Get name and the entire relations collection: + value: + - metadata.name + - relations + Get kind, name and namespace: + value: + - kind + - metadata.name + - metadata.namespace + filter: + name: filter + in: query + description: Filter for just the entities defined by this filter. + required: false + allowReserved: true + schema: + type: array + items: + type: string + examples: + Get groups: + value: + - kind=group + Get orphaned components: + value: + - kind=component,metadata.annotations.backstage.io/orphan=true + offset: + name: offset + in: query + description: Number of records to skip in the query page. + required: false + allowReserved: true + schema: + type: integer + minimum: 0 + limit: + name: limit + in: query + description: Number of records to return in the response. + required: false + allowReserved: true + schema: + type: integer + minimum: 0 + orderField: + name: orderField + in: query + description: The fields to sort returned results by. + required: false + allowReserved: true + schema: + type: array + items: + type: string + description: A two-item tuple of [field, order]. + explode: true + style: form + examples: + Order ascending by name: + value: + - metadata.name,asc + Order descending by owner: + value: + - spec.owner,desc + requestBodies: {} + responses: + ErrorResponse: + description: An error response from the backend. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + schemas: + Error: + type: object + properties: + error: + type: object + properties: + name: + type: string + message: + type: string + stack: + type: string + code: + type: string + required: + - name + - message + request: + type: object + properties: + method: + type: string + url: + type: string + required: + - method + - url + response: + type: object + properties: + statusCode: + type: number + required: + - statusCode + required: + - error + - response + additionalProperties: {} + JsonObject: + type: object + properties: {} + description: A type representing all allowed JSON object values. + additionalProperties: {} + MapStringString: + type: object + properties: {} + additionalProperties: + type: string + description: Construct a type with a set of properties K of type T + EntityLink: + type: object + properties: + type: + type: string + description: An optional value to categorize links into specific groups + icon: + type: string + description: An optional semantic key that represents a visual icon. + title: + type: string + description: An optional descriptive title for the link. + url: + type: string + description: The url to the external site, document, etc. + required: + - url + description: A link to external information that is related to the entity. + additionalProperties: false + EntityMeta: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/EntityLink' + description: A list of external hyperlinks related to the entity. + tags: + type: array + items: + type: string + description: |- + A list of single-valued strings, to for example classify catalog entities in + various ways. + annotations: + $ref: '#/components/schemas/MapStringString' + labels: + $ref: '#/components/schemas/MapStringString' + description: + type: string + description: |- + A short (typically relatively few words, on one line) description of the + entity. + title: + type: string + description: |- + A display name of the entity, to be presented in user interfaces instead + of the `name` property above, when available. + This field is sometimes useful when the `name` is cumbersome or ends up + being perceived as overly technical. The title generally does not have + as stringent format requirements on it, so it may contain special + characters and be more explanatory. Do keep it very short though, and + avoid situations where a title can be confused with the name of another + entity, or where two entities share a title. + Note that this is only for display purposes, and may be ignored by some + parts of the code. Entity references still always make use of the `name` + property, not the title. + namespace: + type: string + description: The namespace that the entity belongs to. + name: + type: string + description: |- + The name of the entity. + Must be unique within the catalog at any given point in time, for any + given namespace + kind pair. This value is part of the technical + identifier of the entity, and as such it will appear in URLs, database + tables, entity references, and similar. It is subject to restrictions + regarding what characters are allowed. + If you want to use a different, more human readable string with fewer + restrictions on it in user interfaces, see the `title` field below. + etag: + type: string + description: |- + An opaque string that changes for each update operation to any part of + the entity, including metadata. + This field can not be set by the user at creation time, and the server + will reject an attempt to do so. The field will be populated in read + operations. The field can (optionally) be specified when performing + update or delete operations, and the server will then reject the + operation if it does not match the current stored value. + uid: + type: string + description: |- + A globally unique ID for the entity. + This field can not be set by the user at creation time, and the server + will reject an attempt to do so. The field will be populated in read + operations. The field can (optionally) be specified when performing + update or delete operations, but the server is free to reject requests + that do so in such a way that it breaks semantics. + required: + - name + description: Metadata fields common to all versions/kinds of entity. + additionalProperties: {} + EntityRelation: + type: object + properties: + targetRef: + type: string + description: The entity ref of the target of this relation. + type: + type: string + description: The type of the relation. + required: + - targetRef + - type + description: A relation of a specific type to another entity in the catalog. + additionalProperties: false + Entity: + type: object + properties: + relations: + type: array + items: + $ref: '#/components/schemas/EntityRelation' + description: The relations that this entity has with other entities. + spec: + $ref: '#/components/schemas/JsonObject' + metadata: + $ref: '#/components/schemas/EntityMeta' + kind: + type: string + description: The high level entity type being described. + apiVersion: + type: string + description: |- + The version of specification format for this particular entity that + this is written against. + required: + - metadata + - kind + - apiVersion + description: The parts of the format that's common to all versions/kinds of entity. + NullableEntity: + type: object + properties: + relations: + type: array + items: + $ref: '#/components/schemas/EntityRelation' + description: The relations that this entity has with other entities. + spec: + $ref: '#/components/schemas/JsonObject' + metadata: + $ref: '#/components/schemas/EntityMeta' + kind: + type: string + description: The high level entity type being described. + apiVersion: + type: string + description: |- + The version of specification format for this particular entity that + this is written against. + required: + - metadata + - kind + - apiVersion + description: The parts of the format that's common to all versions/kinds of entity. + nullable: true + EntityAncestryResponse: + type: object + properties: + items: + type: array + items: + type: object + properties: + parentEntityRefs: + items: + type: string + type: array + entity: + $ref: '#/components/schemas/Entity' + required: + - parentEntityRefs + - entity + rootEntityRef: + type: string + required: + - items + - rootEntityRef + additionalProperties: false + EntitiesBatchResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/NullableEntity' + description: |- + The list of entities, in the same order as the refs in the request. Entries + that are null signify that no entity existed with that ref. + required: + - items + additionalProperties: false + EntityFacet: + type: object + properties: + value: + type: string + count: + type: number + required: + - value + - count + additionalProperties: false + EntityFacetsResponse: + type: object + properties: + facets: + type: object + additionalProperties: + type: array + items: + $ref: '#/components/schemas/EntityFacet' + required: + - facets + additionalProperties: false + Location: + type: object + properties: + target: + type: string + type: + type: string + id: + type: string + required: + - target + - type + - id + description: Entity location for a specific entity. + additionalProperties: false + LocationSpec: + type: object + properties: + target: + type: string + type: + type: string + required: + - target + - type + description: Holds the entity location information. + additionalProperties: false + AnalyzeLocationExistingEntity: + type: object + properties: + entity: + $ref: '#/components/schemas/Entity' + isRegistered: + type: boolean + location: + $ref: '#/components/schemas/LocationSpec' + required: + - entity + - isRegistered + - location + description: |- + If the folder pointed to already contained catalog info yaml files, they are + read and emitted like this so that the frontend can inform the user that it + located them and can make sure to register them as well if they weren't + already + additionalProperties: false + RecursivePartialEntityRelation: + type: object + properties: + targetRef: + type: string + description: The entity ref of the target of this relation. + type: + type: string + description: The type of the relation. + description: A relation of a specific type to another entity in the catalog. + additionalProperties: false + RecursivePartialEntityMeta: + allOf: + - $ref: '#/components/schemas/JsonObject' + - type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/EntityLink' + description: A list of external hyperlinks related to the entity. + tags: + type: array + items: + type: string + description: |- + A list of single-valued strings, to for example classify catalog entities in + various ways. + annotations: + $ref: '#/components/schemas/MapStringString' + labels: + $ref: '#/components/schemas/MapStringString' + description: + type: string + description: |- + A short (typically relatively few words, on one line) description of the + entity. + title: + type: string + description: |- + A display name of the entity, to be presented in user interfaces instead + of the `name` property above, when available. + This field is sometimes useful when the `name` is cumbersome or ends up + being perceived as overly technical. The title generally does not have + as stringent format requirements on it, so it may contain special + characters and be more explanatory. Do keep it very short though, and + avoid situations where a title can be confused with the name of another + entity, or where two entities share a title. + Note that this is only for display purposes, and may be ignored by some + parts of the code. Entity references still always make use of the `name` + property, not the title. + namespace: + type: string + description: The namespace that the entity belongs to. + name: + type: string + description: |- + The name of the entity. + Must be unique within the catalog at any given point in time, for any + given namespace + kind pair. This value is part of the technical + identifier of the entity, and as such it will appear in URLs, database + tables, entity references, and similar. It is subject to restrictions + regarding what characters are allowed. + If you want to use a different, more human readable string with fewer + restrictions on it in user interfaces, see the `title` field below. + etag: + type: string + description: |- + An opaque string that changes for each update operation to any part of + the entity, including metadata. + This field can not be set by the user at creation time, and the server + will reject an attempt to do so. The field will be populated in read + operations. The field can (optionally) be specified when performing + update or delete operations, and the server will then reject the + operation if it does not match the current stored value. + uid: + type: string + description: |- + A globally unique ID for the entity. + This field can not be set by the user at creation time, and the server + will reject an attempt to do so. The field will be populated in read + operations. The field can (optionally) be specified when performing + update or delete operations, but the server is free to reject requests + that do so in such a way that it breaks semantics. + description: Metadata fields common to all versions/kinds of entity. + additionalProperties: false + RecursivePartialEntity: + type: object + properties: + apiVersion: + type: string + description: |- + The version of specification format for this particular entity that + this is written against. + kind: + type: string + description: The high level entity type being described. + metadata: + $ref: '#/components/schemas/RecursivePartialEntityMeta' + spec: + $ref: '#/components/schemas/JsonObject' + relations: + type: array + items: + $ref: '#/components/schemas/RecursivePartialEntityRelation' + description: The relations that this entity has with other entities. + description: Makes all keys of an entire hierarchy optional. + additionalProperties: false + AnalyzeLocationEntityField: + type: object + properties: + description: + type: string + description: |- + A text to show to the user to inform about the choices made. Like, it could say + "Found a CODEOWNERS file that covers this target, so we suggest leaving this + field empty; which would currently make it owned by X" where X is taken from the + codeowners file. + value: + type: string + nullable: true + state: + type: string + enum: + - analysisSuggestedValue + - analysisSuggestedNoValue + - needsUserInput + description: The outcome of the analysis for this particular field + field: + type: string + description: |- + e.g. "spec.owner"? The frontend needs to know how to "inject" the field into the + entity again if the user wants to change it + required: + - description + - value + - state + - field + additionalProperties: false + AnalyzeLocationGenerateEntity: + type: object + properties: + fields: + type: array + items: + $ref: '#/components/schemas/AnalyzeLocationEntityField' + entity: + $ref: '#/components/schemas/RecursivePartialEntity' + required: + - fields + - entity + description: |- + This is some form of representation of what the analyzer could deduce. + We should probably have a chat about how this can best be conveyed to + the frontend. It'll probably contain a (possibly incomplete) entity, plus + enough info for the frontend to know what form data to show to the user + for overriding/completing the info. + additionalProperties: false + AnalyzeLocationResponse: + type: object + properties: + generateEntities: + items: + $ref: '#/components/schemas/AnalyzeLocationGenerateEntity' + type: array + existingEntityFiles: + items: + $ref: '#/components/schemas/AnalyzeLocationExistingEntity' + type: array + required: + - generateEntities + - existingEntityFiles + additionalProperties: false + LocationInput: + type: object + properties: + type: + type: string + target: + type: string + required: + - type + - target + additionalProperties: false + EntitiesQueryResponse: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Entity' + description: The list of entities paginated by a specific filter. + totalItems: + type: number + pageInfo: + type: object + properties: + nextCursor: + type: string + description: The cursor for the next batch of entities. + prevCursor: + type: string + description: The cursor for the previous batch of entities. + required: + - items + - totalItems + - pageInfo + additionalProperties: false + securitySchemes: + JWT: + type: http + scheme: bearer + bearerFormat: JWT +paths: + /refresh: + post: + operationId: RefreshEntity + description: Refresh the entity related to entityRef. + responses: + '200': + description: Refreshed + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + authorizationToken: + type: string + entityRef: + type: string + description: The reference to a single entity that should be refreshed + required: + - entityRef + description: Options for requesting a refresh of entities in the catalog. + additionalProperties: false + /entities: + get: + operationId: GetEntities + description: Get all entities matching a given filter. + responses: + '200': + description: '' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Entity' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - $ref: '#/components/parameters/fields' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/filter' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/after' + - name: order + in: query + allowReserved: true + required: false + schema: + type: array + items: + type: string + /entities/by-uid/{uid}: + get: + operationId: GetEntityByUid + description: Get a single entity by the UID. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - $ref: '#/components/parameters/uid' + delete: + operationId: DeleteEntityByUid + description: Delete a single entity by UID. + responses: + '204': + description: Deleted successfully. + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - $ref: '#/components/parameters/uid' + /entities/by-name/{kind}/{namespace}/{name}: + get: + operationId: GetEntityByName + description: Get an entity by an entity ref. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Entity' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - $ref: '#/components/parameters/kind' + - $ref: '#/components/parameters/namespace' + - $ref: '#/components/parameters/name' + /entities/by-name/{kind}/{namespace}/{name}/ancestry: + get: + operationId: GetEntityAncestryByName + description: Get an entity's ancestry by entity ref. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntityAncestryResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - $ref: '#/components/parameters/kind' + - $ref: '#/components/parameters/namespace' + - $ref: '#/components/parameters/name' + /entities/by-refs: + post: + operationId: GetEntitiesByRefs + description: Get a batch set of entities given an array of entityRefs. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntitiesBatchResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + requestBody: + required: false + content: + application/json: + schema: + type: object + required: + - entityRefs + properties: + entityRefs: + type: array + items: + type: string + fields: + type: array + items: + type: string + examples: + Fetch Backstage entities: + value: + entityRefs: + - component:default/backstage + - api:default/backstage + Fetch annotations for backstage entity: + value: + entityRefs: + - component:default/backstage + fields: + - metadata.annotations + parameters: + - $ref: '#/components/parameters/filter' + /entities/by-query: + get: + operationId: GetEntitiesByQuery + description: Search for entities by a given query. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntitiesQueryResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - $ref: '#/components/parameters/fields' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/orderField' + - $ref: '#/components/parameters/cursor' + - $ref: '#/components/parameters/filter' + - name: fullTextFilterTerm + in: query + description: Text search term. + required: false + allowReserved: true + schema: + type: string + - name: fullTextFilterFields + in: query + description: A comma separated list of fields to sort returned results by. + required: false + allowReserved: true + schema: + type: array + items: + type: string + explode: false + style: form + /entity-facets: + get: + operationId: GetEntityFacets + description: Get all entity facets that match the given filters. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntityFacetsResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - in: query + name: facet + required: true + allowReserved: true + schema: + type: array + items: + type: string + examples: + Entities by kind: + value: + - kind + Entities by spec type: + value: + - spec.type + - $ref: '#/components/parameters/filter' + /locations: + post: + operationId: CreateLocation + description: Create a location for a given target. + responses: + '201': + description: Created + content: + application/json: + schema: + type: object + properties: + exists: + type: boolean + entities: + items: + $ref: '#/components/schemas/Entity' + type: array + location: + $ref: '#/components/schemas/Location' + required: + - entities + - location + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - in: query + name: dryRun + required: false + allowReserved: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + target: + type: string + type: + type: string + required: + - target + - type + get: + operationId: GetLocations + description: Get all locations + responses: + '200': + description: Ok + content: + application/json: + schema: + type: array + items: + type: object + properties: + data: + $ref: '#/components/schemas/Location' + required: + - data + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: [] + /locations/{id}: + get: + operationId: GetLocation + description: Get a location by id. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - in: path + name: id + required: true + allowReserved: true + schema: + type: string + delete: + operationId: DeleteLocation + description: Delete a location by id. + responses: + '204': + description: No content + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - in: path + name: id + required: true + allowReserved: true + schema: + type: string + /locations/by-entity/{kind}/{namespace}/{name}: + get: + operationId: getLocationByEntity + description: Get a location for entity. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Location' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - in: path + name: kind + required: true + allowReserved: true + schema: + type: string + - in: path + name: namespace + required: true + allowReserved: true + schema: + type: string + - in: path + name: name + required: true + allowReserved: true + schema: + type: string + /analyze-location: + post: + operationId: AnalyzeLocation + description: Validate a given location. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyzeLocationResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + catalogFileName: + type: string + location: + $ref: '#/components/schemas/LocationInput' + required: + - location + /validate-entity: + post: + operationId: ValidateEntity + description: Validate that a passed in entity has no errors in schema. + responses: + '200': + description: Ok + '400': + description: Validation errors. + content: + application/json; charset=utf-8: + schema: + type: object + properties: + errors: + type: array + items: + type: object + properties: + name: + type: string + message: + type: string + required: + - name + - message + additionalProperties: {} + required: + - errors + security: + - {} + - JWT: [] + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + location: + type: string + entity: + type: object + additionalProperties: {} + required: + - location + - entity diff --git a/src/systems/dev/backstage/ourstage/catalog/apis/search.yaml b/src/systems/dev/backstage/ourstage/catalog/apis/search.yaml new file mode 100644 index 0000000..ba3e852 --- /dev/null +++ b/src/systems/dev/backstage/ourstage/catalog/apis/search.yaml @@ -0,0 +1,165 @@ +# Source: https://raw.githubusercontent.com/backstage/backstage/master/plugins/search-backend/src/schema/openapi.yaml +openapi: 3.0.3 +info: + title: search + version: '1' + description: The Backstage backend plugin that provides search functionality. + license: + name: Apache-2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + contact: {} +servers: + - url: / +components: + examples: {} + headers: {} + parameters: {} + requestBodies: {} + responses: + ErrorResponse: + description: An error response from the backend. + content: + application/json; charset=utf-8: + schema: + $ref: '#/components/schemas/Error' + schemas: + Error: + type: object + properties: + error: + type: object + properties: + name: + type: string + message: + type: string + required: + - name + - message + request: + type: object + properties: + method: + type: string + url: + type: string + required: + - method + - url + response: + type: object + properties: + statusCode: + type: number + required: + - statusCode + required: + - error + - request + - response + + JsonObject: + type: object + properties: {} + # Free form object. + additionalProperties: {} + securitySchemes: + JWT: + type: http + scheme: bearer + bearerFormat: JWT +paths: + /query: + get: + operationId: Query + description: Query documents with a given filter. + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + type: object + properties: + type: + type: string + description: The "type" of the given document. + document: + type: object + description: The raw value of the document, as indexed. + properties: + title: + type: string + description: The primary name of the document (e.g. name, title, identifier, etc). + text: + type: string + description: Free-form text of the document (e.g. description, content, etc). + location: + type: string + description: The relative or absolute URL of the document (target when a search result is clicked). + highlight: + type: object + description: |- + Optional result highlight. Useful for improving the search result + display/experience. + rank: + type: integer + description: |- + Optional result rank, where 1 is the first/top result returned. + Useful for understanding search effectiveness in analytics. + required: + - type + - document + additionalProperties: false + nextPageCursor: + type: string + previousPageCursor: + type: string + numberOfResults: + type: integer + required: + - results + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + parameters: + - name: term + in: query + required: false + schema: + type: string + default: '' + - name: filters + in: query + required: false + style: deepObject + explode: true + schema: + # JsonObject is used here instead of the full ZOD schema definition as + # resolution of recursive schemas isn't possible with the library we're using + # and it causes a performance hit when _trying_ to resolve them. + $ref: '#/components/schemas/JsonObject' + - name: types + in: query + required: false + schema: + type: array + items: + type: string + - name: pageCursor + in: query + required: false + schema: + type: string + - name: pageLimit + in: query + required: false + schema: + type: integer diff --git a/src/systems/dev/backstage/ourstage/makefile b/src/systems/dev/backstage/ourstage/makefile index 06c69ad..721ef8b 100644 --- a/src/systems/dev/backstage/ourstage/makefile +++ b/src/systems/dev/backstage/ourstage/makefile @@ -100,7 +100,17 @@ run: up .PHONY: debug debug: install-container - @node ./tasks/debug-container.mjs + @echo "Debugging ourstage..." + @docker run \ + --name debug-ourstage-backend-dev \ + --rm \ + --interactive \ + --tty \ + --entrypoint /bin/bash \ + --user node \ + --network host \ + localhost/ourstage/backend-dev:latest + @echo "Successfully debugged ourstage." .PHONY: logs logs: @@ -114,6 +124,9 @@ stop: down .PHONY: shutdown shutdown: down +.PHONY: restart +restart: down up + .PHONY: upgrade upgrade: @echo "Upgrading ourstage..." @@ -124,6 +137,7 @@ update: upgrade .PHONY: clean clean: + @"$(MAKE)" down || true @echo "Cleaning ourstage..." @if [ -d "./node_modules" ]; then yarn run clean || true; fi @echo "Successfully cleaned ourstage." @@ -131,6 +145,8 @@ clean: .PHONY: reset reset: clean @echo "Resetting ourstage..." + @docker rmi --force localhost/ourstage/backend-dev:latest || true + @docker rmi --force localhost/ourstage/backend-prod:latest || true @rm --recursive --force \ ./.yarn/cache \ ./.yarn/install-state.gz \ diff --git a/src/systems/dev/backstage/ourstage/packages/backend/dev.containerfile b/src/systems/dev/backstage/ourstage/packages/backend/dev.containerfile index bc04373..c6451aa 100644 --- a/src/systems/dev/backstage/ourstage/packages/backend/dev.containerfile +++ b/src/systems/dev/backstage/ourstage/packages/backend/dev.containerfile @@ -104,6 +104,7 @@ RUN --mount=type=cache,target=/home/node/.cache/yarn,sharing=locked,uid=1000,gid # Copy the source code. # Restore the backup files. +# Formatting is due to an issue with the `COPY` command. # Install and check the system. COPY --chown=node:node . ./ RUN --mount=type=cache,target=/home/node/.cache/yarn,sharing=locked,uid=1000,gid=1000 \ diff --git a/src/systems/dev/backstage/ourstage/packages/backend/prod.containerfile b/src/systems/dev/backstage/ourstage/packages/backend/prod.containerfile index fdfea2f..3a9efbc 100644 --- a/src/systems/dev/backstage/ourstage/packages/backend/prod.containerfile +++ b/src/systems/dev/backstage/ourstage/packages/backend/prod.containerfile @@ -114,4 +114,7 @@ COPY --chown=node:node ./catalog-info.yaml ./ # Copy system configuration. COPY --chown=node:node ./app-config.yaml ./app-config.production.yaml ./ +# Do not allow local configuration to be present in the production image. +RUN rm --force ./app-config.local.yaml + CMD ["node", "packages/backend", "--config", "app-config.yaml", "--config", "app-config.production.yaml"] diff --git a/src/systems/dev/backstage/ourstage/tasks/get-container-logs.mjs b/src/systems/dev/backstage/ourstage/tasks/get-container-logs.mjs index 8cbbd7c..d45078d 100644 --- a/src/systems/dev/backstage/ourstage/tasks/get-container-logs.mjs +++ b/src/systems/dev/backstage/ourstage/tasks/get-container-logs.mjs @@ -2,7 +2,6 @@ const getContainerLogs = async (execa) => { console.log('\nRetrieving ourstage logs...') const ourstageEnv = process.env.OURSTAGE_ENV.toLocaleLowerCase() - const imageName = `${process.env.OURSTAGE_BACKEND_IMAGE_NAME}-${ourstageEnv}:${process.env.OURSTAGE_BACKEND_IMAGE_TAG}` const containerName = `ourstage-backend-${ourstageEnv}` const containerIsAlreadyRunningArgv = [ diff --git a/src/systems/dev/backstage/ourstage/tasks/stop-container.mjs b/src/systems/dev/backstage/ourstage/tasks/stop-container.mjs index 911c960..64359f1 100644 --- a/src/systems/dev/backstage/ourstage/tasks/stop-container.mjs +++ b/src/systems/dev/backstage/ourstage/tasks/stop-container.mjs @@ -2,7 +2,6 @@ const stopContainer = async (execa) => { console.log('\nStopping ourstage...') const ourstageEnv = process.env.OURSTAGE_ENV.toLocaleLowerCase() - const imageName = `${process.env.OURSTAGE_BACKEND_IMAGE_NAME}-${ourstageEnv}:${process.env.OURSTAGE_BACKEND_IMAGE_TAG}` const containerName = `ourstage-backend-${ourstageEnv}` const containerIsAlreadyRunningArgv = [ diff --git a/src/systems/dev/backstage/ourstage/yarn.lock b/src/systems/dev/backstage/ourstage/yarn.lock index a5f1e35..15c7f81 100644 --- a/src/systems/dev/backstage/ourstage/yarn.lock +++ b/src/systems/dev/backstage/ourstage/yarn.lock @@ -7770,8 +7770,8 @@ __metadata: "@testing-library/jest-dom": "npm:^6.4.2" "@testing-library/react": "npm:^14.2.2" "@testing-library/user-event": "npm:^14.5.2" - "@types/react": "npm:^18.2.69" - "@types/react-dom": "npm:^18.2.22" + "@types/react": "npm:*" + "@types/react-dom": "npm:*" cross-env: "npm:^7.0.3" history: "npm:^5.3.0" react: "npm:^18.2.0" diff --git a/src/systems/dev/nexus/.yarnrc.yml b/src/systems/dev/nexus/.yarnrc.yml new file mode 100644 index 0000000..7341e67 --- /dev/null +++ b/src/systems/dev/nexus/.yarnrc.yml @@ -0,0 +1,4 @@ +# Never use the Nexus registry for these packages, +# since Nexus is not yet running. +npmAlwaysAuth: false +npmRegistryServer: 'https://registry.yarnpkg.com/' diff --git a/src/systems/dev/nexus/makefile b/src/systems/dev/nexus/makefile index 9e1fd93..b22af50 100644 --- a/src/systems/dev/nexus/makefile +++ b/src/systems/dev/nexus/makefile @@ -16,26 +16,11 @@ install-storage: .PHONY: install install: - @echo "Installing nexus container..." - @docker build \ - --file ./containerfile \ - --network=host \ - --tag $(nexus_image_name) \ - ./ - @echo "Successfully installed nexus container." + @node ./tasks/install-container.mjs .PHONY: up up: install - @echo "Starting nexus container..." - @docker run \ - --name $(nexus_container_name) \ - --network host \ - --detach \ - --volume $(nexus_data_volume_name):/nexus-data \ - $(nexus_image_name) - @printf "\n\nOur Nexus is running at http://localhost:$(nexus_port)\n\n" - @echo "Successfully started nexus container." - + @node ./tasks/start-container.mjs .PHONY: start start: up .PHONY: startup @@ -45,44 +30,54 @@ serve: up .PHONY: run run: up +.PHONY: down +down: + @node ./tasks/stop-container.mjs +.PHONY: stop +stop: down +.PHONY: shutdown +shutdown: down + +.PHONY: restart +restart: down up + .PHONY: debug debug: install - @echo "Starting ourstage..." + @echo "Debugging ournexus..." @docker run \ - --name debug-$(nexus_container_name) \ + --name debug-ournexus \ --rm \ --interactive \ --tty \ --entrypoint /bin/bash \ - --user node \ + --user nexus \ --network host \ - $(nexus_container_name) - @echo "Successfully started ourstage." + localhost/ournexus:latest + @echo "Successfully debugged ournexus." .PHONY: logs logs: - @echo "Retrieving ourstage logs..." -ifndef follow - @docker logs $(nexus_container_name) -else - @docker logs $(nexus_container_name) --follow -endif - @echo "Retrieved ourstage logs." + @node ./tasks/get-container-logs.mjs .PHONY: clean clean: - @echo "Stopping ourstage..." - @docker rm --force $(nexus_container_name) - @echo "Stopping stopped ourstage." -.PHONY: down -down: clean -.PHONY: stop -stop: clean -.PHONY: shutdown -shutdown: clean + @"$(MAKE)" down || true + @echo "Cleaning ournexus..." + @rm --recursive --force \ + ./node_modules + @echo "Successfully cleaned ournexus." .PHONY: reset reset: clean @echo "Resetting ourstage..." - @docker volume rm --force $(nexus_data_volume_name) + @docker rmi --force localhost/ournexus:latest || true @echo "Successfully reset ourstage." + +.PHONY: reset-data +reset-data: +ifneq ($(confirm),1) + $(error Required argument confirm is not set to 1) +endif + @echo "Resetting ournexus data..." + @docker volume rm --force ournexus-data || true + @echo "Successfully reset ournexus data." diff --git a/src/systems/dev/nexus/package.json b/src/systems/dev/nexus/package.json new file mode 100644 index 0000000..a92beea --- /dev/null +++ b/src/systems/dev/nexus/package.json @@ -0,0 +1,8 @@ +{ + "name": "@ourchitecture/ournexus", + "packageManager": "yarn@4.1.1", + "devDependencies": { + "dotenv": "^16.4.5", + "execa": "^8.0.1" + } +} diff --git a/src/systems/dev/nexus/tasks/get-container-logs.mjs b/src/systems/dev/nexus/tasks/get-container-logs.mjs new file mode 100644 index 0000000..4405817 --- /dev/null +++ b/src/systems/dev/nexus/tasks/get-container-logs.mjs @@ -0,0 +1,65 @@ +const getContainerLogs = async (execa) => { + console.log('\nRetrieving ournexus logs...') + + const containerName = `ournexus` + + const containerIsAlreadyRunningArgv = [ + 'ps', + '--quiet', + '--filter', + `name=${containerName}`, + ] + + const commandOptions = { + cleanup: true, + shell: false, + stripFinalNewline: true, + } + + const containerIsAlreadyRunningCommandResult = await execa( + 'docker', + containerIsAlreadyRunningArgv, + commandOptions + ) + + if (containerIsAlreadyRunningCommandResult.failed) { + throw new Error('Failed to check if the container was already running.') + } + + const containerIsAlreadyRunningCommandOutput = + containerIsAlreadyRunningCommandResult.stdout + + if ( + containerIsAlreadyRunningCommandOutput && + containerIsAlreadyRunningCommandOutput.length > 0 + ) { + const runArgv = ['logs', containerName] + + const runContainerCommandResult = await execa('docker', runArgv, { + cleanup: true, + env: process.env, + shell: false, + stderr: process.stderr, + stdout: process.stdout, + stripFinalNewline: true, + }) + + if (runContainerCommandResult.failed) { + throw new Error('Failed to retreive container logs.') + } + } + + console.log('Successfully retrieved ournexus logs.') +} + +const main = async (argv) => { + ;(await import('dotenv')).config() + + const execa = (await import('execa')).execa + + await getContainerLogs(execa) +} + +;(async () => { + await main(process.argv.slice(2)) +})() diff --git a/src/systems/dev/nexus/tasks/install-container.mjs b/src/systems/dev/nexus/tasks/install-container.mjs new file mode 100644 index 0000000..8d9089b --- /dev/null +++ b/src/systems/dev/nexus/tasks/install-container.mjs @@ -0,0 +1,15 @@ +import buildContainer from './modules/build-container.mjs' +import buildStorageVolume from './modules/create-storage-volume.mjs' + +const main = async (argv) => { + ;(await import('dotenv')).config() + + const execa = (await import('execa')).execa + + await buildStorageVolume(execa) + await buildContainer(execa) +} + +;(async () => { + await main(process.argv.slice(2)) +})() diff --git a/src/systems/dev/nexus/tasks/modules/build-container.mjs b/src/systems/dev/nexus/tasks/modules/build-container.mjs new file mode 100644 index 0000000..7a6ac1a --- /dev/null +++ b/src/systems/dev/nexus/tasks/modules/build-container.mjs @@ -0,0 +1,28 @@ +export default async (execa) => { + console.log('\nInstalling ournexus...') + + const imageName = `${process.env.OURNEXUS_IMAGE_NAME}:${process.env.OURNEXUS_IMAGE_TAG}` + + const buildArgv = [ + 'build', + `--file=./containerfile`, + '--network=host', + `--tag=${imageName}`, + './', + ] + + const buildContainerCommandResult = await execa('docker', buildArgv, { + cleanup: true, + env: process.env, + shell: false, + stderr: process.stderr, + stdout: process.stdout, + stripFinalNewline: true, + }) + + if (buildContainerCommandResult.failed) { + throw new Error('Failed to build the container.') + } + + console.log('Successfully installed ournexus.') +} diff --git a/src/systems/dev/nexus/tasks/modules/create-storage-volume.mjs b/src/systems/dev/nexus/tasks/modules/create-storage-volume.mjs new file mode 100644 index 0000000..f52a010 --- /dev/null +++ b/src/systems/dev/nexus/tasks/modules/create-storage-volume.mjs @@ -0,0 +1,47 @@ +export default async (execa) => { + console.log('\nInstalling ournexus storage...') + + const volumeName = `ournexus-data` + + const volumeIsAlreadyCreatedArgv = ['volume', 'inspect', volumeName] + + const volumeIsAlreadyCreatedCommandResult = await execa( + 'docker', + volumeIsAlreadyCreatedArgv, + { + cleanup: true, + shell: false, + reject: false, + stripFinalNewline: true, + } + ) + + const hasNoSuchVolumeError = volumeIsAlreadyCreatedCommandResult.stderr + ?.toLocaleLowerCase() + .includes('no such volume') + + if (volumeIsAlreadyCreatedCommandResult.failed && !hasNoSuchVolumeError) { + console.error(volumeIsAlreadyCreatedCommandResult.stderr) + throw new Error(volumeIsAlreadyCreatedCommandResult.stderr) + } + + if (!hasNoSuchVolumeError) { + console.log('Container volume already exists.') + } else { + const buildArgv = ['volume', 'create', volumeName] + + const createVolumeCommandResult = await execa('docker', buildArgv, { + cleanup: true, + shell: false, + stderr: process.stderr, + stdout: process.stdout, + stripFinalNewline: true, + }) + + if (createVolumeCommandResult.failed) { + throw new Error('Failed to create the container volume.') + } + } + + console.log('Successfully installed ournexus storage.') +} diff --git a/src/systems/dev/backstage/ourstage/tasks/debug-container.mjs b/src/systems/dev/nexus/tasks/start-container.mjs similarity index 67% rename from src/systems/dev/backstage/ourstage/tasks/debug-container.mjs rename to src/systems/dev/nexus/tasks/start-container.mjs index f400980..c3ab82d 100644 --- a/src/systems/dev/backstage/ourstage/tasks/debug-container.mjs +++ b/src/systems/dev/nexus/tasks/start-container.mjs @@ -1,11 +1,11 @@ import buildContainer from './modules/build-container.mjs' +import buildStorageVolume from './modules/create-storage-volume.mjs' -const debugContainer = async (execa) => { - console.log('\nDebugging ourstage...') +const startContainer = async (execa) => { + console.log('\nStarting ournexus...') - const ourstageEnv = process.env.OURSTAGE_ENV.toLocaleLowerCase() - const imageName = `${process.env.OURSTAGE_BACKEND_IMAGE_NAME}-${ourstageEnv}:${process.env.OURSTAGE_BACKEND_IMAGE_TAG}` - const containerName = `ourstage-backend-${ourstageEnv}` + const imageName = `${process.env.OURNEXUS_IMAGE_NAME}:${process.env.OURNEXUS_IMAGE_TAG}` + const containerName = `ournexus` const containerIsAlreadyRunningArgv = [ 'ps', @@ -37,18 +37,15 @@ const debugContainer = async (execa) => { containerIsAlreadyRunningCommandOutput && containerIsAlreadyRunningCommandOutput.length > 0 ) { - console.log('Ourstage is already running at http://localhost:7007.') - console.log('To debug, run `make stop` and then `make debug`.') + console.log('Ournexus is already running at http://localhost:8081.') } else { const runArgv = [ 'run', - '--entrypoint=/bin/bash', - '--interactive', - `--name=debug-${containerName}`, + '--detach', + `--name=${containerName}`, '--network=host', - '--rm', - '--tty', - '--user=node', + '--user=nexus', + '--volume=ournexus-data:/nexus-data', imageName, ] @@ -64,9 +61,11 @@ const debugContainer = async (execa) => { if (runContainerCommandResult.failed) { throw new Error('Failed to start the container.') } + + console.log('Ournexus is running at http://localhost:8081.') } - console.log('Successfully debugged ourstage.') + console.log('Successfully started ournexus.') } const main = async (argv) => { @@ -74,8 +73,9 @@ const main = async (argv) => { const execa = (await import('execa')).execa + await buildStorageVolume(execa) await buildContainer(execa) - await debugContainer(execa) + await startContainer(execa) } ;(async () => { diff --git a/src/systems/dev/nexus/tasks/stop-container.mjs b/src/systems/dev/nexus/tasks/stop-container.mjs new file mode 100644 index 0000000..043a767 --- /dev/null +++ b/src/systems/dev/nexus/tasks/stop-container.mjs @@ -0,0 +1,65 @@ +const stopContainer = async (execa) => { + console.log('\nStopping ournexus...') + + const containerName = `ournexus` + + const containerIsAlreadyRunningArgv = [ + 'ps', + '--quiet', + '--filter', + `name=${containerName}`, + ] + + const commandOptions = { + cleanup: true, + shell: false, + stripFinalNewline: true, + } + + const containerIsAlreadyRunningCommandResult = await execa( + 'docker', + containerIsAlreadyRunningArgv, + commandOptions + ) + + if (containerIsAlreadyRunningCommandResult.failed) { + throw new Error('Failed to check if the container was already running.') + } + + const containerIsAlreadyRunningCommandOutput = + containerIsAlreadyRunningCommandResult.stdout + + if ( + containerIsAlreadyRunningCommandOutput && + containerIsAlreadyRunningCommandOutput.length > 0 + ) { + const runArgv = ['rm', '--force', containerName] + + const runContainerCommandResult = await execa('docker', runArgv, { + cleanup: true, + env: process.env, + shell: false, + stderr: process.stderr, + stdout: process.stdout, + stripFinalNewline: true, + }) + + if (runContainerCommandResult.failed) { + throw new Error('Failed to stop the container.') + } + } + + console.log('Successfully stopped ournexus.') +} + +const main = async (argv) => { + ;(await import('dotenv')).config() + + const execa = (await import('execa')).execa + + await stopContainer(execa) +} + +;(async () => { + await main(process.argv.slice(2)) +})() diff --git a/yarn.lock b/yarn.lock index 385a1b2..9557137 100644 --- a/yarn.lock +++ b/yarn.lock @@ -574,6 +574,15 @@ __metadata: languageName: unknown linkType: soft +"@ourchitecture/ournexus@workspace:src/systems/dev/nexus": + version: 0.0.0-use.local + resolution: "@ourchitecture/ournexus@workspace:src/systems/dev/nexus" + dependencies: + dotenv: "npm:^16.4.5" + execa: "npm:^8.0.1" + languageName: unknown + linkType: soft + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -1362,6 +1371,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^16.4.5": + version: 16.4.5 + resolution: "dotenv@npm:16.4.5" + checksum: 10/55a3134601115194ae0f924e54473459ed0d9fc340ae610b676e248cca45aa7c680d86365318ea964e6da4e2ea80c4514c1adab5adb43d6867fb57ff068f95c8 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0"