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')}
>
}
>
);
};