Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ describe('file-upload-utils', () => {

it('should return the file upload handler for supported file type', () => {
const fileEx = getRequiredFileUploadExtension(fileUploadExtensions, 'string-boot.jar');
expect(fileEx.properties.handler).toEqual(handler1);
expect(fileEx?.properties.handler).toEqual(handler1);
});

it('should return null if there is no handler for a file type', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { getRequiredFileUploadExtension } from './file-upload-utils';

export type FileUploadContextType = {
extensions: string[];
fileUpload: File;
fileUpload: File | undefined;
setFileUpload: (file: File) => void;
};

Expand All @@ -26,7 +26,7 @@ export const useValuesFileUploadContext = (): FileUploadContextType => {
const [fileUploadExtensions, resolved] = useResolvedExtensions<FileUpload>(isFileUpload);
const toastContext = useToast();
const [namespace] = useActiveNamespace();
const [file, setFile] = useState<File>(undefined);
const [file, setFile] = useState<File | undefined>(undefined);
const fileExtensions = useMemo(
() =>
resolved
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
const [cloneAccessMode, setCloneAccessMode] = React.useState(resource?.spec?.accessModes?.[0]);
const [requestedUnit, setRequestedUnit] = React.useState(defaultSize[1] || 'Ti');
const [validSize, setValidSize] = React.useState(true);
const pvcAccessMode = getPVCAccessModes(resource, 'title');
const pvcAccessMode = getPVCAccessModes(resource as PersistentVolumeClaimKind, 'title');
const [pvcSC, setPVCStorageClass] = React.useState('');
const [updatedProvisioner, setUpdatedProvisioner] = React.useState('');
const handleStorageClass = (updatedStorageClass: StorageClassResourceKind) => {
Expand All @@ -85,15 +85,17 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
});
const pvcUsedCapacityQueryResult: DataPoint[] = getInstantVectorStats(
response,
null,
undefined,
humanizeBinaryBytes,
);
const pvcUsedCapacity = pvcUsedCapacityQueryResult?.[0]?.label || '-';
const requestedSizeInputChange = ({ value, unit }) => {
setRequestedSize(value);
setRequestedUnit(unit);
const cloneSizeInBytes = convertToBaseValue(value + unit);
const pvcSizeInBytes = convertToBaseValue(getRequestedPVCSize(resource));
const pvcSizeInBytes = convertToBaseValue(
getRequestedPVCSize(resource as PersistentVolumeClaimKind),
);
const isValid = cloneSizeInBytes >= pvcSizeInBytes;
setValidSize(isValid);
};
Expand All @@ -106,12 +108,12 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
kind: PersistentVolumeClaimModel.kind,
metadata: {
name: clonePVCName,
namespace: resource.metadata.namespace,
namespace: resource?.metadata?.namespace,
},
spec: {
storageClassName: pvcSC,
dataSource: {
name: pvcName,
name: pvcName || '',
kind: PersistentVolumeClaimModel.kind,
apiGroup: '',
},
Expand All @@ -120,17 +122,20 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
storage: `${requestedSize}${requestedUnit}`,
},
},
volumeMode: resource.spec.volumeMode,
accessModes: [cloneAccessMode],
volumeMode: resource?.spec?.volumeMode,
accessModes: [cloneAccessMode || ''],
},
};

handlePromise(k8sCreate(PersistentVolumeClaimModel, pvcCloneObj))
.then((cloneResource) => {
close();
history.push(resourceObjPath(cloneResource, referenceFor(cloneResource)));
})
.catch(() => {});
return handlePromise(k8sCreate(PersistentVolumeClaimModel, pvcCloneObj)).then(
(cloneResource) => {
close?.();
const resourcePath = resourceObjPath(cloneResource, referenceFor(cloneResource));
if (resourcePath) {
history.push(resourcePath);
}
},
);
};

