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"