diff --git a/Dockerfile b/Dockerfile index b133731198..7fd9846510 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,16 +66,6 @@ COPY --from=docs/docker.github.io:nginx-onbuild /etc/nginx/conf.d/default.conf / # archives less often than new ones. # To add a new archive, add it here # AND ALSO edit _data/docsarchives/archives.yaml to add it to the drop-down -COPY --from=docs/docker.github.io:v1.4 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.5 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.6 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.7 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.8 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.9 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.10 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.11 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.12 ${TARGET} ${TARGET} -COPY --from=docs/docker.github.io:v1.13 ${TARGET} ${TARGET} COPY --from=docs/docker.github.io:v17.03 ${TARGET} ${TARGET} COPY --from=docs/docker.github.io:v17.06 ${TARGET} ${TARGET} COPY --from=docs/docker.github.io:v17.09 ${TARGET} ${TARGET} diff --git a/README.md b/README.md index 0cda197bd6..d700366c81 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,21 @@ still optimizes the bandwidth during browsing). > This is beta content. It is not yet complete and should be considered a work in progress. This content is subject to change without notice. ``` +## Accessing unsupported archived documentation + +Supported documentation includes the current version plus the previous five versions. + +If you are using a version of the documentation that is no longer supported, which means that the version number is not listed in the site dropdown list, you can still access that documentation in the following ways: + +- By entering your version number and selecting it from the branch selection list for this repo +- By directly accessing the Github URL for your version. For example, https://github.com/docker/docker.github.io/tree/v1.9 for `v1.9` +- By running a container of the specific [tag for your documentation version](https://cloud.docker.com/u/docs/repository/docker/docs/docker.github.io/general#read-these-docs-offline) +in Docker Hub. For example, run the following to access `v1.9`: + + ```bash + docker run -it -p 4000:4000 docs/docker.github.io:v1.9 + ``` + ## Building archives and the live published docs All the images described below are automatically built using Docker Hub. To diff --git a/_config.yml b/_config.yml index 463ec13ade..0711e1a7ee 100644 --- a/_config.yml +++ b/_config.yml @@ -13,7 +13,7 @@ safe: false lsi: false url: https://docs.docker.com # This needs to have all the directories you expect to be in the archives (delivered by docs-base in the Dockerfile) -keep_files: ["v1.4", "v1.5", "v1.6", "v1.7", "v1.8", "v1.9", "v1.10", "v1.11", "v1.12", "v1.13", "v17.03", "v17.06", "v17.09", "v17.12", "v18.03"] +keep_files: ["v17.03", "v17.06", "v17.09", "v17.12", "v18.03"] exclude: ["_scripts", "apidocs/layouts", "Gemfile", "hooks", "index.html", "404.html"] # Component versions -- address like site.docker_ce_version @@ -94,7 +94,7 @@ defaults: - scope: path: "install" values: - win_latest_build: "docker-18.09.1" + win_latest_build: "docker-18.09.2" - scope: path: "datacenter" values: diff --git a/_data/docsarchive/archives.yaml b/_data/docsarchive/archives.yaml index 3069fd3570..a961160d4f 100644 --- a/_data/docsarchive/archives.yaml +++ b/_data/docsarchive/archives.yaml @@ -22,33 +22,3 @@ - archive: name: v17.03 image: docs/docker.github.io:v17.03 -- archive: - name: v1.13 - image: docs/docker.github.io:v1.13 -- archive: - name: v1.12 - image: docs/docker.github.io:v1.12 -- archive: - name: v1.11 - image: docs/docker.github.io:v1.11 -- archive: - name: v1.10 - image: docs/docker.github.io:v1.10 -- archive: - name: v1.9 - image: docs/docker.github.io:v1.9 -- archive: - name: v1.8 - image: docs/docker.github.io:v1.8 -- archive: - name: v1.7 - image: docs/docker.github.io:v1.7 -- archive: - name: v1.6 - image: docs/docker.github.io:v1.6 -- archive: - name: v1.5 - image: docs/docker.github.io:v1.5 -- archive: - name: v1.4 - image: docs/docker.github.io:v1.4 diff --git a/_data/glossary.yaml b/_data/glossary.yaml index d42732b086..ddc581405c 100644 --- a/_data/glossary.yaml +++ b/_data/glossary.yaml @@ -32,7 +32,7 @@ collection: | nodes, services, containers, volumes, networks, and secrets. [Learn how to manage collections](/datacenter/ucp/2.2/guides/access-control/manage-access-with-collections/). Compose: | [Compose](https://github.com/docker/compose) is a tool for defining and - running complex applications with Docker. With compose, you define a + running complex applications with Docker. With Compose, you define a multi-container application in a single file, then spin your application up in a single command which does everything that needs to be done to get it running. diff --git a/_data/toc.yaml b/_data/toc.yaml index 26b237c3a7..de7d515a52 100644 --- a/_data/toc.yaml +++ b/_data/toc.yaml @@ -1182,6 +1182,8 @@ manuals: title: Add SANs to cluster certificates - path: /ee/ucp/admin/configure/collect-cluster-metrics/ title: Collect UCP cluster metrics with Prometheus + - path: /ee/ucp/admin/configure/metrics-descriptions/ + title: Using UCP cluster metrics with Prometheus - path: /ee/ucp/admin/configure/configure-rbac-kube/ title: Configure native Kubernetes role-based access control - path: /ee/ucp/admin/configure/create-audit-logs/ @@ -1204,8 +1206,6 @@ manuals: title: UCP configuration file - path: /ee/ucp/admin/configure/use-node-local-network-in-swarm/ title: Use a local node network in a swarm - - path: /ee/ucp/admin/configure/use-nfs-volumes/ - title: Use NFS persistent storage - path: /ee/ucp/admin/configure/use-your-own-tls-certificates/ title: Use your own TLS certificates - path: /ee/ucp/admin/configure/manage-and-deploy-private-images/ @@ -1345,6 +1345,8 @@ manuals: section: - title: Access Kubernetes Resources path: /ee/ucp/kubernetes/kube-resources/ + - title: Use NFS persistent storage + path: /ee/ucp/admin/configure/use-nfs-volumes/ - title: Configure AWS EBS Storage for Kubernetes path: /ee/ucp/kubernetes/configure-aws-storage/ - title: Deploy a workload diff --git a/_includes/ee-linux-install-reuse.md b/_includes/ee-linux-install-reuse.md index bbd1cfa6b5..62e845c7a2 100644 --- a/_includes/ee-linux-install-reuse.md +++ b/_includes/ee-linux-install-reuse.md @@ -137,7 +137,7 @@ You only need to set up the repository once, after which you can install Docker {% elsif section == "install-using-yum-repo" %} -> ***NOTE:*** If you need to run Docker EE 2.0, please see the following instructions: +> **Note**: If you need to run Docker EE 2.0, please see the following instructions: > * [18.03](https://docs.docker.com/v18.03/ee/supported-platforms/) - Older Docker EE Engine only release > * [17.06](https://docs.docker.com/v17.06/engine/installation/) - Docker Enterprise Edition 2.0 (Docker Engine, > UCP, and DTR). diff --git a/compose/compose-file/compose-file-v1.md b/compose/compose-file/compose-file-v1.md index 7e0ede1bc1..9e5c1ac1de 100644 --- a/compose/compose-file/compose-file-v1.md +++ b/compose/compose-file/compose-file-v1.md @@ -205,7 +205,7 @@ the value assigned to a variable that shows up more than once_. The files in the list are processed from the top down. For the same variable specified in file `a.env` and assigned a different value in file `b.env`, if `b.env` is listed below (after), then the value from `b.env` stands. For example, given the -following declaration in `docker_compose.yml`: +following declaration in `docker-compose.yml`: ```yaml services: diff --git a/compose/compose-file/compose-file-v2.md b/compose/compose-file/compose-file-v2.md index cf59a2a446..f6c356dab2 100644 --- a/compose/compose-file/compose-file-v2.md +++ b/compose/compose-file/compose-file-v2.md @@ -532,7 +532,7 @@ the value assigned to a variable that shows up more than once_. The files in the list are processed from the top down. For the same variable specified in file `a.env` and assigned a different value in file `b.env`, if `b.env` is listed below (after), then the value from `b.env` stands. For example, given the -following declaration in `docker_compose.yml`: +following declaration in `docker-compose.yml`: ```yaml services: @@ -990,7 +990,7 @@ as it has the highest priority. It then connects to `app_net_3`, then app_net_2: app_net_3: -> **Note:** If multiple networks have the same priority, the connection order +> **Note**: If multiple networks have the same priority, the connection order > is undefined. ### pid @@ -1235,7 +1235,7 @@ volumes: mydata: ``` -> **Note:** When creating bind mounts, using the long syntax requires the +> **Note**: When creating bind mounts, using the long syntax requires the > referenced folder to be created beforehand. Using the short syntax > creates the folder on the fly if it doesn't exist. > See the [bind mounts documentation](/engine/admin/volumes/bind-mounts.md/#differences-between--v-and---mount-behavior) @@ -1248,7 +1248,7 @@ service. volume_driver: mydriver -> **Note:** In [version 2 files](compose-versioning.md#version-2), this +> **Note**: In [version 2 files](compose-versioning.md#version-2), this > option only applies to anonymous volumes (those specified in the image, > or specified under `volumes` without an explicit named volume or host path). > To configure the driver for a named volume, use the `driver` key under the @@ -1298,7 +1298,7 @@ then read-write is used. Each of these is a single value, analogous to its [docker run](/engine/reference/run.md) counterpart. -> **Note:** The following options were added in [version 2.2](compose-versioning.md#version-22): +> **Note**: The following options were added in [version 2.2](compose-versioning.md#version-22): > `cpu_count`, `cpu_percent`, `cpus`. > The following options were added in [version 2.1](compose-versioning.md#version-21): > `oom_kill_disable`, `cpu_period` diff --git a/compose/compose-file/index.md b/compose/compose-file/index.md index 76d4ec4dc7..4a736aaaa2 100644 --- a/compose/compose-file/index.md +++ b/compose/compose-file/index.md @@ -279,7 +279,7 @@ at build time is the value in the environment where Compose is running. #### cache_from -> **Note:** This option is new in v3.2 +> **Note**: This option is new in v3.2 A list of images that the engine uses for cache resolution. @@ -291,7 +291,7 @@ A list of images that the engine uses for cache resolution. #### labels -> **Note:** This option is new in v3.3 +> **Note**: This option is new in v3.3 Add metadata to the resulting image using [Docker labels](/engine/userguide/labels-custom-metadata.md). You can use either an array or a dictionary. @@ -490,7 +490,7 @@ an error. ### credential_spec -> **Note:** this option was added in v3.3. +> **Note**: this option was added in v3.3. Configure the credential spec for managed service account. This option is only used for services using Windows containers. The `credential_spec` must be in the @@ -1001,7 +1001,7 @@ the value assigned to a variable that shows up more than once_. The files in the list are processed from the top down. For the same variable specified in file `a.env` and assigned a different value in file `b.env`, if `b.env` is listed below (after), then the value from `b.env` stands. For example, given the -following declaration in `docker_compose.yml`: +following declaration in `docker-compose.yml`: ```none services: @@ -1431,7 +1431,7 @@ containers in the bare-metal machine's namespace and vice versa. Expose ports. -> **Note:** Port mapping is incompatible with `network_mode: host` +> **Note**: Port mapping is incompatible with `network_mode: host` #### Short syntax @@ -1473,7 +1473,7 @@ ports: ``` -> **Note:** The long syntax is new in v3.2 +> **Note**: The long syntax is new in v3.2 ### restart @@ -1810,7 +1810,7 @@ volumes: mydata: ``` -> **Note:** The long syntax is new in v3.2 +> **Note**: The long syntax is new in v3.2 #### Volumes for services, swarms, and stack files diff --git a/compose/install.md b/compose/install.md index 25125a1340..4b190c3d6f 100644 --- a/compose/install.md +++ b/compose/install.md @@ -129,7 +129,7 @@ by step instructions are also included below. sudo chmod +x /usr/local/bin/docker-compose ``` -> ***Note:*** If the command `docker-compose` fails after installation, check your path. +> **Note**: If the command `docker-compose` fails after installation, check your path. > You can also create a symbolic link to `/usr/bin` or any other directory in your path. For example: diff --git a/config/containers/start-containers-automatically.md b/config/containers/start-containers-automatically.md index a695072aeb..4c24788bc1 100644 --- a/config/containers/start-containers-automatically.md +++ b/config/containers/start-containers-automatically.md @@ -28,8 +28,8 @@ any of the following: |:-----------------|:------------------------------------------------------------------------------------------------| | `no` | Do not automatically restart the container. (the default) | | `on-failure` | Restart the container if it exits due to an error, which manifests as a non-zero exit code. | -| `unless-stopped` | Restart the container unless it is explicitly stopped or Docker itself is stopped or restarted. | -| `always` | Always restart the container if it stops. | +| `always` | Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in [restart policy details](#restart-policy-details)) | +| `unless-stopped` | Similar to `always`, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts. | The following example starts a Redis container and configures it to always restart unless it is explicitly stopped or Docker is restarted. diff --git a/config/daemon/systemd.md b/config/daemon/systemd.md index 57d7863603..1c18eeae3e 100644 --- a/config/daemon/systemd.md +++ b/config/daemon/systemd.md @@ -101,7 +101,7 @@ you need to add this configuration in the Docker systemd service file. The `NO_PROXY` variable specifies a string that contains comma-separated values for hosts that should be excluded from proxying. These are the options you can specify to exclude hosts: - * IP address prefix (`1.2.3.4`) or in CIDR notation (`1.2.3.4/8`) + * IP address prefix (`1.2.3.4`) * Domain name, or a special DNS label (`*`) * A domain name matches that name and all subdomains. A domain name with a leading "." matches subdomains only. For example, given the domains diff --git a/datacenter/dtr/2.3/reference/cli/install.md b/datacenter/dtr/2.3/reference/cli/install.md index af70dd5652..9ab28e346b 100644 --- a/datacenter/dtr/2.3/reference/cli/install.md +++ b/datacenter/dtr/2.3/reference/cli/install.md @@ -24,11 +24,13 @@ command. Example usage: +```bash $ docker run -it --rm dtr-internal.caas.docker.io/caas/dtr:2.4.0-alpha-008434_ge02413a install \ --ucp-node \ --ucp-insecure-tls +``` -Note: Use --ucp-ca "$(cat ca.pem)" instead of --ucp-insecure-tls for a production deployment. +> **Note**: Use `--ucp-ca "$(cat ca.pem)"` instead of `--ucp-insecure-tls` for a production deployment. ## Options diff --git a/datacenter/dtr/2.4/reference/cli/install.md b/datacenter/dtr/2.4/reference/cli/install.md index 8769054686..34590c63a5 100644 --- a/datacenter/dtr/2.4/reference/cli/install.md +++ b/datacenter/dtr/2.4/reference/cli/install.md @@ -24,11 +24,13 @@ command. Example usage: +```bash $ docker run -it --rm docker/dtr:2.4.1 install \ --ucp-node \ --ucp-insecure-tls +``` -Note: Use --ucp-ca "$(cat ca.pem)" instead of --ucp-insecure-tls for a production deployment. +> **Note**: Use `--ucp-ca "$(cat ca.pem)"` instead of `--ucp-insecure-tls` for a production deployment. ## Options diff --git a/datacenter/ucp/1.1/release_notes.md b/datacenter/ucp/1.1/release_notes.md index 1586de609e..1cc0707fb3 100644 --- a/datacenter/ucp/1.1/release_notes.md +++ b/datacenter/ucp/1.1/release_notes.md @@ -14,10 +14,10 @@ upgrade your installation to the latest release. (18 Jan 2017) -Note: UCP 1.1.6 supports Docker Engine 1.12 but does not use the built-in -orchestration capabilities provided by the Docker Engine with swarm mode enabled. -When installing this UCP version on a Docker Engine 1.12 host, UCP creates a -cluster using the older Docker Swarm v1.2. +> **Note**: UCP 1.1.6 supports Docker Engine 1.12 but does not use the built-in +> orchestration capabilities provided by the Docker Engine with swarm mode enabled. +> When installing this UCP version on a Docker Engine 1.12 host, UCP creates a +> cluster using the older Docker Swarm v1.2. **Security Update** @@ -41,10 +41,10 @@ the [permissions levels section](user-management/permission-levels.md) for more (8 Dec 2016) -Note: UCP 1.1.5 supports Docker Engine 1.12 but does not use the built-in -orchestration capabilities provided by the Docker Engine with swarm mode enabled. -When installing this UCP version on a Docker Engine 1.12 host, UCP creates a -cluster using the older Docker Swarm v1.2. +> **Note**: UCP 1.1.5 supports Docker Engine 1.12 but does not use the built-in +> orchestration capabilities provided by the Docker Engine with swarm mode enabled. +> When installing this UCP version on a Docker Engine 1.12 host, UCP creates a +> cluster using the older Docker Swarm v1.2. **Bug fixes** @@ -61,10 +61,10 @@ the authentication process. (29 Sept 2016) -Note: UCP 1.1.4 supports Docker Engine 1.12 but does not use the built-in -orchestration capabilities provided by the Docker Engine with swarm mode enabled. -When installing this UCP version on a Docker Engine 1.12 host, UCP creates a -cluster using Docker Swarm v1.2.5. +> **Note**: UCP 1.1.4 supports Docker Engine 1.12 but does not use the built-in +> orchestration capabilities provided by the Docker Engine with swarm mode enabled. +> When installing this UCP version on a Docker Engine 1.12 host, UCP creates a +> cluster using Docker Swarm v1.2.5. **Bug fixes** @@ -76,10 +76,10 @@ organization accounts ## Version 1.1.3 -Note: UCP 1.1.3 supports Docker Engine 1.12 but does not use the built-in -orchestration capabilities provided by the Docker Engine with swarm mode enabled. -When installing this UCP version on a Docker Engine 1.12 host, UCP creates a -cluster using Docker Swarm v1.2.5. +> **Note**: UCP 1.1.3 supports Docker Engine 1.12 but does not use the built-in +> orchestration capabilities provided by the Docker Engine with swarm mode enabled. +> When installing this UCP version on a Docker Engine 1.12 host, UCP creates a +> cluster using Docker Swarm v1.2.5. **Security Update** @@ -125,9 +125,9 @@ enabled, and is not compatible with swarm-mode based APIs, e.g. `docker service` ## Version 1.1.2 -Note: UCP 1.1.2 supports Docker Engine 1.12 but doesn't use the new clustering -capabilities provided by the Docker swarm mode. When installing this UCP version -on a Docker Engine 1.12, UCP creates a "classic" Docker Swarm 1.2.3 cluster. +> **Note**: UCP 1.1.2 supports Docker Engine 1.12 but doesn't use the new clustering +> capabilities provided by the Docker swarm mode. When installing this UCP version +> on a Docker Engine 1.12, UCP creates a "classic" Docker Swarm 1.2.3 cluster. **Features** diff --git a/datacenter/ucp/2.2/guides/user/services/use-domain-names-to-access-services.md b/datacenter/ucp/2.2/guides/user/services/use-domain-names-to-access-services.md index 20bc8c6d6c..81a13d9361 100644 --- a/datacenter/ucp/2.2/guides/user/services/use-domain-names-to-access-services.md +++ b/datacenter/ucp/2.2/guides/user/services/use-domain-names-to-access-services.md @@ -194,7 +194,8 @@ apply two labels to your service: com.docker.ucp.mesh.http.1=external_route=http://example.org,redirect=https://example.org com.docker.ucp.mesh.http.2=external_route=sni://example.org ``` -Note: It is not possible to redirect HTTPS to HTTP. + +> **Note**: It is not possible to redirect HTTPS to HTTP. ### X-Forwarded-For header diff --git a/datacenter/ucp/3.0/guides/admin/backups-and-disaster-recovery.md b/datacenter/ucp/3.0/guides/admin/backups-and-disaster-recovery.md index 58bb999f5b..688f6d6b98 100644 --- a/datacenter/ucp/3.0/guides/admin/backups-and-disaster-recovery.md +++ b/datacenter/ucp/3.0/guides/admin/backups-and-disaster-recovery.md @@ -41,6 +41,17 @@ As part of your backup policy you should regularly create backups of UCP. DTR is backed up independently. [Learn about DTR backups and recovery](../../../../dtr/2.3/guides/admin/backups-and-disaster-recovery.md). +> Warning: On UCP versions 3.0.0 - 3.0.7, before performing a UCP backup, you must clean up multiple /dev/shm mounts in the ucp-kublet entrypoint script by running the following script on all nodes via cron job: + +``` +SHM_MOUNT=$(grep -m1 '^tmpfs./dev/shm' /proc/mounts) +while [ $(grep -cm2 '^tmpfs./dev/shm' /proc/mounts) -gt 1 ]; do + sudo umount /dev/shm +done +grep -q '^tmpfs./dev/shm' /proc/mounts || sudo mount "${SHM_MOUNT}" +``` +For additional details, refer to [Docker KB000934](https://success.docker.com/article/more-than-one-dev-shm-mount-in-the-host-namespace){: target="_blank"} + To create a UCP backup, run the `{{ page.ucp_org }}/{{ page.ucp_repo }}:{{ page.ucp_version }} backup` command on a single UCP manager. This command creates a tar archive with the contents of all the [volumes used by UCP](../architecture.md) to persist data diff --git a/datacenter/ucp/3.0/guides/admin/install/plan-installation.md b/datacenter/ucp/3.0/guides/admin/install/plan-installation.md index 04ea8b586c..98e56c29df 100644 --- a/datacenter/ucp/3.0/guides/admin/install/plan-installation.md +++ b/datacenter/ucp/3.0/guides/admin/install/plan-installation.md @@ -40,6 +40,10 @@ Docker UCP requires each node on the cluster to have a static IP address. Before installing UCP, ensure your network and nodes are configured to support this. +## Avoid IP range conflicts + +The `service-cluster-ip-range` Kubernetes API Server flag is currently set to `10.96.0.0/16` and cannot be changed. + ## Time synchronization In distributed systems like Docker UCP, time synchronization is critical diff --git a/datacenter/ucp/3.0/guides/admin/install/upgrade.md b/datacenter/ucp/3.0/guides/admin/install/upgrade.md index 243c401039..47a6b2271d 100644 --- a/datacenter/ucp/3.0/guides/admin/install/upgrade.md +++ b/datacenter/ucp/3.0/guides/admin/install/upgrade.md @@ -22,7 +22,7 @@ impact to your users. Don't make changes to UCP configurations while you're upgrading. This can lead to misconfigurations that are difficult to troubleshoot. -> Note: If you are upgrading a cluster to UCP 3.0.2 or higher on Microsoft +> **Note**: If you are upgrading a cluster to UCP 3.0.2 or higher on Microsoft > Azure then please ensure all of the Azure [prerequisities](install-on-azure.md/#azure-prerequisites) > are met. diff --git a/datacenter/ucp/3.0/guides/user/services/use-domain-names-to-access-services.md b/datacenter/ucp/3.0/guides/user/services/use-domain-names-to-access-services.md index 4f70c76168..f7be26d1dc 100644 --- a/datacenter/ucp/3.0/guides/user/services/use-domain-names-to-access-services.md +++ b/datacenter/ucp/3.0/guides/user/services/use-domain-names-to-access-services.md @@ -187,7 +187,8 @@ apply two labels to your service: com.docker.ucp.mesh.http.1=external_route=http://example.org,redirect=https://example.org com.docker.ucp.mesh.http.2=external_route=sni://example.org ``` -Note: It is not possible to redirect HTTPS to HTTP. + +> **Note**: It is not possible to redirect HTTPS to HTTP. ### X-Forwarded-For header diff --git a/datacenter/ucp/3.0/reference/cli/install.md b/datacenter/ucp/3.0/reference/cli/install.md index 79ee12a366..2c562d90b8 100644 --- a/datacenter/ucp/3.0/reference/cli/install.md +++ b/datacenter/ucp/3.0/reference/cli/install.md @@ -63,9 +63,9 @@ command. | `--swarm-port` | Port for the Docker Swarm manager. Used for backwards compatibility | | `--swarm-grpc-port` | Port for communication between nodes | | `--cni-installer-url` | A URL pointing to a Kubernetes YAML file to be used as an installer for the CNI plugin of the cluster. If specified, the default CNI plugin is not installed. If the URL uses the HTTPS scheme, no certificate verification is performed. | - | `--pod-cidr` | Kubernetes cluster IP pool for the pods to allocated IPs from (Default: 192.168.0.0/16) | | `--cloud-provider` | The cloud provider for the cluster | +| `--skip-cloud-provider` | Disables checks that rely on detecting the cloud provider (if any) on which the cluster is currently running. | | `--dns` | Set custom DNS servers for the UCP containers | | `--dns-opt` | Set DNS options for the UCP containers | | `--dns-search` | Set custom DNS search domains for the UCP containers | @@ -80,7 +80,8 @@ command. | `--swarm-experimental` | Enable Docker Swarm experimental features. Used for backwards compatibility | | `--disable-tracking` | Disable anonymous tracking and analytics | | `--disable-usage` | Disable anonymous usage reporting | -| `--external-server-cert` | Use the certificates in the `ucp-controller-server-certs` volume instead of generating self-signed certs during installation | +| `--external-server-cert` | Use the certificates in the `ucp-controller-server-certs` volume instead of generating self-signed certs during installation +| | `--preserve-certs` | Don't generate certificates if they already exist | | `--binpack` | Set the Docker Swarm scheduler to binpack mode. Used for backwards compatibility | | `--random` | Set the Docker Swarm scheduler to random mode. Used for backwards compatibility | diff --git a/develop/index.md b/develop/index.md index d07d2a462d..142b1fb173 100644 --- a/develop/index.md +++ b/develop/index.md @@ -29,4 +29,4 @@ most benefits from Docker. ## Advanced development with the SDK or API -After you can write Dockerfiles or Compose files and use Docker CLI, take it to the next level by using Docker Engine SDK for Go/Python or use HTTP API directly. +After you can write Dockerfiles or Compose files and use Docker CLI, take it to the next level by using Docker Engine SDK for Go/Python or use the HTTP API directly. diff --git a/docker-for-mac/edge-release-notes.md b/docker-for-mac/edge-release-notes.md index 0a3b05ee9c..0d5f65247f 100644 --- a/docker-for-mac/edge-release-notes.md +++ b/docker-for-mac/edge-release-notes.md @@ -16,7 +16,14 @@ notes](release-notes) are also available. (Following the CE release model, releases, and download stable and edge product installers at [Download Docker for Mac](install.md#download-docker-for-mac). -## Edge Releases of 2018 +## Edge Releases of 2019 + +### Docker Community Edition 2.0.2.1 2019-02-15 + +[Download](https://download.docker.com/mac/edge/31274/Docker.dmg) + +* Upgrades + - [Docker 18.09.2](https://github.com/docker/docker-ce/releases/tag/v18.09.2), fixes [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) ### Docker Community Edition 2.0.2.0 2019-02-06 @@ -55,6 +62,8 @@ for Mac](install.md#download-docker-for-mac). - Rename Docker for Mac to Docker Desktop - Partially open services ports if possible. [docker/for-mac#3438](https://github.com/docker/for-mac/issues/3438) +## Edge Releases of 2018 + ### Docker Community Edition 2.0.0.0-mac82 2018-12-07 [Download](https://download.docker.com/mac/edge/29268/Docker.dmg) diff --git a/docker-for-mac/index.md b/docker-for-mac/index.md index 7d4dcde633..3032e0ce5a 100644 --- a/docker-for-mac/index.md +++ b/docker-for-mac/index.md @@ -412,9 +412,9 @@ $ security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychai See also, [Directory structures for certificates](#directory-structures-for-certificates). -> **Note:** You need to restart Docker Desktop for Mac after making any changes to the -keychain or to the `~/.docker/certs.d` directory in order for the changes to -take effect. +> **Note**: You need to restart Docker Desktop for Mac after making any changes to the +> keychain or to the `~/.docker/certs.d` directory in order for the changes to +> take effect. For a complete explanation of how to do this, see the blog post [Adding Self-signed Registry Certs to Docker & Docker Desktop for diff --git a/docker-for-mac/multi-arch.md b/docker-for-mac/multi-arch.md index 423996f994..bb248844e3 100644 --- a/docker-for-mac/multi-arch.md +++ b/docker-for-mac/multi-arch.md @@ -6,29 +6,51 @@ redirect_from: title: Leverage multi-CPU architecture support notoc: true --- +Docker images can support multiple architectures, which means that a single +image may contain variants for different architectures, and sometimes for different +operating systems, such as Windows. -Docker Desktop for Mac provides `binfmt_misc` multi architecture support, so you can run -containers for different Linux architectures, such as `arm`, `mips`, `ppc64le`, -and even `s390x`. +When running an image with multi-architecture support, `docker` will +automatically select an image variant which matches your OS and architecture. + +Most of the official images on Docker Hub provide a [variety of architectures](https://github.com/docker-library/official-images#architectures-other-than-amd64). +For example, the `busybox` image supports `amd64`, `arm32v5`, `arm32v6`, +`arm32v7`, `arm64v8`, `i386`, `ppc64le`, and `s390x`. When running this image +on an `x86_64` / `amd64` machine, the `x86_64` variant will be pulled and run, +which can be seen from the output of the `uname -a` command that's run inside +the container: + +```bash +$ docker run busybox uname -a + +Linux 82ef1a0c07a2 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 GNU/Linux +``` + +**Docker Desktop for Mac** provides `binfmt_misc` multi-architecture support, +which means you can run containers for different Linux architectures +such as `arm`, `mips`, `ppc64le`, and even `s390x`. This does not require any special configuration in the container itself as it uses -qemu-static from the Docker for -Mac VM. +qemu-static from the **Docker for +Mac VM**. Because of this, you can run an ARM container, like the `arm32v7` or `ppc64le` +variants of the busybox image: -You can run an ARM container, like the -balena arm builds: - -``` -$ docker run balenalib/armv7hf-debian uname -a - -Linux 3d3ffca44f6e 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l GNU/Linux - -$ docker run justincormack/ppc64le-debian uname -a - -Linux edd13885f316 4.1.12 #1 SMP Tue Jan 12 10:51:00 UTC 2016 ppc64le GNU/Linux +### arm32v7 variant +```bash +$ docker run arm32v7/busybox uname -a +Linux 9e3873123d09 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l GNU/Linux ``` -Multi architecture support makes it easy to build -multi architecture Docker images or experiment with ARM images and binaries -from your Mac. +### ppc64le variant +```bash +$ docker run ppc64le/busybox uname -a + +Linux 57a073cc4f10 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 ppc64le GNU/Linux +``` + +Notice that this time, the `uname -a` output shows `armv7l` and +`ppc64le` respectively. + +Multi-architecture support makes it easy to build multi-architecture Docker images or experiment with ARM images and binaries from your Mac. + diff --git a/docker-for-mac/osxfs.md b/docker-for-mac/osxfs.md index 02e3bfac3f..e1e17bdecd 100644 --- a/docker-for-mac/osxfs.md +++ b/docker-for-mac/osxfs.md @@ -63,7 +63,7 @@ By default, you can share files in `/Users/`, `/Volumes/`, `/private/`, and `/tmp` directly. To add or remove directory trees that are exported to Docker, use the **File sharing** tab in Docker preferences ![whale menu](images/whale-x.png){: .inline} -> **Preferences** -> -**File sharing**. (See [Preferences](index.md#preferences).) +**File sharing**. (See [Preferences](/docker-for-mac/index.md#preferences-menu).) All other paths used in `-v` bind mounts are sourced from the Moby Linux VM running the Docker diff --git a/docker-for-mac/release-notes.md b/docker-for-mac/release-notes.md index 52d6f3fd16..bb6de1d393 100644 --- a/docker-for-mac/release-notes.md +++ b/docker-for-mac/release-notes.md @@ -20,6 +20,13 @@ Desktop for Mac](install.md#download-docker-for-mac). ## Stable Releases of 2019 +### Docker Community Edition 2.0.0.3 2019-02-15 + +[Download](https://download.docker.com/mac/stable/31259/Docker.dmg) + +* Upgrades + - [Docker 18.09.2](https://github.com/docker/docker-ce/releases/tag/v18.09.2), fixes [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) + ### Docker Community Edition 2.0.0.2 2019-01-16 [Download](https://download.docker.com/mac/stable/30215/Docker.dmg) diff --git a/docker-for-windows/edge-release-notes.md b/docker-for-windows/edge-release-notes.md index bb858238f3..28c3ca60fa 100644 --- a/docker-for-windows/edge-release-notes.md +++ b/docker-for-windows/edge-release-notes.md @@ -16,7 +16,14 @@ notes](release-notes) are also available. (Following the CE release model, releases, and download stable and edge product installers at [Download Docker for Windows](install.md#download-docker-for-windows). -## Edge Releases of 2018 +## Edge Releases of 2019 + +### Docker Community Edition 2.0.2.1 2019-02-15 + +[Download](https://download.docker.com/win/edge/31274/Docker%20Desktop%20Installer.exe) + +* Upgrades + - [Docker 18.09.2](https://github.com/docker/docker-ce/releases/tag/v18.09.2), fixes [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) ### Docker Community Edition 2.0.2.0 2019-02-06 @@ -54,6 +61,8 @@ for Windows](install.md#download-docker-for-windows). - Quit will not check if service is running anymore - Fix UI lock when changing kubernetes state +## Edge Releases of 2018 + ### Docker Community Edition 2.0.0.0-win82 2018-12-07 [Download](https://download.docker.com/win/edge/29268/Docker%20for%20Windows%20Installer.exe) diff --git a/docker-for-windows/install.md b/docker-for-windows/install.md index 9b5b769e81..b1fd76f684 100644 --- a/docker-for-windows/install.md +++ b/docker-for-windows/install.md @@ -54,7 +54,7 @@ Hub](https://hub.docker.com/editions/community/docker-ce-desktop-windows){: Looking for information on using Windows containers? * [Switch between Windows and Linux - containers](https://docs.docker.com/docker-for-windows/#switch-between-windows-and-linux-containers) + containers](/docker-for-windows/index.md#switch-between-windows-and-linux-containers) describes the Linux / Windows containers toggle in Docker Desktop for Windows and points you to the tutorial mentioned above. * [Getting Started with Windows Containers @@ -99,7 +99,7 @@ accessible from any terminal window. If the whale is hidden in the Notifications area, click the up arrow on the taskbar to show it. To learn more, see [Docker -Settings](index.md#docker-settings-dialog). +Settings](/docker-for-windows/index.md#docker-settings-dialog). If you just installed the app, you also get a popup success message with suggested next steps, and a link to this documentation. diff --git a/docker-for-windows/release-notes.md b/docker-for-windows/release-notes.md index 13527bfb0a..006a63c25b 100644 --- a/docker-for-windows/release-notes.md +++ b/docker-for-windows/release-notes.md @@ -20,6 +20,16 @@ for Windows](install.md#download-docker-for-windows). ## Stable Releases of 2019 +### Docker Community Edition 2.0.0.3 2019-02-15 + +[Download](https://download.docker.com/win/stable/31259/Docker%20for%20Windows%20Installer.exe) + +* Upgrades + - [Docker 18.09.2](https://github.com/docker/docker-ce/releases/tag/v18.09.2), fixes [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) + +* Bug fix + - Fix crash in system tray menu when the Hub login fails or Air gap mode + ### Docker Community Edition 2.0.0.2 2019-01-16 [Download](https://download.docker.com/win/stable/30215/Docker%20for%20Windows%20Installer.exe) diff --git a/docker-hub/builds/index.md b/docker-hub/builds/index.md index e773c20e8e..0b128ec895 100644 --- a/docker-hub/builds/index.md +++ b/docker-hub/builds/index.md @@ -129,9 +129,9 @@ For each source: * Specify the **Dockerfile location** as a path relative to the root of the source code repository. (If the Dockerfile is at the repository root, leave this path set to `/`.) -> **Note:** When Docker Hub pulls a branch from a source code repository, it performs -a shallow clone (only the tip of the specified branch). Refer to [Advanced options for Autobuild and Autotest](advanced.md) -for more information. +> **Note**: When Docker Hub pulls a branch from a source code repository, it performs +> a shallow clone (only the tip of the specified branch). Refer to [Advanced options for Autobuild and Autotest](advanced.md) +> for more information. ### Environment variables for builds diff --git a/docker-hub/orgs.md b/docker-hub/orgs.md index ca70da6e76..72ba707b37 100644 --- a/docker-hub/orgs.md +++ b/docker-hub/orgs.md @@ -13,7 +13,7 @@ Docker Hub Organizations let you create teams so you can give your team access t - **Organizations** are a collection of teams and repositories that can be managed together. - **Teams** are groups of Docker Hub users that belong to your organization. -**Note:** in Docker Hub, users cannot be associated directly to an organization. They belong only to teams within an organization. +> **Note**: in Docker Hub, users cannot be associated directly to an organization. They belong only to teams within an organization. ### Creating an organization @@ -48,7 +48,7 @@ To create a team: 2. Click on **Add User** 3. Provide the user's Docker ID username _or_ email to add them to the team ![Add User to Team](images/orgs-team-add-user.png) -**Note:** you are not automatically added to teams created by your organization. +> **Note**: you are not automatically added to teams created by your organization. ### Removing team members diff --git a/docker-hub/publish/certify-images.md b/docker-hub/publish/certify-images.md index ab96a2045a..3cc5e6dc8f 100644 --- a/docker-hub/publish/certify-images.md +++ b/docker-hub/publish/certify-images.md @@ -466,11 +466,12 @@ root:[~/] # root:[~/] # ./inspectDockerImage --json gforghetti/apache:latest | jq ``` -Note: The output was piped to the **jq** command to display it "nicely". + +> **Note**: The output was piped to the `jq` command to display it "nicely". #### Output: -``` +```json { "Date": "Mon May 21 13:23:37 2018", "SystemOperatingSystem": "Operating System: Ubuntu 16.04.4 LTS", @@ -580,7 +581,6 @@ Note: The output was piped to the **jq** command to display it "nicely". } ] } -root:[~/] # ``` diff --git a/docker-hub/publish/certify-plugins-logging.md b/docker-hub/publish/certify-plugins-logging.md index fd806ae7bd..69cb248e27 100644 --- a/docker-hub/publish/certify-plugins-logging.md +++ b/docker-hub/publish/certify-plugins-logging.md @@ -364,12 +364,11 @@ gforghetti:~/$ gforghetti:~:$ ./inspectDockerLoggingPlugin --json gforghetti/docker-log-driver-test:latest | jq ``` -> Note: The output was piped to the **jq** command to display it "nicely". +> **Note**: The output was piped to the `jq` command to display it "nicely". #### Output: - -``` +```json { "Date": "Mon May 21 14:38:28 2018", "SystemOperatingSystem": "Operating System: Ubuntu 16.04.4 LTS", diff --git a/ee/dtr/admin/configure/deploy-caches/simple-kube.md b/ee/dtr/admin/configure/deploy-caches/simple-kube.md index cd9b70d2a1..0236edb6bc 100644 --- a/ee/dtr/admin/configure/deploy-caches/simple-kube.md +++ b/ee/dtr/admin/configure/deploy-caches/simple-kube.md @@ -82,7 +82,7 @@ stored in the primary DTR. You can [customize the storage parameters](/registry/configuration/#storage), if you want the cached images to be backended by persistent storage. -> Note: Kubernetes Peristent Volumes or Persistent Volume Claims would have to be +> **Note**: Kubernetes Peristent Volumes or Persistent Volume Claims would have to be > used to provide persistent backend storage capabilities for the cache. ``` diff --git a/ee/dtr/admin/configure/use-a-web-proxy.md b/ee/dtr/admin/configure/use-a-web-proxy.md index 9ea427ec12..56f8c86a51 100644 --- a/ee/dtr/admin/configure/use-a-web-proxy.md +++ b/ee/dtr/admin/configure/use-a-web-proxy.md @@ -38,7 +38,8 @@ docker run -it --rm \ --https-proxy username:password@: \ --ucp-insecure-tls ``` -NOTE: DTR will hide the password portion of the URL, when it is displayed in the DTR UI. + +> **Note**: DTR will hide the password portion of the URL, when it is displayed in the DTR UI. ## Where to go next diff --git a/ee/dtr/admin/disaster-recovery/repair-a-cluster.md b/ee/dtr/admin/disaster-recovery/repair-a-cluster.md index 3a2a89d700..e6bdf42edb 100644 --- a/ee/dtr/admin/disaster-recovery/repair-a-cluster.md +++ b/ee/dtr/admin/disaster-recovery/repair-a-cluster.md @@ -45,7 +45,7 @@ It also reconfigures DTR removing all other nodes from the cluster, leaving DTR as a single-replica cluster with the replica you chose. Start by finding the ID of the DTR replica that you want to repair from. -You can find the list of replicas by navigating to the UCP web UI, or by using +You can find the list of replicas by navigating to **Shared Resources > Stacks** or **Swarm > Volumes** (when using [swarm mode](/engine/swarm/)) on the UCP web interface, or by using a UCP client bundle to run: {% raw %} @@ -57,6 +57,15 @@ docker ps --format "{{.Names}}" | grep dtr ``` {% endraw %} +Another way to determine the replica ID is to SSH into a DTR node and run the following: + +{% raw %} +```bash +REPLICA_ID=$(docker inspect -f '{{.Name}}' $(docker ps -q -f name=dtr-rethink) | cut -f 3 -d '-') +&& echo $REPLICA_ID +``` +{% endraw %} + Then, use your UCP client bundle to run the emergency repair command: ```bash diff --git a/ee/dtr/admin/disaster-recovery/repair-a-single-replica.md b/ee/dtr/admin/disaster-recovery/repair-a-single-replica.md index 5224219ee3..f61c21c13b 100644 --- a/ee/dtr/admin/disaster-recovery/repair-a-single-replica.md +++ b/ee/dtr/admin/disaster-recovery/repair-a-single-replica.md @@ -54,7 +54,7 @@ To remove unhealthy replicas, you'll first have to find the replica ID of one of the replicas you want to keep, and the replica IDs of the unhealthy replicas you want to remove. -You can find this in the **Stacks** page of the UCP web UI, or by using the UCP +You can find the list of replicas by navigating to **Shared Resources > Stacks** or **Swarm > Volumes** (when using [swarm mode](/engine/swarm/)) on the UCP web interface, or by using the UCP client bundle to run: {% raw %} @@ -66,6 +66,15 @@ docker ps --format "{{.Names}}" | grep dtr ``` {% endraw %} +Another way to determine the replica ID is to SSH into a DTR node and run the following: + +{% raw %} +```bash +REPLICA_ID=$(docker inspect -f '{{.Name}}' $(docker ps -q -f name=dtr-rethink) | cut -f 3 -d '-') +&& echo $REPLICA_ID +``` +{% endraw %} + Then use the UCP client bundle to remove the unhealthy replicas: ```bash diff --git a/ee/dtr/release-notes.md b/ee/dtr/release-notes.md index 497cf07e83..5c8b86ced6 100644 --- a/ee/dtr/release-notes.md +++ b/ee/dtr/release-notes.md @@ -84,6 +84,7 @@ to upgrade your installation to the latest release. * Users with read-only permissions to a repository can edit the repository README but their changes will not be saved. Only repository admins should have the ability to [edit the description](/ee/dtr/admin/manage-users/permission-levels/#team-permission-levels) of a repository. (docker/dhe-deploy #9677) * Poll mirroring for Docker plugins such as `docker/imagefs` is currently broken. (docker/dhe-deploy #9490) * When viewing the details of a scanned image tag, the header may display a different vulnerability count from the layer details. (docker/dhe-deploy #9474) + * In order to set a tag limit for pruning purposes, immutability must be turned off for a repository. This limitation is not clear in the **Repository Settings** view. (docker/dhe-deploy #9554) * Webhooks * When configured for "Image promoted from repository" events, a webhook notification is triggered twice during an image promotion when scanning is enabled on a repository. (docker/dhe-deploy #9685) diff --git a/ee/dtr/user/tag-pruning.md b/ee/dtr/user/tag-pruning.md index a12fbccac6..6853a0c777 100644 --- a/ee/dtr/user/tag-pruning.md +++ b/ee/dtr/user/tag-pruning.md @@ -11,11 +11,14 @@ Tag pruning is the process of cleaning up unnecessary or unwanted repository tag * specifying a tag pruning policy or alternatively, * setting a tag limit - > Tag Pruning > > When run, tag pruning only deletes a tag and does not carry out any actual blob deletion. For actual blob deletions, see [Garbage Collection](../../admin/configure/garbage-collection.md). +> Known Issue +> +> While the tag limit field is disabled when you turn on immutability for a new repository, this is currently [not the case with **Repository Settings**](/ee/dtr/release-notes/#known-issues). As a workaround, turn off immutability when setting a tag limit via **Repository Settings > Pruning**. + In the following section, we will cover how to specify a tag pruning policy and set a tag limit on repositories that you manage. It will not include modifying or deleting a tag pruning policy. ## Specify a tag pruning policy @@ -65,7 +68,10 @@ In addition to pruning policies, you can also set tag limits on repositories tha ![](../images/tag-pruning-4.png){: .with-border} -To set a tag limit, select the repository that you want to update and click the **Settings** tab. Specify a number in the **Pruning** section and click **Save**. The **Pruning** tab will now display your tag limit above the prune triggers list along with a link to modify this setting. +To set a tag limit, do the following: +1. Select the repository that you want to update and click the **Settings** tab. +2. Turn off immutability for the repository. +3. Specify a number in the **Pruning** section and click **Save**. The **Pruning** tab will now display your tag limit above the prune triggers list along with a link to modify this setting. ![](../images/tag-pruning-5.png){: .with-border} diff --git a/ee/ucp/admin/backups-and-disaster-recovery.md b/ee/ucp/admin/backups-and-disaster-recovery.md index fb487b0aa8..c07aa4f8a0 100644 --- a/ee/ucp/admin/backups-and-disaster-recovery.md +++ b/ee/ucp/admin/backups-and-disaster-recovery.md @@ -45,6 +45,17 @@ As part of your backup policy you should regularly create backups of UCP. DTR is backed up independently. [Learn about DTR backups and recovery](../../dtr/2.5/admin/disaster-recovery/index.md). +> Warning: On UCP versions 3.1.0 - 3.1.2, before performing a UCP backup, you must clean up multiple /dev/shm mounts in the ucp-kublet entrypoint script by running the following script on all nodes via cron job: + +``` +SHM_MOUNT=$(grep -m1 '^tmpfs./dev/shm' /proc/mounts) +while [ $(grep -cm2 '^tmpfs./dev/shm' /proc/mounts) -gt 1 ]; do + sudo umount /dev/shm +done +grep -q '^tmpfs./dev/shm' /proc/mounts || sudo mount "${SHM_MOUNT}" +``` +For additional details, refer to [Docker KB000934](https://success.docker.com/article/more-than-one-dev-shm-mount-in-the-host-namespace){: target="_blank"} + To create a UCP backup, run the `{{ page.ucp_org }}/{{ page.ucp_repo }}:{{ page.ucp_version }} backup` command on a single UCP manager. This command creates a tar archive with the contents of all the [volumes used by UCP](../ucp-architecture.md) to persist data diff --git a/ee/ucp/admin/configure/collect-cluster-metrics.md b/ee/ucp/admin/configure/collect-cluster-metrics.md index e3f2f9c304..274291c8a5 100644 --- a/ee/ucp/admin/configure/collect-cluster-metrics.md +++ b/ee/ucp/admin/configure/collect-cluster-metrics.md @@ -22,16 +22,16 @@ The Docker EE platform provides a base set of metrics that gets you running and ## Business metrics ## These are high-level aggregate metrics that typically combine technical, financial, and organizational data to create metrics for business leaders of the IT infrastructure. Some examples of business metrics might be: - - Company or division-level application downtime - - Aggregate resource utilization - - Application resource demand growth + - Company or division-level application downtime + - Aggregate resource utilization + - Application resource demand growth ## Application metrics ## These are metrics about domain of APM tools like AppDynamics or DynaTrace and provide metrics about the state or performance of the application itself. - - Service state metrics - - Container platform metrics - - Host infrastructure metrics + - Service state metrics + - Container platform metrics + - Host infrastructure metrics Docker EE 2.1 does not collect or expose application level metrics. @@ -40,9 +40,9 @@ The following are metrics Docker EE 2.1 collects, aggregates, and exposes: ## Service state metrics ## These are metrics about the state of services running on the container platform. These types of metrics have very low cardinality, meaning the values are typically from a small fixed set of possibilities, commonly binary. - - Application health - - Convergence of K8s deployments and Swarm services - - Cluster load by number of services or containers or pods + - Application health + - Convergence of K8s deployments and Swarm services + - Cluster load by number of services or containers or pods ## Deploy Prometheus on worker nodes diff --git a/ee/ucp/admin/configure/create-audit-logs.md b/ee/ucp/admin/configure/create-audit-logs.md index 931e670104..1656b63d13 100644 --- a/ee/ucp/admin/configure/create-audit-logs.md +++ b/ee/ucp/admin/configure/create-audit-logs.md @@ -195,6 +195,17 @@ events and may create a large amount of log entries. - /kubernetesdocs - /manage +## API endpoint information redacted + +Information for the following API endpoints is redacted from the audit logs for security purposes: + +- `/secrets/create` (POST) +- `/secrets/{id}/update` (POST) +- `/swarm/join` (POST) +- `/swarm/update` (POST) +-`/auth/login` (POST) +- Kube secrete create/update endpoints + ## Where to go next - [Collect UCP Cluster Metrics with Prometheus](collect-cluster-metrics.md) diff --git a/ee/ucp/admin/configure/deploy-route-reflectors.md b/ee/ucp/admin/configure/deploy-route-reflectors.md index d4978db9e5..ca8f6090ed 100644 --- a/ee/ucp/admin/configure/deploy-route-reflectors.md +++ b/ee/ucp/admin/configure/deploy-route-reflectors.md @@ -27,7 +27,7 @@ workloads. If Route Reflectors are running on a same node as other workloads, swarm ingress and NodePorts might not work in these workloads. -## Choose dedicated notes +## Choose dedicated nodes Start by tainting the nodes, so that no other workload runs there. Configure your CLI with a UCP client bundle, and for each dedicated node, run: diff --git a/ee/ucp/admin/configure/external-auth/index.md b/ee/ucp/admin/configure/external-auth/index.md index a98deb7ea2..fd6f2e852e 100644 --- a/ee/ucp/admin/configure/external-auth/index.md +++ b/ee/ucp/admin/configure/external-auth/index.md @@ -141,7 +141,7 @@ Click **Yes** to enable integrating UCP users and teams with LDAP servers. | No simple pagination | If your LDAP server doesn't support pagination. | | Just-In-Time User Provisioning | Whether to create user accounts only when users log in for the first time. The default value of `true` is recommended. If you upgraded from UCP 2.0.x, the default is `false`. | -> **Note:** LDAP connections using certificates created with TLS v1.2 do not currently advertise support for sha512WithRSAEncryption in the TLS handshake which leads to issues establishing connections with some clients. Support for advertising sha512WithRSAEncryption will be added in UCP 3.1.0. +> **Note**: LDAP connections using certificates created with TLS v1.2 do not currently advertise support for sha512WithRSAEncryption in the TLS handshake which leads to issues establishing connections with some clients. Support for advertising sha512WithRSAEncryption will be added in UCP 3.1.0. ![](../../../images/ldap-integration-1.png){: .with-border} diff --git a/ee/ucp/admin/configure/metrics-descriptions.md b/ee/ucp/admin/configure/metrics-descriptions.md new file mode 100644 index 0000000000..71799ef204 --- /dev/null +++ b/ee/ucp/admin/configure/metrics-descriptions.md @@ -0,0 +1,86 @@ +--- +description: Using UCP cluster metrics with Prometheus +keywords: prometheus, metrics, ucp +title: Using UCP cluster metrics with Prometheus +redirect_from: +- /engine/admin/prometheus/ +--- + +# UCP metrics + +The following table lists the metrics that UCP exposes in Prometheus, along with descriptions. Note that only the metrics +labeled with `ucp_` are documented. Other metrics are exposed in Prometheus but are not documented. + +| Name | Units | Description | Labels | Metric source | +|---------------------------------------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------|---------------| +| `ucp_controller_services` | number of services | The total number of Swarm services | | Controller | +| `ucp_engine_container_cpu_percent` | percentage | The percentage of CPU time this container is using. | container labels | Node | +| `ucp_engine_container_cpu_total_time_nanoseconds` | nanoseconds | Total CPU time used by this container in nanoseconds | container labels | Node | +| `ucp_engine_container_health` | 0.0 or 1.0 | Whether or not this container is healthy, according to its healthcheck. Note that if this value is 0, it just means that the container is not reporting healthy; it might not have a healthcheck defined at all, or its healthcheck might not have returned any results yet | container labels | Node | +| `ucp_engine_container_memory_max_usage_bytes` | bytes | Maximum memory used by this container in bytes | container labels | Node | +| `ucp_engine_container_memory_usage_bytes` | bytes | Current memory used by this container in bytes | container labels | Node | +| `ucp_engine_container_memory_usage_percent` | percentage | Percentage of total node memory currently being used by this container | container labels | Node | +| `ucp_engine_container_network_rx_bytes_total` | bytes | Number of bytes received by this container on this network in the last sample | container networking labels | Node | +| `ucp_engine_container_network_rx_dropped_packets_total` | number of packets | Number of packets bound for this container on this network that were dropped in the last sample | container networking labels | Node | +| `ucp_engine_container_network_rx_errors_total` | number of errors | Number of received network errors for this container on this network in the last sample | container networking labels | Node | +| `ucp_engine_container_network_rx_packets_total` | number of packets | Number of received packets for this container on this network in the last sample | container networking labels | Node | +| `ucp_engine_container_network_tx_bytes_total` | bytes | Number of bytes sent by this container on this network in the last sample | container networking labels | Node | +| `ucp_engine_container_network_tx_dropped_packets_total` | number of packets | Number of packets sent from this container on this network that were dropped in the last sample | container networking labels | Node | +| `ucp_engine_container_network_tx_errors_total` | number of errors | Number of sent network errors for this container on this network in the last sample | container networking labels | Node | +| `ucp_engine_container_network_tx_packets_total` | number of packets | Number of sent packets for this container on this network in the last sample | container networking labels | Node | +| `ucp_engine_container_unhealth` | 0.0 or 1.0 | Whether or not this container is unhealthy, according to its healthcheck. Note that if this value is 0, it just means that the container is not reporting unhealthy; it might not have a healthcheck defined at all, or its healthcheck might not have returned any results yet | container labels | Node | +| `ucp_engine_containers` | number of containers | Total number of containers on this node | node labels | Node | +| `ucp_engine_cpu_total_time_nanoseconds` | nanoseconds | System CPU time used by this container in nanoseconds | container labels | Node | +| `ucp_engine_disk_free_bytes` | bytes | Free disk space on the Docker root directory on this node in bytes. Note that this metric is not available for Windows nodes | node labels | Node | +| `ucp_engine_disk_total_bytes` | bytes | Total disk space on the Docker root directory on this node in bytes. Note that this metric is not available for Windows nodes | node labels | Node | +| `ucp_engine_images` | number of images | Total number of images on this node | node labels | Node | +| `ucp_engine_memory_total_bytes` | bytes | Total amount of memory on this node in bytes | node labels | Node | +| `ucp_engine_networks` | number of networks | Total number of networks on this node | node labels | Node | +| `ucp_engine_node_health` | 0.0 or 1.0 | Whether or not this node is healthy, as determined by UCP | nodeName: node name, nodeAddr: node IP address | Controller | +| `ucp_engine_num_cpu_cores` | number of cores | Number of CPU cores on this node | node labels | Node | +| `ucp_engine_pod_container_ready` | 0.0 or 1.0 | Whether or not this container in a Kubernetes pod is ready, as determined by its readiness probe. | pod labels | Controller | +| `ucp_engine_pod_ready` | 0.0 or 1.0 | Whether or not this Kubernetes pod is ready, as determined by its readiness probe. | pod labels | Controller | +| `ucp_engine_volumes` | number of volumes | Total number of volumes on this node | node labels | Node | + +## Metrics labels + +Metrics exposed by UCP in Prometheus have standardized labels, depending on the resource that they are measuring. +The following table lists some of the labels that are used, along with their values: + +### Container labels + +| Label name | Value | +|--------------------|---------------------------------------------------------------------------------------------| +| `collection` | The collection ID of the collection this container is in, if any | +| `container` | The ID of this container | +| `image` | The name of this container's image | +| `manager` | "true" if the container's node is a UCP manager, "false" otherwise | +| `name` | The name of the container | +| `podName` | If this container is part of a Kubernetes pod, this is the pod's name | +| `podNamespace` | If this container is part of a Kubernetes pod, this is the pod's namespace | +| `podContainerName` | If this container is part of a Kubernetes pod, this is the container's name in the pod spec | +| `service` | If this container is part of a Swarm service, this is the service ID | +| `stack` | If this container is part of a Docker compose stack, this is the name of the stack | + +### Container networking labels + +The following metrics measure network activity for a given network attached to a given +container. They have the same labels as Container labels, with one addition: + +| Label name | Value | +|------------|-----------------------| +| `network` | The ID of the network | + +### Node labels + +| Label name | Value | +|------------|--------------------------------------------------------| +| `manager` | "true" if the node is a UCP manager, "false" otherwise | + +## Metric source + +UCP exports metrics on every node and also exports additional metrics from +every controller. The metrics that are exported from controllers are +cluster-scoped, for example, the total number of Swarm services. Metrics that +are exported from nodes are specific to those nodes, for example, the total memory +on that node. diff --git a/ee/ucp/admin/configure/ucp-configuration-file.md b/ee/ucp/admin/configure/ucp-configuration-file.md index 2af248e983..78ce30c8a5 100644 --- a/ee/ucp/admin/configure/ucp-configuration-file.md +++ b/ee/ucp/admin/configure/ucp-configuration-file.md @@ -112,6 +112,8 @@ Configures audit logging options for UCP components. Specifies scheduling options and the default orchestrator for new nodes. +> **Note**: If you run the `kubectl` command, such as `kubectl describe nodes`, to view scheduling rules on Kubernetes nodes, it does not reflect what is configured in UCP Admin settings. UCP uses taints to control container scheduling on nodes and is unrelated to kubectl's `Unschedulable` boolean flag. + | Parameter | Required | Description | |:------------------------------|:---------|:-------------------------------------------------------------------------------------------------------------------------------------------| | `enable_admin_ucp_scheduling` | no | Set to `true` to allow admins to schedule on containers on manager nodes. The default is `false`. | @@ -181,7 +183,7 @@ components. Assigning these values overrides the settings in a container's | `metrics_retention_time` | no | Adjusts the metrics retention time. | | `metrics_scrape_interval` | no | Sets the interval for how frequently managers gather metrics from nodes in the cluster. | | `metrics_disk_usage_interval` | no | Sets the interval for how frequently storage metrics are gathered. This operation can be expensive when large volumes are present. | -| `rethinkdb_cache_size` | no | Sets the size of the cache used by UCP's RethinkDB servers. The default is 512MB, but leaving this field empty or specifying `auto` instructs RethinkDB to determine a cache size automatically. | +| `rethinkdb_cache_size` | no | Sets the size of the cache used by UCP's RethinkDB servers. The default is 1GB, but leaving this field empty or specifying `auto` instructs RethinkDB to determine a cache size automatically. | | `cloud_provider` | no | Set the cloud provider for the kubernetes cluster. | | `pod_cidr` | yes | Sets the subnet pool from which the IP for the Pod should be allocated from the CNI ipam plugin. Default is `192.168.0.0/16`. | | `calico_mtu` | no | Set the MTU (maximum transmission unit) size for the Calico plugin. | diff --git a/ee/ucp/admin/configure/use-nfs-volumes.md b/ee/ucp/admin/configure/use-nfs-volumes.md index b4d9fadb49..821a94c827 100644 --- a/ee/ucp/admin/configure/use-nfs-volumes.md +++ b/ee/ucp/admin/configure/use-nfs-volumes.md @@ -8,9 +8,9 @@ Docker UCP supports Network File System (NFS) persistent volumes for Kubernetes. To enable this feature on a UCP cluster, you need to set up an NFS storage volume provisioner. -> Kubernetes storage drivers +> ### Kubernetes storage drivers > -> Currently, NFS is the only Kubernetes storage driver that UCP supports. +>NFS is one of the Kubernetes storage drivers that UCP supports. See [Kubernetes Volume Drivers](https://success.docker.com/article/compatibility-matrix#kubernetesvolumedrivers) in the Compatibility Matrix for the full list. {: important} ## Enable NFS volume provisioning diff --git a/ee/ucp/admin/install/plan-installation.md b/ee/ucp/admin/install/plan-installation.md index 7e19cf6341..d3b7e0bfba 100644 --- a/ee/ucp/admin/install/plan-installation.md +++ b/ee/ucp/admin/install/plan-installation.md @@ -42,12 +42,22 @@ this. ## Avoid IP range conflicts +The `service-cluster-ip-range` Kubernetes API Server flag is currently set to `10.96.0.0/16` and cannot be changed. + Swarm uses a default address pool of `10.0.0.0/16` for its overlay networks. If this conflicts with your current network implementation, please use a custom IP address pool. To specify a custom IP address pool, use the `--default-address-pool` command line option during [Swarm initialization](../../../../engine/swarm/swarm-mode.md). -**NOTE:** Currently, the UCP installation process does not support this flag. To deploy with a custom IP pool, Swarm must first be installed using this flag and UCP must be installed on top of it. +> **Note**: Currently, the UCP installation process does not support this flag. To deploy with a custom IP pool, Swarm must first be installed using this flag and UCP must be installed on top of it. Kubernetes uses a default cluster IP pool for pods that is `192.168.0.0/16`. If it conflicts with your current networks, please use a custom IP pool by specifying `--pod-cidr` during UCP installation. +## Avoid firewall conflicts + +For SUSE Linux Enterprise Server 12 SP2 (SLES12), the `FW_LO_NOTRACK` flag is turned on by default in the openSUSE firewall. This speeds up packet processing on the loopback interface, and breaks certain firewall setups that need to redirect outgoing packets via custom rules on the local machine. + +To turn off the FW_LO_NOTRACK option, edit the `/etc/sysconfig/SuSEfirewall2` file and set `FW_LO_NOTRACK="no"`. Save the file and restart the firewall or reboot. + +For For SUSE Linux Enterprise Server 12 SP3, the default value for `FW_LO_NOTRACK` was changed to `no`. + ## Time synchronization In distributed systems like Docker UCP, time synchronization is critical diff --git a/ee/ucp/admin/install/system-requirements.md b/ee/ucp/admin/install/system-requirements.md index 009b588be0..373e7665d9 100644 --- a/ee/ucp/admin/install/system-requirements.md +++ b/ee/ucp/admin/install/system-requirements.md @@ -84,6 +84,14 @@ host types: | managers | TCP 12386 | Internal | Port for the authentication worker | | managers | TCP 12388 | Internal | Internal Port for the Kubernetes API Server | +## Avoid firewall conflicts + +For SUSE Linux Enterprise Server 12 SP2 (SLES12), the `FW_LO_NOTRACK` flag is turned on by default in the openSUSE firewall. This speeds up packet processing on the loopback interface, and breaks certain firewall setups that need to redirect outgoing packets via custom rules on the local machine. + +To turn off the FW_LO_NOTRACK option, edit the `/etc/sysconfig/SuSEfirewall2` file and set `FW_LO_NOTRACK="no"`. Save the file and restart the firewall or reboot. + +For For SUSE Linux Enterprise Server 12 SP3, the default value for `FW_LO_NOTRACK` was changed to `no`. + ## Enable ESP traffic For overlay networks with encryption to work, you need to ensure that diff --git a/ee/ucp/admin/install/upgrade.md b/ee/ucp/admin/install/upgrade.md index 99e6360295..15d8a4f15a 100644 --- a/ee/ucp/admin/install/upgrade.md +++ b/ee/ucp/admin/install/upgrade.md @@ -29,7 +29,7 @@ Learn about [UCP system requirements](system-requirements.md). Ensure that your cluster nodes meet the minimum requirements for port openings. [Ports used](system-requirements.md/#ports-used) are documented in the UCP system requirements. -> Note: If you are upgrading a cluster to UCP 3.0.2 or higher on Microsoft +> **Note**: If you are upgrading a cluster to UCP 3.0.2 or higher on Microsoft > Azure then please ensure all of the Azure [prerequisites](install-on-azure.md/#azure-prerequisites) > are met. @@ -56,17 +56,17 @@ to install the Docker Enterprise Edition. Starting with the manager nodes, and then worker nodes: 1. Log into the node using ssh. -2. Upgrade the Docker Engine to version 17.06.2-ee-8 or higher. See [Upgrade Docker EE](https://docs.docker.com/ee/upgrade/). +2. Upgrade the Docker Engine to version 18.09.0 or higher. See [Upgrade Docker EE](https://docs.docker.com/ee/upgrade/). 3. Make sure the node is healthy. - In your browser, navigate to the **Nodes** page in the UCP web UI, + In your browser, navigate to **Nodes** in the UCP web interface, and check that the node is healthy and is part of the cluster. ## Upgrade UCP -You can upgrade UCP from the web UI or the CLI. +You can upgrade UCP from the web or the command line interface. -### Use the UI to perform an upgrade +### Use the web interface to perform an upgrade When an upgrade is available for a UCP installation, a banner appears. @@ -77,17 +77,17 @@ It can be found under the **Upgrade** tab of the **Admin Settings** section. ![](../../images/upgrade-ucp-2.png){: .with-border} -In the **Available Versions** dropdown, select **3.0.0** and click +In the **Available Versions** dropdown, select the version you want to update to and click **Upgrade UCP**. -During the upgrade, the UI will be unavailable, and you should wait +During the upgrade, the web interface will be unavailable, and you should wait until completion before continuing to interact with it. When the upgrade -completes, you'll see a notification that a newer version of the UI -is available and a browser refresh is required to see the latest UI. +completes, you'll see a notification that a newer version of the web interface +is available and a browser refresh is required to see it. ### Use the CLI to perform an upgrade -To upgrade from the CLI, log into a UCP manager node using ssh, and run: +To upgrade from the CLI, log into a UCP manager node using SSH, and run: ``` # Get the latest version of UCP @@ -100,10 +100,10 @@ docker container run --rm -it \ upgrade --interactive ``` -This runs the upgrade command in interactive mode, so that you are prompted -for any necessary configuration values. +This runs the upgrade command in interactive mode, which will prompt you +for required configuration values. -Once the upgrade finishes, navigate to the UCP web UI and make sure that +Once the upgrade finishes, navigate to the UCP web interface and make sure that all the nodes managed by UCP are healthy. ## Where to go next diff --git a/ee/ucp/authorization/ee-standard.md b/ee/ucp/authorization/ee-standard.md index 8e5e9d7743..f43e08f4f3 100644 --- a/ee/ucp/authorization/ee-standard.md +++ b/ee/ucp/authorization/ee-standard.md @@ -53,7 +53,7 @@ built-in collection, `/Shared`. Other collections are also being created to enable shared `db` applications. -> **Note:** For increased security with node-based isolation, use Docker +> **Note**: For increased security with node-based isolation, use Docker > Enterprise Advanced. - `/Shared/mobile` hosts all Mobile applications and resources. @@ -107,7 +107,7 @@ collection boundaries. By assigning multiple grants per team, the Mobile and Payments applications teams can connect to dedicated Database resources through a secure and controlled interface, leveraging Database networks and secrets. -> **Note:** In Docker Enterprise Standard, all resources are deployed across the +> **Note**: In Docker Enterprise Standard, all resources are deployed across the > same group of UCP worker nodes. Node segmentation is provided in Docker > Enterprise Advanced and discussed in the [next tutorial](ee-advanced.md). diff --git a/ee/ucp/authorization/group-resources.md b/ee/ucp/authorization/group-resources.md index ff43863a9a..67f3fdbad4 100644 --- a/ee/ucp/authorization/group-resources.md +++ b/ee/ucp/authorization/group-resources.md @@ -40,7 +40,14 @@ can be nested inside one another, to create hierarchies. You can nest collections inside one another. If a user is granted permissions for one collection, they'll have permissions for its child collections, -pretty much like a directory structure.. +pretty much like a directory structure. As of UCP `3.1`, the ability to create a nested +collection of more than 2 layers deep within the root `/Swarm/` collection has been deprecated. + +The following image provides two examples of nested collections with the recommended maximum +of two nesting layers. The first example illustrates an environment-oriented collection, and the second +example illustrates an application-oriented collection. + +![](../images/nested-collection.png){: .with-border} For a child collection, or for a user who belongs to more than one team, the system concatenates permissions from multiple roles into an "effective role" for diff --git a/ee/ucp/images/nested-collection.png b/ee/ucp/images/nested-collection.png new file mode 100644 index 0000000000..6da2677646 Binary files /dev/null and b/ee/ucp/images/nested-collection.png differ diff --git a/ee/ucp/images/upgrade-ucp-1.png b/ee/ucp/images/upgrade-ucp-1.png index 02feffe51f..441ae33737 100644 Binary files a/ee/ucp/images/upgrade-ucp-1.png and b/ee/ucp/images/upgrade-ucp-1.png differ diff --git a/ee/ucp/images/upgrade-ucp-2.png b/ee/ucp/images/upgrade-ucp-2.png index ed55f22e90..9e4a5bd30c 100644 Binary files a/ee/ucp/images/upgrade-ucp-2.png and b/ee/ucp/images/upgrade-ucp-2.png differ diff --git a/ee/ucp/interlock/usage/sessions.md b/ee/ucp/interlock/usage/sessions.md index 93f39a72e2..46f43b65a6 100644 --- a/ee/ucp/interlock/usage/sessions.md +++ b/ee/ucp/interlock/usage/sessions.md @@ -125,7 +125,7 @@ $> curl -vs -H "Host: demo.local" http://127.0.0.1/ping You can use `docker service scale demo=10` to add some more replicas. Once scaled, you will notice that requests are pinned to a specific backend. -Note: due to the way the IP hashing works for extensions, you will notice a new upstream address when scaling replicas. This is -expected as internally the proxy uses the new set of replicas to decide on a backend on which to pin. Once the upstreams are -determined a new "sticky" backend will be chosen and that will be the dedicated upstream. +> **Note**: due to the way the IP hashing works for extensions, you will notice a new upstream address when scaling replicas. This is +> expected as internally the proxy uses the new set of replicas to decide on a backend on which to pin. Once the upstreams are +> determined a new "sticky" backend will be chosen and that will be the dedicated upstream. diff --git a/ee/ucp/interlock/usage/tls.md b/ee/ucp/interlock/usage/tls.md index 7c52129323..aedd6ecabf 100644 --- a/ee/ucp/interlock/usage/tls.md +++ b/ee/ucp/interlock/usage/tls.md @@ -143,7 +143,7 @@ using a version of `curl` that includes the SNI header with insecure requests. If this doesn't happen, `curl` displays an error saying that the SSL handshake was aborterd. -> ***NOTE:*** Currently there is no way to update expired certificates using this method. +> **Note**: Currently there is no way to update expired certificates using this method. > The proper way is to create a new secret then update the corresponding service. ## Let your service handle TLS diff --git a/ee/ucp/interlock/usage/websockets.md b/ee/ucp/interlock/usage/websockets.md index ec2b1b46b5..5aa8a8c18a 100644 --- a/ee/ucp/interlock/usage/websockets.md +++ b/ee/ucp/interlock/usage/websockets.md @@ -27,8 +27,8 @@ $> docker service create \ ehazlett/websocket-chat ``` -Note: for this to work you must have an entry for `demo.local` in your local hosts (i.e. `/etc/hosts`) file. -This uses the browser for websocket communication so you will need to have an entry or use a routable domain. +> **Note**: for this to work you must have an entry for `demo.local` in your local hosts (i.e. `/etc/hosts`) file. +> This uses the browser for websocket communication so you will need to have an entry or use a routable domain. Interlock will detect once the service is available and publish it. Once the tasks are running and the proxy service has been updated the application should be available via `http://demo.local`. Open diff --git a/ee/ucp/kubernetes/configure-aws-storage.md b/ee/ucp/kubernetes/configure-aws-storage.md index 0a5f4b7d88..179edc536c 100644 --- a/ee/ucp/kubernetes/configure-aws-storage.md +++ b/ee/ucp/kubernetes/configure-aws-storage.md @@ -32,8 +32,8 @@ Instances must have the following [AWS Identity and Access Management](https://d ### Infrastructure Configuration - Apply the roles and policies to Kubernetes masters and workers as indicated in the above chart. -- EC2 instances must be set to the private DNS hostname of the instance (will typically end in `.internal`) -- EC2 instances must also be labeled with the key `KubernetesCluster` with a matching value across all nodes. +- Set the hostname of the EC2 instances to the private DNS hostname of the instance. See [DNS Hostnames](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-hostnames) and [To change the system hostname without a public DNS name](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-hostname.html#set-hostname-system) for more details. +- Label the EC2 instances with the key `KubernetesCluster` and assign the same value across all nodes, for example, `UCPKubenertesCluster`. ### Cluster Configuration diff --git a/ee/ucp/kubernetes/install-cni-plugin.md b/ee/ucp/kubernetes/install-cni-plugin.md index d91f19981f..ee7c856d0d 100644 --- a/ee/ucp/kubernetes/install-cni-plugin.md +++ b/ee/ucp/kubernetes/install-cni-plugin.md @@ -11,7 +11,7 @@ UCP supports certified third-party Container Networking Interface (CNI) plugins. built-in [Calico](https://github.com/projectcalico/cni-plugin) plugin, but you can override that and install a Docker certified plugin. -***NOTE:*** The `--cni-installer-url` option is deprecated as of UCP 3.1. It is replaced by the `--unmanaged-cni` option. +> **Note**: The `--cni-installer-url` option is deprecated as of UCP 3.1. It is replaced by the `--unmanaged-cni` option. # Install UCP with a custom CNI plugin @@ -27,9 +27,10 @@ docker container run --rm -it --name ucp \ --unmanaged-cni \ --interactive ``` -***NOTE:*** Setting `--unmanaged-cni` to `true` value installs UCP without a managed CNI plugin. UCP and the -Kubernetes components will be running but pod-to-pod networking will not function until a CNI plugin is manually -installed. This will impact some functionality of UCP until a CNI plugin is running. + +> **Note**: Setting `--unmanaged-cni` to `true` value installs UCP without a managed CNI plugin. UCP and the +> Kubernetes components will be running but pod-to-pod networking will not function until a CNI plugin is manually +> installed. This will impact some functionality of UCP until a CNI plugin is running. You must provide a correct YAML installation file for the CNI plugin, but most of the default files work on Docker EE with no modification. diff --git a/ee/ucp/release-notes.md b/ee/ucp/release-notes.md index f9535edbc8..f0bbd6b31f 100644 --- a/ee/ucp/release-notes.md +++ b/ee/ucp/release-notes.md @@ -38,6 +38,8 @@ upgrade your installation to the latest release. * Non-admin users can no longer create `PersistentVolumes` that mount host directories. (docker/orca#15936) * Added support for the limit arg in `docker ps`. (docker/orca#15812) * Fixed an issue with ucp-proxy health check. (docker/orca#15814, docker/orca#15813, docker/orca#16021, docker/orca#15811) + * Fixed an issue with manual creation of a **ClusterRoleBinding** or **RoleBinding** for `User` or `Group` subjects requiring the ID of the user, organization, or team. (docker/orca#14935) + * Fixed an issue in which Kube Rolebindings only worked on UCP User ID and not UCP username. (docker/orca#14935) ### Known issue * By default, Kubelet begins deleting images, starting with the oldest unused images, after exceeding 85% disk space utilization. This causes an issue in an air-gapped environment. (docker/orca#16082) @@ -191,7 +193,9 @@ There are several backward-incompatible changes in the Kubernetes API that may a The following features are deprecated in UCP 3.1. * Collections - * User-created nested collections more than 2 layers deep within the root `/Swarm/` collection are deprecated and will be removed in future versions of the product. In the future, we recommend that at most only two levels of collections be created within UCP under the shared Cluster collection designated as `/Swarm/`. For example, if a production collection is created as a collection under the cluster collection `/Swarm/` as `/Swarm/production/` then at most one level of nestedness should be created, as in `/Swarm/production/app/`. + * The ability to create a nested collection of more than 2 layers deep within the root `/Swarm/` collection is now deprecated and will not be included in future versions of the product. However, current nested collections with more than 2 layers are still retained. + + * Docker recommends a maximum of two layers when creating collections within UCP under the shared cluster collection designated as `/Swarm/`. For example, if a production collection called `/Swarm/production` is created under the shared cluster collection, `/Swarm/`, then only one level of nesting should be created: `/Swarm/production/app/`. See [Nested Collections](/ee/ucp/authorization/group-resources/#nested-collections) for more details. * Kubernetes * **PersistentVolumeLabel** admission controller is deprecated in Kubernetes 1.11. This functionality will be migrated to [Cloud Controller Manager](https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/](https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/) diff --git a/ee/upgrade.md b/ee/upgrade.md index 144aa818f9..19f1c4cd60 100644 --- a/ee/upgrade.md +++ b/ee/upgrade.md @@ -11,7 +11,7 @@ redirect_from: In Docker Engine - Enterprise 18.09, significant architectural improvements were made to the network architecture in Swarm to increase the performance and scale of the built-in load balancing functionality. -> ***NOTE:*** These changes introduce new constraints to the Docker Engine - Enterprise upgrade process that, +> **Note**: These changes introduce new constraints to the Docker Engine - Enterprise upgrade process that, > if not correctly followed, can have impact on the availability of applications running on the Swarm. These > constraints impact any upgrades coming from any version before 18.09 to version 18.09 or greater. diff --git a/engine/ce-ee-node-activate.md b/engine/ce-ee-node-activate.md index 40cff6f21f..367980534d 100644 --- a/engine/ce-ee-node-activate.md +++ b/engine/ce-ee-node-activate.md @@ -26,7 +26,7 @@ on your hub/store account after starting the trial or paid license. This allows upgrade operations to work as expected and keep them current as long as your license is still valid and has not expired. -> ***NOTE:*** You can use the `docker engine update` command. However, if you continue to use +> **Note**: You can use the `docker engine update` command. However, if you continue to use > the CE packages, the OS package will no longer replace the active daemon binary during apt/yum > updates, so you are responsible for performing the `docker engine update` operation periodically > to keep your engine up to date. @@ -61,10 +61,10 @@ Server: Docker Engine - Community 2. Log into the Docker engine from the command line. -**NOTE:** When running the command `docker login`, the shell stores the credentials in the current user's home -directory. RHEL and Ubuntu-based Linux distributions have different behavior for sudo. RHEL sets $HOME to point -to `/root` while Ubuntu leaves `$HOME` pointing to the user's home directory who ran `sudo` and this can cause -permission and access problems when switching between `sudo` and non-sudo'd commands. +> **Note**: When running the command `docker login`, the shell stores the credentials in the current user's home +> directory. RHEL and Ubuntu-based Linux distributions have different behavior for sudo. RHEL sets $HOME to point +> to `/root` while Ubuntu leaves `$HOME` pointing to the user's home directory who ran `sudo` and this can cause +> permission and access problems when switching between `sudo` and non-sudo'd commands. For Ubuntu or Debian: diff --git a/engine/release-notes.md b/engine/release-notes.md index 48cfe1630b..5c2c7d25bb 100644 --- a/engine/release-notes.md +++ b/engine/release-notes.md @@ -16,13 +16,13 @@ Docker EE is a superset of all the features in Docker CE. It incorporates defect that you can use in environments where new features cannot be adopted as quickly for consistency and compatibility reasons. -> ***NOTE:*** +> **Note**: > New in 18.09 is an aligned release model for Docker Engine - Community and Docker > Engine - Enterprise. The new versioning scheme is YY.MM.x where x is an incrementing > patch version. The enterprise engine is a superset of the community engine. They > will ship concurrently with the same x patch version based on the same code base. -> ***NOTE:*** +> **Note**: > The client and container runtime are now in separate packages from the daemon in > Docker Engine 18.09. Users should install and update all three packages at the same time > to get the latest patch releases. For example, on Ubuntu: @@ -224,8 +224,7 @@ As of EE 2.2, Docker will deprecate support for Device Mapper as a storage drive time, but support will be removed in a future release. Docker will continue to support Device Mapper for existing EE 2.0 and 2.1 customers. Please contact Sales for more information. -Docker recommends that existing customers [migrate to using Overlay2 for the storage driver] -(https://success.docker.com/article/how-do-i-migrate-an-existing-ucp-cluster-to-the-overlay2-graph-driver). +Docker recommends that existing customers [migrate to using Overlay2 for the storage driver](https://success.docker.com/article/how-do-i-migrate-an-existing-ucp-cluster-to-the-overlay2-graph-driver). The [Overlay2 storage driver](https://docs.docker.com/storage/storagedriver/overlayfs-driver/) is now the default for Docker engine implementations. @@ -236,14 +235,16 @@ For more information on the list of deprecated flags and APIs, have a look at th In this release, Docker has also removed support for TLS < 1.2 [moby/moby#37660](https://github.com/moby/moby/pull/37660), Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/docker-ce-packaging/pull/255) / [docker-ce-packaging#254](https://github.com/docker/docker-ce-packaging/pull/254), and Debian 8 "Jessie" [docker-ce-packaging#255](https://github.com/docker/docker-ce-packaging/pull/255) / [docker-ce-packaging#254](https://github.com/docker/docker-ce-packaging/pull/254). -### 18.03.1-ee-6 +## Older Docker Engine EE Release notes + +## 18.03.1-ee-6 2019-02-11 ### Security fixes for Docker Engine - Enterprise * Update `runc` to address a critical vulnerability that allows specially-crafted containers to gain administrative privileges on the host. [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) * Ubuntu 14.04 customers using a 3.13 kernel will need to upgrade to a supported Ubuntu 4.x kernel -### 18.03.1-ee-5 +## 18.03.1-ee-5 2019-01-09 ### Security fixes @@ -256,35 +257,11 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d * Fix resource leak on `docker logs --follow` [moby/moby#37576](https://github.com/moby/moby/pull/37576) * Mask proxy credentials from URL when displayed in system info (docker/escalation#879) -### 17.06.2-ee-19 - -2019-02-11 - -### Security fixes for Docker Engine - Enterprise -* Update `runc` to address a critical vulnerability that allows specially-crafted containers to gain administrative privileges on the host. [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) -* Ubuntu 14.04 customers using a 3.13 kernel will need to upgrade to a supported Ubuntu 4.x kernel - -### 17.06.2-ee-18 -2019-01-09 - -### Security fixes -* Upgraded Go language to 1.10.6 to resolve CVE-2018-16873, CVE-2018-16874, and CVE-2018-16875. -* Added `/proc/asound` to masked paths -* Fixed authz plugin for 0-length content and path validation. - -### Fixes for Docker Engine EE -* Disable kmem accounting in runc on RHEL/CentOS (docker/escalation#614, docker/escalation#692) -* Fix resource leak on `docker logs --follow` [moby/moby#37576](https://github.com/moby/moby/pull/37576) -* Mask proxy credentials from URL when displayed in system info (docker/escalation#879) - - -## Older Docker Engine EE Release notes - -### 18.03.1-ee-4 +## 18.03.1-ee-4 2018-10-25 - > *** NOTE: *** If you're deploying UCP or DTR, use Docker EE Engine 18.09 or higher. 18.03 is an engine only release. + > **Note**: If you're deploying UCP or DTR, use Docker EE Engine 18.09 or higher. 18.03 is an engine only release. #### Client @@ -307,59 +284,7 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d * Fixed the logic used for skipping over running tasks. [docker/swarmkit#2724](https://github.com/docker/swarmkit/pull/2724) * Addressed unassigned task leak when a service is removed. [docker/swarmkit#2709](https://github.com/docker/swarmkit/pull/2709) - ### 18.03.1-ee-3 - 2018-08-30 - - #### Builder - - * Fix: no error if build args are missing during docker build. [docker/engine#25](https://github.com/docker/engine/pull/25) - * Ensure RUN instruction to run without healthcheck. [moby/moby#37413](https://github.com/moby/moby/pull/37413) - - #### Client - - * Fix manifest list to always use correct size. [docker/cli#1156](https://github.com/docker/cli/pull/1156) - * Various shell completion script updates. [docker/cli#1159](https://github.com/docker/cli/pull/1159) [docker/cli#1227](https://github.com/docker/cli/pull/1227) - * Improve version output alignment. [docker/cli#1204](https://github.com/docker/cli/pull/1204) - - #### Runtime - - * Disable CRI plugin listening on port 10010 by default. [docker/engine#29](https://github.com/docker/engine/pull/29) - * Update containerd to v1.1.2. [docker/engine#33](https://github.com/docker/engine/pull/33) - * Windows: Pass back system errors on container exit. [moby/moby#35967](https://github.com/moby/moby/pull/35967) - * Windows: Fix named pipe support for hyper-v isolated containers. [docker/engine#2](https://github.com/docker/engine/pull/2) [docker/cli#1165](https://github.com/docker/cli/pull/1165) - * Register OCI media types. [docker/engine#4](https://github.com/docker/engine/pull/4) - - #### Swarm Mode - - * Clean up tasks in dirty list for which the service has been deleted. [docker/swarmkit#2694](https://github.com/docker/swarmkit/pull/2694) - * Propagate the provided external CA certificate to the external CA object in swarm. [docker/cli#1178](https://github.com/docker/cli/pull/1178) - -2018-10-25 - -> ***NOTE:*** If you're deploying UCP or DTR, use Docker EE Engine 18.09 or higher. 18.03 is an engine only release. - -#### Client - -* Fixed help message flags on docker stack commands and child commands. [docker/cli#1251](https://github.com/docker/cli/pull/1251) -* Fixed typo breaking zsh docker update autocomplete. [docker/cli#1232](https://github.com/docker/cli/pull/1232) - -### Networking - -* Added optimizations to reduce the messages in the NetworkDB queue. [docker/libnetwork#2225](https://github.com/docker/libnetwork/pull/2225) -* Fixed a very rare condition where managers are not correctly triggering the reconnection logic. [docker/libnetwork#2226](https://github.com/docker/libnetwork/pull/2226) -* Changed loglevel from error to warning for missing disable_ipv6 file. [docker/libnetwork#2224](https://github.com/docker/libnetwork/pull/2224) - -#### Runtime - -* Fixed denial of service with large numbers in cpuset-cpus and cpuset-mems. [moby/moby#37967](https://github.com/moby/moby/pull/37967) -* Added stability improvements for devicemapper shutdown. [moby/moby#36307](https://github.com/moby/moby/pull/36307) [moby/moby#36438](https://github.com/moby/moby/pull/36438) - -#### Swarm Mode - -* Fixed the logic used for skipping over running tasks. [docker/swarmkit#2724](https://github.com/docker/swarmkit/pull/2724) -* Addressed unassigned task leak when a service is removed. [docker/swarmkit#2709](https://github.com/docker/swarmkit/pull/2709) - -### 18.03.1-ee-3 +## 18.03.1-ee-3 2018-08-30 #### Builder @@ -386,7 +311,7 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d * Clean up tasks in dirty list for which the service has been deleted. [docker/swarmkit#2694](https://github.com/docker/swarmkit/pull/2694) * Propagate the provided external CA certificate to the external CA object in swarm. [docker/cli#1178](https://github.com/docker/cli/pull/1178) -### 18.03.1-ee-2 +## 18.03.1-ee-2 2018-07-10 > #### Important notes about this release @@ -399,7 +324,7 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d + Add /proc/acpi to masked paths [(CVE-2018-10892)](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2018-10892). [moby/moby#37404](https://github.com/moby/moby/pull/37404) -### 18.03.1-ee-1 +## 18.03.1-ee-1 2018-06-27 > #### Important notes about this release @@ -423,7 +348,29 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d + Support for `--chown` with `COPY` and `ADD` in `Dockerfile`. + Added functionality for the `docker logs` command to include the output of multiple logging drivers. -### 17.06.2-ee-17 + +## 17.06.2-ee-19 + +2019-02-11 + +### Security fixes for Docker Engine - Enterprise +* Update `runc` to address a critical vulnerability that allows specially-crafted containers to gain administrative privileges on the host. [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) +* Ubuntu 14.04 customers using a 3.13 kernel will need to upgrade to a supported Ubuntu 4.x kernel + +## 17.06.2-ee-18 +2019-01-09 + +### Security fixes +* Upgraded Go language to 1.10.6 to resolve CVE-2018-16873, CVE-2018-16874, and CVE-2018-16875. +* Added `/proc/asound` to masked paths +* Fixed authz plugin for 0-length content and path validation. + +### Fixes for Docker Engine EE +* Disable kmem accounting in runc on RHEL/CentOS (docker/escalation#614, docker/escalation#692) +* Fix resource leak on `docker logs --follow` [moby/moby#37576](https://github.com/moby/moby/pull/37576) +* Mask proxy credentials from URL when displayed in system info (docker/escalation#879) + +## 17.06.2-ee-17 2018-10-25 #### Networking @@ -442,7 +389,7 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d * Fixed leaking task resources. [docker/swarmkit#2755](https://github.com/docker/swarmkit/pull/2755) * Fixed deadlock in dispatcher that could cause node to crash. [docker/swarmkit#2753](https://github.com/docker/swarmkit/pull/2753) -### 17.06.2-ee-16 +## 17.06.2-ee-16 2018-07-26 #### Client @@ -468,7 +415,7 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d * RoleManager will remove deleted nodes from the cluster membership. [docker/swarmkit#2607](https://github.com/docker/swarmkit/pull/2607) - Fix unassigned task leak when service is removed. [docker/swarmkit#2708](https://github.com/docker/swarmkit/pull/2708) -### 17.06.2-ee-15 +## 17.06.2-ee-15 2018-07-10 #### Runtime @@ -494,21 +441,21 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d - Fix `docker stack deploy --prune` with empty name removes all swarm services. [moby/moby#36776](https://github.com/moby/moby/issues/36776) -### 17.06.2-ee-13 +## 17.06.2-ee-13 2018-06-04 #### Networking - Fix attachable containers that may leave DNS state when exiting. [docker/libnetwork#2175](https://github.com/docker/libnetwork/pull/2175) -### 17.06.2-ee-12 +## 17.06.2-ee-12 2018-05-29 #### Networking - Fix to allow service update with no connection loss. [docker/libnetwork#2157](https://github.com/docker/libnetwork/pull/2157) -### 17.06.2-ee-11 +## 17.06.2-ee-11 2018-05-17 #### Client @@ -533,14 +480,14 @@ Ubuntu 14.04 "Trusty Tahr" [docker-ce-packaging#255](https://github.com/docker/d * When all Swarm managers are stopped at the same time, the swarm might end up in a split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). -### 17.06.2-ee-10 +## 17.06.2-ee-10 2018-04-27 #### Runtime * Fix version output to not have `-dev`. -### 17.06.2-ee-9 +## 17.06.2-ee-9 2018-04-26 #### Runtime @@ -554,7 +501,7 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). - Increase raft ElectionTick to 10xHeartbeatTick. [docker/swarmkit#2564](https://github.com/docker/swarmkit/pull/2564) - Adding logic to restore networks in order. [docker/swarmkit#2584](https://github.com/docker/swarmkit/pull/2584) -### 17.06.2-ee-8 +## 17.06.2-ee-8 2018-04-17 #### Runtime @@ -577,7 +524,7 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). workaround, wait for leader election to complete before issuing commands to the cluster. -### 17.06.2-ee-7 +## 17.06.2-ee-7 2018-03-19 #### Important notes about this release @@ -628,7 +575,7 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). - Synchronize Dispatcher.Stop() with incoming rpcs [docker/swarmkit#2524](https://github.com/docker/swarmkit/pull/2524) - Fix IP overlap with empty EndpointSpec [docker/swarmkit#2511](https://github.com/docker/swarmkit/pull/2511) -### 17.06.2-ee-6 +## 17.06.2-ee-6 2017-11-27 #### Runtime @@ -645,7 +592,7 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). * Only shut down old tasks on success [docker/swarmkit#2308](https://github.com/docker/swarmkit/pull/2308) * Error on cluster spec name change [docker/swarmkit#2436](https://github.com/docker/swarmkit/pull/2436) -### 17.06.2-ee-5 +## 17.06.2-ee-5 2017-11-02 #### Important notes about this release @@ -695,7 +642,7 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). * Docker may experience IP exhaustion if many tasks are assigned to a single overlay network, for example if many services are attached to that network or because services on the network are scaled to many replicas. The problem may also manifest when tasks are rescheduled because of node failures. In case of node failure, Docker currently waits 24h to release overlay IP addresses. The problem can be diagnosed by looking for `failed to allocate network IP for task` messages in the Docker logs. * SELinux enablement is not supported for containers on IBM Z on RHEL because of missing Red Hat package. -### 17.06.2-ee-4 +## 17.06.2-ee-4 2017-10-12 #### Client @@ -714,14 +661,14 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). * Serialize IP allocation [docker/libnetwork#1788](https://github.com/docker/libnetwork/pull/1788) -### 17.06.2-ee-3 +## 17.06.2-ee-3 2017-09-22 #### Swarm mode - Increase max message size to allow larger snapshots [docker/swarmkit#131](https://github.com/docker/swarmkit/pull/131) -### 17.06.1-ee-2 +## 17.06.1-ee-2 2017-08-24 #### Client @@ -741,7 +688,7 @@ split-brain scenario. [Learn more](https://success.docker.com/article/KB000759). - Ignore PullOptions for running tasks [#2351](https://github.com/docker/swarmkit/pull/2351) -### 17.06.1-ee-1 +## 17.06.1-ee-1 2017-08-16 #### Important notes about this release @@ -1017,7 +964,7 @@ not reachable until one of these 2 conditions happens: As a workaround, send at least a packet out from each container like (ping, GARP, etc). -### Docker EE 17.03.2-ee-8 +## Docker EE 17.03.2-ee-8 2017-12-13 * Handle cleanup DNS for attachable container to prevent leak in name resolution [docker/libnetwork#1999](https://github.com/docker/libnetwork/pull/1999) @@ -1032,7 +979,7 @@ As a workaround, send at least a packet out from each container like * Don't abort when setting `may_detach_mounts` [moby/moby#35172](https://github.com/moby/moby/pull/35172) * Protect health monitor channel to prevent engine panic [moby/moby#35482](https://github.com/moby/moby/pull/35482) -### Docker EE 17.03.2-ee-7 +## Docker EE 17.03.2-ee-7 2017-10-04 * Fix logic in network resource reaping to prevent memory leak [docker/libnetwork#1944](https://github.com/docker/libnetwork/pull/1944) [docker/libnetwork#1960](https://github.com/docker/libnetwork/pull/1960) @@ -1096,6 +1043,14 @@ Initial Docker EE release, based on Docker CE 17.03.0 ## Older Docker Engine CE Release notes +## 18.06.2 + +2019-02-11 + +### Security fixes for Docker Engine - Community +* Update `runc` to address a critical vulnerability that allows specially-crafted containers to gain administrative privileges on the host. [CVE-2019-5736](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736) +* Ubuntu 14.04 customers using a 3.13 kernel will need to upgrade to a supported Ubuntu 4.x kernel + ## 18.06.1-ce 2018-08-21 @@ -1298,7 +1253,12 @@ Initial Docker EE release, based on Docker CE 17.03.0 - Avoid a leak when a service with unassigned tasks is deleted. [docker/engine#27](https://github.com/docker/engine/pull/27) - Fix racy batching on the dispatcher. [docker/engine#27](https://github.com/docker/engine/pull/27) -### 18.03.1-ce +## 18.03.1-ce +2018-04-26 + +## Older Docker Engine CE Release notes + +## 18.03.1-ce 2018-04-26 #### Client @@ -1336,7 +1296,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 * Allow for larger preset property values, do not override [docker/libnetwork#2124](https://github.com/docker/libnetwork/pull/2124) * Prevent panics on concurrent reads/writes when calling `changeNodeState` [docker/libnetwork#2136](https://github.com/docker/libnetwork/pull/2136) -### 18.03.0-ce +## 18.03.0-ce 2018-03-21 #### Builder @@ -1454,7 +1414,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 + Add swarm types to bash completion event type filter [docker/cli#888](https://github.com/docker/cli/pull/888) - Fix issue where network inspect does not show Created time for networks in swarm scope [moby/moby#36095](https://github.com/moby/moby/pull/36095) -### 17.12.1-ce +## 17.12.1-ce 2018-02-27 #### Client @@ -1495,7 +1455,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 #### Swarm * Remove watchMiss from swarm mode [docker/libnetwork#2047](https://github.com/docker/libnetwork/pull/2047) -### 17.12.0-ce +## 17.12.0-ce 2017-12-27 #### Known Issues @@ -1598,7 +1558,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 * Pass Version to engine static builds [docker/docker-ce-packaging#70](https://github.com/docker/docker-ce-packaging/pull/70) + Added support for aarch64 on Debian (stretch/jessie) and Ubuntu Zesty or newer [docker/docker-ce-packaging#35](https://github.com/docker/docker-ce-packaging/pull/35) -### 17.09.1-ce +## 17.09.1-ce 2017-12-07 #### Builder @@ -1642,7 +1602,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 - Provide custom gRPC dialer to override default proxy dialer [docker/swarmkit/#2457](https://github.com/docker/swarmkit/pull/2457) - Avoids recursive readlock on swarm info [moby/moby#35388](https://github.com/moby/moby/pull/35388) -### 17.09.0-ce +## 17.09.0-ce 2017-09-26 #### Builder @@ -1707,7 +1667,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 + Remove deprecated `--enable-api-cors` daemon flag [moby/moby#34821](https://github.com/moby/moby/pull/34821) -### 17.06.2-ce +## 17.06.2-ce 2017-09-05 #### Client @@ -1723,7 +1683,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 - Ignore PullOptions for running tasks [docker/swarmkit#2351](https://github.com/docker/swarmkit/pull/2351) -### 17.06.1-ce +## 17.06.1-ce 2017-08-15 #### Builder @@ -1779,7 +1739,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 * Cluster update and memory issue fixes [#114](https://github.com/docker/docker-ce/pull/114) * Changing get network request to return predefined network in swarm [#150](https://github.com/docker/docker-ce/pull/150) -### 17.06.0-ce +## 17.06.0-ce 2017-06-28 > **Note**: Docker 17.06.0 has an issue in the image builder causing a change in the behavior @@ -1884,7 +1844,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 * Disable legacy registry (v1) by default [#33629](https://github.com/moby/moby/pull/33629) -### 17.03.2-ce +## 17.03.2-ce 2017-05-29 ## 17.03.3-ce @@ -1917,7 +1877,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 - Fix a case where tasks could get killed unexpectedly [#33118](https://github.com/moby/moby/pull/33118) - Fix an issue preventing to deploy services if the registry cannot be reached despite the needed images being locally present [#33117](https://github.com/moby/moby/pull/33117) -### 17.03.1-ce +## 17.03.1-ce 2017-03-27 #### Remote API (v1.27) & Client @@ -1950,7 +1910,7 @@ Initial Docker EE release, based on Docker CE 17.03.0 * Cleanup HCS on restore [#31503](https://github.com/docker/docker/pull/31503) -### 17.03.0-ce +## 17.03.0-ce 2017-03-01 **IMPORTANT**: Starting with this release, Docker is on a monthly release cycle and uses a @@ -1999,7 +1959,7 @@ Upgrading from Docker 1.13.1 to 17.03.0 is expected to be simple and low-risk. ## Edge releases -### 18.05.0-ce +## 18.05.0-ce 2018-05-09 #### Builder @@ -2070,7 +2030,7 @@ Upgrading from Docker 1.13.1 to 17.03.0 is expected to be simple and low-risk. * Expose swarmkit's Raft tuning parameters in engine config. [moby/moby#36726](https://github.com/moby/moby/pull/36726) * Make internal/test/daemon.Daemon swarm aware. [moby/moby#36826](https://github.com/moby/moby/pull/36826) -### 18.04.0-ce +## 18.04.0-ce 2018-04-10 #### Builder @@ -2152,7 +2112,7 @@ Upgrading from Docker 1.13.1 to 17.03.0 is expected to be simple and low-risk. - Fix agent logging race. [docker/swarmkit#2578](https://github.com/docker/swarmkit/pull/2578) * Adding logic to restore networks in order. [docker/swarmkit#2571](https://github.com/docker/swarmkit/pull/2571) -### 18.02.0-ce +## 18.02.0-ce 2018-02-07 #### Builder @@ -2218,7 +2178,7 @@ Upgrading from Docker 1.13.1 to 17.03.0 is expected to be simple and low-risk. * Update runc to fix hang during start and exec [moby/moby#36097](https://github.com/moby/moby/pull/36097) - Fix "--node-generic-resource" singular/plural [moby/moby#36125](https://github.com/moby/moby/pull/36125) -### 18.01.0-ce +## 18.01.0-ce 2018-01-10 #### Builder @@ -2276,7 +2236,7 @@ Upgrading from Docker 1.13.1 to 17.03.0 is expected to be simple and low-risk. - Fix published ports not being updated if a service has the same number of host-mode published ports with Published Port 0 [docker/swarmkit#2376](https://github.com/docker/swarmkit/pull/2376) * Make the task termination order deterministic [docker/swarmkit#2265](https://github.com/docker/swarmkit/pull/2265) -### 17.11.0-ce +## 17.11.0-ce 2017-11-20 > **Important**: Docker CE 17.11 is the first Docker release based on @@ -2349,7 +2309,7 @@ running, un-managed, on the system. + Build packages for Debian 10 (Buster) [docker/docker-ce-packaging#50](https://github.com/docker/docker-ce-packaging/pull/50) + Build packages for Ubuntu 17.10 (Artful) [docker/docker-ce-packaging#55](https://github.com/docker/docker-ce-packaging/pull/55) -### 17.10.0-ce +## 17.10.0-ce 2017-10-17 > **Important**: Starting with this release, `docker service create`, `docker service update`, @@ -2399,7 +2359,7 @@ use `--detach` to keep the old behaviour. - Do not filter nodes if logdriver is set to `none` [docker/swarmkit#2396](https://github.com/docker/swarmkit/pull/2396) + Adding ipam options to ipam driver requests [docker/swarmkit#2324](https://github.com/docker/swarmkit/pull/2324) -### 17.07.0-ce +## 17.07.0-ce 2017-08-29 #### API & Client @@ -2462,7 +2422,7 @@ use `--detach` to keep the old behaviour. * Fix error during service creation if a network with the same name exists both as "local" and "swarm" scoped network [docker/cli#184](https://github.com/docker/cli/pull/184) * (experimental) Add support for plugins on swarm [moby/moby#33575](https://github.com/moby/moby/pull/33575) -### 17.05.0-ce +## 17.05.0-ce 2017-05-04 #### Builder @@ -2549,7 +2509,7 @@ use `--detach` to keep the old behaviour. - Deprecate `--api-enable-cors` daemon flag. This flag was marked deprecated in Docker 1.6.0 but not listed in deprecated features [#32352](https://github.com/docker/docker/pull/32352) - Remove Ubuntu 12.04 (Precise Pangolin) as supported platform. Ubuntu 12.04 is EOL, and no longer receives updates [#32520](https://github.com/docker/docker/pull/32520) -### 17.04.0-ce +## 17.04.0-ce 2017-04-05 #### Builder diff --git a/engine/security/https.md b/engine/security/https.md index 18376b4a93..0e8bdd4d3d 100644 --- a/engine/security/https.md +++ b/engine/security/https.md @@ -102,7 +102,7 @@ Docker clients. For client authentication, create a client key and certificate signing request: -> **Note:** for simplicity of the next couple of steps, you may perform this +> **Note**: for simplicity of the next couple of steps, you may perform this > step on the Docker daemon's host machine as well. $ openssl genrsa -out key.pem 4096 diff --git a/engine/security/https/README.md b/engine/security/https/README.md index 41e9fe22ea..8db187c76b 100644 --- a/engine/security/https/README.md +++ b/engine/security/https/README.md @@ -16,7 +16,7 @@ My process is as following: lots of things to see and manually answer, as openssl wants to be interactive -**NOTE:** make sure you enter the hostname (`boot2docker` in my case) when prompted for `Computer Name`) +> **Note**: make sure you enter the hostname (`boot2docker` in my case) when prompted for `Computer Name`) root@boot2docker:/# sudo make run diff --git a/engine/swarm/join-nodes.md b/engine/swarm/join-nodes.md index f5d8a267d1..3c9e216bfb 100644 --- a/engine/swarm/join-nodes.md +++ b/engine/swarm/join-nodes.md @@ -26,7 +26,7 @@ the `docker swarm join` command. The node only uses the token at join time. If you subsequently rotate the token, it doesn't affect existing swarm nodes. Refer to [Run Docker Engine in swarm mode](swarm-mode.md#view-the-join-command-or-update-a-swarm-join-token). -**NOTE:** Docker engine allows a non-FIPS node to join a FIPS-enabled swarm cluster. +> **Note**: Docker engine allows a non-FIPS node to join a FIPS-enabled swarm cluster. While a mixed FIPS environment makes upgrading or changing status easier, Docker recommends not running a mixed FIPS environment in production. diff --git a/engine/swarm/networking.md b/engine/swarm/networking.md index 615021621c..2b1e07109d 100644 --- a/engine/swarm/networking.md +++ b/engine/swarm/networking.md @@ -208,7 +208,7 @@ Multiple pools can be configured if discontiguous address space is required. How The default mask length can be configured and is the same for all networks. It is set to `/24` by default. To change the default subnet mask length, use the `--default-addr-pool-mask-length` command line option. -**NOTE:** Default address pools can only be configured on `swarm init` and cannot be altered after cluster creation. +> **Note**: Default address pools can only be configured on `swarm init` and cannot be altered after cluster creation. ##### Overlay network size limitations diff --git a/get-started/part3.md b/get-started/part3.md index c9baf3cc60..28ec86e5ca 100644 --- a/get-started/part3.md +++ b/get-started/part3.md @@ -143,18 +143,28 @@ named it the same as shown in this example, the name is `getstartedlab_web`. The service ID is listed as well, along with the number of replicas, image name, and exposed ports. +Alternatively, you can run `docker stack services`, followed by the name of +your stack. The following example command lets you view all services associated with the +`getstartedlab` stack: + +```bash +docker stack services getstartedlab +ID NAME MODE REPLICAS IMAGE PORTS +bqpve1djnk0x getstartedlab_web replicated 5/5 username/repo:tag *:4000->80/tcp +``` + A single container running in a service is called a **task**. Tasks are given unique IDs that numerically increment, up to the number of `replicas` you defined in `docker-compose.yml`. List the tasks for your service: -```shell +```bash docker service ps getstartedlab_web ``` Tasks also show up if you just list all the containers on your system, though that is not filtered by service: -```shell +```bash docker container ls -q ``` @@ -168,6 +178,18 @@ load-balancing; with each request, one of the 5 tasks is chosen, in a round-robin fashion, to respond. The container IDs match your output from the previous command (`docker container ls -q`). +To view all tasks of a stack, you can run `docker stack ps` followed by your app name, as shown in the following example: + +```bash +docker stack ps getstartedlab +ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS +uwiaw67sc0eh getstartedlab_web.1 username/repo:tag docker-desktop Running Running 9 minutes ago +sk50xbhmcae7 getstartedlab_web.2 username/repo:tag docker-desktop Running Running 9 minutes ago +c4uuw5i6h02j getstartedlab_web.3 username/repo:tag docker-desktop Running Running 9 minutes ago +0dyb70ixu25s getstartedlab_web.4 username/repo:tag docker-desktop Running Running 9 minutes ago +aocrb88ap8b0 getstartedlab_web.5 username/repo:tag docker-desktop Running Running 9 minutes ago +``` + > Running Windows 10? > > Windows 10 PowerShell should already have `curl` available, but if not you can diff --git a/install/linux/docker-ce/ubuntu.md b/install/linux/docker-ce/ubuntu.md index 9e99ff9945..60fdaccc0f 100644 --- a/install/linux/docker-ce/ubuntu.md +++ b/install/linux/docker-ce/ubuntu.md @@ -56,7 +56,7 @@ networks, are preserved. The Docker CE package is now called `docker-ce`. ### Supported storage drivers Docker CE on Ubuntu supports `overlay2`, `aufs` and `btrfs` storage drivers. -> *** Note: *** In Docker Engine - Enterprise, `btrfs` is only supported on SLES. See the documentation on +> **Note**: In Docker Engine - Enterprise, `btrfs` is only supported on SLES. See the documentation on > [btrfs](/engine/userguide/storagedriver/btrfs-driver.md) for more details. For new installations on version 4 and higher of the Linux kernel, `overlay2` diff --git a/install/linux/docker-ee/rhel.md b/install/linux/docker-ee/rhel.md index c182de5aaf..cfb50d1242 100644 --- a/install/linux/docker-ee/rhel.md +++ b/install/linux/docker-ee/rhel.md @@ -57,7 +57,7 @@ $ cat /proc/sys/crypto/fips_enabled 1 ``` -> ***NOTE:*** FIPS is only supported in the Docker Engine EE. UCP and DTR currently do not have support for FIPS-140-2. +> **Note**: FIPS is only supported in the Docker Engine EE. UCP and DTR currently do not have support for FIPS-140-2. To enable FIPS 140-2 compliance on a system that is not in FIPS 140-2 mode, do the following: diff --git a/install/linux/docker-ee/suse.md b/install/linux/docker-ee/suse.md index dc3ecafe5f..be83f8218f 100644 --- a/install/linux/docker-ee/suse.md +++ b/install/linux/docker-ee/suse.md @@ -164,7 +164,7 @@ Before you install Docker EE for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker EE from the repository. -> ***NOTE:*** If you need to run Docker EE 2.0, please see the following instructions: +> **Note**: If you need to run Docker EE 2.0, please see the following instructions: > * [18.03](https://docs.docker.com/v18.03/ee/supported-platforms/) - Older Docker EE Engine only release > * [17.06](https://docs.docker.com/v17.06/engine/installation/) - Docker Enterprise Edition 2.0 (Docker Engine, > UCP, and DTR). diff --git a/install/linux/docker-ee/ubuntu.md b/install/linux/docker-ee/ubuntu.md index e46af2efd9..979220fc50 100644 --- a/install/linux/docker-ee/ubuntu.md +++ b/install/linux/docker-ee/ubuntu.md @@ -137,7 +137,7 @@ from the repository. 4. Temporarily add a `$DOCKER_EE_VERSION` variable into your environment. - > ***NOTE:*** If you need to run something other than Docker EE 2.0, please see the following instructions: + > **Note**: If you need to run something other than Docker EE 2.0, please see the following instructions: > * [18.03](https://docs.docker.com/v18.03/ee/supported-platforms/) - Older Docker EE Engine only release > * [17.06](https://docs.docker.com/v17.06/engine/installation/) - Docker Enterprise Edition 2.0 (Docker Engine, > UCP, and DTR). diff --git a/install/windows/docker-ee.md b/install/windows/docker-ee.md index d300eb586e..31f53e3abb 100644 --- a/install/windows/docker-ee.md +++ b/install/windows/docker-ee.md @@ -14,28 +14,32 @@ Docker Engine - Enterprise enables native Docker containers on Windows Server. W > Release notes > -> [Release notes for all versions](/release-notes/) +> [Release notes for all versions](/engine/release-notes/) ## System requirements -Windows OS requirements around specific CPU and RAM requirements also need to be met as specified -in the [Windows Server Requirements](https://docs.microsoft.com/en-us/windows-server/get-started/system-requirements). -This provides information for specific CPU and memory specs and capabilities (instruction sets like CMPXCHG16b, -LAHF/SAHF, and PrefetchW, security: DEP/NX, etc.). +Windows OS requirements around specific CPU and RAM requirements also need to be +met as specified in the [Windows Server +Requirements](https://docs.microsoft.com/en-us/windows-server/get-started/system-requirements). +This provides information for specific CPU and memory specs and capabilities +(instruction sets like CMPXCHG16b, LAHF/SAHF, and PrefetchW, security: DEP/NX, +etc.). -* OS Versions: Server 2016 (Core and GUI), 1709 and 1803 +* OS Versions: + - Long Term Service Channel (LTSC) - 2016 and 2019 (Core and GUI) + - Semi-annual Channel (SAC) - 1709, 1803 and 1809 * RAM: 4GB -* Disk space: [32 GB minimum recommendation for Windows](https://docs.microsoft.com/en-us/windows-server/get-started/system - requirements). An additional 32 GB of Space is recommended for base images for ServerCore and NanoServer along with buffer - space for workload containers running IIS, SQL Server and .Net apps. +* Disk space: [32 GB minimum recommendation for Windows](https://docs.microsoft.com/en-us/windows-server/get-started/system-requirements). +Docker recommends an additional 32 GB of space for base images for ServerCore +and NanoServer along with buffer space for workload containers running IIS, SQL Server and .Net apps. + ## Install Docker Engine - Enterprise -Docker Engine - Enterprise requires Windows Server 2016, 1703, or 1803. See -[What to know before you install](#what-to-know-before-you-install) for a -full list of prerequisites. +To install the Docker Engine - Enterprise on your hosts, Docker provides a +[OneGet](https://github.com/oneget/oneget) PowerShell Module. -1. Open a PowerShell command prompt, and type the following commands. +1. Open an elevated PowerShell command prompt, and type the following commands. ```powershell Install-Module DockerMsftProvider -Force @@ -87,19 +91,28 @@ Select option `6) Download and Install Updates`. ### FIPS 140-2 cryptographic module support -[Federal Information Processing Standards (FIPS) Publication 140-2](https://csrc.nist.gov/csrc/media/publications/fips/140/2/final/documents/fips1402.pdf) is a United States Federal security requirement for cryptographic modules. +[Federal Information Processing Standards (FIPS) Publication +140-2](https://csrc.nist.gov/csrc/media/publications/fips/140/2/final/documents/fips1402.pdf) +is a United States Federal security requirement for cryptographic modules. -With Docker EE Basic license for versions 18.09 and later, Docker provides FIPS 140-2 support in Windows Server 2016. This includes a FIPS supported cryptographic module. If the Windows implementation already has FIPS support enabled, FIPS is automatically enabled in the Docker engine. +With Docker EE Basic license for versions 18.09 and later, Docker provides FIPS +140-2 support in Windows Server. This includes a FIPS supported cryptographic +module. If the Windows implementation already has FIPS support enabled, FIPS is +automatically enabled in the Docker engine. -**NOTE:** FIPS 140-2 is only supported in the Docker EE engine. UCP and DTR currently do not have support for FIPS 140-2. -To enable FIPS 140-2 compliance on a system that is not in FIPS 140-2 mode, execute the following command in PowerShell: +> **Note**: FIPS 140-2 is only supported in the Docker EE engine. UCP and DTR currently do not have support for FIPS 140-2. + +To enable FIPS 140-2 compliance on a system that is not in FIPS 140-2 mode, +execute the following command in PowerShell: ```powershell [System.Environment]::SetEnvironmentVariable("DOCKER_FIPS", "1", "Machine") ``` -FIPS 140-2 mode may also be enabled via the Windows Registry. To update the pertinent registry key, execute the following PowerShell command as an Administrator: +FIPS 140-2 mode may also be enabled via the Windows Registry. To update the +pertinent registry key, execute the following PowerShell command as an +Administrator: ```powershell Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy\" -Name "Enabled" -Value "1" @@ -119,12 +132,12 @@ Labels: com.docker.security.fips=enabled ``` -**NOTE:** If the system has the FIPS-140-2 cryptographic module installed on the operating system, it is possible to disable FIPS-140-2 compliance. To disable FIPS-140-2 in Docker but not the operating system, set the value `"DOCKER_FIPS","0"` in the `[System.Environment]`.` +> **Note**: If the system has the FIPS-140-2 cryptographic module installed on the operating system, it is possible to disable FIPS-140-2 compliance. To disable FIPS-140-2 in Docker but not the operating system, set the value `"DOCKER_FIPS","0"` in the `[System.Environment]`.` ## Use a script to install Docker EE -Use the following steps when you want to install manually, script automated -installs, or install on air-gapped systems. +Use the following guide if you wanted to install the Docker Engine - Enterprise +manually, via a script, or on air-gapped systems. 1. In a PowerShell command prompt, download the installer archive on a machine that has a connection. @@ -192,7 +205,8 @@ Docker {{ site.docker_ee_version }} Docker ### Updating the DockerMsftProvider -Installing specific Docker EE versions may require an update to previously installed DockerMsftProvider modules. To update: +Installing specific Docker EE versions may require an update to previously +installed DockerMsftProvider modules. To update: ```powershell Update-Module DockerMsftProvider @@ -202,16 +216,19 @@ Then open a new PowerShell session for the update to take effect. ## Update Docker Engine - Enterprise -To update Docker Engine - Enterprise to the most recent release, specify the `-RequiredVersion` and `-Update` flags: +To update Docker Engine - Enterprise to the most recent release, specify the +`-RequiredVersion` and `-Update` flags: ```powershell Install-Package -Name docker -ProviderName DockerMsftProvider -RequiredVersion {{ site.docker_ee_version }} -Update -Force ``` -The required version must match any of the versions available in this json file: https://dockermsft.blob.core.windows.net/dockercontainer/DockerMsftIndex.json +The required version number must match a versions available on the [JSON +index](https://dockermsft.blob.core.windows.net/dockercontainer/DockerMsftIndex.json) ## Uninstall Docker EE - Use the following commands to completely remove the Docker Engine - Enterprise from a Windows Server: + Use the following commands to completely remove the Docker Engine - Enterprise + from a Windows Server: 1. Leave any active Docker Swarm @@ -245,20 +262,11 @@ The required version must match any of the versions available in this json file: Remove-Item -Path "C:\ProgramData\Docker" -Recurse -Force ``` -## Preparing a Docker EE Engine for use with UCP +## Preparing a Windows Host for use with UCP -Run the -[UCP installation script for Windows](/ee/ucp/admin/configure/join-nodes/join-windows-nodes-to-cluster/#run-the-windows-node-setup-script). - -Start the Docker service: - -```powershell -Start-Service Docker -``` - -* **What the Docker Engine - Enterprise install includes**: The installation -provides [Docker Engine](/engine/userguide/intro.md) and the -[Docker CLI client](/engine/reference/commandline/cli.md). +To add a Windows Server host to an existing Universal Control Plane cluster +please follow the list of [prerequisites and joining +instructions](/ee/ucp/admin/configure/join-nodes/join-windows-nodes-to-cluster/#run-the-windows-node-setup-script). ## About Docker Engine - Enterprise containers and Windows Server @@ -269,9 +277,6 @@ provides a tutorial on how to set up and run Windows containers on Windows 10 or Windows Server 2016. It shows you how to use a MusicStore application with Windows containers. -* [Setup - Windows Server 2016 (Lab)](https://github.com/docker/labs/blob/master/windows/windows-containers/Setup-Server2016.md) -describes environment setup in detail. - * Docker Container Platform for Windows Server [articles and blog posts](https://www.docker.com/microsoft/) on the Docker website. diff --git a/machine/drivers/azure.md b/machine/drivers/azure.md index 9c6f211507..3c7af9a01c 100644 --- a/machine/drivers/azure.md +++ b/machine/drivers/azure.md @@ -7,7 +7,7 @@ title: Microsoft Azure You need an Azure Subscription to use this Docker Machine driver. [Sign up for a free trial.][trial] -> **NOTE:** This documentation is for the new version of the Azure driver, which started +> **Note**: This documentation is for the new version of the Azure driver, which started > shipping with v0.7.0. This driver is not backwards-compatible with the old > Azure driver. If you want to continue managing your existing Azure machines, please > download and use machine versions prior to v0.7.0. diff --git a/network/overlay.md b/network/overlay.md index c3e75a04d7..18d555de08 100644 --- a/network/overlay.md +++ b/network/overlay.md @@ -230,7 +230,7 @@ preferred because it is somewhat self-documenting. -p 8080:80/tcp -p 8080:80/udp or
-p published=8080,target=80,protocol=tcp -p published=8080,target=80,protocol=udp -Map TCP port 80 on the service to TCP port 8080 on the routing mesh, and map UDP port 80 on the service to UDP port 8080 on the routine mesh. +Map TCP port 80 on the service to TCP port 8080 on the routing mesh, and map UDP port 80 on the service to UDP port 8080 on the routing mesh. diff --git a/reference/dtr/2.6/api/dtr-swagger-2.6.json b/reference/dtr/2.6/api/dtr-swagger-2.6.json new file mode 100644 index 0000000000..0958f472c0 --- /dev/null +++ b/reference/dtr/2.6/api/dtr-swagger-2.6.json @@ -0,0 +1,9957 @@ +{ + "swagger": "2.0", + "info": { + "title": "Docker Trusted Registry", + "version": "2.6.0-tp9" + }, + "paths": { + "/api/v0/accounts/language": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "Get the chosen language", + "operationId": "GetLanguage", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Language" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Language" + } + } + } + } + }, + "/api/v0/accounts/{namespace}": { + "delete": { + "description": "\n\t*Authorization:* Client must be authenticated as a system admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "Removes a user or organization along with all repositories", + "operationId": "DeleteNamespace", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + } + ], + "responses": { + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/accounts/{namespace}/repositories": { + "delete": { + "description": "\n\t*Authorization:* Client must be authenticated as a system admin, organization admin or user in question\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "Removes all of a user or organization's repositories", + "operationId": "DeleteNamespaceRepositories", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + } + ], + "responses": { + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/accounts/{namespace}/webhooks": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "List the webhook subscriptions for a namespace", + "operationId": "ListNamespaceWebhooks", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + } + } + } + }, + "/api/v0/accounts/{orgname}/teams/{teamname}/repositoryAccess": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who owns the organization the team is in or be a member of that team.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "List repository access grants for a team", + "operationId": "ListTeamRepoAccess", + "parameters": [ + { + "type": "string", + "description": "organization account name", + "name": "orgname", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "teamname", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListTeamRepoAccess" + } + }, + "400": { + "description": "the team does not belong to the organization" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TEAM: A team with the given name does not exist in the organization." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListTeamRepoAccess" + } + } + } + } + }, + "/api/v0/accounts/{username}/repositoryAccess/{namespace}/{reponame}": { + "get": { + "description": "\n\t*Authorization:* Client must be authenticated either as the user in question or be a system admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "Check a user's access to a repository", + "operationId": "GetUserRepoAccess", + "parameters": [ + { + "type": "string", + "description": "user account name", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.RepoUserAccess" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.RepoUserAccess" + } + } + } + } + }, + "/api/v0/accounts/{username}/settings": { + "get": { + "description": "\n*Authorization:* Client must be authenticated either as the user in question or be a system admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "Check a user's settings", + "operationId": "GetUserSettings", + "parameters": [ + { + "type": "string", + "description": "user account name", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.UserSettings" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_USER: A user with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.UserSettings" + } + } + } + }, + "patch": { + "description": "\n*Authorization:* Client must be authenticated either as the user in question or be a system admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "accounts" + ], + "summary": "Update a user's settings", + "operationId": "UpdateUserSettings", + "parameters": [ + { + "type": "string", + "description": "user account name", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UserSettings" + } + } + ], + "responses": { + "200": { + "description": "Successfully updated user settings." + }, + "400": { + "description": "INVALID_USER_SETTINGS: The submitted user settings change request contains invalid values." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_USER: A user with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully updated user settings." + } + } + } + }, + "/api/v0/action_configs": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "action_configs" + ], + "summary": "List all action configs", + "operationId": "ListActionConfigs", + "responses": { + "200": { + "description": "Success, list of action configs returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.ActionConfigs" + } + }, + "default": { + "description": "Success, list of action configs returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.ActionConfigs" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "action_configs" + ], + "summary": "Configure actions", + "operationId": "UpdateActionConfig", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tmpforms.ActionConfigCreate" + } + } + ], + "responses": { + "202": { + "description": "Success.", + "schema": { + "$ref": "#/definitions/tmpresponses.ActionConfig" + } + } + } + } + }, + "/api/v0/action_configs/{action}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "action_configs" + ], + "summary": "Get info about the actionConfig with the given action", + "operationId": "GetActionConfig", + "parameters": [ + { + "type": "string", + "description": "name of action to fetch the config for", + "name": "action", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Success, action config info returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.ActionConfig" + } + }, + "default": { + "description": "Success, action config info returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.ActionConfig" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "action_configs" + ], + "summary": "Delete the action config. The defaults will be used.", + "operationId": "DeleteActionConfig", + "parameters": [ + { + "type": "string", + "description": "the name of the action to delete the config for", + "name": "action", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "Success, action config has been deleted." + } + } + } + }, + "/api/v0/api_tokens": { + "get": { + "description": "listUserAPITokensHandler", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "API_tokens" + ], + "summary": "Get all API tokens associated with user. Get all tokens if no user is not specified", + "operationId": "GetAllAPITokensByUser", + "parameters": [ + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "string", + "description": "Limit the API token results to a specific user", + "name": "username", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved API tokens", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.APIToken" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_USER: A user with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved API tokens", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.APIToken" + } + } + } + } + }, + "post": { + "description": "createAPITokenHandler", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "API_tokens" + ], + "summary": "Create a new API token", + "operationId": "CreateAnAPIToken", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreateAPIToken" + } + }, + { + "type": "string", + "description": "Limit the API token results to a specific user", + "name": "username", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully created API token", + "schema": { + "$ref": "#/definitions/responses.NewAPIToken" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully created API token", + "schema": { + "$ref": "#/definitions/responses.NewAPIToken" + } + } + } + }, + "delete": { + "description": "cleanupAPITokenHleanupHandler", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "API_tokens" + ], + "summary": "Mass deletion of API tokens from database based on user, time created, and/or generation method", + "operationId": "APITokenCleanup", + "parameters": [ + { + "type": "string", + "description": "Limit the API token results to a specific user", + "name": "username", + "in": "query" + }, + { + "type": "string", + "description": "The date on which the token was last used", + "name": "usedbefore", + "in": "query" + }, + { + "type": "string", + "default": "auto", + "description": "The method by which the token was created", + "name": "generatedby", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully cleaned up API tokens" + }, + "400": { + "description": "INVALID_PARAMETERS: Unable to parse query parameters" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_USER: A user with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully cleaned up API tokens" + } + } + } + }, + "/api/v0/api_tokens/{hashedtoken}": { + "get": { + "description": "getAPITokenHandler", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "API_tokens" + ], + "summary": "Get an API token's information based on it's token id", + "operationId": "GetAnAPIToken", + "parameters": [ + { + "type": "string", + "description": "API token id", + "name": "hashedtoken", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Successfully retrieved API token", + "schema": { + "$ref": "#/definitions/responses.APIToken" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_API_TOKEN: An API token with the id name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved API token", + "schema": { + "$ref": "#/definitions/responses.APIToken" + } + } + } + }, + "delete": { + "description": "deleteAPITokenHandler", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "API_tokens" + ], + "summary": "Delete a specific API token", + "operationId": "DeleteAnAPIToken", + "parameters": [ + { + "type": "string", + "description": "API token id", + "name": "hashedtoken", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Successfully deleted API token" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_API_TOKEN: An API token with the id name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully deleted API token" + } + } + }, + "patch": { + "description": "updateAPITokenHandler", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "API_tokens" + ], + "summary": "Update information about a specific API token", + "operationId": "UpdateAnAPIToken", + "parameters": [ + { + "type": "string", + "description": "API token id", + "name": "hashedtoken", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UpdateAPIToken" + } + } + ], + "responses": { + "200": { + "description": "Successfully updated API tokens", + "schema": { + "$ref": "#/definitions/responses.APIToken" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_API_TOKEN: An API token with the id name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully updated API tokens", + "schema": { + "$ref": "#/definitions/responses.APIToken" + } + } + } + } + }, + "/api/v0/content_caches": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as any active user in the system.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "content_caches" + ], + "summary": "List all content caches", + "operationId": "ListContentCaches", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ContentCache" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ContentCache" + } + } + } + } + }, + "post": { + "description": "\n*Authorization:* Client must be authenticated an admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "content_caches" + ], + "summary": "Create content cache", + "operationId": "CreateContentCache", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreateContentCache" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.ContentCache" + } + }, + "400": { + "description": "invalid content cache details" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/content_caches/{contentcacheuuid}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as any active user in the system.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "content_caches" + ], + "summary": "View details of a content cache", + "operationId": "GetContentCache", + "parameters": [ + { + "type": "string", + "description": "uuid of content cache", + "name": "contentcacheuuid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ContentCache" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_CONTENT_CACHE: A content cache with the given uuid does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ContentCache" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated an admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "content_caches" + ], + "summary": "Remove a content cache", + "operationId": "DeleteContentCache", + "parameters": [ + { + "type": "string", + "description": "uuid of content cache", + "name": "contentcacheuuid", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or content cache does not exist" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_CONTENT_CACHE: A content cache with the given uuid does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/crons": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "crons" + ], + "summary": "List all crons", + "operationId": "ListCrons", + "responses": { + "200": { + "description": "Success, list of crons returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Crons" + } + }, + "default": { + "description": "Success, list of crons returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Crons" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "crons" + ], + "summary": "Create / update a periodic task", + "operationId": "UpdateCron", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tmpforms.CronCreate" + } + } + ], + "responses": { + "202": { + "description": "Success.", + "schema": { + "$ref": "#/definitions/tmpresponses.Cron" + } + } + } + } + }, + "/api/v0/crons/{action}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "crons" + ], + "summary": "Get info about the cron with the given action", + "operationId": "GetCron", + "parameters": [ + { + "type": "string", + "description": "action of the cron to fetch", + "name": "action", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Success, cron info returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Cron" + } + }, + "default": { + "description": "Success, cron info returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Cron" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "crons" + ], + "summary": "Delete the cron. Jobs created from it will not be canceled.", + "operationId": "DeleteCron", + "parameters": [ + { + "type": "string", + "description": "action of cron to delete", + "name": "action", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "Success, cron has been deleted." + } + } + } + }, + "/api/v0/events": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "events" + ], + "summary": "Get Events", + "operationId": "GetEvents", + "parameters": [ + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "string", + "name": "publishedBefore", + "in": "query" + }, + { + "type": "string", + "name": "publishedAfter", + "in": "query" + }, + { + "type": "string", + "description": "UUID of the user or organization that performed the event", + "name": "actorId", + "in": "query" + }, + { + "type": "string", + "description": "Type of events to filter by", + "name": "eventType", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Events" + } + }, + "400": { + "description": "INVALID_PARAMETERS: Unable to parse query parameters" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Events" + } + } + } + } + }, + "/api/v0/imagescan/layeroverride": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Gets a list of all the available overrides", + "operationId": "GetLayerVulnOverrides", + "responses": { + "200": { + "description": "Successfully set vulnerability override", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.LayerVulnOverride" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "500": { + "description": "INTERNAL_ERROR: An internal server error occurred. Contact a system administrator for more information." + }, + "default": { + "description": "Successfully set vulnerability override", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.LayerVulnOverride" + } + } + } + } + } + }, + "/api/v0/imagescan/layeroverride/{layerid}": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Sets a vulnerability override for the given layer", + "operationId": "SetLayerVulnOverride", + "parameters": [ + { + "type": "string", + "description": "layer id", + "name": "layerid", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.VulnOverrideOption" + } + } + ], + "responses": { + "200": { + "description": "Successfully set vulnerability override" + }, + "400": { + "description": "INVALID_SETTINGS: The submitted settings change request contains invalid values." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_LAYER: A layer with the given sha does not exist in the repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "500": { + "description": "INTERNAL_ERROR: An internal server error occurred. Contact a system administrator for more information." + }, + "default": { + "description": "Successfully set vulnerability override" + } + } + } + }, + "/api/v0/imagescan/layeroverride/{vulnerabilityid}": { + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Deletes a layer vulnerability override", + "operationId": "DeleteLayerVulnOverride", + "parameters": [ + { + "type": "string", + "description": "vulnerability id", + "name": "vulnerabilityid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_LAYER: A layer with the given sha does not exist in the repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK" + } + } + } + }, + "/api/v0/imagescan/repositories/{namespace}/{reponame}/{tag}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Deprecated use /scansummary/repositories/{namespace}/{reponame}/{tag}", + "operationId": "GetSummaryByManifestDigest", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name", + "name": "tag", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include detailed summary results", + "name": "detailed", + "in": "query" + }, + { + "type": "string", + "description": "Operating system of the tag", + "name": "os", + "in": "query" + }, + { + "type": "string", + "description": "Architecture of the tag", + "name": "arch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved summary.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.OldScanSummary" + } + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved summary.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.OldScanSummary" + } + } + } + } + } + }, + "/api/v0/imagescan/scan": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Do a scan or a scan/check of all layers", + "operationId": "ScanAllLayers", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.ScanOptions" + } + } + ], + "responses": { + "200": { + "description": "Successfully submitted all layers to jobrunner for scan/check." + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully submitted all layers to jobrunner for scan/check." + } + } + } + }, + "/api/v0/imagescan/scan/update": { + "put": { + "consumes": [ + "multipart/form-data", + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Update the vulnerability database for security scanning", + "operationId": "UpdateVulnDB", + "parameters": [ + { + "type": "file", + "description": "Upload file to init database", + "name": "file", + "in": "formData" + }, + { + "type": "boolean", + "default": false, + "description": "Init or update vuln db in online mode.", + "name": "online", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully started to updated vulnerability DB." + }, + "400": { + "description": "SCANNING_DB_NOT_READY: Scanning DB is not ready" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully started to updated vulnerability DB." + } + } + } + }, + "/api/v0/imagescan/scan/{namespace}/{reponame}/{tag}/{os}/{arch}": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Do a scan or a scan/check of given image", + "operationId": "ScanImage", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name", + "name": "tag", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "operating system of the tag", + "name": "os", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "architecture of the tag", + "name": "arch", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Successfully submitted image to jobrunner for scan/check." + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully submitted image to jobrunner for scan/check." + } + } + } + }, + "/api/v0/imagescan/scansummary/component/{component}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the image by component", + "operationId": "GetScannedImageByComponent", + "parameters": [ + { + "type": "string", + "description": "component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include scan status summary results", + "name": "scanstatus", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + } + } + } + }, + "/api/v0/imagescan/scansummary/cve/{cve}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the image by CVE", + "operationId": "GetScannedImageByCVE", + "parameters": [ + { + "type": "string", + "description": "cve", + "name": "cve", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include scan status summary results", + "name": "scanstatus", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + } + } + } + }, + "/api/v0/imagescan/scansummary/layer/{layerid}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the image by layer sha", + "operationId": "GetScannedImageByLayer", + "parameters": [ + { + "type": "string", + "description": "layer id", + "name": "layerid", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include scan status summary results", + "name": "scanstatus", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_LAYER: A layer with the given sha does not exist in the repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + } + } + } + }, + "/api/v0/imagescan/scansummary/license/{license}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the image by license", + "operationId": "GetScannedImageByLicense", + "parameters": [ + { + "type": "string", + "description": "license", + "name": "license", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include scan status summary results", + "name": "scanstatus", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved images", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + } + } + } + }, + "/api/v0/imagescan/scansummary/repositories/{namespace}/{reponame}/{reference}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the scan summary info on a namespace/repo:tag or namespace/repo@digest", + "operationId": "GetScanSummary", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "digest or tag for an image manifest", + "name": "reference", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include scan status summary results", + "name": "scanstatus", + "in": "query" + }, + { + "type": "string", + "description": "Operating system of the tag", + "name": "os", + "in": "query" + }, + { + "type": "string", + "description": "Architecture of the tag", + "name": "arch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved summary.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_REF: A ref with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved summary.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ScanSummary" + } + } + } + } + } + }, + "/api/v0/imagescan/scansummary/repositories/{namespace}/{reponame}/{tag}/export": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "text/csv", + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the scan summary info on a namespace/repo:tag as a file", + "operationId": "ExportScanSummary", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name", + "name": "tag", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include scan status summary results", + "name": "scanstatus", + "in": "query" + }, + { + "type": "string", + "description": "Operating system of the tag", + "name": "os", + "in": "query" + }, + { + "type": "string", + "description": "Architecture of the tag", + "name": "arch", + "in": "query" + }, + { + "type": "string", + "description": "Scan summary exported filetype", + "name": "Accept", + "in": "header" + } + ], + "responses": { + "400": { + "description": "INVALID_PARAMETERS: Unable to parse query parameters" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/imagescan/scansummary/tags": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get a list of scan summaries", + "operationId": "GetScanSummaries", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.ImagesForm" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved summary.", + "schema": { + "$ref": "#/definitions/responses.ThinScanSummaries" + } + }, + "400": { + "description": "INVALID_PARAMETERS: Unable to parse query parameters" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved summary.", + "schema": { + "$ref": "#/definitions/responses.ThinScanSummaries" + } + } + } + } + }, + "/api/v0/imagescan/status": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "imagescan" + ], + "summary": "Get the status and version of scanning service", + "operationId": "GetNautilusDBStatus", + "responses": { + "200": { + "description": "Successfully retrieved DB status", + "schema": { + "$ref": "#/definitions/responses.NautilusStatus" + } + }, + "400": { + "description": "SCANNING_NOT_ENABLED: Scanning is not enabled" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully retrieved DB status", + "schema": { + "$ref": "#/definitions/responses.NautilusStatus" + } + } + } + } + }, + "/api/v0/index/autocomplete": { + "get": { + "description": "\nRepository results will be filtered to only those repositories visible to the client. Account results will not be filtered.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "index" + ], + "summary": "Autocompletion for repositories and/or accounts", + "operationId": "Autocomplete", + "parameters": [ + { + "type": "string", + "description": "Autocomplete query", + "name": "query", + "in": "query", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include repositories in the response", + "name": "includeRepositories", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to include accounts in the response", + "name": "includeAccounts", + "in": "query" + }, + { + "type": "string", + "description": "Exact repository namespace to limit results to.", + "name": "namespace", + "in": "query" + }, + { + "type": "number", + "default": 25, + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Autocomplete" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Autocomplete" + } + } + } + } + }, + "/api/v0/index/dockersearch": { + "get": { + "description": "\nThis is used for the Docker CLI's docker search command. Repository results will be filtered to only those repositories visible to the client.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "index" + ], + "summary": "Search Docker repositories", + "operationId": "Docker Search", + "parameters": [ + { + "type": "string", + "description": "Search query", + "name": "q", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.DockerSearch" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.DockerSearch" + } + } + } + } + }, + "/api/v0/jobs": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "jobs" + ], + "summary": "List all jobs ordered by most recently scheduled", + "operationId": "ListJobs", + "parameters": [ + { + "type": "string", + "default": "any", + "description": "Filter jobs by action.", + "name": "action", + "in": "query" + }, + { + "type": "string", + "default": "any", + "description": "Filter jobs by worker ID.", + "name": "worker", + "in": "query" + }, + { + "type": "string", + "default": "any", + "description": "Show only jobs that are running.", + "name": "running", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Return most recently scheduled jobs starting from this offset index.", + "name": "start", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of jobs per page of results.", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Success, list of jobs returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Jobs" + } + }, + "default": { + "description": "Success, list of jobs returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Jobs" + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "jobs" + ], + "summary": "Schedule a job to be run immediately", + "operationId": "CreateJob", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tmpforms.JobSubmission" + } + } + ], + "responses": { + "202": { + "description": "Success, job waiting to be claimed.", + "schema": { + "$ref": "#/definitions/tmpresponses.Job" + } + } + } + } + }, + "/api/v0/jobs/{jobID}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "jobs" + ], + "summary": "Get info about the job with the given ID", + "operationId": "GetJob", + "parameters": [ + { + "type": "string", + "description": "ID of job to fetch", + "name": "jobID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Success, job info returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Job" + } + }, + "default": { + "description": "Success, job info returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Job" + } + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "jobs" + ], + "summary": "Signal this job's worker to cancel and delete the job", + "operationId": "DeleteJobs", + "parameters": [ + { + "type": "string", + "description": "ID of job to delete", + "name": "jobID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "Success, job has been deleted." + } + } + } + }, + "/api/v0/jobs/{jobID}/cancel": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "jobs" + ], + "summary": "Signal this job's worker to cancel the job", + "operationId": "CancelJob", + "parameters": [ + { + "type": "string", + "description": "ID of job to cancel", + "name": "jobID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "Success, job has been canceled." + } + } + } + }, + "/api/v0/jobs/{jobID}/logs": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "jobs" + ], + "summary": "Retrieve logs for this job from its worker", + "operationId": "GetJobLogs", + "parameters": [ + { + "type": "string", + "description": "ID of job whose logs to retrieve", + "name": "jobID", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": false, + "description": "t/f: stream new logs", + "name": "stream", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Line number to start from", + "name": "offset", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Number of lines to return if not streaming", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Success, job's logs returned.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/tmpresponses.JobLog" + } + } + }, + "default": { + "description": "Success, job's logs returned.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/tmpresponses.JobLog" + } + } + } + } + } + }, + "/api/v0/meta/alerts": { + "get": { + "description": "\n*Authorization:* Client must be authenticated an admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "meta" + ], + "summary": "Get alerts", + "operationId": "GetAlerts", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Alert" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Alert" + } + } + } + } + } + }, + "/api/v0/meta/cluster_status": { + "get": { + "description": "\n*Authorization:* Client must be authenticated an admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "meta" + ], + "summary": "Get cluster status", + "operationId": "GetClusterStatus", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ClusterStatus" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ClusterStatus" + } + } + } + } + }, + "/api/v0/meta/features": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as any active user in the system\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "meta" + ], + "summary": "Get features", + "operationId": "GetFeatures", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Features" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Features" + } + } + } + } + }, + "/api/v0/meta/settings": { + "get": { + "description": "\n*Authorization:* Client must be authenticated an admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "meta" + ], + "summary": "Get settings", + "operationId": "GetSettings", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Settings" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Settings" + } + } + } + }, + "post": { + "description": "\n*Authorization:* Client must be authenticated an admin.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "meta" + ], + "summary": "Update settings", + "operationId": "UpdateSettings", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.Settings" + } + } + ], + "responses": { + "202": { + "description": "success" + }, + "400": { + "description": "INVALID_SETTINGS: The submitted settings change request contains invalid values." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/remote/registry": { + "post": { + "description": "\n*Authorization:* Client must be authenticated as any active user in the system. Credentials provided in the request body must be for an active user in the remote system.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "remote" + ], + "summary": "Create a check for connection status of remote registry", + "operationId": "CreateRemoteRegistryCheck", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreateRemoteRegistryCheck" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.RemoteRegistryCheck" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as any active user in the system. Results will be filtered to only those repositories visible to the client.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List all repositories", + "operationId": "ListRepositories", + "parameters": [ + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repositories" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repositories" + } + } + } + } + }, + "/api/v0/repositories/scan/toggle": { + "post": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" access to the repository\n(i.e., user owns the repo or is a member of a team with \"admin\" level access to the organization\"s repository).\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Toggles scan on push for all repositories", + "operationId": "ToggleAllRepositoriesScanOnPush", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.ToggleScanOnPush" + } + } + ], + "responses": { + "200": { + "description": "Successfully toggled scan on push for all repositories." + }, + "400": { + "description": "INVALID_JSON: Unable to parse JSON" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "Successfully toggled scan on push for all repositories." + } + } + } + }, + "/api/v0/repositories/{namespace}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as any active user in the system. Results will be filtered to only those repositories visible to the client.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List repositories in a namespace", + "operationId": "ListNamespaceRepositories", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repositories" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repositories" + } + } + } + }, + "post": { + "description": "\n*Authorization:* Client must be authenticated as a user who has admin access to the\nrepository namespace (i.e., user owns the repo or is a member of a team with\n\"admin\" level access to the organization's namespace of repositories).\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Create repository", + "operationId": "CreateRepository", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreateRepo" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.Repository" + } + }, + "400": { + "description": "REPOSITORY_EXISTS: A repository with the same name already exists." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "View details of a repository", + "operationId": "GetRepository", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repository" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repository" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" access to the repository\n(i.e., user owns the repo or is a member of a team with \"admin\" level access to the organization\"s repository).\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Remove a repository", + "operationId": "DeleteRepository", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The domain used to push tags to DTR. Must be set to obtain/manipulate Notary related information", + "name": "domain", + "in": "query" + } + ], + "responses": { + "204": { + "description": "success or repository does not exist" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "REPOSITORY_CONTAINS_TAGS_IN_NOTARY: This repository contains tags in notary and can't be deleted until all tags in notary are removed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + }, + "patch": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" access to the repository\n(i.e., user owns the repo or is a member of a team with \"admin\" level access to the organization\"s repository).\n\nNote that a repository cannot be renamed this way.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Update details of a repository", + "operationId": "PatchRepository", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UpdateRepo" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repository" + } + }, + "400": { + "description": "INVALID_REPOSITORY_VISIBILITY: The visibility value of the repository is invalid." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Repository" + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/events": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the events for a repository", + "operationId": "ListRepoEvents", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "string", + "name": "publishedBefore", + "in": "query" + }, + { + "type": "string", + "name": "publishedAfter", + "in": "query" + }, + { + "type": "string", + "description": "UUID of the user or organization that performed the event", + "name": "actorId", + "in": "query" + }, + { + "type": "string", + "description": "Type of events to filter by", + "name": "eventType", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Exclude image pull events", + "name": "excludePull", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Events" + } + }, + "400": { + "description": "INVALID_PARAMETERS: Unable to parse query parameters" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.Events" + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/manifests": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the available manifests for a repository", + "operationId": "ListRepoManifests", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Manifest" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Manifest" + } + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/manifests/{reference}": { + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"write\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Delete a manifest for a repository", + "operationId": "DeleteRepoManifest", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "digest or tag for an image manifest", + "name": "reference", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success" + }, + "400": { + "description": "INVALID_DIGEST: The given digest is invalid." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REF: A ref with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/mirroringPolicies": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the mirroring policies for a repository", + "operationId": "ListRepoMirroringPolicies", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.MirroringPolicy" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.MirroringPolicy" + } + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Deletes a set of mirroring policies for a repository", + "operationId": "DeleteRepoMirroringPolicies", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/forms.DeleteMirroringPolicyIDs" + } + } + } + ], + "responses": { + "204": { + "description": "success" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pollMirroringPolicies": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the poll mirroring policies for a repository", + "operationId": "ListRepoPollMirroringPolicies", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + } + } + } + }, + "post": { + "description": "*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository and credentials to the remote repository.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Create a poll mirroring policy for a repository", + "operationId": "CreateRepoPollMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreatePollMirroringPolicy" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_POLL_MIRRORING_POLICY: The given poll mirroring policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pollMirroringPolicies/{pollmirroringpolicyid}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Retrieve a specific poll mirroring policy for a repository", + "operationId": "GetRepoPollMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "poll mirroring policy id", + "name": "pollmirroringpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_POLL_MIRRORING_POLICY: A poll mirroring policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + } + } + }, + "put": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository and credentials to the remote repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Updates a specific poll mirroring policy for a repository", + "operationId": "UpdateRepoPollMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "poll mirroring policy id", + "name": "pollmirroringpolicyid", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UpdatePollMirroringPolicy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_POLL_MIRRORING_POLICY: The given poll mirroring policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PollMirroringPolicy" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Deletes a specific poll mirroring policy for a repository", + "operationId": "DeleteRepoPollMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "poll mirroring policy id", + "name": "pollmirroringpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or poll mirroring policy does not exist" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_POLL_MIRRORING_POLICY: A poll mirroring policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/promotionPolicies": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the source or target repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the promotion policies for a repository", + "operationId": "ListRepoPromotionPolicies", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to list promotion policies for a repository as a source or destination.", + "name": "source", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + } + } + } + }, + "post": { + "description": "*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the source and target repository.\nRules for the policy can be on the following fields and their respective operators:\n- \"tag\"\n\t- \"eq\": equals\n\t- \"sw\": starts with\n\t- \"ew\": ends with\n\t- \"c\": contains\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"license.name\"\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"component.name\"\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"vulnerability_all\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_critical\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_major\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_minor\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"updated_at\"\n\t- \"bf\": before\n\t- \"af\": after\n- \"updated_at_duration\"\n\t- \"bf\": before\n\t- \"af\": after\n\nThe tag template is used to rename the tag in the target repository. The\nfollowing symbols are allowed:\n- \"%n\": The tag to promote (e.g. 1, 4.5, latest)\n- \"%A\": Day of the week (e.g. Sunday, Monday)\n- \"%a\": Day of the week, abbreviated (e.g. Sun, Mon , Tue)\n- \"%w\": Day of the week, as a number (e.g. 0, 1, 6)\n- \"%d\": Number for the day of the month (e.g. 01, 15, 31)\n- \"%B\": Month (e.g. January, December)\n- \"%b\": Month, abbreviated (e.g. Jan, Jun, Dec)\n- \"%m\": Month, as a number (e.g. 01, 06, 12)\n- \"%Y\": Year (e.g. 1999, 2015, 2048)\n- \"%y\": Year, two digits (e.g. 99, 15, 48)\n- \"%H\": Hour, in 24 hour format (e.g. 00, 12, 23)\n- \"%I\": Hour, in 12 hour format (e.g. 01, 10, 10)\n- \"%p\": Period of the day (e.g. AM, PM)\n- \"%M\": Minute (e.g. 00, 10, 59)\n- \"%S\": Second (e.g. 00, 10, 59)\n- \"%f\": Microsecond (e.g. 000000, 999999)\n- \"%Z\": Name for the timezone (e.g. UTC, PST, EST)\n- \"%j\": Day of the year (e.g. 001, 200, 366)\n- \"%W\": Week of the year (e.g. 00, 10 , 53)\n", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Create a promotion policy for a repository", + "operationId": "CreateRepoPromotionPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreatePromotionPolicy" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + }, + "400": { + "description": "INVALID_PROMOTION_POLICY: The given promotion policy is invalid." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/promotionPolicies/{promotionpolicyid}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the source or target repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Retrieve a specific promotion policy for a repository", + "operationId": "GetRepoPromotionPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "promotion policy id", + "name": "promotionpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PROMOTION_POLICY: A promotion policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + } + } + }, + "put": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the source and target repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Updates a specific promotion policy for a repository", + "operationId": "UpdateRepoPromotionPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "promotion policy id", + "name": "promotionpolicyid", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UpdatePromotionPolicy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + }, + "400": { + "description": "INVALID_PROMOTION_POLICY: The given promotion policy is invalid." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PROMOTION_POLICY: A promotion policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PromotionPolicy" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the source or target repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Deletes a specific promotion policy for a repository", + "operationId": "DeleteRepoPromotionPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "promotion policy id", + "name": "promotionpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or promotion policy does not exist" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PROMOTION_POLICY: A promotion policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pruningPolicies": { + "get": { + "description": "*Authorization:* Client must be authenticated as a user who has visibility to the repository.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the pruning policies for a repository", + "operationId": "ListRepoPruningPolicies", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PruningPolicy" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PruningPolicy" + } + } + } + } + }, + "post": { + "description": "*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\nRules for the policy can be on the following fields and their respective operators:\n- \"tag\"\n\t- \"eq\": equals\n\t- \"sw\": starts with\n\t- \"ew\": ends with\n\t- \"c\": contains\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"license.name\"\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"component.name\"\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"vulnerability_all\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_critical\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_major\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_minor\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"updated_at\"\n\t- \"bf\": before\n\t- \"af\": after\n- \"updated_at_duration\"\n\t- \"bf\": before\n\t- \"af\": after\n", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Create a pruning policy for a repository", + "operationId": "CreateRepoPruningPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreatePruningPolicy" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.PruningPolicy" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_PRUNING_POLICY: The given pruning policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pruningPolicies/test": { + "post": { + "description": "*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Test a pruning policy for a repository", + "operationId": "TestRepoPruningPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreatePruningPolicy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ThinTag" + } + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_PRUNING_POLICY: The given pruning policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ThinTag" + } + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pruningPolicies/{pruningpolicyid}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Retrieve a specific pruning policy for a repository", + "operationId": "GetRepoPruningPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "pruning policy id", + "name": "pruningpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PruningPolicy" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PRUNING_POLICY: A pruning policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PruningPolicy" + } + } + } + }, + "put": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Updates a specific pruning policy for a repository", + "operationId": "UpdateRepoPruningPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "pruning policy id", + "name": "pruningpolicyid", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UpdatePruningPolicy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PruningPolicy" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_PRUNING_POLICY: The given pruning policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PruningPolicy" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Deletes a specific pruning policy for a repository", + "operationId": "DeleteRepoPruningPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "pruning policy id", + "name": "pruningpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or pruning policy does not exist" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PRUNING_POLICY: A pruning policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pushMirroringPolicies": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the push mirroring policies for a repository", + "operationId": "ListRepoPushMirroringPolicies", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + } + } + } + }, + "post": { + "description": "*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository and credentials to the remote repository.\nRules for the policy can be on the following fields and their respective operators:\n- \"tag\"\n\t- \"eq\": equals\n\t- \"sw\": starts with\n\t- \"ew\": ends with\n\t- \"c\": contains\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"license.name\"\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"component.name\"\n\t- \"oo\": one of\n\t- \"noo\": not one of\n- \"vulnerability_all\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_critical\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_major\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"vulnerability_minor\"\n\t- \"gte\": greater than or equals\n\t- \"gt\": greater than\n\t- \"eq\": equals\n\t- \"neq\": not equals\n\t- \"lte\": less than or equals\n\t- \"lt\": less than\n- \"updated_at\"\n\t- \"bf\": before\n\t- \"af\": after\n- \"updated_at_duration\"\n\t- \"bf\": before\n\t- \"af\": after\n\nThe tag template is used to rename the tag in the target repository. The\nfollowing symbols are allowed:\n- \"%n\": The tag to promote (e.g. 1, 4.5, latest)\n- \"%A\": Day of the week (e.g. Sunday, Monday)\n- \"%a\": Day of the week, abbreviated (e.g. Sun, Mon , Tue)\n- \"%w\": Day of the week, as a number (e.g. 0, 1, 6)\n- \"%d\": Number for the day of the month (e.g. 01, 15, 31)\n- \"%B\": Month (e.g. January, December)\n- \"%b\": Month, abbreviated (e.g. Jan, Jun, Dec)\n- \"%m\": Month, as a number (e.g. 01, 06, 12)\n- \"%Y\": Year (e.g. 1999, 2015, 2048)\n- \"%y\": Year, two digits (e.g. 99, 15, 48)\n- \"%H\": Hour, in 24 hour format (e.g. 00, 12, 23)\n- \"%I\": Hour, in 12 hour format (e.g. 01, 10, 10)\n- \"%p\": Period of the day (e.g. AM, PM)\n- \"%M\": Minute (e.g. 00, 10, 59)\n- \"%S\": Second (e.g. 00, 10, 59)\n- \"%f\": Microsecond (e.g. 000000, 999999)\n- \"%Z\": Name for the timezone (e.g. UTC, PST, EST)\n- \"%j\": Day of the year (e.g. 001, 200, 366)\n- \"%W\": Week of the year (e.g. 00, 10 , 53)\n", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Create a push mirroring policy for a repository", + "operationId": "CreateRepoPushMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreatePushMirroringPolicy" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_PUSH_MIRRORING_POLICY: The given push mirroring policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/pushMirroringPolicies/{pushmirroringpolicyid}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Retrieve a specific push mirroring policy for a repository", + "operationId": "GetRepoPushMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "push mirroring policy id", + "name": "pushmirroringpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PUSH_MIRRORING_POLICY: A push mirroring policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + } + } + }, + "put": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository and credentials to the remote repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Updates a specific push mirroring policy for a repository", + "operationId": "UpdateRepoPushMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "push mirroring policy id", + "name": "pushmirroringpolicyid", + "in": "path", + "required": true + }, + { + "type": "boolean", + "default": true, + "description": "Whether to evaluate the policy on creation", + "name": "initialEvaluation", + "in": "query" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.UpdatePushMirroringPolicy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + }, + "400": { + "description": "REMOTE_REGISTRY_INVALID_PERMISSIONS: Remote user not authorized to access the requested resource." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "INVALID_PUSH_MIRRORING_POLICY: The given push mirroring policy is invalid." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.PushMirroringPolicy" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the local repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Deletes a specific push mirroring policy for a repository", + "operationId": "DeleteRepoPushMirroringPolicy", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "push mirroring policy id", + "name": "pushmirroringpolicyid", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or push mirroring policy does not exist" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_PUSH_MIRRORING_POLICY: A push mirroring policy with the given id does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/tags": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the available tags for a repository", + "operationId": "ListRepoTags", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the manifest for each tag", + "name": "includeManifests", + "in": "query" + }, + { + "type": "string", + "description": "The domain used to push tags to DTR. Must be set to obtain/manipulate Notary related information", + "name": "domain", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ListTag" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.ListTag" + } + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/tags/{reference}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has visibility to the repository.\nIf the ref given is to a manifest list, multiple Tag objects will be returned, one for each manifest in the list.\nSimilarly if the ref is a digest the API will return all tags referencing that digest.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Retrieve a specific tag for a repository", + "operationId": "ListRepoTag", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "digest or tag for an image manifest", + "name": "reference", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The domain used to push tags to DTR. Must be set to obtain/manipulate Notary related information", + "name": "domain", + "in": "query" + }, + { + "type": "string", + "description": "Operating system of the tag", + "name": "os", + "in": "query" + }, + { + "type": "string", + "description": "Architecture of the tag", + "name": "arch", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Tag" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REF: A ref with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Tag" + } + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/tags/{tag}": { + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"write\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Delete a tag for a repository", + "operationId": "DeleteRepoTag", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name", + "name": "tag", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The domain used to push tags to DTR. Must be set to obtain/manipulate Notary related information", + "name": "domain", + "in": "query" + } + ], + "responses": { + "204": { + "description": "success" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "409": { + "description": "TAG_IN_NOTARY: This tag is in notary and can't be deleted until it is removed from notary" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/tags/{tag}/promotion": { + "post": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"read\" level access to the source repository and \"write\" level access to the target repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Promotes a specific tag for a repository", + "operationId": "CreateRepoTagPromotion", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name", + "name": "tag", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreatePromotion" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.Promotion" + } + }, + "400": { + "description": "INVALID_TAG_NAME: The given tag name is either too long or contains illegal characters." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/tags/{tag}/pushMirroring": { + "post": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"read\" level access to the local repository and \"write\" level access to the remote repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Mirrors a local tag by pushing to a remote repository", + "operationId": "CreateRepoTagPushMirroring", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name", + "name": "tag", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.CreateMirroring" + } + } + ], + "responses": { + "201": { + "description": "success", + "schema": { + "$ref": "#/definitions/responses.Mirroring" + } + }, + "400": { + "description": "INVALID_TAG_NAME: The given tag name is either too long or contains illegal characters." + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TAG: A tag with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/teamAccess": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List teams granted access to an organization-owned repository", + "operationId": "ListRepoTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListRepoTeamAccess" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListRepoTeamAccess" + } + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/teamAccess/{teamname}": { + "put": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Set a team's access to an orgnization-owned repository", + "operationId": "GrantRepoTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "teamname", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.Access" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListRepoTeamAccess" + } + }, + "400": { + "description": "the team does not belong to the organization" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TEAM: A team with the given name does not exist in the organization." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListRepoTeamAccess" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "Revoke a team's acccess to an organization-owned repository", + "operationId": "RevokeRepoTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "teamname", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or the team is not in the access list or there is no such team in the organization" + }, + "400": { + "description": "the repository is not owned by an organization" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TEAM: A team with the given name does not exist in the organization." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/repositories/{namespace}/{reponame}/webhooks": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the repository.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositories" + ], + "summary": "List the webhook subscriptions for a repository", + "operationId": "ListRepoWebhooks", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of repository", + "name": "reponame", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_REPOSITORY: A repository with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + } + } + } + }, + "/api/v0/repositoryNamespaces/{namespace}/teamAccess": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as an admin or a member of the organization.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositoryNamespaces" + ], + "summary": "List teams granted access to an organization-owned namespace of repositories", + "operationId": "ListRepoNamespaceTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The ID of the first record on the page", + "name": "pageStart", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Maximum number of results to return", + "name": "pageSize", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to include the resource count in the response header", + "name": "count", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListRepoNamespaceTeamAccess" + } + }, + "400": { + "description": "the namespace is not owned by an organization" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.ListRepoNamespaceTeamAccess" + } + } + } + } + }, + "/api/v0/repositoryNamespaces/{namespace}/teamAccess/{teamname}": { + "get": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level\naccess to the namespace or is a member of the team.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositoryNamespaces" + ], + "summary": "Get a team's granted access to an organization-owned namespace of repositories", + "operationId": "GetRepoNamespaceTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "teamname", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.NamespaceTeamAccess" + } + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_NAMESPACE_TEAM_ACCESS: An access grant for the given team in the given namespace does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.NamespaceTeamAccess" + } + } + } + }, + "put": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the namespace.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositoryNamespaces" + ], + "summary": "Set a team's access to an organization-owned namespace of repositories", + "operationId": "GrantRepoNamespaceTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "teamname", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.Access" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.NamespaceTeamAccess" + } + }, + "400": { + "description": "the team does not belong to the owning organization" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TEAM: A team with the given name does not exist in the organization." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "$ref": "#/definitions/responses.NamespaceTeamAccess" + } + } + } + }, + "delete": { + "description": "\n*Authorization:* Client must be authenticated as a user who has \"admin\" level access to the namespace.\n\t\t", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repositoryNamespaces" + ], + "summary": "Revoke a team's access to an organization-owned namespace of repositories", + "operationId": "RevokeRepoNamespaceTeamAccess", + "parameters": [ + { + "type": "string", + "description": "namespace/owner of repository", + "name": "namespace", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "teamname", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "success or the team does not exist in the access list or there is no such team in the organization" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_TEAM: A team with the given name does not exist in the organization." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + } + } + } + }, + "/api/v0/webhooks": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "webhooks" + ], + "summary": "List Webhooks", + "operationId": "ListWebhooks", + "parameters": [ + { + "type": "string", + "default": "any", + "description": "The type of webhook to list", + "name": "webhookType", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + }, + "400": { + "description": "INVALID_JSON: Unable to parse JSON" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "webhooks" + ], + "summary": "Create Webhook", + "operationId": "CreateWebhook", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.Webhook" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + }, + "400": { + "description": "INVALID_JSON: Unable to parse JSON" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_ACCOUNT: An account with the given name does not exist." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + } + } + } + }, + "/api/v0/webhooks/test": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "webhooks" + ], + "summary": "Test Webhook", + "operationId": "TestWebhook", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.WebhookTestPayload" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "INVALID_JSON: Unable to parse JSON" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK" + } + } + } + }, + "/api/v0/webhooks/update": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "webhooks" + ], + "summary": "Update Webhook", + "operationId": "UpdateWebhook", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/forms.WebhookUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + }, + "400": { + "description": "INVALID_JSON: Unable to parse JSON" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Webhook" + } + } + } + } + } + }, + "/api/v0/webhooks/{webhook}": { + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "webhooks" + ], + "summary": "Delete Webhook", + "operationId": "DeleteWebhook", + "parameters": [ + { + "type": "string", + "description": "webhook subscription ID", + "name": "webhook", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "NOT_AUTHENTICATED: The client is not authenticated." + }, + "403": { + "description": "NOT_AUTHORIZED: The client is not authorized." + }, + "404": { + "description": "NO_SUCH_WEBHOOK: A webhook subscription with the given name does not exist for the given repository." + }, + "405": { + "description": "NOT_ALLOWED: Method Not Allowed" + }, + "406": { + "description": "NOT_ACCEPTABLE: Not Acceptable" + }, + "415": { + "description": "UNSUPPORTED_MEDIA_TYPE: Unsupported Media Type" + }, + "default": { + "description": "OK" + } + } + } + }, + "/api/v0/workers": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "workers" + ], + "summary": "List all workers", + "operationId": "ListWorkers", + "responses": { + "200": { + "description": "Success, list of workers returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Workers" + } + }, + "default": { + "description": "Success, list of workers returned.", + "schema": { + "$ref": "#/definitions/tmpresponses.Workers" + } + } + } + } + }, + "/api/v0/workers/{id}/capacity": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "workers" + ], + "summary": "Update the capacity for a worker", + "operationId": "UpdateWorkerCapacity", + "parameters": [ + { + "type": "string", + "description": "ID of worker to update", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tmpforms.UpdateWorkerCapacity" + } + } + ], + "responses": { + "202": { + "description": "Success." + } + } + } + } + }, + "definitions": { + "forms.Access": { + "required": [ + "accessLevel" + ], + "properties": { + "accessLevel": { + "type": "string", + "enum": [ + "read-only", + "read-write", + "admin" + ] + } + } + }, + "forms.CreateAPIToken": { + "properties": { + "tokenLabel": { + "type": "string" + } + } + }, + "forms.CreateContentCache": { + "required": [ + "name", + "host" + ], + "properties": { + "host": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "forms.CreateMirroring": { + "required": [ + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "remoteTag", + "username", + "password", + "authToken" + ], + "properties": { + "authToken": { + "type": "string" + }, + "password": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "remoteTag": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "forms.CreatePollMirroringPolicy": { + "required": [ + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "enabled", + "username", + "password", + "authToken" + ], + "properties": { + "authToken": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "password": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "forms.CreatePromotion": { + "required": [ + "targetRepository", + "targetTag" + ], + "properties": { + "targetRepository": { + "type": "string" + }, + "targetTag": { + "type": "string" + } + } + }, + "forms.CreatePromotionPolicy": { + "required": [ + "rules", + "targetRepository", + "tagTemplate", + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "tagTemplate": { + "type": "string" + }, + "targetRepository": { + "type": "string" + } + } + }, + "forms.CreatePruningPolicy": { + "required": [ + "rules", + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + } + } + }, + "forms.CreatePushMirroringPolicy": { + "required": [ + "rules", + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "tagTemplate", + "enabled", + "username", + "password", + "authToken" + ], + "properties": { + "authToken": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "password": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tagTemplate": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "forms.CreateRemoteRegistryCheck": { + "required": [ + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "username", + "password", + "authToken" + ], + "properties": { + "authToken": { + "type": "string" + }, + "password": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "forms.CreateRepo": { + "required": [ + "name", + "shortDescription", + "longDescription", + "scanOnPush", + "immutableTags", + "enableManifestLists", + "tagLimit" + ], + "properties": { + "enableManifestLists": { + "type": "boolean" + }, + "immutableTags": { + "type": "boolean" + }, + "longDescription": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scanOnPush": { + "type": "boolean" + }, + "shortDescription": { + "type": "string" + }, + "tagLimit": { + "type": "integer", + "format": "integer" + }, + "visibility": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + } + }, + "forms.DeleteMirroringPolicyIDs": { + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + } + } + }, + "forms.EmptyForm": {}, + "forms.Image": { + "required": [ + "name", + "digest" + ], + "properties": { + "digest": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "forms.ImagesForm": { + "required": [ + "images" + ], + "properties": { + "images": { + "type": "array", + "items": { + "$ref": "#/definitions/forms.Image" + } + } + } + }, + "forms.ScanOptions": { + "required": [ + "scan", + "check" + ], + "properties": { + "check": { + "type": "boolean" + }, + "scan": { + "type": "boolean" + } + } + }, + "forms.Settings": { + "required": [ + "dtrHost", + "sso", + "createRepositoryOnPush", + "disableUpgrades", + "reportAnalytics", + "anonymizeAnalytics", + "disableBackupWarning", + "webTLSCert", + "webTLSKey", + "webTLSCA", + "scanningEnabled", + "scanningSyncOnline", + "scanningDeadline", + "scanningEnableAutoRecheck", + "jobHistoryCompactionEnabled", + "jobHistoryToKeep", + "jobHistoryMaxAge", + "repoEventHistoryCompactionEnabled", + "repoEventHistoryToKeep", + "repoEventHistoryMaxAge", + "readOnlyRegistry" + ], + "properties": { + "anonymizeAnalytics": { + "type": "boolean" + }, + "createRepositoryOnPush": { + "type": "boolean" + }, + "disableBackupWarning": { + "type": "boolean" + }, + "disableUpgrades": { + "type": "boolean" + }, + "dtrHost": { + "type": "string" + }, + "jobHistoryCompactionEnabled": { + "type": "boolean" + }, + "jobHistoryMaxAge": { + "type": "string" + }, + "jobHistoryToKeep": { + "type": "integer", + "format": "int64" + }, + "readOnlyRegistry": { + "type": "boolean" + }, + "repoEventHistoryCompactionEnabled": { + "type": "boolean" + }, + "repoEventHistoryMaxAge": { + "type": "string" + }, + "repoEventHistoryToKeep": { + "type": "integer", + "format": "int64" + }, + "reportAnalytics": { + "type": "boolean" + }, + "scanningDeadline": { + "type": "integer" + }, + "scanningEnableAutoRecheck": { + "type": "boolean" + }, + "scanningEnabled": { + "type": "boolean" + }, + "scanningSyncOnline": { + "type": "boolean" + }, + "sso": { + "type": "boolean" + }, + "webTLSCA": { + "type": "string" + }, + "webTLSCert": { + "type": "string" + }, + "webTLSKey": { + "type": "string" + } + } + }, + "forms.ToggleScanOnPush": { + "required": [ + "scanOnPush" + ], + "properties": { + "scanOnPush": { + "type": "boolean" + } + } + }, + "forms.UpdateAPIToken": { + "properties": { + "isActive": { + "type": "boolean" + }, + "tokenLabel": { + "type": "string" + } + } + }, + "forms.UpdatePollMirroringPolicy": { + "properties": { + "authToken": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "password": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "forms.UpdatePromotionPolicy": { + "properties": { + "enabled": { + "type": "boolean" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "tagTemplate": { + "type": "string" + }, + "targetRepository": { + "type": "string" + } + } + }, + "forms.UpdatePruningPolicy": { + "properties": { + "enabled": { + "type": "boolean" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + } + } + }, + "forms.UpdatePushMirroringPolicy": { + "properties": { + "authToken": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "password": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tagTemplate": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "forms.UpdateRepo": { + "required": [ + "immutableTags" + ], + "properties": { + "enableManifestLists": { + "type": "boolean" + }, + "immutableTags": { + "type": "boolean" + }, + "longDescription": { + "type": "string" + }, + "scanOnPush": { + "type": "boolean" + }, + "shortDescription": { + "type": "string" + }, + "tagLimit": { + "type": "integer", + "format": "integer" + }, + "visibility": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + } + }, + "forms.UserSettings": { + "properties": { + "contentCacheUUID": { + "type": "string" + } + } + }, + "forms.VulnOverrideOption": { + "required": [ + "component", + "componentVersion", + "cve", + "notes" + ], + "properties": { + "component": { + "type": "string" + }, + "componentVersion": { + "type": "string" + }, + "cve": { + "type": "string" + }, + "notes": { + "type": "string" + } + } + }, + "forms.Webhook": { + "required": [ + "endpoint", + "tlsCert", + "skipTLSVerification" + ], + "properties": { + "endpoint": { + "type": "string" + }, + "key": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tlsCert": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "TAG_PUSH", + "TAG_PULL", + "TAG_DELETE", + "PROMOTION", + "PUSH_MIRRORING", + "POLL_MIRRORING", + "MANIFEST_PUSH", + "MANIFEST_PULL", + "MANIFEST_DELETE", + "REPO_EVENT", + "SCAN_COMPLETED", + "SCAN_FAILED", + "SCANNER_UPDATE_COMPLETED" + ] + } + } + }, + "forms.WebhookTestPayload": { + "required": [ + "type", + "endpoint", + "tlsCert", + "skipTLSVerification" + ], + "properties": { + "endpoint": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tlsCert": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "forms.WebhookUpdate": { + "required": [ + "id", + "inactive", + "tlsCert", + "skipTLSVerification" + ], + "properties": { + "id": { + "type": "string" + }, + "inactive": { + "type": "boolean" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tlsCert": { + "type": "string" + } + } + }, + "responses.APIToken": { + "required": [ + "hashedToken", + "tokenLabel", + "isActive", + "lastUsed", + "createdAt", + "generatedBy", + "creatorUa" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "creatorUa": { + "type": "string" + }, + "generatedBy": { + "type": "string" + }, + "hashedToken": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "lastUsed": { + "type": "string", + "format": "date-time" + }, + "tokenLabel": { + "type": "string" + } + } + }, + "responses.Account": { + "required": [ + "name", + "id", + "fullName", + "isOrg" + ], + "properties": { + "fullName": { + "description": "Full Name of the account", + "type": "string" + }, + "id": { + "description": "ID of the account", + "type": "string" + }, + "isActive": { + "description": "Whether the user is active and can login (users only)", + "type": "boolean" + }, + "isAdmin": { + "description": "Whether the user is a system admin (users only)", + "type": "boolean" + }, + "isImported": { + "description": "Whether the user was imported from an upstream identity provider", + "type": "boolean" + }, + "isOrg": { + "description": "Whether the account is an organization (or user)", + "type": "boolean" + }, + "membersCount": { + "description": "The number of members of the organization", + "type": "integer", + "format": "int32" + }, + "name": { + "description": "Name of the account", + "type": "string" + }, + "teamsCount": { + "description": "The number of teams in the organization", + "type": "integer", + "format": "int32" + } + } + }, + "responses.Alert": { + "required": [ + "message" + ], + "properties": { + "class": { + "type": "string" + }, + "id": { + "type": "string" + }, + "img": { + "type": "string" + }, + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "responses.Autocomplete": { + "properties": { + "accountResults": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Account" + } + }, + "repositoryResults": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Repository" + } + } + } + }, + "responses.ClusterStatus": { + "required": [ + "rethink_system_tables", + "replica_health", + "replica_timestamp", + "replica_readonly", + "gc_lock_holder" + ], + "properties": { + "gc_lock_holder": { + "type": "string" + }, + "replica_health": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "replica_readonly": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "replica_timestamp": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "rethink_system_tables": { + "type": "object" + } + } + }, + "responses.Component": { + "required": [ + "component", + "version", + "vulns", + "fullpath" + ], + "properties": { + "component": { + "type": "string" + }, + "fullpath": { + "type": "array", + "items": { + "type": "string" + } + }, + "license": { + "$ref": "#/definitions/responses.License" + }, + "version": { + "type": "string" + }, + "vulns": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.VulnerabilityDetails" + } + } + } + }, + "responses.ContentCache": { + "required": [ + "id", + "name", + "host" + ], + "properties": { + "host": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "responses.DetailedSummary": { + "required": [ + "sha256sum" + ], + "properties": { + "components": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Component" + } + }, + "sha256sum": { + "type": "string" + } + } + }, + "responses.DockerRepository": { + "required": [ + "description", + "is_official", + "is_trusted", + "name", + "star_count" + ], + "properties": { + "description": { + "type": "string" + }, + "is_official": { + "type": "boolean" + }, + "is_trusted": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "star_count": { + "type": "integer", + "format": "int32" + } + } + }, + "responses.DockerSearch": { + "required": [ + "num_results", + "query", + "results" + ], + "properties": { + "num_results": { + "type": "integer", + "format": "int32" + }, + "query": { + "type": "string" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.DockerRepository" + } + } + } + }, + "responses.DockerfileLine": { + "required": [ + "line", + "layerDigest", + "size", + "isEmpty" + ], + "properties": { + "isEmpty": { + "type": "boolean" + }, + "layerDigest": { + "type": "string" + }, + "line": { + "type": "string" + }, + "mediaType": { + "type": "string" + }, + "size": { + "type": "integer", + "format": "int64" + }, + "urls": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "responses.Events": { + "required": [ + "events" + ], + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.Event" + } + } + } + }, + "responses.Features": { + "required": [ + "scanningEnabled", + "scanningLicensed", + "promotionLicensed", + "mirroringLicensed", + "metadataStoreOptedIn", + "onlineGCEnabled", + "db_version", + "ucpHost" + ], + "properties": { + "db_version": { + "type": "integer", + "format": "int32" + }, + "metadataStoreOptedIn": { + "type": "boolean" + }, + "mirroringLicensed": { + "type": "boolean" + }, + "onlineGCEnabled": { + "type": "boolean" + }, + "promotionLicensed": { + "type": "boolean" + }, + "scanningEnabled": { + "type": "boolean" + }, + "scanningLicensed": { + "type": "boolean" + }, + "ucpHost": { + "type": "string" + } + } + }, + "responses.Language": { + "required": [ + "language" + ], + "properties": { + "language": { + "type": "string" + } + } + }, + "responses.LayerVulnOverride": { + "required": [ + "pk", + "digest", + "component", + "componentVersion", + "cve", + "notes" + ], + "properties": { + "component": { + "type": "string" + }, + "componentVersion": { + "type": "string" + }, + "cve": { + "type": "string" + }, + "digest": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "pk": { + "type": "string" + } + } + }, + "responses.License": { + "required": [ + "name", + "type", + "url" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "responses.ListRepoNamespaceTeamAccess": { + "required": [ + "namespace", + "teamAccessList" + ], + "properties": { + "namespace": { + "type": "string" + }, + "teamAccessList": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.TeamAccess" + } + } + } + }, + "responses.ListRepoTeamAccess": { + "required": [ + "repository", + "teamAccessList" + ], + "properties": { + "repository": { + "$ref": "#/definitions/responses.Repository" + }, + "teamAccessList": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.TeamAccess" + } + } + } + }, + "responses.ListTag": { + "required": [ + "name", + "digest", + "author", + "updatedAt", + "createdAt", + "hashMismatch", + "inNotary", + "manifest" + ], + "properties": { + "author": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "digest": { + "type": "string" + }, + "hashMismatch": { + "description": "true if the hashes from notary and registry don't match", + "type": "boolean" + }, + "inNotary": { + "description": "true if the tag exists in Notary", + "type": "boolean" + }, + "manifest": { + "$ref": "#/definitions/responses.Manifest" + }, + "mirroring": { + "$ref": "#/definitions/responses.Mirroring" + }, + "name": { + "type": "string" + }, + "promotion": { + "$ref": "#/definitions/responses.Promotion" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + }, + "responses.ListTeamRepoAccess": { + "required": [ + "team", + "repositoryAccessList" + ], + "properties": { + "repositoryAccessList": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.RepoAccess" + } + }, + "team": { + "$ref": "#/definitions/responses.Team" + } + } + }, + "responses.Manifest": { + "required": [ + "digest" + ], + "properties": { + "architecture": { + "type": "string" + }, + "author": { + "type": "string" + }, + "configDigest": { + "type": "string" + }, + "configMediaType": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "digest": { + "type": "string" + }, + "dockerfile": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.DockerfileLine" + } + }, + "mediaType": { + "type": "string" + }, + "os": { + "type": "string" + }, + "osVersion": { + "type": "string" + }, + "size": { + "type": "integer", + "format": "int64" + } + } + }, + "responses.Mirroring": { + "required": [ + "mirroringPolicyID", + "digest", + "remoteRepository", + "remoteTag" + ], + "properties": { + "digest": { + "type": "string" + }, + "mirroringPolicyID": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "remoteTag": { + "type": "string" + } + } + }, + "responses.MirroringPolicy": { + "required": [ + "id", + "mirroringType", + "username", + "localRepository", + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "enabled", + "lastMirroredAt", + "lastStatus" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "lastMirroredAt": { + "type": "string" + }, + "lastStatus": { + "$ref": "#/definitions/schema.MirroringStatus" + }, + "localRepository": { + "type": "string" + }, + "mirroringType": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tagTemplate": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "responses.NamespaceTeamAccess": { + "required": [ + "accessLevel", + "team", + "namespace" + ], + "properties": { + "accessLevel": { + "type": "string", + "enum": [ + "read-only", + "read-write", + "admin" + ] + }, + "namespace": { + "type": "string" + }, + "team": { + "$ref": "#/definitions/responses.Team" + } + } + }, + "responses.NautilusStatus": { + "required": [ + "state", + "scanner_version", + "scannerUpdatedAt", + "db_version", + "db_updated_at", + "lastDBUpdateFailed", + "lastVulnOverridesDBUpdateFailed" + ], + "properties": { + "db_updated_at": { + "type": "string", + "format": "date-time" + }, + "db_version": { + "type": "integer", + "format": "int32" + }, + "lastDBUpdateFailed": { + "type": "boolean" + }, + "lastVulnOverridesDBUpdateFailed": { + "type": "boolean" + }, + "replicas": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema.ScannerFingerprint" + } + }, + "scannerUpdatedAt": { + "type": "string", + "format": "date-time" + }, + "scanner_version": { + "type": "integer", + "format": "int32" + }, + "state": { + "type": "integer", + "format": "int32" + } + } + }, + "responses.NewAPIToken": { + "required": [ + "token", + "hashedToken", + "tokenLabel", + "isActive", + "lastUsed", + "createdAt", + "generatedBy", + "creatorUa" + ], + "properties": { + "createdAt": { + "type": "string", + "format": "date-time" + }, + "creatorUa": { + "type": "string" + }, + "generatedBy": { + "type": "string" + }, + "hashedToken": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "lastUsed": { + "type": "string", + "format": "date-time" + }, + "token": { + "type": "string" + }, + "tokenLabel": { + "type": "string" + } + } + }, + "responses.Note": { + "required": [ + "reason", + "type" + ], + "properties": { + "reason": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "responses.OldScanSummary": { + "required": [ + "namespace", + "reponame", + "tag", + "critical", + "major", + "minor", + "last_scan_status", + "check_completed_at", + "should_rescan", + "has_foreign_layers" + ], + "properties": { + "check_completed_at": { + "type": "string", + "format": "date-time" + }, + "critical": { + "type": "integer", + "format": "int32" + }, + "has_foreign_layers": { + "type": "boolean" + }, + "last_scan_status": { + "type": "integer", + "format": "int32" + }, + "layer_details": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.DetailedSummary" + } + }, + "major": { + "type": "integer", + "format": "int32" + }, + "minor": { + "type": "integer", + "format": "int32" + }, + "namespace": { + "type": "string" + }, + "reponame": { + "type": "string" + }, + "should_rescan": { + "type": "boolean" + }, + "tag": { + "type": "string" + } + } + }, + "responses.PollMirroringPolicy": { + "required": [ + "id", + "username", + "localRepository", + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "enabled", + "lastMirroredAt", + "lastStatus" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "lastMirroredAt": { + "type": "string" + }, + "lastStatus": { + "$ref": "#/definitions/schema.MirroringStatus" + }, + "localRepository": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + }, + "responses.Promotion": { + "required": [ + "promotionPolicyID", + "string", + "sourceRepository", + "sourceTag" + ], + "properties": { + "promotionPolicyID": { + "type": "string" + }, + "sourceRepository": { + "type": "string" + }, + "sourceTag": { + "type": "string" + }, + "string": { + "type": "string" + } + } + }, + "responses.PromotionPolicy": { + "required": [ + "id", + "rules", + "sourceRepository", + "targetRepository", + "tagTemplate", + "enabled", + "lastPromotedAt" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "lastPromotedAt": { + "type": "string", + "format": "date-time" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "sourceRepository": { + "type": "string" + }, + "tagTemplate": { + "type": "string" + }, + "targetRepository": { + "type": "string" + } + } + }, + "responses.PruningPolicy": { + "required": [ + "id", + "rules", + "repository", + "enabled", + "lastPrunedAt" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "lastPrunedAt": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + } + } + }, + "responses.PushMirroringPolicy": { + "required": [ + "id", + "rules", + "username", + "localRepository", + "remoteHost", + "remoteRepository", + "remoteCA", + "skipTLSVerification", + "tagTemplate", + "enabled", + "lastMirroredAt", + "lastStatus" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "lastMirroredAt": { + "type": "string" + }, + "lastStatus": { + "$ref": "#/definitions/schema.MirroringStatus" + }, + "localRepository": { + "type": "string" + }, + "remoteCA": { + "type": "string" + }, + "remoteHost": { + "type": "string" + }, + "remoteRepository": { + "type": "string" + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/ruleengine.Rule" + } + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tagTemplate": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "responses.RemoteRegistryCheck": { + "required": [ + "registryType", + "permissions" + ], + "properties": { + "permissions": { + "$ref": "#/definitions/responses.RemoteRepositoryPermissions" + }, + "registryType": { + "type": "string" + } + } + }, + "responses.RemoteRepositoryPermissions": { + "required": [ + "read", + "write" + ], + "properties": { + "read": { + "type": "boolean" + }, + "write": { + "type": "boolean" + } + } + }, + "responses.ReplicaSettings": { + "required": [ + "HTTPPort", + "HTTPSPort", + "node" + ], + "properties": { + "HTTPPort": { + "type": "integer" + }, + "HTTPSPort": { + "type": "integer" + }, + "node": { + "type": "string" + } + } + }, + "responses.RepoAccess": { + "required": [ + "accessLevel", + "repository" + ], + "properties": { + "accessLevel": { + "type": "string", + "enum": [ + "read-only", + "read-write", + "admin" + ] + }, + "repository": { + "$ref": "#/definitions/responses.Repository" + } + } + }, + "responses.RepoUserAccess": { + "required": [ + "accessLevel", + "user", + "repository" + ], + "properties": { + "accessLevel": { + "type": "string", + "enum": [ + "read-only", + "read-write", + "admin" + ] + }, + "repository": { + "$ref": "#/definitions/responses.Repository" + }, + "user": { + "$ref": "#/definitions/responses.Account" + } + } + }, + "responses.Repositories": { + "required": [ + "repositories" + ], + "properties": { + "repositories": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Repository" + } + } + } + }, + "responses.Repository": { + "required": [ + "id", + "namespace", + "namespaceType", + "name", + "shortDescription", + "visibility", + "scanOnPush", + "immutableTags", + "enableManifestLists", + "pulls", + "pushes", + "tagLimit" + ], + "properties": { + "enableManifestLists": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "immutableTags": { + "type": "boolean" + }, + "longDescription": { + "type": "string" + }, + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "namespaceType": { + "type": "string", + "enum": [ + "user", + "organization" + ] + }, + "pulls": { + "type": "integer", + "format": "integer" + }, + "pushes": { + "type": "integer", + "format": "integer" + }, + "scanOnPush": { + "type": "boolean" + }, + "shortDescription": { + "type": "string" + }, + "tagLimit": { + "type": "integer", + "format": "integer" + }, + "visibility": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + } + }, + "responses.ScanSummary": { + "required": [ + "scannedImage", + "shouldRescan" + ], + "properties": { + "scanStatus": { + "type": "integer", + "format": "int32" + }, + "scannedImage": { + "$ref": "#/definitions/schema.ScannedImage" + }, + "shouldRescan": { + "type": "boolean" + } + } + }, + "responses.Settings": { + "required": [ + "dtrHost", + "sso", + "createRepositoryOnPush", + "replicaSettings", + "httpProxy", + "httpsProxy", + "noProxy", + "disableUpgrades", + "reportAnalytics", + "anonymizeAnalytics", + "disableBackupWarning", + "logProtocol", + "logHost", + "logLevel", + "webTLSCert", + "webTLSCA", + "replicaID", + "scanningEnabled", + "scanningSyncOnline", + "scanningDeadline", + "scanningEnableAutoRecheck", + "jobHistoryCompactionEnabled", + "jobHistoryToKeep", + "jobHistoryMaxAge", + "repoEventHistoryCompactionEnabled", + "repoEventHistoryToKeep", + "repoEventHistoryMaxAge", + "storageVolume", + "nfsHost", + "nfsPath", + "readOnlyRegistry" + ], + "properties": { + "anonymizeAnalytics": { + "type": "boolean" + }, + "createRepositoryOnPush": { + "type": "boolean" + }, + "disableBackupWarning": { + "type": "boolean" + }, + "disableUpgrades": { + "type": "boolean" + }, + "dtrHost": { + "type": "string" + }, + "httpProxy": { + "type": "string" + }, + "httpsProxy": { + "type": "string" + }, + "jobHistoryCompactionEnabled": { + "type": "boolean" + }, + "jobHistoryMaxAge": { + "type": "string" + }, + "jobHistoryToKeep": { + "type": "integer", + "format": "int64" + }, + "logHost": { + "type": "string" + }, + "logLevel": { + "type": "string" + }, + "logProtocol": { + "type": "string" + }, + "nfsHost": { + "type": "string" + }, + "nfsPath": { + "type": "string" + }, + "noProxy": { + "type": "string" + }, + "readOnlyRegistry": { + "type": "boolean" + }, + "replicaID": { + "type": "string" + }, + "replicaSettings": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/responses.ReplicaSettings" + } + }, + "repoEventHistoryCompactionEnabled": { + "type": "boolean" + }, + "repoEventHistoryMaxAge": { + "type": "string" + }, + "repoEventHistoryToKeep": { + "type": "integer", + "format": "int64" + }, + "reportAnalytics": { + "type": "boolean" + }, + "scanningDeadline": { + "type": "integer" + }, + "scanningEnableAutoRecheck": { + "type": "boolean" + }, + "scanningEnabled": { + "type": "boolean" + }, + "scanningSyncOnline": { + "type": "boolean" + }, + "sso": { + "type": "boolean" + }, + "storageVolume": { + "type": "string" + }, + "webTLSCA": { + "type": "string" + }, + "webTLSCert": { + "type": "string" + } + } + }, + "responses.Tag": { + "required": [ + "digest", + "createdAt", + "inNotary", + "manifest", + "name", + "author", + "updatedAt", + "hashMismatch" + ], + "properties": { + "author": { + "type": "string" + }, + "components": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.ScannerComponent" + } + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "digest": { + "type": "string" + }, + "hashMismatch": { + "description": "true if the hashes from notary and registry don't match", + "type": "boolean" + }, + "inNotary": { + "description": "true if the tag exists in Notary", + "type": "boolean" + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.ScannerLicense" + } + }, + "manifest": { + "$ref": "#/definitions/responses.Manifest" + }, + "mirroring": { + "$ref": "#/definitions/responses.Mirroring" + }, + "name": { + "type": "string" + }, + "promotion": { + "$ref": "#/definitions/responses.Promotion" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "vuln_summary": { + "$ref": "#/definitions/responses.OldScanSummary" + } + } + }, + "responses.Team": { + "required": [ + "id", + "clientUserIsMember" + ], + "properties": { + "clientUserIsMember": { + "type": "boolean" + }, + "id": { + "type": "string" + } + } + }, + "responses.TeamAccess": { + "required": [ + "accessLevel", + "team" + ], + "properties": { + "accessLevel": { + "type": "string", + "enum": [ + "read-only", + "read-write", + "admin" + ] + }, + "team": { + "$ref": "#/definitions/responses.Team" + } + } + }, + "responses.ThinScanSummaries": { + "required": [ + "images" + ], + "properties": { + "images": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schema.ScannerVulnCount" + } + } + } + }, + "responses.ThinTag": { + "required": [ + "name", + "digest" + ], + "properties": { + "digest": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "responses.UserSettings": { + "required": [ + "ContentCacheUUID" + ], + "properties": { + "ContentCacheUUID": { + "type": "string" + } + } + }, + "responses.Vulnerability": { + "required": [ + "cve", + "cvss", + "summary" + ], + "properties": { + "cve": { + "type": "string" + }, + "cvss": { + "type": "number", + "format": "float" + }, + "summary": { + "type": "string" + } + } + }, + "responses.VulnerabilityDetails": { + "required": [ + "vuln", + "exact", + "notes" + ], + "properties": { + "exact": { + "type": "boolean" + }, + "notes": { + "type": "array", + "items": { + "$ref": "#/definitions/responses.Note" + } + }, + "vuln": { + "$ref": "#/definitions/responses.Vulnerability" + } + } + }, + "responses.Webhook": { + "required": [ + "id", + "type", + "key", + "endpoint", + "authorID", + "createdAt", + "inactive", + "tlsCert", + "skipTLSVerification" + ], + "properties": { + "authorID": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "inactive": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "lastSuccessfulAt": { + "type": "string", + "format": "date-time" + }, + "skipTLSVerification": { + "type": "boolean" + }, + "tlsCert": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "ruleengine.Rule": { + "properties": { + "field": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "schema.Event": { + "required": [ + "id", + "publishedAt", + "actor", + "actorType", + "type", + "object", + "repository" + ], + "properties": { + "actor": { + "type": "string" + }, + "actorType": { + "type": "string" + }, + "id": { + "type": "string" + }, + "object": { + "$ref": "#/definitions/schema.Object" + }, + "publishedAt": { + "type": "string", + "format": "date-time" + }, + "repository": { + "type": "string" + }, + "target": { + "$ref": "#/definitions/schema.Object" + }, + "type": { + "type": "string" + } + } + }, + "schema.LayerVulnOverride": { + "required": [ + "pk", + "digest", + "component", + "componentVersion", + "cve", + "notes" + ], + "properties": { + "component": { + "type": "string" + }, + "componentVersion": { + "type": "string" + }, + "cve": { + "type": "string" + }, + "digest": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "pk": { + "type": "string" + } + } + }, + "schema.MirroringStatus": { + "required": [ + "code", + "detail", + "timestamp" + ], + "properties": { + "code": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } + }, + "schema.Object": { + "required": [ + "id", + "type" + ], + "properties": { + "content": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "schema.ScannedImage": { + "required": [ + "pk", + "namespace", + "repository", + "tag", + "manifestDigest", + "totalVulnCount", + "licenses", + "layers", + "components", + "cves", + "maxCVSSValue", + "scannerFingerprint", + "vulnOverrides" + ], + "properties": { + "components": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.ScannerComponent" + } + }, + "cves": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.ScannerCVE" + } + }, + "layers": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.ScannerLayer" + } + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.ScannerLicense" + } + }, + "manifestDigest": { + "type": "string" + }, + "maxCVSSValue": { + "type": "number", + "format": "float" + }, + "namespace": { + "type": "string" + }, + "pk": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "scannerFingerprint": { + "$ref": "#/definitions/schema.ScannerFingerprint" + }, + "tag": { + "type": "string" + }, + "totalVulnCount": { + "$ref": "#/definitions/schema.ScannerVulnCount" + }, + "vulnOverrides": { + "type": "array", + "items": { + "$ref": "#/definitions/schema.LayerVulnOverride" + } + } + } + }, + "schema.ScannerCVE": { + "required": [ + "cvePK", + "summary", + "cvss", + "notes" + ], + "properties": { + "cvePK": { + "type": "string" + }, + "cvss": { + "type": "number", + "format": "float" + }, + "notes": { + "type": "string" + }, + "summary": { + "type": "string" + } + } + }, + "schema.ScannerComponent": { + "required": [ + "componentPK", + "vulnCount", + "name", + "version", + "filepaths", + "cves", + "licenses", + "source" + ], + "properties": { + "componentPK": { + "type": "string" + }, + "cves": { + "type": "array", + "items": { + "type": "string" + } + }, + "filepaths": { + "type": "array", + "items": { + "type": "string" + } + }, + "licenses": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "source": { + "type": "string" + }, + "version": { + "type": "string" + }, + "vulnCount": { + "$ref": "#/definitions/schema.ScannerVulnCount" + } + } + }, + "schema.ScannerFingerprint": { + "required": [ + "scannerType", + "version" + ], + "properties": { + "scannerType": { + "type": "integer", + "format": "int32" + }, + "version": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "schema.ScannerLayer": { + "required": [ + "digest", + "mediaType", + "author", + "size", + "components" + ], + "properties": { + "author": { + "type": "string" + }, + "components": { + "type": "array", + "items": { + "type": "string" + } + }, + "digest": { + "type": "string" + }, + "mediaType": { + "type": "string" + }, + "size": { + "type": "integer", + "format": "int64" + } + } + }, + "schema.ScannerLicense": { + "required": [ + "name", + "url", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "schema.ScannerVulnCount": { + "required": [ + "critical", + "major", + "minor" + ], + "properties": { + "critical": { + "type": "integer", + "format": "int32" + }, + "major": { + "type": "integer", + "format": "int32" + }, + "minor": { + "type": "integer", + "format": "int32" + } + } + }, + "tmpforms.ActionConfigCreate": { + "required": [ + "action", + "parameters" + ], + "properties": { + "action": { + "description": "The action to modify the config for", + "type": "string" + }, + "parameters": { + "description": "Extra parameters to pass to the job. The available parameters depend on the job. These are overwritten by any corresponding parameters set in the job itself.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "tmpforms.CronCreate": { + "required": [ + "action", + "schedule", + "retries", + "capacityMap", + "parameters", + "deadline", + "stopTimeout" + ], + "properties": { + "action": { + "description": "The action which the cron will perform", + "type": "string" + }, + "capacityMap": { + "description": "The map of required capacity", + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "deadline": { + "description": "After this amount of time has passed, a SIGTERM will be sent", + "type": "string" + }, + "parameters": { + "description": "Extra parameters to pass to the job. The available parameters depend on the job.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "retries": { + "description": "The number of times to retry a job if it fails", + "type": "integer", + "format": "int32" + }, + "schedule": { + "description": "The for the cron as a cronspec string: (seconds) (minutes) (hours) (day of month) (month) (day of week) or @hourly, @weekly, etc.", + "type": "string" + }, + "stopTimeout": { + "description": "This long after SIGTERM is sent, SIGKILL will be sent if the proccess is still alive", + "type": "string" + } + } + }, + "tmpforms.EmptyForm": {}, + "tmpforms.JobSubmission": { + "required": [ + "action", + "parameters", + "retries", + "capacityMap", + "deadline", + "stopTimeout", + "scheduledAt" + ], + "properties": { + "action": { + "description": "The action which the job will perform", + "type": "string" + }, + "capacityMap": { + "description": "The map of required capacity", + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "deadline": { + "description": "After this amount of time has passed, a SIGTERM will be sent", + "type": "string" + }, + "parameters": { + "description": "Parameters to start the job with", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "retries": { + "description": "The number of times to retry a job if it fails", + "type": "integer", + "format": "int32" + }, + "scheduledAt": { + "description": "The time at which to run the job. Empty string or no value means now. Format: RFC3339", + "type": "string" + }, + "stopTimeout": { + "description": "This long after SIGTERM is sent, SIGKILL will be sent if the proccess is still alive", + "type": "string" + } + } + }, + "tmpforms.UpdateWorkerCapacity": { + "required": [ + "capacityMap" + ], + "properties": { + "capacityMap": { + "description": "The new capacity for the worker, representing roughly the amount of RAM to use", + "type": "object", + "additionalProperties": { + "type": "integer" + } + } + } + }, + "tmpresponses.ActionConfig": { + "required": [ + "id", + "action", + "parameters" + ], + "properties": { + "action": { + "description": "The action this config refers to.", + "type": "string" + }, + "id": { + "description": "Randomly generated UUID for foreign references.", + "type": "string" + }, + "parameters": { + "description": "Extra parameters to pass to the job. The available parameters depend on the job.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "tmpresponses.ActionConfigs": { + "required": [ + "actionConfigs" + ], + "properties": { + "actionConfigs": { + "type": "array", + "items": { + "$ref": "#/definitions/tmpresponses.ActionConfig" + } + } + } + }, + "tmpresponses.Cron": { + "required": [ + "id", + "action", + "schedule", + "retries", + "capacityMap", + "parameters", + "deadline", + "stopTimeout", + "nextRun" + ], + "properties": { + "action": { + "description": "The action to be performed by jobs spawned from this cron.", + "type": "string" + }, + "capacityMap": { + "description": "The map of required capacity", + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "deadline": { + "type": "string" + }, + "id": { + "description": "Randomly generated UUID for foreign references.", + "type": "string" + }, + "nextRun": { + "description": "The next time the job will run.", + "type": "string", + "format": "date-time" + }, + "parameters": { + "description": "Extra parameters to pass to the job. The available parameters depend on the job.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "retries": { + "description": "The number of times to retry the job if it fails", + "type": "integer", + "format": "int32" + }, + "schedule": { + "description": "The schedule for this cron as a cronspec string: (seconds) (minutes) (hours) (day of month) (month) (day of week) or @hourly, @weekly, etc.", + "type": "string" + }, + "stopTimeout": { + "description": "This long after SIGTERM is sent, SIGKILL will be sent if the proccess is still alive", + "type": "string" + } + } + }, + "tmpresponses.Crons": { + "required": [ + "crons" + ], + "properties": { + "crons": { + "type": "array", + "items": { + "$ref": "#/definitions/tmpresponses.Cron" + } + } + } + }, + "tmpresponses.Job": { + "required": [ + "id", + "retryFromID", + "workerID", + "status", + "scheduledAt", + "lastUpdated", + "action", + "retriesLeft", + "retriesTotal", + "capacityMap", + "parameters", + "deadline", + "stopTimeout" + ], + "properties": { + "action": { + "description": "The action this job performs", + "type": "string" + }, + "capacityMap": { + "description": "The map of required capacity", + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "deadline": { + "type": "string" + }, + "id": { + "description": "The ID of the job", + "type": "string" + }, + "lastUpdated": { + "description": "The last time at which the status of this job was updated", + "type": "string", + "format": "date-time" + }, + "parameters": { + "description": "Extra parameters to pass to the job. The available parameters depend on the job.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "retriesLeft": { + "description": "The number of times to retry the job if it fails", + "type": "integer", + "format": "int32" + }, + "retriesTotal": { + "description": "The total number of times to retry the original job if it fails", + "type": "integer", + "format": "int32" + }, + "retryFromID": { + "description": "The ID of the job this job retried from", + "type": "string" + }, + "scheduledAt": { + "description": "The time at which this job was scheduled", + "type": "string", + "format": "date-time" + }, + "status": { + "description": "The current status of the job", + "type": "string", + "enum": [ + "waiting", + "running", + "done", + "canceled", + "errored" + ] + }, + "stopTimeout": { + "description": "This long after SIGTERM is sent, SIGKILL will be sent if the proccess is still alive", + "type": "string" + }, + "workerID": { + "description": "The ID of the worker which performed the job, unclaimed by a worker if empty", + "type": "string" + } + } + }, + "tmpresponses.JobLog": { + "required": [ + "data", + "lineNum" + ], + "properties": { + "data": { + "type": "string" + }, + "lineNum": { + "type": "integer", + "format": "int32" + } + } + }, + "tmpresponses.Jobs": { + "required": [ + "jobs" + ], + "properties": { + "jobs": { + "type": "array", + "items": { + "$ref": "#/definitions/tmpresponses.Job" + } + } + } + }, + "tmpresponses.Worker": { + "required": [ + "id", + "status", + "capacityMap", + "heartbeatExpiration" + ], + "properties": { + "capacityMap": { + "description": "A map used to represent now much load the worker should be allocated. Only security scanning jobs use this and the value is roughly equivalent to expected memory usage in bytes.", + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "heartbeatExpiration": { + "description": "Time after which the worker should be considered dead.", + "type": "string" + }, + "id": { + "description": "Randomly generated UUID for foreign references.", + "type": "string" + }, + "status": { + "description": "Status of the worker", + "type": "string" + } + } + }, + "tmpresponses.Workers": { + "required": [ + "workers" + ], + "properties": { + "workers": { + "type": "array", + "items": { + "$ref": "#/definitions/tmpresponses.Worker" + } + } + } + } + }, + "tags": [ + { + "description": "Accounts", + "name": "accounts" + }, + { + "description": "Admin", + "name": "meta" + }, + { + "description": "Content Caches", + "name": "content_caches" + }, + { + "description": "Repositories", + "name": "repositories" + }, + { + "description": "Repository Namespaces", + "name": "repositoryNamespaces" + }, + { + "description": "Events", + "name": "events" + }, + { + "description": "Docker Security Scanner", + "name": "imagescan" + }, + { + "description": "Webhooks", + "name": "webhooks" + }, + { + "description": "Jobs", + "name": "jobs" + }, + { + "description": "Crons", + "name": "crons" + }, + { + "description": "Workers", + "name": "workers" + }, + { + "description": "Action Configs", + "name": "action_configs" + } + ] +} diff --git a/reference/dtr/2.6/cli/install.md b/reference/dtr/2.6/cli/install.md index 36cfed2311..325a09f5b4 100644 --- a/reference/dtr/2.6/cli/install.md +++ b/reference/dtr/2.6/cli/install.md @@ -23,11 +23,13 @@ After installing DTR, you can join additional DTR replicas using `docker/dtr joi ## Example Usage +```bash $ docker run -it --rm docker/dtr:{{ site.dtr_version }}.0 install \ --ucp-node \ --ucp-insecure-tls +``` -> Note: Use `--ucp-ca "$(cat ca.pem)"` instead of `--ucp-insecure-tls` for a production deployment. +> **Note**: Use `--ucp-ca "$(cat ca.pem)"` instead of `--ucp-insecure-tls` for a production deployment. ## Options diff --git a/reference/ucp/3.1/cli/install.md b/reference/ucp/3.1/cli/install.md index 355ec80ed1..5528f1cdc3 100644 --- a/reference/ucp/3.1/cli/install.md +++ b/reference/ucp/3.1/cli/install.md @@ -42,41 +42,42 @@ command. | Option | Description | |:-------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `--debug, D` | Enable debug mode | -| `--jsonlog` | Produce json formatted output for easier parsing | -| `--interactive, i` | Run in interactive mode and prompt for configuration values | -| `--admin-username` | The UCP administrator username | | `--admin-password` | The UCP administrator password | -| `--san` | Add subject alternative names to certificates (e.g. --san www1.acme.com --san www2.acme.com) | | `--unmanaged-cni` | This determines who manages the CNI plugin, using `true` or `false`. The default is `false`. The `true` value installs UCP without a managed CNI plugin. UCP and the Kubernetes components will be running but pod to pod networking will not function until a CNI plugin is manually installed. This will impact some functionality of UCP until a CNI plugin is running. | -| `--host-address` | The network address to advertise to other nodes. Format: IP address or network interface name | -| `--data-path-addr` | Address or interface to use for data path traffic. Format: IP address or network interface name | -| `--controller-port` | Port for the web UI and API | -| `--kube-apiserver-port` | Port for the Kubernetes API server (default: 6443) | -| `--swarm-port` | Port for the Docker Swarm manager. Used for backwards compatibility | -| `--swarm-grpc-port` | Port for communication between nodes | +| `--admin-username` | The UCP administrator username | +| `--binpack` | Set the Docker Swarm scheduler to binpack mode. Used for backwards compatibility | +| `--cloud-provider` | The cloud provider for the cluster | `--cni-installer-url` | Deprecated feature. A URL pointing to a Kubernetes YAML file to be used as an installer for the CNI plugin of the cluster. If specified, the default CNI plugin is not installed. If the URL uses the HTTPS scheme, no certificate verification is performed. | -| `--unmanaged-cni` | flag to indicate if cni provider is calico and managed by UCP (calico is the default CNI provider). The default value is "true" when using the default Calico CNI. | -| `--pod-cidr` | Kubernetes cluster IP pool for the pods to allocated IPs from (Default: `192.168.0.0/16`) | -| `--cloud-provider` | The cloud provider for the cluster | -| `--dns` | Set custom DNS servers for the UCP containers | -| `--dns-opt` | Set DNS options for the UCP containers | -| `--dns-search` | Set custom DNS search domains for the UCP containers | -| `--unlock-key` | The unlock key for this swarm-mode cluster, if one exists. | -| `--existing-config` | Use the latest existing UCP config during this installation. The install fails if a config is not found. | -| `--force-minimums` | Force the install/upgrade even if the system doesn't meet the minimum requirements. | -| `--pull` | Pull UCP images: `always`, when `missing`, or `never` | -| `--registry-username` | Username to use when pulling images | -| `--registry-password` | Password to use when pulling images | -| `--kv-timeout` | Timeout in milliseconds for the key-value store | -| `--kv-snapshot-count` | Number of changes between key-value store snapshots | -| `--swarm-experimental` | Enable Docker Swarm experimental features. Used for backwards compatibility | +| `--controller-port` | Port for the web UI and API +| `--data-path-addr` | Address or interface to use for data path traffic. Format: IP address or network interface name +| `--debug, D` | Enable debug mode | | `--disable-tracking` | Disable anonymous tracking and analytics | | `--disable-usage` | Disable anonymous usage reporting | -| `--external-server-cert` | Use the certificates in the `ucp-controller-server-certs` volume instead of generating self-signed certs during installation | -| `--preserve-certs` | Don't generate certificates if they already exist | -| `--binpack` | Set the Docker Swarm scheduler to binpack mode. Used for backwards compatibility | -| `--random` | Set the Docker Swarm scheduler to random mode. Used for backwards compatibility | -| `--external-service-lb` | Set the external service load balancer reported in the UI | +| `--dns` | Set custom DNS servers for the UCP containers | +| `--dns-opt` | Set DNS options for the UCP containers | +| `--dns-search` | Set custom DNS search domains for the UCP containers | | `--enable-profiling` | Enable performance profiling | -| `--license` | Add a license: e.g.` --license "$(cat license.lic)" ` | +| `--existing-config` | Use the latest existing UCP config during this installation. The install fails if a config is not found. | +| `--external-server-cert` | Use the certificates in the `ucp-controller-server-certs` volume instead of generating self-signed certs during installation | +| `--external-service-lb` | Set the external service load balancer reported in the UI | | `--force-insecure-tcp` | Force install to continue even with unauthenticated Docker Engine ports | +| `--force-minimums` | Force the install/upgrade even if the system doesn't meet the minimum requirements. | +| `--host-address` | The network address to advertise to other nodes. Format: IP address or network interface name | +| `--interactive, i` | Run in interactive mode and prompt for configuration values | +| `--jsonlog` | Produce json formatted output for easier parsing | +| `--kube-apiserver-port` | Port for the Kubernetes API server (default: 6443) | +| `--kv-snapshot-count` | Number of changes between key-value store snapshots | +| `--kv-timeout` | Timeout in milliseconds for the key-value store | +| `--license` | Add a license: e.g.` --license "$(cat license.lic)" ` | +| `--pod-cidr` | Kubernetes cluster IP pool for the pods to allocated IPs from (Default: `192.168.0.0/16`) | +| `--preserve-certs` | Don't generate certificates if they already exist | +| `--pull` | Pull UCP images: `always`, when `missing`, or `never` | +| `--random` | Set the Docker Swarm scheduler to random mode. Used for backwards compatibility | +| `--registry-username` | Username to use when pulling images | +| `--registry-password` | Password to use when pulling images | +| `--san` | Add subject alternative names to certificates (e.g. --san www1.acme.com --san www2.acme.com) | +| `--skip-cloud-provider` | Disables checks that rely on detecting the cloud provider (if any) on which the cluster is currently running. | +| `--swarm-experimental` | Enable Docker Swarm experimental features. Used for backwards compatibility | +| `--swarm-port` | Port for the Docker Swarm manager. Used for backwards compatibility | +| `--swarm-grpc-port` | Port for communication between nodes | +| `--unlock-key` | The unlock key for this swarm-mode cluster, if one exists. | +| `--unmanaged-cni` |The default value of `false` indicates that Kubernetes networking is managed by UCP with its default managed CNI plugin, Calico. When set to `true`, UCP does not deploy or manage the lifecycle of the default CNI plugin - the CNI plugin is deployed and managed independently of UCP. Note that when `unmanaged-cni=true`, networking in the cluster will not function for Kubernetes until a CNI plugin is deployed. | diff --git a/registry/help.md b/registry/help.md index ff5a76077b..694af283a1 100644 --- a/registry/help.md +++ b/registry/help.md @@ -7,7 +7,7 @@ title: Get help If you need help, or just want to chat, you can reach us: - on the [Docker forums](https://forums.docker.com/c/open-source-projects/opensrcreg). -- on the [Docker community Slack](https://dockercommunity.slack.com/messages/C31GQCJN7/). +- on the [Docker community Slack](https://blog.docker.com/2016/11/introducing-docker-community-directory-docker-community-slack/). - on the [mailing list](https://groups.google.com/a/dockerproject.org/forum/#!forum/distribution) (mail at ). If you want to report a bug: diff --git a/registry/recipes/nginx.md b/registry/recipes/nginx.md index 6673b2a22b..07ed4b62be 100644 --- a/registry/recipes/nginx.md +++ b/registry/recipes/nginx.md @@ -38,7 +38,7 @@ you want through the secondary authentication mechanism implemented inside your proxy, it also requires that you move TLS termination from the Registry to the proxy itself. -> ***NOTE:*** Docker does not recommend binding your registry to `localhost:5000` without +> **Note**: Docker does not recommend binding your registry to `localhost:5000` without > authentication. This creates a potential loophole in your Docker Registry security. > As a result, anyone who can log on to the server where your Docker Registry is running > can push images without authentication. diff --git a/release-notes/docker-compose.md b/release-notes/docker-compose.md index d4a72da42b..5021768df4 100644 --- a/release-notes/docker-compose.md +++ b/release-notes/docker-compose.md @@ -954,7 +954,7 @@ naming scheme accordingly before upgrading. - Containers dependencies can now be set up to wait on positive healthchecks when declared using `depends_on`. See the documentation for the updated syntax. - **Note:** This feature will not be ported to version 3 Compose files. + **Note**: This feature will not be ported to version 3 Compose files. - Added support for the `sysctls` parameter in service definitions diff --git a/storage/storagedriver/zfs-driver.md b/storage/storagedriver/zfs-driver.md index 46f83af919..2f3faa159a 100644 --- a/storage/storagedriver/zfs-driver.md +++ b/storage/storagedriver/zfs-driver.md @@ -44,7 +44,7 @@ use unless you have substantial experience with ZFS on Linux. and push existing images to Docker Hub or a private repository, so that you do not need to re-create them later. -> ***NOTE:*** There is no need to use `MountFlags=slave` with Docker Engine 18.09 or +> **Note**: There is no need to use `MountFlags=slave` with Docker Engine 18.09 or > later because `dockerd` and `containerd` are in different mount namespaces. ## Configure Docker with the `zfs` storage driver