Skip to content

Commit 78e4e48

Browse files
committed
Resolves: MTV-3642 | address feedback
Signed-off-by: Jeff Puzzo <jpuzzo@redhat.com>
1 parent e3ba70c commit 78e4e48

File tree

5 files changed

+21
-52
lines changed

5 files changed

+21
-52
lines changed

src/plans/create/steps/customization-scripts/NewScriptsFields.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import {
1818
ScriptTypeLabels,
1919
} from './constants';
2020
import ScriptContentField from './ScriptContentField';
21-
import { getNextOrder, validateScriptName } from './utils';
21+
import { validateScriptName } from './utils';
2222

2323
const NewScriptsFields: FC = () => {
2424
const { t } = useForkliftTranslation();
25-
const { control, getValues, setValue } = useCreatePlanFormContext();
25+
const { control, setValue } = useCreatePlanFormContext();
2626

2727
const {
2828
append,
@@ -39,11 +39,7 @@ const NewScriptsFields: FC = () => {
3939
`${CustomScriptsFieldId.Scripts}.${index}.${field}`;
4040

4141
const handleAddScript = (): void => {
42-
const currentScripts = getValues(CustomScriptsFieldId.Scripts);
43-
append({
44-
...DefaultScript,
45-
order: getNextOrder(currentScripts),
46-
});
42+
append({ ...DefaultScript });
4743
};
4844

4945
const handleRemoveScript = (index: number): void => {

src/plans/create/steps/customization-scripts/__tests__/utils.test.ts

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { GuestType, ScriptType } from '../constants';
44
import type { CustomScript } from '../types';
55
import {
66
buildConfigMapKey,
7-
getNextOrder,
87
isScriptConfigMap,
98
scriptsToConfigMapData,
109
validateScriptName,
@@ -14,45 +13,39 @@ const createScript = (overrides: Partial<CustomScript> = {}): CustomScript => ({
1413
content: '#!/bin/bash\necho hello',
1514
guestType: GuestType.Linux,
1615
name: 'setup-network',
17-
order: 10,
1816
scriptType: ScriptType.Firstboot,
1917
...overrides,
2018
});
2119

2220
describe('buildConfigMapKey', () => {
23-
it('builds a Linux firstboot key', () => {
21+
it('builds a Linux firstboot key with customer prefix', () => {
2422
const script = createScript();
25-
expect(buildConfigMapKey(script)).toBe('10_linux_firstboot_setup-network.sh');
23+
expect(buildConfigMapKey(script)).toBe('99999_linux_firstboot_setup-network.sh');
2624
});
2725

2826
it('builds a Windows firstboot key', () => {
2927
const script = createScript({ guestType: GuestType.Windows, scriptType: ScriptType.Firstboot });
30-
expect(buildConfigMapKey(script)).toBe('10_win_firstboot_setup-network.ps1');
28+
expect(buildConfigMapKey(script)).toBe('99999_win_firstboot_setup-network.ps1');
3129
});
3230

3331
it('builds a Linux run key', () => {
3432
const script = createScript({ scriptType: ScriptType.Run });
35-
expect(buildConfigMapKey(script)).toBe('10_linux_run_setup-network.sh');
36-
});
37-
38-
it('zero-pads single-digit order numbers', () => {
39-
const script = createScript({ order: 5 });
40-
expect(buildConfigMapKey(script)).toBe('05_linux_firstboot_setup-network.sh');
33+
expect(buildConfigMapKey(script)).toBe('99999_linux_run_setup-network.sh');
4134
});
4235
});
4336

4437
describe('scriptsToConfigMapData', () => {
4538
it('converts multiple scripts to ConfigMap data entries', () => {
4639
const scripts = [
47-
createScript({ name: 'first', order: 10 }),
48-
createScript({ name: 'second', order: 20, scriptType: ScriptType.Run }),
40+
createScript({ name: 'first' }),
41+
createScript({ name: 'second', scriptType: ScriptType.Run }),
4942
];
5043

5144
const result = scriptsToConfigMapData(scripts);
5245

5346
expect(result).toEqual({
54-
'10_linux_firstboot_first.sh': '#!/bin/bash\necho hello',
55-
'20_linux_run_second.sh': '#!/bin/bash\necho hello',
47+
'99999_linux_firstboot_first.sh': '#!/bin/bash\necho hello',
48+
'99999_linux_run_second.sh': '#!/bin/bash\necho hello',
5649
});
5750
});
5851

@@ -61,17 +54,6 @@ describe('scriptsToConfigMapData', () => {
6154
});
6255
});
6356

64-
describe('getNextOrder', () => {
65-
it('returns 10 for an empty array', () => {
66-
expect(getNextOrder([])).toBe(10);
67-
});
68-
69-
it('increments by 10 from the highest order', () => {
70-
const scripts = [createScript({ order: 10 }), createScript({ order: 30 })];
71-
expect(getNextOrder(scripts)).toBe(40);
72-
});
73-
});
74-
7557
describe('validateScriptName', () => {
7658
it('returns undefined for a valid name with hyphens', () => {
7759
expect(validateScriptName('setup-network')).toBeUndefined();
@@ -96,12 +78,12 @@ describe('validateScriptName', () => {
9678

9779
describe('isScriptConfigMap', () => {
9880
it('returns true for a Linux script key', () => {
99-
const data = { '10_linux_firstboot_setup.sh': '#!/bin/bash' };
81+
const data = { '99999_linux_firstboot_setup.sh': '#!/bin/bash' };
10082
expect(isScriptConfigMap(data)).toBe(true);
10183
});
10284

10385
it('returns true for a Windows script key', () => {
104-
const data = { '05_win_run_cleanup.ps1': 'Remove-Item' };
86+
const data = { '99999_win_run_cleanup.ps1': 'Remove-Item' };
10587
expect(isScriptConfigMap(data)).toBe(true);
10688
});
10789

src/plans/create/steps/customization-scripts/constants.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,16 @@ export const ScriptTypeLabels: Record<ScriptType, ReturnType<typeof t>> = {
3838
[ScriptType.Run]: t('Run'),
3939
};
4040

41-
export const ORDER_INCREMENT = 10;
41+
// The backend reads scripts alphabetically via Go's os.ReadDir.
42+
// MTV's own scripts use prefix 9999 (see customize.go). Customer scripts
43+
// use 99999 so they always sort after MTV scripts.
44+
// https://github.com/kubev2v/forklift/blob/main/pkg/virt-v2v/customize/customize.go
45+
export const CUSTOMER_SCRIPT_PREFIX = 99999;
4246

4347
export const DefaultScript: CustomScript = {
4448
content: '',
4549
guestType: GuestType.Linux,
4650
name: '',
47-
order: ORDER_INCREMENT,
4851
scriptType: ScriptType.Firstboot,
4952
};
5053

src/plans/create/steps/customization-scripts/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,5 @@ export type CustomScript = {
44
content: string;
55
guestType: GuestType;
66
name: string;
7-
order: number;
87
scriptType: ScriptType;
98
};

src/plans/create/steps/customization-scripts/utils.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { isEmpty } from '@utils/helpers';
21
import { t } from '@utils/i18n';
32

43
import {
4+
CUSTOMER_SCRIPT_PREFIX,
55
FILE_EXTENSIONS,
6-
ORDER_INCREMENT,
76
OS_PREFIXES,
87
SCRIPT_KEY_PATTERN,
98
SCRIPT_NAME_REGEX,
@@ -12,15 +11,14 @@ import type { CustomScript } from './types';
1211

1312
/**
1413
* Builds a ConfigMap data key matching the backend regex patterns in customize.go.
15-
* Order is zero-padded so lexicographic sorting matches numeric order (e.g. `02_` before `10_`).
14+
* Uses a large prefix (99999) so customer scripts sort after virt-v2v (4000–5005) and MTV (9999) scripts.
1615
* @see https://github.com/kubev2v/forklift/blob/main/pkg/virt-v2v/customize/customize.go
1716
*/
1817
export const buildConfigMapKey = (script: CustomScript): string => {
19-
const paddedOrder = String(script.order).padStart(2, '0');
2018
const osPrefix = OS_PREFIXES[script.guestType];
2119
const ext = FILE_EXTENSIONS[script.guestType];
2220

23-
return `${paddedOrder}_${osPrefix}_${script.scriptType}_${script.name}.${ext}`;
21+
return `${CUSTOMER_SCRIPT_PREFIX}_${osPrefix}_${script.scriptType}_${script.name}.${ext}`;
2422
};
2523

2624
export const scriptsToConfigMapData = (scripts: CustomScript[]): Record<string, string> => {
@@ -30,15 +28,6 @@ export const scriptsToConfigMapData = (scripts: CustomScript[]): Record<string,
3028
}, {});
3129
};
3230

33-
export const getNextOrder = (scripts: CustomScript[]): number => {
34-
if (isEmpty(scripts)) {
35-
return ORDER_INCREMENT;
36-
}
37-
38-
const maxOrder = Math.max(...scripts.map((script) => script.order));
39-
return maxOrder + ORDER_INCREMENT;
40-
};
41-
4231
export const validateScriptName = (value: string): string | undefined => {
4332
if (!value?.trim()) {
4433
return t('Script name is required.');

0 commit comments

Comments
 (0)