Browse code

Merge pull request #51300 from rafaelcamelo31/50486_api_move_scripts

api: move scripts to generate and validate swagger to api module

Sebastiaan van Stijn authored on 2025/12/12 05:35:38
Showing 15 changed files
... ...
@@ -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/