api: move scripts to generate and validate swagger to api module
| ... | ... |
@@ -163,6 +163,29 @@ jobs: |
| 163 | 163 |
run: | |
| 164 | 164 |
make -o build validate-${{ matrix.script }}
|
| 165 | 165 |
|
| 166 |
+ validate-api-swagger: |
|
| 167 |
+ runs-on: ubuntu-24.04 |
|
| 168 |
+ timeout-minutes: 10 # guardrails timeout for the whole job |
|
| 169 |
+ defaults: |
|
| 170 |
+ run: |
|
| 171 |
+ working-directory: api |
|
| 172 |
+ needs: |
|
| 173 |
+ - validate-dco |
|
| 174 |
+ name: validate (api-swagger) |
|
| 175 |
+ steps: |
|
| 176 |
+ - |
|
| 177 |
+ name: Checkout |
|
| 178 |
+ uses: actions/checkout@v4 |
|
| 179 |
+ - |
|
| 180 |
+ name: Build api module image |
|
| 181 |
+ run: | |
|
| 182 |
+ make build GO_VERSION=${{ env.GO_VERSION }}
|
|
| 183 |
+ - |
|
| 184 |
+ name: Validate swagger |
|
| 185 |
+ run: | |
|
| 186 |
+ make validate-swagger |
|
| 187 |
+ make validate-swagger-gen |
|
| 188 |
+ |
|
| 166 | 189 |
smoke-prepare: |
| 167 | 190 |
runs-on: ubuntu-24.04 |
| 168 | 191 |
timeout-minutes: 10 # guardrails timeout for the whole job |
| ... | ... |
@@ -83,22 +83,6 @@ RUN --mount=type=cache,sharing=locked,id=moby-criu-aptlib,target=/var/lib/apt \ |
| 83 | 83 |
FROM distribution/distribution:$REGISTRY_VERSION AS registry |
| 84 | 84 |
RUN mkdir /build && mv /bin/registry /build/registry |
| 85 | 85 |
|
| 86 |
-# go-swagger |
|
| 87 |
-FROM base AS swagger |
|
| 88 |
-WORKDIR /go/src/github.com/go-swagger/go-swagger |
|
| 89 |
-ARG TARGETPLATFORM |
|
| 90 |
-# GO_SWAGGER_VERSION specifies the version of the go-swagger binary to install. |
|
| 91 |
-# Go-swagger is used in CI for generating types from swagger.yaml in |
|
| 92 |
-# hack/validate/swagger-gen |
|
| 93 |
-ARG GO_SWAGGER_VERSION=v0.33.1 |
|
| 94 |
-RUN --mount=type=cache,target=/root/.cache/go-build,id=swagger-build-$TARGETPLATFORM \ |
|
| 95 |
- --mount=type=cache,target=/go/pkg/mod \ |
|
| 96 |
- --mount=type=tmpfs,target=/go/src/ <<EOT |
|
| 97 |
- set -e |
|
| 98 |
- GOBIN=/build CGO_ENABLED=0 xx-go install "github.com/go-swagger/go-swagger/cmd/swagger@${GO_SWAGGER_VERSION}"
|
|
| 99 |
- xx-verify /build/swagger |
|
| 100 |
-EOT |
|
| 101 |
- |
|
| 102 | 86 |
# frozen-images |
| 103 | 87 |
# See also frozenImages in "testutil/environment/protect.go" (which needs to |
| 104 | 88 |
# be updated when adding images to this list) |
| ... | ... |
@@ -420,7 +404,6 @@ FROM docker/compose-bin:${COMPOSE_VERSION} AS compose
|
| 420 | 420 |
|
| 421 | 421 |
FROM base AS dev-systemd-false |
| 422 | 422 |
COPY --link --from=frozen-images /build/ /docker-frozen-images |
| 423 |
-COPY --link --from=swagger /build/ /usr/local/bin/ |
|
| 424 | 423 |
COPY --link --from=delve /build/ /usr/local/bin/ |
| 425 | 424 |
COPY --link --from=gowinres /build/ /usr/local/bin/ |
| 426 | 425 |
COPY --link --from=tini /build/ /usr/local/bin/ |
| ... | ... |
@@ -118,11 +118,8 @@ DELVE_PORT_FORWARD := $(if $(DELVE_PORT),-p "$(DELVE_PORT)",) |
| 118 | 118 |
|
| 119 | 119 |
DOCKER_FLAGS := $(DOCKER) run --rm --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD) $(DELVE_PORT_FORWARD) |
| 120 | 120 |
|
| 121 |
-SWAGGER_DOCS_PORT ?= 9000 |
|
| 122 |
- |
|
| 123 | 121 |
define \n |
| 124 | 122 |
|
| 125 |
- |
|
| 126 | 123 |
endef |
| 127 | 124 |
|
| 128 | 125 |
# if this session isn't interactive, then we don't want to allocate a |
| ... | ... |
@@ -263,20 +260,12 @@ win: bundles ## cross build the binary for windows |
| 263 | 263 |
$(BAKE_CMD) --set *.platform=windows/amd64 binary |
| 264 | 264 |
|
| 265 | 265 |
.PHONY: swagger-gen |
| 266 |
-swagger-gen: |
|
| 267 |
- docker run --rm -v $(PWD):/go/src/github.com/docker/docker \ |
|
| 268 |
- -w /go/src/github.com/docker/docker \ |
|
| 269 |
- --entrypoint hack/generate-swagger-api.sh \ |
|
| 270 |
- -e GOPATH=/go \ |
|
| 271 |
- quay.io/goswagger/swagger:0.7.4 |
|
| 266 |
+swagger-gen: ## generate swagger API types |
|
| 267 |
+ $(MAKE) -C api swagger-gen |
|
| 272 | 268 |
|
| 273 | 269 |
.PHONY: swagger-docs |
| 274 | 270 |
swagger-docs: ## preview the API documentation |
| 275 |
- @echo "API docs preview will be running at http://localhost:$(SWAGGER_DOCS_PORT)" |
|
| 276 |
- @docker run --rm -v $(PWD)/api/swagger.yaml:/usr/share/nginx/html/swagger.yaml \ |
|
| 277 |
- -e 'REDOC_OPTIONS=hide-hostname="true" lazy-rendering' \ |
|
| 278 |
- -p $(SWAGGER_DOCS_PORT):80 \ |
|
| 279 |
- bfirsh/redoc:1.14.0 |
|
| 271 |
+ $(MAKE) -C api swagger-docs |
|
| 280 | 272 |
|
| 281 | 273 |
.PHONY: generate-files |
| 282 | 274 |
generate-files: |
| 283 | 275 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,25 @@ |
| 0 |
+# syntax=docker/dockerfile:1 |
|
| 1 |
+ |
|
| 2 |
+ARG GO_VERSION=1.25.4 |
|
| 3 |
+ |
|
| 4 |
+FROM golang:${GO_VERSION}-alpine AS base
|
|
| 5 |
+RUN apk add --no-cache bash make yamllint |
|
| 6 |
+CMD ["/bin/bash"] |
|
| 7 |
+ |
|
| 8 |
+# go-swagger |
|
| 9 |
+FROM base AS swagger |
|
| 10 |
+WORKDIR /go/src/github.com/go-swagger/go-swagger |
|
| 11 |
+# GO_SWAGGER_VERSION specifies the version of the go-swagger binary to install. |
|
| 12 |
+# Go-swagger is used in CI for generating types from swagger.yaml in |
|
| 13 |
+# api/scripts/generate-swagger-api.sh |
|
| 14 |
+ARG GO_SWAGGER_VERSION=v0.33.1 |
|
| 15 |
+ARG TARGETPLATFORM |
|
| 16 |
+RUN --mount=type=cache,target=/root/.cache/go-build,id=swagger-build-$TARGETPLATFORM \ |
|
| 17 |
+ --mount=type=cache,target=/go/pkg/mod \ |
|
| 18 |
+ CGO_ENABLED=0 go install "github.com/go-swagger/go-swagger/cmd/swagger@${GO_SWAGGER_VERSION}" && \
|
|
| 19 |
+ /go/bin/swagger version |
|
| 20 |
+ |
|
| 21 |
+# dev is a dev-environment to work with the api module. |
|
| 22 |
+FROM base AS dev |
|
| 23 |
+COPY --from=swagger /go/bin/swagger /usr/local/bin/swagger |
|
| 24 |
+WORKDIR /go/src/github.com/moby/moby/api |
| 0 | 25 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,64 @@ |
| 0 |
+# API Module Makefile |
|
| 1 |
+# This Makefile provides targets for the swagger generation and validation |
|
| 2 |
+# which are specific to the API module. |
|
| 3 |
+ |
|
| 4 |
+DOCKER ?= docker |
|
| 5 |
+BUILDX ?= $(DOCKER) buildx |
|
| 6 |
+ |
|
| 7 |
+API_DIR := $(CURDIR) |
|
| 8 |
+PROJECT_PATH := /go/src/github.com/moby/moby |
|
| 9 |
+ |
|
| 10 |
+DOCKER_MOUNT := -v "$(API_DIR):$(PROJECT_PATH)/api" |
|
| 11 |
+ |
|
| 12 |
+DOCKER_IMAGE := docker-api-dev |
|
| 13 |
+ |
|
| 14 |
+DOCKER_WORKDIR := -w $(PROJECT_PATH)/api |
|
| 15 |
+ |
|
| 16 |
+DOCKER_FLAGS := $(DOCKER) run --rm $(DOCKER_MOUNT) $(DOCKER_WORKDIR) |
|
| 17 |
+DOCKER_RUN := $(DOCKER_FLAGS) "$(DOCKER_IMAGE)" |
|
| 18 |
+ |
|
| 19 |
+DOCKER_CONTAINER_NAME := $(if $(CONTAINER_NAME),--name $(CONTAINER_NAME),) |
|
| 20 |
+ |
|
| 21 |
+BUILD_CMD := $(BUILDX) build |
|
| 22 |
+GO_VERSION ?= 1.25.4 |
|
| 23 |
+SWAGGER_VERSION ?= v0.33.1 |
|
| 24 |
+SWAGGER_DOCS_PORT ?= 9000 |
|
| 25 |
+ |
|
| 26 |
+.DEFAULT_GOAL := help |
|
| 27 |
+ |
|
| 28 |
+.PHONY: build |
|
| 29 |
+build: |
|
| 30 |
+ $(BUILD_CMD) \ |
|
| 31 |
+ --build-arg GO_VERSION=$(GO_VERSION) \ |
|
| 32 |
+ --build-arg SWAGGER_VERSION=$(SWAGGER_VERSION) \ |
|
| 33 |
+ --target dev \ |
|
| 34 |
+ --load \ |
|
| 35 |
+ -t "$(DOCKER_IMAGE)" \ |
|
| 36 |
+ -f Dockerfile \ |
|
| 37 |
+ . |
|
| 38 |
+ |
|
| 39 |
+.PHONY: swagger-gen |
|
| 40 |
+swagger-gen: build ## generate swagger API types |
|
| 41 |
+ $(DOCKER_RUN) ./scripts/generate-swagger-api.sh |
|
| 42 |
+ |
|
| 43 |
+.PHONY: swagger-docs |
|
| 44 |
+swagger-docs: ## preview the API documentation |
|
| 45 |
+ @echo "API docs preview will be running at http://localhost:$(SWAGGER_DOCS_PORT)" |
|
| 46 |
+ @docker run --rm \ |
|
| 47 |
+ -v $(PWD)/:/usr/share/nginx/html/swagger/ \ |
|
| 48 |
+ -e 'REDOC_OPTIONS=hide-hostname="true" lazy-rendering' \ |
|
| 49 |
+ -e SPEC_URL="swagger/swagger.yaml" \ |
|
| 50 |
+ -p $(SWAGGER_DOCS_PORT):80 \ |
|
| 51 |
+ redocly/redoc:v2.5.1 |
|
| 52 |
+ |
|
| 53 |
+.PHONY: validate-swagger |
|
| 54 |
+validate-swagger: build ## validate the swagger.yaml file |
|
| 55 |
+ $(DOCKER_RUN) ./scripts/validate-swagger.sh |
|
| 56 |
+ |
|
| 57 |
+.PHONY: validate-swagger-gen |
|
| 58 |
+validate-swagger-gen: build ## validate generated types are up-to-date |
|
| 59 |
+ $(DOCKER_RUN) ./scripts/validate-swagger-gen.sh |
|
| 60 |
+ |
|
| 61 |
+.PHONY: help |
|
| 62 |
+help: ## display this help message |
|
| 63 |
+ @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
| 0 | 64 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,127 @@ |
| 0 |
+#!/bin/bash |
|
| 1 |
+# vim: set noexpandtab: |
|
| 2 |
+# -*- indent-tabs-mode: t -*- |
|
| 3 |
+set -eu |
|
| 4 |
+ |
|
| 5 |
+API_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
| 6 |
+ |
|
| 7 |
+generate_model() {
|
|
| 8 |
+ local package="$1" |
|
| 9 |
+ shift |
|
| 10 |
+ mapfile |
|
| 11 |
+ swagger generate model --spec="${API_DIR}/swagger.yaml" \
|
|
| 12 |
+ --target="${API_DIR}" --model-package="$package" \
|
|
| 13 |
+ --config-file="${API_DIR}/swagger-gen.yaml" \
|
|
| 14 |
+ --template-dir="${API_DIR}/templates" --allow-template-override \
|
|
| 15 |
+ "$@" \ |
|
| 16 |
+ $(printf -- '--name=%s ' "${MAPFILE[@]}")
|
|
| 17 |
+} |
|
| 18 |
+ |
|
| 19 |
+generate_operation() {
|
|
| 20 |
+ mapfile |
|
| 21 |
+ swagger generate operation --spec="${API_DIR}/swagger.yaml" \
|
|
| 22 |
+ --target="${API_DIR}" --api-package=types --model-package=types \
|
|
| 23 |
+ --config-file="${API_DIR}/swagger-gen.yaml" \
|
|
| 24 |
+ --template-dir="${API_DIR}/templates" --allow-template-override \
|
|
| 25 |
+ "$@" \ |
|
| 26 |
+ $(printf -- '--name=%s ' "${MAPFILE[@]}")
|
|
| 27 |
+} |
|
| 28 |
+ |
|
| 29 |
+# /==================================================================\ |
|
| 30 |
+# | | |
|
| 31 |
+# | ATTENTION: | |
|
| 32 |
+# | | |
|
| 33 |
+# | Sort model package stanzas and model/operation names | |
|
| 34 |
+# | *** ALPHABETICALLY *** | |
|
| 35 |
+# | to reduce the likelihood of merge conflicts. | |
|
| 36 |
+# | | |
|
| 37 |
+# \==================================================================/ |
|
| 38 |
+ |
|
| 39 |
+#region -------- Models -------- |
|
| 40 |
+ |
|
| 41 |
+generate_model types/build <<- 'EOT' |
|
| 42 |
+ BuildCacheDiskUsage |
|
| 43 |
+EOT |
|
| 44 |
+ |
|
| 45 |
+generate_model types/common <<- 'EOT' |
|
| 46 |
+ ErrorResponse |
|
| 47 |
+ IDResponse |
|
| 48 |
+EOT |
|
| 49 |
+ |
|
| 50 |
+generate_model types/container <<- 'EOT' |
|
| 51 |
+ ChangeType |
|
| 52 |
+ ContainerCreateResponse |
|
| 53 |
+ ContainerTopResponse |
|
| 54 |
+ ContainerUpdateResponse |
|
| 55 |
+ ContainerWaitExitError |
|
| 56 |
+ ContainerWaitResponse |
|
| 57 |
+ ContainersDiskUsage |
|
| 58 |
+ FilesystemChange |
|
| 59 |
+ PortSummary |
|
| 60 |
+EOT |
|
| 61 |
+ |
|
| 62 |
+generate_model types/image <<- 'EOT' |
|
| 63 |
+ ImageDeleteResponseItem |
|
| 64 |
+ ImagesDiskUsage |
|
| 65 |
+EOT |
|
| 66 |
+# ImageSummary |
|
| 67 |
+# TODO: Restore when go-swagger is updated |
|
| 68 |
+# See https://github.com/moby/moby/pull/47526#discussion_r1551800022 |
|
| 69 |
+ |
|
| 70 |
+generate_model types/network --keep-spec-order --additional-initialism=IPAM <<- 'EOT' |
|
| 71 |
+ ConfigReference |
|
| 72 |
+ EndpointResource |
|
| 73 |
+ IPAMStatus |
|
| 74 |
+ Network |
|
| 75 |
+ NetworkConnectRequest |
|
| 76 |
+ NetworkCreateResponse |
|
| 77 |
+ NetworkDisconnectRequest |
|
| 78 |
+ NetworkInspect |
|
| 79 |
+ NetworkStatus |
|
| 80 |
+ NetworkSummary |
|
| 81 |
+ NetworkTaskInfo |
|
| 82 |
+ PeerInfo |
|
| 83 |
+ ServiceInfo |
|
| 84 |
+ SubnetStatus |
|
| 85 |
+EOT |
|
| 86 |
+ |
|
| 87 |
+generate_model types/plugin <<- 'EOT' |
|
| 88 |
+ Plugin |
|
| 89 |
+ PluginDevice |
|
| 90 |
+ PluginEnv |
|
| 91 |
+ PluginMount |
|
| 92 |
+EOT |
|
| 93 |
+ |
|
| 94 |
+generate_model types/registry <<- 'EOT' |
|
| 95 |
+ AuthResponse |
|
| 96 |
+EOT |
|
| 97 |
+ |
|
| 98 |
+generate_model types/storage <<- 'EOT' |
|
| 99 |
+ DriverData |
|
| 100 |
+ RootFSStorage |
|
| 101 |
+ RootFSStorageSnapshot |
|
| 102 |
+ Storage |
|
| 103 |
+EOT |
|
| 104 |
+ |
|
| 105 |
+generate_model types/swarm <<- 'EOT' |
|
| 106 |
+ ServiceCreateResponse |
|
| 107 |
+ ServiceUpdateResponse |
|
| 108 |
+EOT |
|
| 109 |
+ |
|
| 110 |
+generate_model types/volume <<- 'EOT' |
|
| 111 |
+ Volume |
|
| 112 |
+ VolumeCreateRequest |
|
| 113 |
+ VolumeListResponse |
|
| 114 |
+ VolumesDiskUsage |
|
| 115 |
+EOT |
|
| 116 |
+ |
|
| 117 |
+#endregion |
|
| 118 |
+ |
|
| 119 |
+#region -------- Operations -------- |
|
| 120 |
+ |
|
| 121 |
+generate_operation --skip-responses --skip-parameters <<- 'EOT' |
|
| 122 |
+ Authenticate |
|
| 123 |
+ ImageHistory |
|
| 124 |
+EOT |
|
| 125 |
+ |
|
| 126 |
+#endregion |
| 0 | 127 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,52 @@ |
| 0 |
+#!/usr/bin/env bash |
|
| 1 |
+set -euo pipefail |
|
| 2 |
+ |
|
| 3 |
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
| 4 |
+API_DIR="${SCRIPT_DIR}/.."
|
|
| 5 |
+ |
|
| 6 |
+TMP_DIR="$(mktemp -d)" |
|
| 7 |
+trap "rm -rf ${TMP_DIR}" EXIT
|
|
| 8 |
+GEN_FILES=() |
|
| 9 |
+ |
|
| 10 |
+echo "Validating generated code..." |
|
| 11 |
+echo "Separating generated files from handwritten files..." |
|
| 12 |
+while IFS= read -r file; do |
|
| 13 |
+ GEN_FILES+=("$file")
|
|
| 14 |
+done < <(grep -rl "// Code generated" "${API_DIR}/types" || true)
|
|
| 15 |
+ |
|
| 16 |
+echo "Copying generated files into temporary folder..." |
|
| 17 |
+for f in "${GEN_FILES[@]}"; do
|
|
| 18 |
+ mkdir -p "${TMP_DIR}/$(dirname "${f#${API_DIR}/}")"
|
|
| 19 |
+ cp "$f" "${TMP_DIR}/${f#${API_DIR}/}"
|
|
| 20 |
+done |
|
| 21 |
+ |
|
| 22 |
+cp "${API_DIR}/swagger.yaml" "${TMP_DIR}/"
|
|
| 23 |
+cp "${API_DIR}/swagger-gen.yaml" "${TMP_DIR}/"
|
|
| 24 |
+cp -r "${API_DIR}/templates" "${TMP_DIR}/" 2> /dev/null || true
|
|
| 25 |
+ |
|
| 26 |
+echo "Generating swagger types in temporary folder..." |
|
| 27 |
+( |
|
| 28 |
+ cd "${TMP_DIR}"
|
|
| 29 |
+ "${SCRIPT_DIR}/generate-swagger-api.sh" > /dev/null 2>&1
|
|
| 30 |
+) |
|
| 31 |
+ |
|
| 32 |
+echo "Run diff for all generated files..." |
|
| 33 |
+DIFF_FOUND=false |
|
| 34 |
+for f in "${GEN_FILES[@]}"; do
|
|
| 35 |
+ REL="${f#${API_DIR}/}"
|
|
| 36 |
+ if ! diff -q "${TMP_DIR}/${REL}" "${API_DIR}/${REL}" > /dev/null 2>&1; then
|
|
| 37 |
+ echo "Difference found in ${REL}"
|
|
| 38 |
+ diff -u "${TMP_DIR}/${REL}" "${API_DIR}/${REL}" || true
|
|
| 39 |
+ DIFF_FOUND=true |
|
| 40 |
+ fi |
|
| 41 |
+done |
|
| 42 |
+ |
|
| 43 |
+if [ "$DIFF_FOUND" = true ]; then |
|
| 44 |
+ echo |
|
| 45 |
+ echo "Swagger validation failed. Please run:" |
|
| 46 |
+ echo " ./scripts/generate-swagger-api.sh" |
|
| 47 |
+ echo "and commit updated generated files." |
|
| 48 |
+ exit 1 |
|
| 49 |
+fi |
|
| 50 |
+ |
|
| 51 |
+echo "Swagger file is up to date." |
| 0 | 52 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,16 @@ |
| 0 |
+#!/usr/bin/env bash |
|
| 1 |
+set -e |
|
| 2 |
+ |
|
| 3 |
+# Expected to be in api directory |
|
| 4 |
+cd "$(dirname "${BASH_SOURCE[0]}")/.."
|
|
| 5 |
+ |
|
| 6 |
+echo "Validating swagger.yaml..." |
|
| 7 |
+ |
|
| 8 |
+yamllint -f parsable -c validate/yamllint.yaml swagger.yaml |
|
| 9 |
+ |
|
| 10 |
+if out=$(swagger validate swagger.yaml); then |
|
| 11 |
+ echo "Validation done! ${out}"
|
|
| 12 |
+else |
|
| 13 |
+ echo "${out}" >&2
|
|
| 14 |
+ false |
|
| 15 |
+fi |
| 0 | 16 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,29 @@ |
| 0 |
+#!/usr/bin/env bash |
|
| 1 |
+set -e |
|
| 2 |
+SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
| 3 |
+source "${SCRIPTDIR}/.validate"
|
|
| 4 |
+ |
|
| 5 |
+if [ -n "${TEST_FORCE_VALIDATE:-}" ]; then
|
|
| 6 |
+ files=(docs/api/*.yaml) |
|
| 7 |
+else |
|
| 8 |
+ IFS=$'\n' |
|
| 9 |
+ files=($(validate_diff --diff-filter=ACMR --name-only -- docs/*.yaml || true)) |
|
| 10 |
+ unset IFS |
|
| 11 |
+fi |
|
| 12 |
+ |
|
| 13 |
+# validate the yamllint configuration file before anything else |
|
| 14 |
+if out=$(yamllint -f parsable -d "{extends: default, rules: {document-start: disable}}" "${SCRIPTDIR}"/yamllint.yaml); then
|
|
| 15 |
+ echo "Congratulations! yamllint config file formatted correctly" |
|
| 16 |
+else |
|
| 17 |
+ echo "${out}" >&2
|
|
| 18 |
+ false |
|
| 19 |
+fi |
|
| 20 |
+ |
|
| 21 |
+# Then validate GitHub actions workflows, and conditionally lint the swagger |
|
| 22 |
+# files in the docs directory, as these are large files and take some time. |
|
| 23 |
+if out=$(yamllint -f parsable -c "${SCRIPTDIR}"/yamllint.yaml .github/workflows/*.yml "${files[@]}"); then
|
|
| 24 |
+ echo "Congratulations! YAML files are formatted correctly" |
|
| 25 |
+else |
|
| 26 |
+ echo "${out}" >&2
|
|
| 27 |
+ false |
|
| 28 |
+fi |
| 0 | 29 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,10 @@ |
| 0 |
+extends: default |
|
| 1 |
+locale: C.UTF-8 |
|
| 2 |
+rules: |
|
| 3 |
+ document-start: disable |
|
| 4 |
+ line-length: disable |
|
| 5 |
+ # ignore "warning truthy value should be one of [false, true]" on GitHub |
|
| 6 |
+ # actions workflows, which use "on:" to specify when to run. |
|
| 7 |
+ truthy: |
|
| 8 |
+ ignore: | |
|
| 9 |
+ .github/workflows/ |
| 0 | 10 |
deleted file mode 100755 |
| ... | ... |
@@ -1,125 +0,0 @@ |
| 1 |
-#!/bin/bash |
|
| 2 |
-# vim: set noexpandtab: |
|
| 3 |
-# -*- indent-tabs-mode: t -*- |
|
| 4 |
-set -eu |
|
| 5 |
- |
|
| 6 |
-generate_model() {
|
|
| 7 |
- local package="$1" |
|
| 8 |
- shift |
|
| 9 |
- mapfile |
|
| 10 |
- swagger generate model --spec=api/swagger.yaml \ |
|
| 11 |
- --target=api --model-package="$package" \ |
|
| 12 |
- --config-file=api/swagger-gen.yaml \ |
|
| 13 |
- --template-dir=api/templates --allow-template-override \ |
|
| 14 |
- "$@" \ |
|
| 15 |
- $(printf -- '--name=%s ' "${MAPFILE[@]}")
|
|
| 16 |
-} |
|
| 17 |
- |
|
| 18 |
-generate_operation() {
|
|
| 19 |
- mapfile |
|
| 20 |
- swagger generate operation --spec=api/swagger.yaml \ |
|
| 21 |
- --target=api --api-package=types --model-package=types \ |
|
| 22 |
- --config-file=api/swagger-gen.yaml \ |
|
| 23 |
- --template-dir=api/templates --allow-template-override \ |
|
| 24 |
- "$@" \ |
|
| 25 |
- $(printf -- '--name=%s ' "${MAPFILE[@]}")
|
|
| 26 |
-} |
|
| 27 |
- |
|
| 28 |
-# /==================================================================\ |
|
| 29 |
-# | | |
|
| 30 |
-# | ATTENTION: | |
|
| 31 |
-# | | |
|
| 32 |
-# | Sort model package stanzas and model/operation names | |
|
| 33 |
-# | *** ALPHABETICALLY *** | |
|
| 34 |
-# | to reduce the likelihood of merge conflicts. | |
|
| 35 |
-# | | |
|
| 36 |
-# \==================================================================/ |
|
| 37 |
- |
|
| 38 |
-#region -------- Models -------- |
|
| 39 |
- |
|
| 40 |
-generate_model types/build <<- 'EOT' |
|
| 41 |
- BuildCacheDiskUsage |
|
| 42 |
-EOT |
|
| 43 |
- |
|
| 44 |
-generate_model types/common <<- 'EOT' |
|
| 45 |
- ErrorResponse |
|
| 46 |
- IDResponse |
|
| 47 |
-EOT |
|
| 48 |
- |
|
| 49 |
-generate_model types/container <<- 'EOT' |
|
| 50 |
- ChangeType |
|
| 51 |
- ContainerCreateResponse |
|
| 52 |
- ContainerTopResponse |
|
| 53 |
- ContainerUpdateResponse |
|
| 54 |
- ContainerWaitExitError |
|
| 55 |
- ContainerWaitResponse |
|
| 56 |
- ContainersDiskUsage |
|
| 57 |
- FilesystemChange |
|
| 58 |
- PortSummary |
|
| 59 |
-EOT |
|
| 60 |
- |
|
| 61 |
-generate_model types/image <<- 'EOT' |
|
| 62 |
- ImageDeleteResponseItem |
|
| 63 |
- ImagesDiskUsage |
|
| 64 |
-EOT |
|
| 65 |
-# ImageSummary |
|
| 66 |
-# TODO: Restore when go-swagger is updated |
|
| 67 |
-# See https://github.com/moby/moby/pull/47526#discussion_r1551800022 |
|
| 68 |
- |
|
| 69 |
-generate_model types/network --keep-spec-order --additional-initialism=IPAM <<- 'EOT' |
|
| 70 |
- ConfigReference |
|
| 71 |
- EndpointResource |
|
| 72 |
- IPAMStatus |
|
| 73 |
- Network |
|
| 74 |
- NetworkConnectRequest |
|
| 75 |
- NetworkCreateResponse |
|
| 76 |
- NetworkDisconnectRequest |
|
| 77 |
- NetworkInspect |
|
| 78 |
- NetworkStatus |
|
| 79 |
- NetworkSummary |
|
| 80 |
- NetworkTaskInfo |
|
| 81 |
- PeerInfo |
|
| 82 |
- ServiceInfo |
|
| 83 |
- SubnetStatus |
|
| 84 |
-EOT |
|
| 85 |
- |
|
| 86 |
-generate_model types/plugin <<- 'EOT' |
|
| 87 |
- Plugin |
|
| 88 |
- PluginDevice |
|
| 89 |
- PluginEnv |
|
| 90 |
- PluginMount |
|
| 91 |
-EOT |
|
| 92 |
- |
|
| 93 |
-generate_model types/registry <<- 'EOT' |
|
| 94 |
- AuthResponse |
|
| 95 |
-EOT |
|
| 96 |
- |
|
| 97 |
-generate_model types/storage <<- 'EOT' |
|
| 98 |
- DriverData |
|
| 99 |
- RootFSStorage |
|
| 100 |
- RootFSStorageSnapshot |
|
| 101 |
- Storage |
|
| 102 |
-EOT |
|
| 103 |
- |
|
| 104 |
-generate_model types/swarm <<- 'EOT' |
|
| 105 |
- ServiceCreateResponse |
|
| 106 |
- ServiceUpdateResponse |
|
| 107 |
-EOT |
|
| 108 |
- |
|
| 109 |
-generate_model types/volume <<- 'EOT' |
|
| 110 |
- Volume |
|
| 111 |
- VolumeCreateRequest |
|
| 112 |
- VolumeListResponse |
|
| 113 |
- VolumesDiskUsage |
|
| 114 |
-EOT |
|
| 115 |
- |
|
| 116 |
-#endregion |
|
| 117 |
- |
|
| 118 |
-#region -------- Operations -------- |
|
| 119 |
- |
|
| 120 |
-generate_operation --skip-responses --skip-parameters <<- 'EOT' |
|
| 121 |
- Authenticate |
|
| 122 |
- ImageHistory |
|
| 123 |
-EOT |
|
| 124 |
- |
|
| 125 |
-#endregion |
| 126 | 1 |
deleted file mode 100755 |
| ... | ... |
@@ -1,18 +0,0 @@ |
| 1 |
-#!/usr/bin/env bash |
|
| 2 |
-set -e |
|
| 3 |
-SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
| 4 |
-source "${SCRIPTDIR}/.validate"
|
|
| 5 |
- |
|
| 6 |
-IFS=$'\n' |
|
| 7 |
-files=($(validate_diff --diff-filter=ACMR --name-only -- 'api/swagger.yaml' || true)) |
|
| 8 |
-unset IFS |
|
| 9 |
- |
|
| 10 |
-if [ -n "${TEST_FORCE_VALIDATE:-}" ] || [ ${#files[@]} -gt 0 ]; then
|
|
| 11 |
- yamllint -f parsable -c "${SCRIPTDIR}"/yamllint.yaml api/swagger.yaml
|
|
| 12 |
- if out=$(swagger validate api/swagger.yaml); then |
|
| 13 |
- echo "Congratulations! ${out}"
|
|
| 14 |
- else |
|
| 15 |
- echo "${out}" >&2
|
|
| 16 |
- false |
|
| 17 |
- fi |
|
| 18 |
-fi |
| 19 | 1 |
deleted file mode 100755 |
| ... | ... |
@@ -1,29 +0,0 @@ |
| 1 |
-#!/usr/bin/env bash |
|
| 2 |
- |
|
| 3 |
-SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
| 4 |
-source "${SCRIPTDIR}/.validate"
|
|
| 5 |
- |
|
| 6 |
-IFS=$'\n' |
|
| 7 |
-files=($(validate_diff --diff-filter=ACMR --name-only -- 'api/types/' 'api/swagger.yaml' || true)) |
|
| 8 |
-unset IFS |
|
| 9 |
- |
|
| 10 |
-if [ -n "${TEST_FORCE_VALIDATE:-}" ] || [ ${#files[@]} -gt 0 ]; then
|
|
| 11 |
- "${SCRIPTDIR}"/../generate-swagger-api.sh 2> /dev/null
|
|
| 12 |
- # Let see if the working directory is clean |
|
| 13 |
- diffs="$(git diff -- api/types/)" |
|
| 14 |
- if [ "$diffs" ]; then |
|
| 15 |
- {
|
|
| 16 |
- echo 'The result of hack/generate-swagger-api.sh differs' |
|
| 17 |
- echo |
|
| 18 |
- echo "$diffs" |
|
| 19 |
- echo |
|
| 20 |
- echo 'Please update api/swagger.yaml with any API changes, then ' |
|
| 21 |
- echo 'run hack/generate-swagger-api.sh.' |
|
| 22 |
- } >&2 |
|
| 23 |
- false |
|
| 24 |
- else |
|
| 25 |
- echo 'Congratulations! All API changes are done the right way.' |
|
| 26 |
- fi |
|
| 27 |
-else |
|
| 28 |
- echo 'No api/types/ or api/swagger.yaml changes in diff.' |
|
| 29 |
-fi |
| 30 | 1 |
deleted file mode 100755 |
| ... | ... |
@@ -1,29 +0,0 @@ |
| 1 |
-#!/usr/bin/env bash |
|
| 2 |
-set -e |
|
| 3 |
-SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
| 4 |
-source "${SCRIPTDIR}/.validate"
|
|
| 5 |
- |
|
| 6 |
-if [ -n "${TEST_FORCE_VALIDATE:-}" ]; then
|
|
| 7 |
- files=(docs/api/*.yaml) |
|
| 8 |
-else |
|
| 9 |
- IFS=$'\n' |
|
| 10 |
- files=($(validate_diff --diff-filter=ACMR --name-only -- docs/*.yaml || true)) |
|
| 11 |
- unset IFS |
|
| 12 |
-fi |
|
| 13 |
- |
|
| 14 |
-# validate the yamllint configuration file before anything else |
|
| 15 |
-if out=$(yamllint -f parsable -d "{extends: default, rules: {document-start: disable}}" "${SCRIPTDIR}"/yamllint.yaml); then
|
|
| 16 |
- echo "Congratulations! yamllint config file formatted correctly" |
|
| 17 |
-else |
|
| 18 |
- echo "${out}" >&2
|
|
| 19 |
- false |
|
| 20 |
-fi |
|
| 21 |
- |
|
| 22 |
-# Then validate GitHub actions workflows, and conditionally lint the swagger |
|
| 23 |
-# files in the docs directory, as these are large files and take some time. |
|
| 24 |
-if out=$(yamllint -f parsable -c "${SCRIPTDIR}"/yamllint.yaml .github/workflows/*.yml "${files[@]}"); then
|
|
| 25 |
- echo "Congratulations! YAML files are formatted correctly" |
|
| 26 |
-else |
|
| 27 |
- echo "${out}" >&2
|
|
| 28 |
- false |
|
| 29 |
-fi |
| 30 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,10 +0,0 @@ |
| 1 |
-extends: default |
|
| 2 |
-locale: C.UTF-8 |
|
| 3 |
-rules: |
|
| 4 |
- document-start: disable |
|
| 5 |
- line-length: disable |
|
| 6 |
- # ignore "warning truthy value should be one of [false, true]" on GitHub |
|
| 7 |
- # actions workflows, which use "on:" to specify when to run. |
|
| 8 |
- truthy: |
|
| 9 |
- ignore: | |
|
| 10 |
- .github/workflows/ |