import React from 'react'; import './ImageBuildStatus.scss'; import { Alert, Button, CodeBlock, CodeBlockCode, Flex, Panel, PanelMain, Popover, Skeleton, Text, } from '@patternfly/react-core'; import { CheckCircleIcon, CopyIcon, ExclamationCircleIcon, ExclamationTriangleIcon, InProgressIcon, OffIcon, PendingIcon, } from '@patternfly/react-icons'; import { AWS_S3_EXPIRATION_TIME_IN_HOURS, OCI_STORAGE_EXPIRATION_TIME_IN_DAYS, } from '../../constants'; import { ClonesResponseItem, ComposeStatus, ComposeStatusError, ComposesResponseItem, UploadStatus, useGetComposeStatusQuery, } from '../../store/imageBuilderApi'; type StatusClonePropTypes = { clone: ClonesResponseItem; status: UploadStatus | undefined; }; export const StatusClone = ({ clone, status }: StatusClonePropTypes) => { switch (status?.status) { case 'failure': return ( ); case 'success': case 'running': case 'pending': return ( ); default: return <>; } }; type ComposeStatusPropTypes = { compose: ComposesResponseItem; }; export const AwsDetailsStatus = ({ compose }: ComposeStatusPropTypes) => { const { data, isSuccess } = useGetComposeStatusQuery({ composeId: compose.id, }); if (!isSuccess) { return <>; } switch (data.image_status.status) { case 'failure': return ( ); default: return ( ); } }; type CloudStatusPropTypes = { compose: ComposesResponseItem; }; export const CloudStatus = ({ compose }: CloudStatusPropTypes) => { const { data, isSuccess } = useGetComposeStatusQuery({ composeId: compose.id, }); if (!isSuccess) { return ; } switch (data.image_status.status) { case 'failure': return ( ); default: return ( ); } }; type AzureStatusPropTypes = { status: ComposeStatus; }; export const AzureStatus = ({ status }: AzureStatusPropTypes) => { switch (status.image_status.status) { case 'failure': return ( ); default: return ( ); } }; type ExpiringStatusPropTypes = { compose: ComposesResponseItem; isExpired: boolean; timeToExpiration: number; }; export const ExpiringStatus = ({ compose, isExpired, timeToExpiration, }: ExpiringStatusPropTypes) => { const { data: composeStatus, isSuccess } = useGetComposeStatusQuery({ composeId: compose.id, }); if (!isSuccess) { return ; } const status = composeStatus.image_status.status; const remainingHours = AWS_S3_EXPIRATION_TIME_IN_HOURS - timeToExpiration; const remainingDays = OCI_STORAGE_EXPIRATION_TIME_IN_DAYS - timeToExpiration; const imageType = compose.request.image_requests[0].upload_request.type; if (isExpired) { return ( ); } else if (imageType === 'aws.s3' && status === 'success') { return ( 1 ? 'hours' : 'hour' }`} /> ); } else if (imageType === 'oci.objectstorage' && status === 'success') { return ( 1 ? 'days' : 'day' }`} /> ); } else if (status === 'failure') { return ( ); } else { return ; } }; const statuses = { failure: { icon: , text: 'Image build failed', }, pending: { icon: , text: 'Image build is pending', }, building: { icon: , text: 'Image build in progress', }, uploading: { icon: , text: 'Image upload in progress', }, registering: { icon: , text: 'Cloud registration in progress', }, running: { icon: , text: 'Running', }, success: { icon: , text: 'Ready', }, expired: { icon: , text: 'Expired', }, expiring: { icon: , }, failureSharing: { icon: , text: 'Sharing image failed', }, failedClone: { icon: , text: 'Failure sharing', }, }; type StatusPropTypes = { icon: JSX.Element; text: string; }; const Status = ({ icon, text }: StatusPropTypes) => { return (
{icon}

{text}

); }; type ErrorStatusPropTypes = { icon: JSX.Element; text: string; error: ComposeStatusError | string; }; const ErrorStatus = ({ icon, text, error }: ErrorStatusPropTypes) => { let reason = ''; const detailsArray: string[] = []; if (typeof error === 'string') { reason = error; } else { if (error.reason) { reason = error.reason; } if (Array.isArray(error.details)) { for (const line in error.details) { detailsArray.push(`${error.details[line]}`); } } if (typeof error.details === 'string') { detailsArray.push(error.details); } if (error.details?.reason) { detailsArray.push(`${error.details.reason}`); } } return (
{icon}
{reason} {detailsArray.join('\n')} } >
); };