From 79bd5f3837c1a053bc10d767b2f249cc9d660d4c Mon Sep 17 00:00:00 2001 From: chris48s <chris48s@users.noreply.github.com> Date: Sun, 11 Feb 2024 13:03:50 +0000 Subject: [PATCH] migrate some services from examples to openApi part 47; affects [docker] (#9934) * fix service test * migrate some services from examples to openApi --- .../docker/docker-cloud-automated.service.js | 26 ++++--- services/docker/docker-cloud-build.service.js | 26 ++++--- services/docker/docker-helpers.js | 33 ++++---- services/docker/docker-size.service.js | 76 +++++++++++-------- services/docker/docker-version.service.js | 71 ++++++++++++----- services/docker/docker-version.tester.js | 2 +- 6 files changed, 147 insertions(+), 87 deletions(-) diff --git a/services/docker/docker-cloud-automated.service.js b/services/docker/docker-cloud-automated.service.js index feb392994a..e9af197377 100644 --- a/services/docker/docker-cloud-automated.service.js +++ b/services/docker/docker-cloud-automated.service.js @@ -1,4 +1,4 @@ -import { BaseJsonService } from '../index.js' +import { BaseJsonService, pathParams } from '../index.js' import { dockerBlue, buildDockerUrl } from './docker-helpers.js' import { fetchBuild } from './docker-cloud-common-fetch.js' @@ -13,17 +13,23 @@ export default class DockerCloudAutomatedBuild extends BaseJsonService { isRequired: false, } - static examples = [ - { - title: 'Docker Cloud Automated build', - documentation: '<p>For the new Docker Hub (https://cloud.docker.com)</p>', - namedParams: { - user: 'jrottenberg', - repo: 'ffmpeg', + static openApi = { + '/docker/cloud/automated/{user}/{repo}': { + get: { + summary: 'Docker Cloud Automated build', + parameters: pathParams( + { + name: 'user', + example: 'jrottenberg', + }, + { + name: 'repo', + example: 'ffmpeg', + }, + ), }, - staticPreview: this.render({ buildSettings: ['test'] }), }, - ] + } static _cacheLength = 14400 diff --git a/services/docker/docker-cloud-build.service.js b/services/docker/docker-cloud-build.service.js index 31713155a8..9f7a939bb3 100644 --- a/services/docker/docker-cloud-build.service.js +++ b/services/docker/docker-cloud-build.service.js @@ -1,4 +1,4 @@ -import { BaseJsonService, NotFound } from '../index.js' +import { BaseJsonService, NotFound, pathParams } from '../index.js' import { dockerBlue, buildDockerUrl } from './docker-helpers.js' import { fetchBuild } from './docker-cloud-common-fetch.js' @@ -13,17 +13,23 @@ export default class DockerCloudBuild extends BaseJsonService { isRequired: false, } - static examples = [ - { - title: 'Docker Cloud Build Status', - documentation: '<p>For the new Docker Hub (https://cloud.docker.com)</p>', - namedParams: { - user: 'jrottenberg', - repo: 'ffmpeg', + static openApi = { + '/docker/cloud/build/{user}/{repo}': { + get: { + summary: 'Docker Cloud Build Status', + parameters: pathParams( + { + name: 'user', + example: 'jrottenberg', + }, + { + name: 'repo', + example: 'ffmpeg', + }, + ), }, - staticPreview: this.render({ state: 'Success' }), }, - ] + } static defaultBadgeData = { label: 'docker build' } diff --git a/services/docker/docker-helpers.js b/services/docker/docker-helpers.js index c373297499..dbab9a01da 100644 --- a/services/docker/docker-helpers.js +++ b/services/docker/docker-helpers.js @@ -3,23 +3,25 @@ import Joi from 'joi' import { NotFound } from '../index.js' const dockerBlue = '066da5' +const archEnum = [ + 'amd64', + 'arm', + 'arm64', + 's390x', + '386', + 'ppc64', + 'ppc64le', + 'wasm', + 'mips', + 'mipsle', + 'mips64', + 'mips64le', + 'riscv64', +] + // Valid architecture values: https://golang.org/doc/install/source#environment (GOARCH) const archSchema = Joi.alternatives( - Joi.string().valid( - 'amd64', - 'arm', - 'arm64', - 's390x', - '386', - 'ppc64', - 'ppc64le', - 'wasm', - 'mips', - 'mipsle', - 'mips64', - 'mips64le', - 'riscv64', - ), + Joi.string().valid(...archEnum), Joi.number().valid(386).cast('string'), ) @@ -76,6 +78,7 @@ function getDigestSemVerMatches({ data, digest }) { } export { + archEnum, archSchema, dockerBlue, buildDockerUrl, diff --git a/services/docker/docker-size.service.js b/services/docker/docker-size.service.js index 8368a27a4e..80cb74f6e6 100644 --- a/services/docker/docker-size.service.js +++ b/services/docker/docker-size.service.js @@ -2,8 +2,9 @@ import Joi from 'joi' import prettyBytes from 'pretty-bytes' import { nonNegativeInteger } from '../validators.js' import { latest } from '../version.js' -import { BaseJsonService, NotFound } from '../index.js' +import { BaseJsonService, NotFound, pathParams, queryParams } from '../index.js' import { + archEnum, archSchema, buildDockerUrl, getDockerHubUser, @@ -38,11 +39,29 @@ const pagedSchema = Joi.object({ ), }).required() +const sortEnum = ['date', 'semver'] + const queryParamSchema = Joi.object({ - sort: Joi.string().valid('date', 'semver').default('date'), + sort: Joi.string() + .valid(...sortEnum) + .default('date'), arch: archSchema, }).required() +const openApiQueryParams = queryParams( + { + name: 'sort', + example: 'semver', + schema: { type: 'string', enum: sortEnum }, + description: 'If not specified, the default is `date`', + }, + { + name: 'arch', + example: 'amd64', + schema: { type: 'string', enum: archEnum }, + }, +) + // If user provided the arch parameter, // check if any of the returned images has an architecture matching the arch parameter provided. // If yes, return the size of the image with this arch. @@ -73,36 +92,33 @@ export default class DockerSize extends BaseJsonService { isRequired: false, } - static examples = [ - { - title: 'Docker Image Size (latest by date)', - pattern: ':user/:repo', - namedParams: { user: 'fedora', repo: 'apache' }, - queryParams: { sort: 'date' }, - staticPreview: this.render({ size: 126000000 }), - }, - { - title: 'Docker Image Size (latest semver)', - pattern: ':user/:repo', - namedParams: { user: 'fedora', repo: 'apache' }, - queryParams: { sort: 'semver' }, - staticPreview: this.render({ size: 136000000 }), - }, - { - title: - 'Docker Image Size with architecture (latest by date/latest semver)', - pattern: ':user/:repo', - namedParams: { user: 'library', repo: 'mysql' }, - queryParams: { sort: 'date', arch: 'amd64' }, - staticPreview: this.render({ size: 146000000 }), + static openApi = { + '/docker/image-size/{user}/{repo}': { + get: { + summary: 'Docker Image Size', + parameters: [ + ...pathParams( + { name: 'user', example: 'fedora' }, + { name: 'repo', example: 'apache' }, + ), + ...openApiQueryParams, + ], + }, }, - { - title: 'Docker Image Size (tag)', - pattern: ':user/:repo/:tag', - namedParams: { user: 'fedora', repo: 'apache', tag: 'latest' }, - staticPreview: this.render({ size: 103000000 }), + '/docker/image-size/{user}/{repo}/{tag}': { + get: { + summary: 'Docker Image Size (tag)', + parameters: [ + ...pathParams( + { name: 'user', example: 'fedora' }, + { name: 'repo', example: 'apache' }, + { name: 'tag', example: 'latest' }, + ), + ...openApiQueryParams, + ], + }, }, - ] + } static _cacheLength = 600 diff --git a/services/docker/docker-version.service.js b/services/docker/docker-version.service.js index f611a15cdc..9e8cef35a8 100644 --- a/services/docker/docker-version.service.js +++ b/services/docker/docker-version.service.js @@ -1,8 +1,15 @@ import Joi from 'joi' import { nonNegativeInteger } from '../validators.js' import { latest, renderVersionBadge } from '../version.js' -import { BaseJsonService, NotFound, InvalidResponse } from '../index.js' import { + BaseJsonService, + NotFound, + InvalidResponse, + pathParams, + queryParams, +} from '../index.js' +import { + archEnum, archSchema, buildDockerUrl, getDockerHubUser, @@ -26,11 +33,28 @@ const buildSchema = Joi.object({ ), }).required() +const sortEnum = ['date', 'semver'] + const queryParamSchema = Joi.object({ sort: Joi.string().valid('date', 'semver').default('date'), arch: archSchema.default('amd64'), }).required() +const openApiQueryParams = queryParams( + { + name: 'sort', + example: 'semver', + schema: { type: 'string', enum: sortEnum }, + description: 'If not specified, the default is `date`', + }, + { + name: 'arch', + example: 'amd64', + schema: { type: 'string', enum: archEnum }, + description: 'If not specified, the default is `amd64`', + }, +) + export default class DockerVersion extends BaseJsonService { static category = 'version' static route = { ...buildDockerUrl('v', true), queryParamSchema } @@ -45,28 +69,33 @@ export default class DockerVersion extends BaseJsonService { isRequired: false, } - static examples = [ - { - title: 'Docker Image Version (latest by date)', - pattern: ':user/:repo', - namedParams: { user: '_', repo: 'alpine' }, - queryParams: { sort: 'date', arch: 'amd64' }, - staticPreview: this.render({ version: '3.9.5' }), + static openApi = { + '/docker/v/{user}/{repo}': { + get: { + summary: 'Docker Image Version', + parameters: [ + ...pathParams( + { name: 'user', example: '_' }, + { name: 'repo', example: 'alpine' }, + ), + ...openApiQueryParams, + ], + }, }, - { - title: 'Docker Image Version (latest semver)', - pattern: ':user/:repo', - namedParams: { user: '_', repo: 'alpine' }, - queryParams: { sort: 'semver' }, - staticPreview: this.render({ version: '3.11.3' }), + '/docker/v/{user}/{repo}/{tag}': { + get: { + summary: 'Docker Image Version (tag)', + parameters: [ + ...pathParams( + { name: 'user', example: '_' }, + { name: 'repo', example: 'alpine' }, + { name: 'tag', example: '3.6' }, + ), + ...openApiQueryParams, + ], + }, }, - { - title: 'Docker Image Version (tag latest semver)', - pattern: ':user/:repo/:tag', - namedParams: { user: '_', repo: 'alpine', tag: '3.6' }, - staticPreview: this.render({ version: '3.6.5' }), - }, - ] + } static defaultBadgeData = { label: 'version', color: 'blue' } diff --git a/services/docker/docker-version.tester.js b/services/docker/docker-version.tester.js index 9ded09bf84..c737cb8abe 100644 --- a/services/docker/docker-version.tester.js +++ b/services/docker/docker-version.tester.js @@ -2,7 +2,7 @@ import { isSemver } from '../test-validators.js' import { createServiceTester } from '../tester.js' export const t = await createServiceTester() -t.create('docker version (valid, library)').get('/_/redis.json').expectBadge({ +t.create('docker version (valid, library)').get('/_/alpine.json').expectBadge({ label: 'version', message: isSemver, }) -- GitLab