diff --git a/src/Components/CreateImageWizard/CreateImageWizard.js b/src/Components/CreateImageWizard/CreateImageWizard.js index 4fc1e934..2132cf12 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.js +++ b/src/Components/CreateImageWizard/CreateImageWizard.js @@ -204,6 +204,25 @@ const onSave = (values) => { requests.push(request); } + if (values['target-environment']?.['vsphere-ova']) { + const request = { + distribution: values.release, + image_name: values?.['image-name'], + image_requests: [ + { + architecture: 'x86_64', + image_type: 'vsphere-ova', + upload_request: { + type: 'aws.s3', + options: {}, + }, + }, + ], + customizations, + }; + requests.push(request); + } + if (values['target-environment']?.['guest-image']) { const request = { distribution: values.release, diff --git a/src/Components/CreateImageWizard/formComponents/ReviewStep.js b/src/Components/CreateImageWizard/formComponents/ReviewStep.js index 5186c21c..dbe33f9a 100644 --- a/src/Components/CreateImageWizard/formComponents/ReviewStep.js +++ b/src/Components/CreateImageWizard/formComponents/ReviewStep.js @@ -86,7 +86,13 @@ const ReviewStep = () => { )} {getState()?.values?.['target-environment']?.vsphere && ( - VMWare (.vmdk) + VMWare vSphere (.vmdk) + + + )} + {getState()?.values?.['target-environment']?.['vsphere-ova'] && ( + + VMWare vSphere (.ova) )} diff --git a/src/Components/CreateImageWizard/formComponents/TargetEnvironment.js b/src/Components/CreateImageWizard/formComponents/TargetEnvironment.js index 0e88069d..aa35e397 100644 --- a/src/Components/CreateImageWizard/formComponents/TargetEnvironment.js +++ b/src/Components/CreateImageWizard/formComponents/TargetEnvironment.js @@ -5,10 +5,14 @@ import useFormApi from '@data-driven-forms/react-form-renderer/use-form-api'; import { Checkbox, FormGroup, + Popover, + Radio, Text, + TextContent, TextVariants, Tile, } from '@patternfly/react-core'; +import { HelpIcon } from '@patternfly/react-icons'; import PropTypes from 'prop-types'; import { usePrefetch } from '../../../store/apiSlice'; @@ -20,6 +24,7 @@ const TargetEnvironment = ({ label, isRequired, ...props }) => { aws: false, azure: false, gcp: false, + 'vsphere-ova': false, vsphere: false, 'guest-image': false, 'image-installer': false, @@ -32,129 +37,204 @@ const TargetEnvironment = ({ label, isRequired, ...props }) => { } }, []); - const handleSetEnvironment = (env) => + const handleSetEnvironment = (env, checked) => setEnvironment((prevEnv) => { const newEnv = { ...prevEnv, - [env]: !prevEnv[env], + [env]: checked, }; change(input.name, newEnv); return newEnv; }); - const handleKeyDown = (e, env) => { + const handleKeyDown = (e, env, checked) => { if (e.key === ' ') { - handleSetEnvironment(env); + handleSetEnvironment(env, checked); } }; return ( - <> + Public cloud} + data-testid="target-public" > - Public cloud} - data-testid="target-public" - > -
- - } - onClick={() => handleSetEnvironment('aws')} - onKeyDown={(e) => handleKeyDown(e, 'aws')} - onMouseEnter={() => prefetchSources('aws')} - isSelected={environment.aws} - isStacked - isDisplayLarge - /> - - } - onClick={() => handleSetEnvironment('gcp')} - isSelected={environment.gcp} - onKeyDown={(e) => handleKeyDown(e, 'gcp')} - isStacked - isDisplayLarge - /> - - } - onClick={() => handleSetEnvironment('azure')} - onKeyDown={(e) => handleKeyDown(e, 'azure')} - onMouseEnter={() => prefetchSources('azure')} - isSelected={environment.azure} - isStacked - isDisplayLarge - /> -
-
- Private cloud} - data-testid="target-private" - > - handleSetEnvironment('vsphere')} - aria-label="VMWare checkbox" - id="checkbox-vmware" - name="VMWare" - data-testid="checkbox-vmware" +
+ + } + onClick={() => handleSetEnvironment('aws', !environment.aws)} + onKeyDown={(e) => handleKeyDown(e, 'aws', !environment.aws)} + onMouseEnter={() => prefetchSources('aws')} + isSelected={environment.aws} + isStacked + isDisplayLarge /> - - Other} - data-testid="target-other" - > - handleSetEnvironment('guest-image')} - aria-label="Virtualization guest image checkbox" - id="checkbox-guest-image" - name="Virtualization guest image" - data-testid="checkbox-guest-image" + + } + onClick={() => handleSetEnvironment('gcp', !environment.gcp)} + isSelected={environment.gcp} + onKeyDown={(e) => handleKeyDown(e, 'gcp', !environment.gcp)} + isStacked + isDisplayLarge /> - handleSetEnvironment('image-installer')} - aria-label="Bare metal installer checkbox" - id="checkbox-image-installer" - name="Bare metal installer" - data-testid="checkbox-image-installer" + + } + onClick={() => handleSetEnvironment('azure', !environment.azure)} + onKeyDown={(e) => handleKeyDown(e, 'azure', !environment.azure)} + onMouseEnter={() => prefetchSources('azure')} + isSelected={environment.azure} + isStacked + isDisplayLarge /> - +
- + Private cloud} + className="pf-u-mt-sm" + data-testid="target-private" + > + { + handleSetEnvironment('vsphere-ova', checked); + handleSetEnvironment('vsphere', false); + }} + aria-label="VMWare checkbox" + id="checkbox-vmware" + name="VMWare" + data-testid="checkbox-vmware" + /> + + + + Open virtualization format (.ova) + + + An OVA file is a virtual appliance used by virtualization + platforms such as VMWare vSphere. It is a package that + contains files used to describe a virtual machine, which + includes a VMDK image, OVF descriptor file and a manifest + file. + + + } + > + + + + } + onChange={(checked) => { + handleSetEnvironment('vsphere-ova', checked); + handleSetEnvironment('vsphere', !checked); + }} + isChecked={environment['vsphere-ova']} + isDisabled={!(environment.vsphere || environment['vsphere-ova'])} + /> + + Virtual disk (.vmdk) + + + A VMDK file is a virtual disk that stores the contents of + a virtual machine. This disk has to be imported into + vSphere using govc import.vmdk, use the OVA version when + using the vSphere UI. + + + } + > + + + + } + onChange={(checked) => { + handleSetEnvironment('vsphere-ova', !checked); + handleSetEnvironment('vsphere', checked); + }} + isChecked={environment.vsphere} + isDisabled={!(environment.vsphere || environment['vsphere-ova'])} + /> + + Other} + data-testid="target-other" + > + handleSetEnvironment('guest-image', checked)} + aria-label="Virtualization guest image checkbox" + id="checkbox-guest-image" + name="Virtualization guest image" + data-testid="checkbox-guest-image" + /> + + handleSetEnvironment('image-installer', checked) + } + aria-label="Bare metal installer checkbox" + id="checkbox-image-installer" + name="Bare metal installer" + data-testid="checkbox-image-installer" + /> + +
); }; diff --git a/src/Components/ImagesTable/ImageLinkDirect.js b/src/Components/ImagesTable/ImageLinkDirect.js index 5293871b..4a0bfe5c 100644 --- a/src/Components/ImagesTable/ImageLinkDirect.js +++ b/src/Components/ImagesTable/ImageLinkDirect.js @@ -36,6 +36,7 @@ const ImageLinkDirect = ({ imageId, isExpired, isInClonesTable }) => { const fileExtensions = { vsphere: '.vmdk', + 'vsphere-ova': '.ova', 'guest-image': '.qcow2', 'image-installer': '.iso', }; diff --git a/src/Components/ImagesTable/Target.js b/src/Components/ImagesTable/Target.js index 023fd1b5..f1d394fa 100644 --- a/src/Components/ImagesTable/Target.js +++ b/src/Components/ImagesTable/Target.js @@ -12,7 +12,8 @@ const Target = ({ composeId }) => { aws: 'Amazon Web Services', azure: 'Microsoft Azure', gcp: 'Google Cloud Platform', - vsphere: 'VMWare', + vsphere: 'VMWare vSphere', + 'vsphere-ova': 'VMWare vSphere', 'guest-image': 'Virtualization - Guest image', 'image-installer': 'Bare metal - Installer', }; diff --git a/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js b/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js index 1679b25d..6be21a40 100644 --- a/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js +++ b/src/test/Components/CreateImageWizard/CreateImageWizard.beta.test.js @@ -750,7 +750,7 @@ describe('Click through all steps', () => { targetEnvironmentsExpandable.click(); await screen.findAllByText('AWS'); await screen.findAllByText('GCP'); - await screen.findByText('VMWare (.vmdk)'); + await screen.findByText('VMWare vSphere (.ova)'); await screen.findByText('Virtualization - Guest image (.qcow2)'); await screen.findByText('Bare metal - Installer (.iso)'); @@ -849,14 +849,14 @@ describe('Click through all steps', () => { customizations: customizations, }); id = 'edbae1c2-62bc-42c1-ae0c-3110ab718f58'; - } else if (body.image_requests[0].image_type === 'vsphere') { + } else if (body.image_requests[0].image_type === 'vsphere-ova') { expect(body).toEqual({ distribution: RHEL_8, image_name: 'MyImageName', image_requests: [ { architecture: 'x86_64', - image_type: 'vsphere', + image_type: 'vsphere-ova', upload_request: { type: 'aws.s3', options: {}, diff --git a/src/test/Components/CreateImageWizard/CreateImageWizard.test.js b/src/test/Components/CreateImageWizard/CreateImageWizard.test.js index 8d11621d..3b2522cb 100644 --- a/src/test/Components/CreateImageWizard/CreateImageWizard.test.js +++ b/src/test/Components/CreateImageWizard/CreateImageWizard.test.js @@ -1396,7 +1396,7 @@ describe('Click through all steps', () => { targetEnvironmentsExpandable.click(); await screen.findAllByText('AWS'); await screen.findAllByText('GCP'); - await screen.findByText('VMWare (.vmdk)'); + await screen.findByText('VMWare vSphere (.ova)'); await screen.findByText('Virtualization - Guest image (.qcow2)'); await screen.findByText('Bare metal - Installer (.iso)'); @@ -1566,14 +1566,14 @@ describe('Click through all steps', () => { }, }); id = 'edbae1c2-62bc-42c1-ae0c-3110ab718f58'; - } else if (body.image_requests[0].image_type === 'vsphere') { + } else if (body.image_requests[0].image_type === 'vsphere-ova') { expect(body).toEqual({ distribution: RHEL_8, image_name: 'MyImageName', image_requests: [ { architecture: 'x86_64', - image_type: 'vsphere', + image_type: 'vsphere-ova', upload_request: { type: 'aws.s3', options: {},