From 9efdef7a6c79239faff1d7e4d9d7ad1ca13f27a8 Mon Sep 17 00:00:00 2001 From: Christopher Fry Date: Wed, 23 Nov 2022 09:12:36 -0800 Subject: [PATCH] feat: allow resource path to be updated (#222) This change allows a resource's path to be updated with the `internal.config.kubernetes.io/path` annotation. --- .../components/PackageResourcesList.tsx | 66 ++++++++++++++++--- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/plugins/cad/src/components/PackageRevisionPage/components/PackageResourcesList.tsx b/plugins/cad/src/components/PackageRevisionPage/components/PackageResourcesList.tsx index ea50e481..8223e7b5 100644 --- a/plugins/cad/src/components/PackageRevisionPage/components/PackageResourcesList.tsx +++ b/plugins/cad/src/components/PackageRevisionPage/components/PackageResourcesList.tsx @@ -15,8 +15,9 @@ */ import { makeStyles } from '@material-ui/core'; -import { uniq } from 'lodash'; +import { cloneDeep, uniq } from 'lodash'; import React, { Fragment } from 'react'; +import { KubernetesResource } from '../../../types/KubernetesResource'; import { PackageRevisionResourcesMap } from '../../../types/PackageRevisionResource'; import { addResourceToResourcesMap, @@ -27,6 +28,7 @@ import { ResourceDiffStatus, updateResourceInResourcesMap, } from '../../../utils/packageRevisionResources'; +import { dumpYaml, loadYaml } from '../../../utils/yaml'; import { PackageRevisionPageMode } from '../PackageRevisionPage'; import { PackageRevisionResourcesTable, @@ -175,25 +177,69 @@ export const PackageResourcesList = ({ originalResource?: PackageResource, resource?: PackageResource, ): void => { - let updatedResourcesMap: PackageRevisionResourcesMap | undefined; + let updatedResourcesMap = cloneDeep(resourcesMap); - if (originalResource && !resource) { + if (resource) { + const resourceYaml = loadYaml(resource.yaml) as KubernetesResource; + + if (resourceYaml.metadata.annotations) { + const PATH_ANNOTATION = 'internal.config.kubernetes.io/path'; + + const newFilename = + resourceYaml.metadata.annotations?.[PATH_ANNOTATION]; + + if (newFilename) { + if (!newFilename.endsWith('.yaml')) { + throw new Error('Filename must must have the .yaml extension'); + } + + resource.filename = newFilename; + + delete resourceYaml.metadata.annotations?.[PATH_ANNOTATION]; + if (Object.keys(resourceYaml.metadata.annotations).length === 0) { + delete resourceYaml.metadata.annotations; + } + + resource.yaml = dumpYaml(resourceYaml); + } + } + } + + const deleteResource = + originalResource && + (!resource || resource.filename !== originalResource.filename); + const updateResource = + originalResource && + resource && + resource.filename === originalResource.filename; + const addResource = + resource && + (!originalResource || resource.filename !== originalResource?.filename); + + if (!(deleteResource || updateResource || addResource)) { + throw new Error('No action is set to occur on resources map'); + } + + if (deleteResource) { updatedResourcesMap = removeResourceFromResourcesMap( - resourcesMap, + updatedResourcesMap, originalResource, ); - } else if (originalResource && resource) { + } + + if (updateResource) { updatedResourcesMap = updateResourceInResourcesMap( - resourcesMap, + updatedResourcesMap, originalResource, resource.yaml, ); - } else if (!originalResource && resource) { - updatedResourcesMap = addResourceToResourcesMap(resourcesMap, resource); } - if (!updatedResourcesMap) { - throw new Error('Resources map never updated'); + if (addResource) { + updatedResourcesMap = addResourceToResourcesMap( + updatedResourcesMap, + resource, + ); } onUpdatedResourcesMap(updatedResourcesMap);