From a7ac6a5311224df5eccacd2dfa80077f6d55775a Mon Sep 17 00:00:00 2001 From: Christopher Fry Date: Fri, 7 Jul 2023 10:22:58 -0700 Subject: [PATCH] feat: add support for porch optimistic concurrency control (#271) This change updates the UI to support Porch optimistic concurrency control for package updates. --- .../src/components/AddPackagePage/AddPackagePage.tsx | 12 +++++++++--- .../PackageRevisionPage/PackageRevisionPage.tsx | 5 +++++ plugins/cad/src/types/PackageRevisionResource.ts | 1 + plugins/cad/src/utils/packageRevisionResources.ts | 2 ++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx b/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx index c6856e6e..1319d7ad 100644 --- a/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx +++ b/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx @@ -148,14 +148,16 @@ const mapRepositoryToSelectItem = ( const getPackageResources = async ( api: ConfigAsDataApi, packageName: string, -): Promise<[PackageResource[], PackageRevisionResourcesMap]> => { +): Promise<[PackageResource[], PackageRevisionResourcesMap, string]> => { const packageResourcesResponse = await api.getPackageRevisionResources( packageName, ); const resourcesMap = packageResourcesResponse.spec.resources; const resources = getPackageResourcesFromResourcesMap(resourcesMap); + const resourceVersion = + packageResourcesResponse.metadata.resourceVersion || ''; - return [resources, resourcesMap]; + return [resources, resourcesMap, resourceVersion]; }; export const AddPackagePage = ({ action }: AddPackagePageProps) => { @@ -464,7 +466,10 @@ export const AddPackagePage = ({ action }: AddPackagePageProps) => { const allKptFunctions = await api.listCatalogFunctions(); const kptFunctions = groupFunctionsByName(allKptFunctions); - const [_, resourcesMap] = await getPackageResources(api, newPackageName); + const [_, resourcesMap, resourceVersion] = await getPackageResources( + api, + newPackageName, + ); let updatedResourcesMap = resourcesMap; @@ -484,6 +489,7 @@ export const AddPackagePage = ({ action }: AddPackagePageProps) => { const packageRevisionResources = getPackageRevisionResourcesResource( newPackageName, updatedResourcesMap, + resourceVersion, ); await api.replacePackageRevisionResources(packageRevisionResources); diff --git a/plugins/cad/src/components/PackageRevisionPage/PackageRevisionPage.tsx b/plugins/cad/src/components/PackageRevisionPage/PackageRevisionPage.tsx index e671066b..f0477874 100644 --- a/plugins/cad/src/components/PackageRevisionPage/PackageRevisionPage.tsx +++ b/plugins/cad/src/components/PackageRevisionPage/PackageRevisionPage.tsx @@ -261,6 +261,7 @@ export const PackageRevisionPage = ({ mode }: PackageRevisionPageProps) => { const [revisionSummaries, setRevisionSummaries] = useState( [], ); + const resourcesMapResourceVersion = useRef(''); const [resourcesMap, setResourcesMap] = useState( {}, ); @@ -339,6 +340,8 @@ export const PackageRevisionPage = ({ mode }: PackageRevisionPageProps) => { setRevisionSummaries(thisRevisionSummaries); setPackageRevision(thisPackageRevision); setResourcesMap(thisResources.spec.resources); + resourcesMapResourceVersion.current = + thisResources.metadata.resourceVersion || ''; let upgradeAvailable = false; let thisUpstreamRepository: Repository | undefined = undefined; @@ -665,6 +668,7 @@ export const PackageRevisionPage = ({ mode }: PackageRevisionPageProps) => { const packageRevisionResources = getPackageRevisionResourcesResource( thisPackageName, resourcesMap, + resourcesMapResourceVersion.current, ); await api.replacePackageRevisionResources(packageRevisionResources); @@ -741,6 +745,7 @@ export const PackageRevisionPage = ({ mode }: PackageRevisionPageProps) => { const packageRevisionResources = getPackageRevisionResourcesResource( packageName, resourcesMap, + resourcesMapResourceVersion.current, ); const resourcesResponse = await api.replacePackageRevisionResources( diff --git a/plugins/cad/src/types/PackageRevisionResource.ts b/plugins/cad/src/types/PackageRevisionResource.ts index 96a0959b..dd2a163a 100644 --- a/plugins/cad/src/types/PackageRevisionResource.ts +++ b/plugins/cad/src/types/PackageRevisionResource.ts @@ -31,6 +31,7 @@ export type PackageRevisionResources = { export type PackageRevisionResourcesMetadata = { name: string; namespace?: string; + resourceVersion?: string; }; export type PackageRevisionResourcesSpec = { diff --git a/plugins/cad/src/utils/packageRevisionResources.ts b/plugins/cad/src/utils/packageRevisionResources.ts index 6caf5fad..573e853e 100644 --- a/plugins/cad/src/utils/packageRevisionResources.ts +++ b/plugins/cad/src/utils/packageRevisionResources.ts @@ -100,12 +100,14 @@ export const getPackageRevisionResources = ( export const getPackageRevisionResourcesResource = ( fullPackageName: string, resourcesMap: PackageRevisionResourcesMap, + resourceVersion: string, ): PackageRevisionResources => { const packageRevisionResources: PackageRevisionResources = { apiVersion: 'porch.kpt.dev/v1alpha1', kind: 'PackageRevisionResources', metadata: { name: fullPackageName, + resourceVersion: resourceVersion, }, spec: { resources: resourcesMap,