From c0a0c7bb3db7e22aca7fa087d0e0965003966156 Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Wed, 8 Jan 2025 17:46:15 +0200 Subject: [PATCH] POC/Provisioning: Use PUT endpoints for updates (#98674) --- pkg/services/apiserver/builder/helper.go | 2 + .../apis/provisioning/testdata/openapi.json | 2 +- .../app/features/provisioning/ConfigForm.tsx | 5 +- .../features/provisioning/api/endpoints.ts | 66 ++----------------- public/app/features/provisioning/hooks.ts | 12 ++-- scripts/generate-rtk-apis.ts | 3 +- scripts/parse-generated-api.ts | 5 +- 7 files changed, 20 insertions(+), 75 deletions(-) diff --git a/pkg/services/apiserver/builder/helper.go b/pkg/services/apiserver/builder/helper.go index fd95a2832b4..19f3752ff6f 100644 --- a/pkg/services/apiserver/builder/helper.go +++ b/pkg/services/apiserver/builder/helper.go @@ -170,6 +170,8 @@ func SetupConfig( operationAlt = "get" + operationAlt[len("read"):] } else if strings.HasPrefix(operationAlt, "patch") { operationAlt = "update" + operationAlt[len("patch"):] + } else if strings.HasPrefix(operationAlt, "put") { + operationAlt = "replace" + operationAlt[len("put"):] } // Audit our options here diff --git a/pkg/tests/apis/provisioning/testdata/openapi.json b/pkg/tests/apis/provisioning/testdata/openapi.json index 6528fcdff86..a0f3f483ed5 100644 --- a/pkg/tests/apis/provisioning/testdata/openapi.json +++ b/pkg/tests/apis/provisioning/testdata/openapi.json @@ -1435,7 +1435,7 @@ "Repository" ], "description": "connect PUT requests to files of Repository", - "operationId": "putRepositoryFilesWithPath", + "operationId": "replaceRepositoryFilesWithPath", "parameters": [ { "name": "ref", diff --git a/public/app/features/provisioning/ConfigForm.tsx b/public/app/features/provisioning/ConfigForm.tsx index 17fe94f6d0f..4dbc4cba076 100644 --- a/public/app/features/provisioning/ConfigForm.tsx +++ b/public/app/features/provisioning/ConfigForm.tsx @@ -45,10 +45,7 @@ function getDefaultValues(repository?: RepositorySpec): RepositoryFormData { }, }; } - return { - ...specToData(repository), - token: '', - }; + return specToData(repository); } export interface ConfigFormProps { diff --git a/public/app/features/provisioning/api/endpoints.ts b/public/app/features/provisioning/api/endpoints.ts index 06c156a32a8..3c925af3b6f 100644 --- a/public/app/features/provisioning/api/endpoints.ts +++ b/public/app/features/provisioning/api/endpoints.ts @@ -80,22 +80,6 @@ const injectedRtkApi = api }), invalidatesTags: ['Repository'], }), - updateRepository: build.mutation({ - query: (queryArg) => ({ - url: `/repositories/${queryArg.name}`, - method: 'PATCH', - headers: { 'Content-Type': 'application/merge-patch+json' }, - body: queryArg.body, - params: { - pretty: queryArg.pretty, - dryRun: queryArg.dryRun, - fieldManager: queryArg.fieldManager, - fieldValidation: queryArg.fieldValidation, - force: queryArg.force, - }, - }), - invalidatesTags: ['Repository'], - }), createRepositoryExport: build.mutation({ query: (queryArg) => ({ url: `/repositories/${queryArg.name}/export`, @@ -121,7 +105,10 @@ const injectedRtkApi = api }), providesTags: ['Repository'], }), - putRepositoryFilesWithPath: build.mutation({ + replaceRepositoryFilesWithPath: build.mutation< + ReplaceRepositoryFilesWithPathResponse, + ReplaceRepositoryFilesWithPathArg + >({ query: (queryArg) => ({ url: `/repositories/${queryArg.name}/files/${queryArg.path}`, method: 'PUT', @@ -203,22 +190,6 @@ const injectedRtkApi = api }), invalidatesTags: ['Repository'], }), - updateRepositoryStatus: build.mutation({ - query: (queryArg) => ({ - url: `/repositories/${queryArg.name}/status`, - method: 'PATCH', - headers: { 'Content-Type': 'application/merge-patch+json' }, - body: queryArg.body, - params: { - pretty: queryArg.pretty, - dryRun: queryArg.dryRun, - fieldManager: queryArg.fieldManager, - fieldValidation: queryArg.fieldValidation, - force: queryArg.force, - }, - }), - invalidatesTags: ['Repository'], - }), createRepositorySync: build.mutation({ query: (queryArg) => ({ url: `/repositories/${queryArg.name}/sync`, @@ -293,16 +264,6 @@ export type DeleteRepositoryArg = { propagationPolicy?: string; body: DeleteOptions; }; -export type UpdateRepositoryResponse = Repository; -export type UpdateRepositoryArg = { - name: string; - pretty?: string; - dryRun?: string; - fieldManager?: string; - fieldValidation?: string; - force?: boolean; - body: Patch; -}; export type CreateRepositoryExportResponse = Job; export type CreateRepositoryExportArg = { name: string; @@ -323,8 +284,8 @@ export type GetRepositoryFilesWithPathArg = { path: string; ref?: string; }; -export type PutRepositoryFilesWithPathResponse = ResourceWrapper; -export type PutRepositoryFilesWithPathArg = { +export type ReplaceRepositoryFilesWithPathResponse = ResourceWrapper; +export type ReplaceRepositoryFilesWithPathArg = { name: string; path: string; ref?: string; @@ -375,16 +336,6 @@ export type ReplaceRepositoryStatusArg = { fieldValidation?: string; body: Repository; }; -export type UpdateRepositoryStatusResponse = Repository; -export type UpdateRepositoryStatusArg = { - name: string; - pretty?: string; - dryRun?: string; - fieldManager?: string; - fieldValidation?: string; - force?: boolean; - body: Patch; -}; export type CreateRepositorySyncResponse = Job; export type CreateRepositorySyncArg = { name: string; @@ -590,7 +541,6 @@ export type DeleteOptions = { preconditions?: Preconditions; propagationPolicy?: string; }; -export type Patch = object; export type LintIssue = { message: string; rule: string; @@ -647,18 +597,16 @@ export const { useGetRepositoryQuery, useReplaceRepositoryMutation, useDeleteRepositoryMutation, - useUpdateRepositoryMutation, useCreateRepositoryExportMutation, useGetRepositoryFilesQuery, useGetRepositoryFilesWithPathQuery, - usePutRepositoryFilesWithPathMutation, + useReplaceRepositoryFilesWithPathMutation, useCreateRepositoryFilesWithPathMutation, useDeleteRepositoryFilesWithPathMutation, useGetRepositoryHistoryQuery, useGetRepositoryHistoryWithPathQuery, useGetRepositoryStatusQuery, useReplaceRepositoryStatusMutation, - useUpdateRepositoryStatusMutation, useCreateRepositorySyncMutation, useCreateRepositoryTestMutation, useGetRepositoryWebhookQuery, diff --git a/public/app/features/provisioning/hooks.ts b/public/app/features/provisioning/hooks.ts index 3f5bbeb0d2e..94045482b1b 100644 --- a/public/app/features/provisioning/hooks.ts +++ b/public/app/features/provisioning/hooks.ts @@ -9,15 +9,15 @@ import { useCreateRepositoryFilesWithPathMutation, useCreateRepositoryMutation, useListRepositoryQuery, - usePutRepositoryFilesWithPathMutation, - useUpdateRepositoryMutation, + useReplaceRepositoryFilesWithPathMutation, RepositorySpec, - PutRepositoryFilesWithPathArg, + ReplaceRepositoryFilesWithPathArg, + useReplaceRepositoryMutation, } from './api'; export function useCreateOrUpdateRepository(name?: string) { const [create, createRequest] = useCreateRepositoryMutation(); - const [update, updateRequest] = useUpdateRepositoryMutation(); + const [update, updateRequest] = useReplaceRepositoryMutation(); const updateOrCreate = useCallback( (data: RepositorySpec) => { @@ -45,10 +45,10 @@ export function useRepositoryList(options: ListOptions = {}): [Repository[] | un export function useCreateOrUpdateRepositoryFile(name?: string) { const [create, createRequest] = useCreateRepositoryFilesWithPathMutation(); - const [update, updateRequest] = usePutRepositoryFilesWithPathMutation(); + const [update, updateRequest] = useReplaceRepositoryFilesWithPathMutation(); const updateOrCreate = useCallback( - (data: PutRepositoryFilesWithPathArg) => { + (data: ReplaceRepositoryFilesWithPathArg) => { const actions = name ? update : create; return actions(data); }, diff --git a/scripts/generate-rtk-apis.ts b/scripts/generate-rtk-apis.ts index 70073990929..268b1f2fb36 100644 --- a/scripts/generate-rtk-apis.ts +++ b/scripts/generate-rtk-apis.ts @@ -59,7 +59,8 @@ function filterEndpoints(name: string) { !name.toLowerCase().includes('forallnamespaces') && !name.toLowerCase().includes('getapiresources') && !name.toLowerCase().includes('watch') && - !name.toLowerCase().includes('collection') + !name.toLowerCase().includes('collection') && + !name.toLowerCase().includes('update') ); } diff --git a/scripts/parse-generated-api.ts b/scripts/parse-generated-api.ts index 15380dd51b3..d1ddb0920ef 100644 --- a/scripts/parse-generated-api.ts +++ b/scripts/parse-generated-api.ts @@ -54,10 +54,7 @@ const transformedContent = content }) // Modify any 'List...Arg>' to 'List...Arg | void>' - .replace(/(List[A-Za-z0-9]+Arg)>/g, '$1 | void>') - - // Add headers for content-type in patch endpoints - .replace(/(method: 'PATCH',)/g, "$1\n\t\t\t\theaders: { 'Content-Type': 'application/merge-patch+json' },"); + .replace(/(List[A-Za-z0-9]+Arg)>/g, '$1 | void>'); // Write the transformed content back to a new file fs.writeFileSync(outputFilePath, transformedContent);