return (
Expand All @@ -155,7 +160,7 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
<AccessModeSelector
onChange={setCloneAccessMode}
className="co-clone-pvc-modal__form--space"
pvcResource={resource}
pvcResource={resource as PersistentVolumeClaimKind}
provisioner={updatedProvisioner}
loaded={scResourceLoaded}
loadError={scResourceLoadError}
Expand Down Expand Up @@ -219,7 +224,7 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
<p className="co-clone-pvc-modal__pvc-details">{t('console-app~Namespace')}</p>
<p>
<ResourceIcon kind={NamespaceModel.kind} />
{resource.metadata.namespace}
{resource?.metadata?.namespace}
</p>
</div>
<div>
Expand Down Expand Up @@ -253,7 +258,7 @@ const ClonePVCModal = (props: ClonePVCModalProps) => {
</div>
<div>
<p className="co-clone-pvc-modal__pvc-details">{t('console-app~Volume mode')}</p>
<p>{resource.spec.volumeMode}</p>
<p>{resource?.spec?.volumeMode}</p>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const ResourceLimitsModalLauncher: React.FC<ResourceLimitsModalLauncherProps> =
},
])
.then(() => {
props.close();
props.close?.();
})
.catch((error) => {
actions.setStatus({ submitError: error });
Expand All @@ -46,7 +46,7 @@ const ResourceLimitsModalLauncher: React.FC<ResourceLimitsModalLauncherProps> =

const currentValues = {
limits: getLimitsDataFromResource(props.resource),
container: props.resource.spec.template.spec.containers[0].name,
container: props.resource?.spec?.template?.spec?.containers?.[0]?.name,
};

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,127 +93,131 @@ const RestorePVCModal = ({ close, cancel, resource }: RestorePVCModalProps) => {
setRequestedUnit(unit);
};

const handleStorageClass = (updatedStorageClass: StorageClassResourceKind) => {
setPVCStorageClass(updatedStorageClass?.metadata.name || '');
setUpdatedProvisioner(updatedStorageClass?.provisioner);
};
const handleStorageClass = (updatedStorageClass: StorageClassResourceKind) => {
setPVCStorageClass(updatedStorageClass?.metadata?.name || '');
setUpdatedProvisioner(updatedStorageClass?.provisioner);
};

const submit = (event: React.FormEvent<EventTarget>) => {
event.preventDefault();
const restorePVCTemplate: PersistentVolumeClaimKind = {
apiVersion: PersistentVolumeClaimModel.apiVersion,
kind: PersistentVolumeClaimModel.kind,
metadata: {
name: restorePVCName,
namespace,
},
spec: {
storageClassName: pvcSC,
dataSource: {
name: snapshotName,
kind: VolumeSnapshotModel.kind,
apiGroup: VolumeSnapshotModel.apiGroup,
const submit = (event: React.FormEvent<EventTarget>) => {
event.preventDefault();
const restorePVCTemplate: PersistentVolumeClaimKind = {
apiVersion: PersistentVolumeClaimModel.apiVersion,
kind: PersistentVolumeClaimModel.kind,
metadata: {
name: restorePVCName,
namespace,
},
accessModes: [restoreAccessMode],
volumeMode,
resources: {
requests: {
storage: `${requestedSize}${requestedUnit}`,
spec: {
storageClassName: pvcSC,
dataSource: {
name: snapshotName,
kind: VolumeSnapshotModel.kind,
apiGroup: VolumeSnapshotModel.apiGroup || '',
},
accessModes: [restoreAccessMode],
volumeMode,
resources: {
requests: {
storage: `${requestedSize}${requestedUnit}`,
},
},
},
},
};
};

handlePromise(k8sCreate(PersistentVolumeClaimModel, restorePVCTemplate, { ns: namespace }))
.then((newPVC) => {
close();
return handlePromise(
k8sCreate(PersistentVolumeClaimModel, restorePVCTemplate, { ns: namespace }),
).then((newPVC) => {
close?.();
history.push(
resourcePathFromModel(PersistentVolumeClaimModel, newPVC.metadata.name, namespace),
);
})
.catch(() => {});
};
return (
<form onSubmit={submit} name="form" className="modal-content pf-v6-c-form pf-v6-c-form--no-gap">
<ModalTitle>{t('console-app~Restore as new PVC')}</ModalTitle>
<ModalBody>
<p>
<Trans t={t} ns="console-app">
When restore action for snapshot <strong>{{ snapshotName }}</strong> is finished a new
crash-consistent PVC copy will be created.
</Trans>
</p>
<FormGroup
label={t('console-app~Name')}
isRequired
fieldId="pvc-name"
className="co-restore-pvc-modal__input"
>
<TextInput
});
};
return (
<form
onSubmit={submit}
name="form"
className="modal-content pf-v6-c-form pf-v6-c-form--no-gap"
>
<ModalTitle>{t('console-app~Restore as new PVC')}</ModalTitle>
<ModalBody>
<p>
<Trans t={t} ns="console-app">
When restore action for snapshot <strong>{{ snapshotName }}</strong> is finished a new
crash-consistent PVC copy will be created.
</Trans>
</p>
<FormGroup
label={t('console-app~Name')}
isRequired
type="text"
id="pvc-name"
data-test="pvc-name"
name="restore-pvc-modal__name"
value={restorePVCName}
onChange={(_event, value: string) => setPVCName(value)}
/>
</FormGroup>
<FormGroup fieldId="restore-storage-class" className="co-restore-pvc-modal__input">
{!pvcStorageClassName || !scResourceLoaded ? (
<div className="skeleton-text" />
) : (
<StorageClassDropdown
onChange={handleStorageClass}
filter={(scObj: StorageClassResourceKind) =>
onlyPvcSCs(scObj, scResourceLoadError, scResource)
}
id="restore-storage-class"
required
selectedKey={volumeSnapshotAnnotations?.[snapshotPVCStorageClassAnnotation]}
fieldId="pvc-name"
className="co-restore-pvc-modal__input"
>
<TextInput
isRequired
type="text"
id="pvc-name"
data-test="pvc-name"
name="restore-pvc-modal__name"
value={restorePVCName}
onChange={(_event, value: string) => setPVCName(value)}
/>
)}
</FormGroup>
<AccessModeSelector
onChange={setRestoreAccessMode}
className="co-restore-pvc-modal__input"
provisioner={updatedProvisioner}
loaded={pvcResourceLoaded}
loadError={pvcResourceLoadError}
pvcResource={pvcResource}
availableAccessModes={volumeSnapshotAnnotations?.[snapshotPVCAccessModeAnnotation]?.split(
',',
)}
/>
<VolumeModeSelector
onChange={setVolumeMode}
className="co-restore-pvc-modal__input"
provisioner={updatedProvisioner}
pvcResource={pvcResource}
accessMode={restoreAccessMode}
storageClass={pvcSC}
loaded={pvcResourceLoaded}
availableVolumeMode={volumeSnapshotAnnotations?.[snapshotPVCVolumeModeAnnotation]}
/>
<FormGroup
label={t('console-app~Size')}
isRequired
fieldId="pvc-size"
className="co-restore-pvc-modal__input co-restore-pvc-modal__ocs-size"
>
{!!pvcStorageClassName && scResourceLoaded ? (
<RequestSizeInput
name="requestSize"
onChange={requestedSizeInputChange}
defaultRequestSizeUnit={requestedUnit}
defaultRequestSizeValue={requestedSize}
dropdownUnits={dropdownUnits}
isInputDisabled={scResourceLoadError || isCephProvisioner(scResource?.provisioner)}
required
/>
) : (
<div className="skeleton-text" />
)}
</FormGroup>
<FormGroup fieldId="restore-storage-class" className="co-restore-pvc-modal__input">
{!pvcStorageClassName || !scResourceLoaded ? (
<div className="skeleton-text" />
) : (
<StorageClassDropdown
onChange={handleStorageClass}
filter={(scObj: StorageClassResourceKind) =>
onlyPvcSCs(scObj, scResourceLoadError, scResource)
}
id="restore-storage-class"
required
selectedKey={volumeSnapshotAnnotations?.[snapshotPVCStorageClassAnnotation]}
/>
)}
</FormGroup>
<AccessModeSelector
onChange={setRestoreAccessMode}
className="co-restore-pvc-modal__input"
provisioner={updatedProvisioner}
loaded={pvcResourceLoaded}
loadError={pvcResourceLoadError}
pvcResource={pvcResource}
availableAccessModes={volumeSnapshotAnnotations?.[
snapshotPVCAccessModeAnnotation
]?.split(',')}
/>
<VolumeModeSelector
onChange={setVolumeMode}
className="co-restore-pvc-modal__input"
provisioner={updatedProvisioner}
pvcResource={pvcResource}
accessMode={restoreAccessMode}
storageClass={pvcSC}
loaded={pvcResourceLoaded}
availableVolumeMode={volumeSnapshotAnnotations?.[snapshotPVCVolumeModeAnnotation]}
/>
<FormGroup
label={t('console-app~Size')}
isRequired
fieldId="pvc-size"
className="co-restore-pvc-modal__input co-restore-pvc-modal__ocs-size"
>
{!!pvcStorageClassName && scResourceLoaded ? (
<RequestSizeInput
name="requestSize"
onChange={requestedSizeInputChange}
defaultRequestSizeUnit={requestedUnit}
defaultRequestSizeValue={requestedSize}
dropdownUnits={dropdownUnits}
isInputDisabled={scResourceLoadError || isCephProvisioner(scResource?.provisioner)}
required
/>
) : (
<div className="skeleton-text" />
)}

{!validSize && (
<FormHelperText>
Expand Down
Loading