From 6de7645be5f323a41eeb02858e4c1ecd656bd3d8 Mon Sep 17 00:00:00 2001 From: regexowl Date: Wed, 17 Apr 2024 10:35:07 +0200 Subject: [PATCH] API: Update imageBuilder API schema This updates the imageBuilder API schema. --- api/config/imageBuilder.ts | 1 + api/schema/imageBuilder.yaml | 185 +++++++++++++++---------- src/Components/ImagesTable/Release.tsx | 1 + src/store/imageBuilderApi.ts | 95 ++++++++----- 4 files changed, 180 insertions(+), 102 deletions(-) diff --git a/api/config/imageBuilder.ts b/api/config/imageBuilder.ts index 34fb2f15..2a89f7e2 100644 --- a/api/config/imageBuilder.ts +++ b/api/config/imageBuilder.ts @@ -25,6 +25,7 @@ const config: ConfigFile = { 'getBlueprintComposes', 'deleteBlueprint', 'getBlueprint', + 'recommendPackage', ], }; diff --git a/api/schema/imageBuilder.yaml b/api/schema/imageBuilder.yaml index be0b66f0..6ab74adc 100644 --- a/api/schema/imageBuilder.yaml +++ b/api/schema/imageBuilder.yaml @@ -46,6 +46,7 @@ paths: operationId: getOpenapiJson tags: - meta + - noAuth responses: '200': description: returns this document @@ -422,6 +423,12 @@ paths: tags: - blueprint parameters: + - in: query + name: name + required: false + schema: + type: string + description: fetch blueprint with specific name - in: query name: search required: false @@ -470,7 +477,7 @@ paths: application/json: schema: $ref: '#/components/schemas/CreateBlueprintResponse' - '400': + '422': description: blueprint is malformed content: application/json: @@ -605,7 +612,8 @@ paths: schema: type: integer description: | - Filter by a specific version of the Blueprint we want to fetch composes for + Filter by a specific version of the Blueprint we want to fetch composes for. + Pass special value -1 to fetch composes for latest version of the Blueprint. - in: query name: limit schema: @@ -644,7 +652,28 @@ paths: application/json: schema: $ref: '#/components/schemas/HTTPErrorList' - + /experimental/recommendations: + post: + summary: List recommended packages. + description: "Returns a list of recommended packages for given list of packages." + operationId: recommendPackage + tags: + - recommendations + requestBody: + content: + application/json: + schema: + "$ref": "#/components/schemas/RecommendPackageRequest" + required: true + responses: + '200': + description: Return the recommended packages. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/RecommendationsResponse" components: schemas: HTTPError: @@ -670,6 +699,10 @@ components: properties: version: type: string + build_time: + type: string + build_commit: + type: string Readiness: type: object required: @@ -677,6 +710,23 @@ components: properties: readiness: type: string + ListResponseMeta: + type: object + required: + - count + properties: + count: + type: integer + ListResponseLinks: + type: object + required: + - first + - last + properties: + first: + type: string + last: + type: string DistributionsResponse: type: array description: | @@ -859,7 +909,6 @@ components: additionalProperties: false required: - name - - description - distribution - image_requests - customizations @@ -898,22 +947,9 @@ components: - data properties: meta: - type: object - required: - - count - properties: - count: - type: integer + $ref: '#/components/schemas/ListResponseMeta' links: - type: object - required: - - first - - last - properties: - first: - type: string - last: - type: string + $ref: '#/components/schemas/ListResponseLinks' data: type: array items: @@ -993,6 +1029,7 @@ components: - fedora-38 - fedora-39 - fedora-40 + - fedora-41 ImageRequest: type: object additionalProperties: false @@ -1020,6 +1057,14 @@ components: description: | Size of image, in bytes. When set to 0 the image size is a minimum defined by the image type. + snapshot_date: + type: string + description: | + Snapshotted content will be used instead of the official repositories of the + distribution. The snapshot that was made closest to, but before the specified date will + be used. If no snapshots made before the specified date can be found, the snapshot + closest to, but after the specified date will be used. If no snapshots can be found at + all, the request will fail. ImageTypes: type: string enum: @@ -1046,24 +1091,9 @@ components: - data properties: meta: - type: object - required: - - count - properties: - count: - type: integer + $ref: '#/components/schemas/ListResponseMeta' links: - type: object - required: - - first - - last - properties: - first: - type: string - example: "/api/image-builder/v1/composes?limit=10&offset=0" - last: - type: string - example: "/api/image-builder/v1/composes?limit=10&offset=10" + $ref: '#/components/schemas/ListResponseLinks' data: type: array items: @@ -1246,24 +1276,9 @@ components: - data properties: meta: - type: object - required: - - count - properties: - count: - type: integer + $ref: '#/components/schemas/ListResponseMeta' links: - type: object - required: - - first - - last - properties: - first: - type: string - example: "/api/image-builder/v1/packages?limit=10&offset=0&distribution...." - last: - type: string - example: "/api/image-builder/v1/packages?limit=10&offset=10&distribution...." + $ref: '#/components/schemas/ListResponseLinks' data: type: array items: @@ -1313,6 +1328,29 @@ components: type: string signature: type: string + RecommendPackageRequest: + required: + - packages + - recommendedPackages + type: object + properties: + packages: + type: array + items: + type: string + recommendedPackages: + type: integer + format: int32 + default: 3 + RecommendationsResponse: + required: + - packages + type: object + properties: + packages: + type: array + items: + type: string ClonesResponse: required: - meta @@ -1320,24 +1358,9 @@ components: - data properties: meta: - type: object - required: - - count - properties: - count: - type: integer + $ref: '#/components/schemas/ListResponseMeta' links: - type: object - required: - - first - - last - properties: - first: - type: string - example: "/api/image-builder/v1/composes?limit=10&offset=0" - last: - type: string - example: "/api/image-builder/v1/composes?limit=10&offset=10" + $ref: '#/components/schemas/ListResponseLinks' data: type: array items: @@ -1513,6 +1536,8 @@ components: even when there are one or more mountpoints. fips: $ref: '#/components/schemas/FIPS' + installer: + $ref: '#/components/schemas/Installer' Container: type: object required: @@ -1618,6 +1643,11 @@ components: data: type: string description: Contents of the file as plain text + data_encoding: + type: string + enum: ['plain', 'base64'] + description: When data is base64-encoded to prevent Akamai content filter false positives + default: 'plain' ensure_parents: type: boolean description: Ensure that the parent directories exist @@ -1713,6 +1743,21 @@ components: type: boolean description: Enables the system FIPS mode default: false + Installer: + type: object + additionalProperties: false + description: Anaconda installer configuration + properties: + unattended: + type: boolean + description: | + Create a kickstart file for a fully automated installation + sudo-nopasswd: + type: array + items: + type: string + description: | + Enable passwordless sudo for users or groups (groups must be prefixed by %) Ignition: type: object additionalProperties: false diff --git a/src/Components/ImagesTable/Release.tsx b/src/Components/ImagesTable/Release.tsx index 666b3fe1..3906ccba 100644 --- a/src/Components/ImagesTable/Release.tsx +++ b/src/Components/ImagesTable/Release.tsx @@ -30,6 +30,7 @@ const Release = ({ release }: ReleaseProps) => { 'fedora-38': 'Fedora 38', 'fedora-39': 'Fedora 39', 'fedora-40': 'Fedora 40', + 'fedora-41': 'Fedora 41', }; return

