diff --git a/src/Components/CreateImageWizard/CreateImageWizard.tsx b/src/Components/CreateImageWizard/CreateImageWizard.tsx
index 6e49c8991..6a6dd2677 100644
--- a/src/Components/CreateImageWizard/CreateImageWizard.tsx
+++ b/src/Components/CreateImageWizard/CreateImageWizard.tsx
@@ -27,6 +27,7 @@ import RegistrationStep from './steps/Registration';
import RepositoriesStep from './steps/Repositories';
import ReviewStep from './steps/Review';
import ReviewWizardFooter from './steps/Review/Footer/Footer';
+import ServicesStep from './steps/Services';
import SnapshotStep from './steps/Snapshot';
import Aws from './steps/TargetEnvironment/Aws';
import Azure from './steps/TargetEnvironment/Azure';
@@ -146,6 +147,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => {
const isHostnameEnabled = useFlag('image-builder.hostname.enabled');
const isKernelEnabled = useFlag('image-builder.kernel.enabled');
const isFirewallEnabled = useFlag('image-builder.firewall.enabled');
+ const isServicesStepEnabled = useFlag('image-builder.services.enabled');
// Remove this and all fallthrough logic when snapshotting is enabled in Prod-stable
// =========================TO REMOVE=======================
@@ -236,7 +238,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => {
let startIndex = 1; // default index
if (isEdit) {
- startIndex = 21;
+ startIndex = 22;
}
// Duplicating some of the logic from the Wizard component to allow for custom nav items status
@@ -541,6 +543,18 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => {
>
,
+
+ }
+ >
+
+ ,
{
+ return (
+
+ );
+};
+
+export default ServicesStep;
diff --git a/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx b/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx
index bf0e528ce..963457154 100644
--- a/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Details/Details.test.tsx
@@ -29,6 +29,7 @@ const goToDetailsStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
await clickNext(); // Details
};
diff --git a/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx b/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx
index ad78819ca..6381b4922 100644
--- a/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/FileSystemConfiguration/FileSystemConfiguration.test.tsx
@@ -118,6 +118,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // Details
await enterBlueprintName();
await clickNext(); // Review
diff --git a/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx b/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx
index 40d6816bc..47292c1fe 100644
--- a/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Firewall/Firewall.test.tsx
@@ -38,6 +38,7 @@ const goToFirewallStep = async () => {
};
const goToReviewStep = async () => {
+ await clickNext(); // Services
await clickNext(); // First boot script
await clickNext(); // Details
await enterBlueprintName();
@@ -56,12 +57,12 @@ describe('Step Firewall', () => {
router = undefined;
});
- test('clicking Next loads First boot', async () => {
+ test('clicking Next loads Services', async () => {
await renderCreateMode();
await goToFirewallStep();
await clickNext();
await screen.findByRole('heading', {
- name: 'First boot configuration',
+ name: 'Systemd services',
});
});
diff --git a/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx b/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx
index fa7e54f6d..e15c1f95a 100644
--- a/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/FirstBoot/Firstboot.test.tsx
@@ -51,6 +51,7 @@ const goToFirstBootStep = async (): Promise => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First Boot
};
@@ -76,6 +77,7 @@ const goFromOscapToFirstBoot = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
};
diff --git a/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx b/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx
index 7502c37b0..ed4819462 100644
--- a/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Hostname/Hostname.test.tsx
@@ -43,6 +43,7 @@ const goToHostnameStep = async () => {
const goToReviewStep = async () => {
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx b/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx
index 6fec42001..8af5f27c3 100644
--- a/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/ImageOutput/ImageOutput.test.tsx
@@ -141,6 +141,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx b/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx
index 9af2bfe9c..cb535bd9a 100644
--- a/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Kernel/Kernel.test.tsx
@@ -41,6 +41,7 @@ const goToKernelStep = async () => {
const goToReviewStep = async () => {
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx b/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx
index 8c5c94a6a..bad437de1 100644
--- a/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Locale/Locale.test.tsx
@@ -42,6 +42,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx
index 206e0a648..12dc8b502 100644
--- a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx
@@ -104,6 +104,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName('Oscap test');
diff --git a/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx b/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx
index 258e6288b..6b6120c03 100644
--- a/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx
@@ -58,6 +58,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First Boot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx b/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx
index 9ef4dd7b6..de22fbc15 100644
--- a/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Registration/Registration.test.tsx
@@ -101,6 +101,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // Details
await enterBlueprintName();
await clickNext(); // Review
diff --git a/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx b/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx
index 6fb99cca3..aaf21d52f 100644
--- a/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Repositories/Repositories.test.tsx
@@ -51,6 +51,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First Boot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx b/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx
index 392c134a8..d2152f661 100644
--- a/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Review/Review.test.tsx
@@ -59,6 +59,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
await clickNext(); // Details
await clickNext(); // Review
diff --git a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx
new file mode 100644
index 000000000..6e1461044
--- /dev/null
+++ b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx
@@ -0,0 +1,67 @@
+import type { Router as RemixRouter } from '@remix-run/router';
+import { screen, waitFor } from '@testing-library/react';
+import { userEvent } from '@testing-library/user-event';
+
+import {
+ clickBack,
+ clickNext,
+ verifyCancelButton,
+} from '../../wizardTestUtils';
+import { clickRegisterLater, renderCreateMode } from '../../wizardTestUtils';
+
+let router: RemixRouter | undefined = undefined;
+
+const goToServicesStep = async () => {
+ const user = userEvent.setup();
+ const guestImageCheckBox = await screen.findByRole('checkbox', {
+ name: /virtualization guest image checkbox/i,
+ });
+ await waitFor(() => user.click(guestImageCheckBox));
+ await clickNext(); // Registration
+ await clickRegisterLater();
+ await clickNext(); // OpenSCAP
+ await clickNext(); // File system configuration
+ await clickNext(); // Snapshots
+ await clickNext(); // Custom repositories
+ await clickNext(); // Additional packages
+ await clickNext(); // Users
+ await clickNext(); // Timezone
+ await clickNext(); // Locale
+ await clickNext(); // Hostname
+ await clickNext(); // Kernel
+ await clickNext(); // Firewall
+ await clickNext(); // Services
+};
+
+describe('Step Services', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ router = undefined;
+ });
+
+ test('clicking Next loads First boot script', async () => {
+ await renderCreateMode();
+ await goToServicesStep();
+ await clickNext();
+ await screen.findByRole('heading', {
+ name: 'First boot configuration',
+ });
+ });
+
+ test('clicking Back loads Firewall', async () => {
+ await renderCreateMode();
+ await goToServicesStep();
+ await clickBack();
+ await screen.findByRole('heading', { name: 'Firewall' });
+ });
+
+ test('clicking Cancel loads landing page', async () => {
+ await renderCreateMode();
+ await goToServicesStep();
+ await verifyCancelButton(router);
+ });
+});
+
+// TO DO 'Services step' -> 'revisit step button on Review works'
+// TO DO 'Services request generated correctly'
+// TO DO 'Services edit mode'
diff --git a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx
index abf589916..5a7f1e695 100644
--- a/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Snapshot/Snapshot.test.tsx
@@ -43,6 +43,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
await enterBlueprintName();
await clickNext(); // Review
diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx
index e75db8984..55e7dd19f 100644
--- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AwsTarget.test.tsx
@@ -50,6 +50,7 @@ const goToReview = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx
index 61fec493a..f959dfa13 100644
--- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/AzureTarget.test.tsx
@@ -50,6 +50,7 @@ const goToReview = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx
index 1d0d99f34..ceed257b6 100644
--- a/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/TargetEnvironment/GCPTarget.test.tsx
@@ -45,6 +45,7 @@ const goToReview = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // FirstBoot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx b/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx
index e239fde1c..5ae65d8c8 100644
--- a/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Timezone/Timezone.test.tsx
@@ -42,6 +42,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot script
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx b/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx
index dec9592b8..255a12832 100644
--- a/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx
+++ b/src/test/Components/CreateImageWizard/steps/Users/Users.test.tsx
@@ -40,6 +40,7 @@ const goToReviewStep = async () => {
await clickNext(); // Hostname
await clickNext(); // Kernel
await clickNext(); // Firewall
+ await clickNext(); // Services
await clickNext(); // First boot
await clickNext(); // Details
await enterBlueprintName();
diff --git a/src/test/setup.ts b/src/test/setup.ts
index 426ff99db..a0671bb89 100644
--- a/src/test/setup.ts
+++ b/src/test/setup.ts
@@ -75,6 +75,8 @@ vi.mock('@unleash/proxy-client-react', () => ({
return true;
case 'image-builder.firewall.enabled':
return true;
+ case 'image-builder.services.enabled':
+ return true;
case 'edgeParity.image-list':
return true;
case 'image-builder.edge.local-image-table':