Skip to content
This repository was archived by the owner on Jun 18, 2025. It is now read-only.

Commit 9efdef7

Browse files
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.
1 parent 34f5daf commit 9efdef7

File tree

1 file changed

+56
-10
lines changed

1 file changed

+56
-10
lines changed

plugins/cad/src/components/PackageRevisionPage/components/PackageResourcesList.tsx

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
*/
1616

1717
import { makeStyles } from '@material-ui/core';
18-
import { uniq } from 'lodash';
18+
import { cloneDeep, uniq } from 'lodash';
1919
import React, { Fragment } from 'react';
20+
import { KubernetesResource } from '../../../types/KubernetesResource';
2021
import { PackageRevisionResourcesMap } from '../../../types/PackageRevisionResource';
2122
import {
2223
addResourceToResourcesMap,
@@ -27,6 +28,7 @@ import {
2728
ResourceDiffStatus,
2829
updateResourceInResourcesMap,
2930
} from '../../../utils/packageRevisionResources';
31+
import { dumpYaml, loadYaml } from '../../../utils/yaml';
3032
import { PackageRevisionPageMode } from '../PackageRevisionPage';
3133
import {
3234
PackageRevisionResourcesTable,
@@ -175,25 +177,69 @@ export const PackageResourcesList = ({
175177
originalResource?: PackageResource,
176178
resource?: PackageResource,
177179
): void => {
178-
let updatedResourcesMap: PackageRevisionResourcesMap | undefined;
180+
let updatedResourcesMap = cloneDeep(resourcesMap);
179181

180-
if (originalResource && !resource) {
182+
if (resource) {
183+
const resourceYaml = loadYaml(resource.yaml) as KubernetesResource;
184+
185+
if (resourceYaml.metadata.annotations) {
186+
const PATH_ANNOTATION = 'internal.config.kubernetes.io/path';
187+
188+
const newFilename =
189+
resourceYaml.metadata.annotations?.[PATH_ANNOTATION];
190+
191+
if (newFilename) {
192+
if (!newFilename.endsWith('.yaml')) {
193+
throw new Error('Filename must must have the .yaml extension');
194+
}
195+
196+
resource.filename = newFilename;
197+
198+
delete resourceYaml.metadata.annotations?.[PATH_ANNOTATION];
199+
if (Object.keys(resourceYaml.metadata.annotations).length === 0) {
200+
delete resourceYaml.metadata.annotations;
201+
}
202+
203+
resource.yaml = dumpYaml(resourceYaml);
204+
}
205+
}
206+
}
207+
208+
const deleteResource =
209+
originalResource &&
210+
(!resource || resource.filename !== originalResource.filename);
211+
const updateResource =
212+
originalResource &&
213+
resource &&
214+
resource.filename === originalResource.filename;
215+
const addResource =
216+
resource &&
217+
(!originalResource || resource.filename !== originalResource?.filename);
218+
219+
if (!(deleteResource || updateResource || addResource)) {
220+
throw new Error('No action is set to occur on resources map');
221+
}
222+
223+
if (deleteResource) {
181224
updatedResourcesMap = removeResourceFromResourcesMap(
182-
resourcesMap,
225+
updatedResourcesMap,
183226
originalResource,
184227
);
185-
} else if (originalResource && resource) {
228+
}
229+
230+
if (updateResource) {
186231
updatedResourcesMap = updateResourceInResourcesMap(
187-
resourcesMap,
232+
updatedResourcesMap,
188233
originalResource,
189234
resource.yaml,
190235
);
191-
} else if (!originalResource && resource) {
192-
updatedResourcesMap = addResourceToResourcesMap(resourcesMap, resource);
193236
}
194237

195-
if (!updatedResourcesMap) {
196-
throw new Error('Resources map never updated');
238+
if (addResource) {
239+
updatedResourcesMap = addResourceToResourcesMap(
240+
updatedResourcesMap,
241+
resource,
242+
);
197243
}
198244

199245
onUpdatedResourcesMap(updatedResourcesMap);

0 commit comments

Comments
 (0)