{releaseDisplayValue[release]}

; diff --git a/src/store/imageBuilderApi.ts b/src/store/imageBuilderApi.ts index 698d3d91..44edff83 100644 --- a/src/store/imageBuilderApi.ts +++ b/src/store/imageBuilderApi.ts @@ -84,6 +84,7 @@ const injectedRtkApi = api.injectEndpoints({ query: (queryArg) => ({ url: `/experimental/blueprints`, params: { + name: queryArg.name, search: queryArg.search, limit: queryArg.limit, offset: queryArg.offset, @@ -145,6 +146,16 @@ const injectedRtkApi = api.injectEndpoints({ }, }), }), + recommendPackage: build.mutation< + RecommendPackageApiResponse, + RecommendPackageApiArg + >({ + query: (queryArg) => ({ + url: `/experimental/recommendations`, + method: "POST", + body: queryArg.recommendPackageRequest, + }), + }), }), overrideExisting: false, }); @@ -233,6 +244,8 @@ export type GetOscapCustomizationsApiArg = { export type GetBlueprintsApiResponse = /** status 200 a list of blueprints */ BlueprintsResponse; export type GetBlueprintsApiArg = { + /** fetch blueprint with specific name */ + name?: string; /** search for blueprints by name or description */ search?: string; /** max amount of blueprints, default 100 */ @@ -277,8 +290,9 @@ export type GetBlueprintComposesApiResponse = export type GetBlueprintComposesApiArg = { /** UUID of a blueprint */ id: string; - /** Filter by a specific version of the Blueprint we want to fetch composes for - */ + /** Filter by a specific version of the Blueprint we want to fetch composes for. + Pass special value -1 to fetch composes for latest version of the Blueprint. + */ blueprintVersion?: number; /** max amount of composes, default 100 */ limit?: number; @@ -288,6 +302,11 @@ export type GetBlueprintComposesApiArg = { */ ignoreImageTypes?: ImageTypes[]; }; +export type RecommendPackageApiResponse = + /** status 200 Return the recommended packages. */ RecommendationsResponse[]; +export type RecommendPackageApiArg = { + recommendPackageRequest: RecommendPackageRequest; +}; export type Repository = { rhsm: boolean; baseurl?: string; @@ -335,7 +354,15 @@ export type Distributions = | "fedora-37" | "fedora-38" | "fedora-39" - | "fedora-40"; + | "fedora-40" + | "fedora-41"; +export type ListResponseMeta = { + count: number; +}; +export type ListResponseLinks = { + first: string; + last: string; +}; export type ClientId = "api" | "ui"; export type ImageTypes = | "aws" @@ -441,6 +468,13 @@ export type ImageRequest = { defined by the image type. */ size?: any; + /** Snapshotted content will be used instead of the official repositories of the + distribution. The snapshot that was made closest to, but before the specified date will + be used. If no snapshots made before the specified date can be found, the snapshot + closest to, but after the specified date will be used. If no snapshots can be found at + all, the request will fail. + */ + snapshot_date?: string; }; export type Container = { /** Reference to the container to embed */ @@ -473,6 +507,8 @@ export type File = { group?: string | number; /** Contents of the file as plain text */ data?: string; + /** When data is base64-encoded to prevent Akamai content filter false positives */ + data_encoding?: "plain" | "base64"; /** Ensure that the parent directories exist */ ensure_parents?: boolean; }; @@ -584,6 +620,12 @@ export type Fips = { /** Enables the system FIPS mode */ enabled?: boolean; }; +export type Installer = { + /** Create a kickstart file for a fully automated installation + */ + unattended?: boolean; + "sudo-nopasswd"?: string[]; +}; export type Customizations = { containers?: Container[]; directories?: Directory[]; @@ -617,6 +659,7 @@ export type Customizations = { */ partitioning_mode?: "raw" | "lvm" | "auto-lvm"; fips?: Fips; + installer?: Installer; }; export type ComposeRequest = { distribution: Distributions; @@ -638,13 +681,8 @@ export type ComposesResponseItem = { blueprint_version?: number | null; }; export type ComposesResponse = { - meta: { - count: number; - }; - links: { - first: string; - last: string; - }; + meta: ListResponseMeta; + links: ListResponseLinks; data: ComposesResponseItem[]; }; export type AwsUploadStatus = { @@ -717,13 +755,8 @@ export type ClonesResponseItem = { created_at: string; }; export type ClonesResponse = { - meta: { - count: number; - }; - links: { - first: string; - last: string; - }; + meta: ListResponseMeta; + links: ListResponseLinks; data: ClonesResponseItem[]; }; export type CloneStatusResponse = { @@ -737,13 +770,8 @@ export type Package = { summary: string; }; export type PackagesResponse = { - meta: { - count: number; - }; - links: { - first: string; - last: string; - }; + meta: ListResponseMeta; + links: ListResponseLinks; data: Package[]; }; export type DistributionProfileItem = @@ -773,13 +801,8 @@ export type BlueprintItem = { last_modified_at: string; }; export type BlueprintsResponse = { - meta: { - count: number; - }; - links: { - first: string; - last: string; - }; + meta: ListResponseMeta; + links: ListResponseLinks; data: BlueprintItem[]; }; export type CreateBlueprintResponse = { @@ -787,7 +810,7 @@ export type CreateBlueprintResponse = { }; export type CreateBlueprintRequest = { name: string; - description: string; + description?: string; distribution: Distributions; /** Array of image requests. Having more image requests in a single blueprint is currently not supported. */ @@ -804,6 +827,13 @@ export type BlueprintResponse = { image_requests: ImageRequest[]; customizations: Customizations; }; +export type RecommendationsResponse = { + packages: string[]; +}; +export type RecommendPackageRequest = { + packages: string[]; + recommendedPackages: number; +}; export const { useGetArchitecturesQuery, useLazyGetArchitecturesQuery, @@ -833,4 +863,5 @@ export const { useComposeBlueprintMutation, useGetBlueprintComposesQuery, useLazyGetBlueprintComposesQuery, + useRecommendPackageMutation, } = injectedRtkApi;