Skip to content

Commit

Permalink
basic compose status support
Browse files Browse the repository at this point in the history
  • Loading branch information
croissanne committed Jan 23, 2025
1 parent 653795f commit d2479f6
Show file tree
Hide file tree
Showing 6 changed files with 175 additions and 7 deletions.
35 changes: 34 additions & 1 deletion src/Components/ImagesTable/ImageDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ import { ExternalLinkAltIcon } from '@patternfly/react-icons';

import ClonesTable from './ClonesTable';

import { useGetComposeStatusQuery } from '../../store/backendApi';
import { extractProvisioningList } from '../../store/helpers';
import {
ComposesResponseItem,
GcpUploadRequestOptions,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';
import { useGetSourceListQuery } from '../../store/provisioningApi';
import {
Expand Down Expand Up @@ -478,3 +478,36 @@ export const AwsS3Details = ({ compose }: AwsS3DetailsPropTypes) => {
</>
);
};

type LocalDetailsPropTypes = {
compose: ComposesResponseItem;
};

export const LocalDetails = ({ compose }: LocalDetailsPropTypes) => {
return (
<>
<div className="pf-v5-u-font-weight-bold pf-v5-u-pb-md">
Build Information
</div>
<DescriptionList isHorizontal isCompact className=" pf-v5-u-pl-xl">
<DescriptionListGroup>
<DescriptionListTerm>UUID</DescriptionListTerm>
<DescriptionListDescription>
<ClipboardCopy
hoverTip="Copy"
clickTip="Copied"
variant="inline-compact"
ouiaId="other-targets-uuid"
>
{compose.id}
</ClipboardCopy>
</DescriptionListDescription>
<DescriptionListTerm>Architecture</DescriptionListTerm>
<DescriptionListDescription>
{compose.request.image_requests[0].architecture}
</DescriptionListDescription>
</DescriptionListGroup>
</DescriptionList>
</>
);
};
38 changes: 34 additions & 4 deletions src/Components/ImagesTable/ImagesTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,18 @@ import {
AwsS3Details,
AzureDetails,
GcpDetails,
LocalDetails,
OciDetails,
} from './ImageDetails';
import ImagesTableToolbar from './ImagesTableToolbar';
import { AwsS3Instance, CloudInstance, OciInstance } from './Instance';
import {
AwsS3Instance,
CloudInstance,
OciInstance,
LocalInstance,
} from './Instance';
import Release from './Release';
import { ExpiringStatus, CloudStatus } from './Status';
import { ExpiringStatus, CloudStatus, LocalStatus } from './Status';
import { AwsTarget, Target } from './Target';

import {
Expand All @@ -54,6 +60,11 @@ import {
useGetComposesQuery,
useGetBlueprintComposesQuery,
} from '../../store/backendApi';
import {
useGetComposeStatusQuery,
useGetComposesQuery,
useGetBlueprintComposesQuery,
} from '../../store/backendApi';
import {
selectBlueprintSearchInput,
selectBlueprintVersionFilter,
Expand All @@ -70,7 +81,6 @@ import {
ComposeStatus,
GetBlueprintComposesApiArg,
GetBlueprintsApiArg,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';
import { resolveRelPath } from '../../Utilities/path';
import {
Expand Down Expand Up @@ -321,7 +331,7 @@ const ImagesTableRow = ({ compose, rowIndex }: ImagesTableRowPropTypes) => {
case 'aws.s3':
return <AwsS3Row compose={compose} rowIndex={rowIndex} />;
case 'local':
return <Row compose={compose} rowIndex={rowIndex} />;
return <LocalRow compose={compose} rowIndex={rowIndex} />;
}
};

Expand Down Expand Up @@ -463,6 +473,26 @@ const AwsRow = ({ compose, composeStatus, rowIndex }: AwsRowPropTypes) => {
);
};

type LocalRowPropTypes = {
compose: ComposesResponseItem;
rowIndex: number;
};

const LocalRow = ({ compose, rowIndex }: LocalRowPropTypes) => {
const details = <LocalDetails compose={compose} />;
const instance = <LocalInstance compose={compose} />;
const status = <LocalStatus compose={compose} />;
return (
<Row
compose={compose}
rowIndex={rowIndex}
details={details}
instance={instance}
status={status}
/>
);
};

type RowPropTypes = {
compose: ComposesResponseItem;
rowIndex: number;
Expand Down
24 changes: 23 additions & 1 deletion src/Components/ImagesTable/Instance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
SEARCH_INPUT,
} from '../../constants';
import { useGetBlueprintsQuery } from '../../store/backendApi';
import { useGetComposeStatusQuery } from '../../store/backendApi';
import {
selectSelectedBlueprintId,
selectBlueprintSearchInput,
Expand All @@ -37,7 +38,6 @@ import {
ComposesResponseItem,
ComposeStatus,
ImageTypes,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';
import {
isAwsUploadRequestOptions,
Expand Down Expand Up @@ -407,3 +407,25 @@ export const AwsS3Instance = ({
);
}
};

type LocalInstancePropTypes = {
compose: ComposesResponseItem;
};

export const LocalInstance = ({ compose }: LocalInstancePropTypes) => {
const { data: composeStatus, isSuccess } = useGetComposeStatusQuery({
composeId: compose.id,
});
if (!isSuccess) {
return <Skeleton />;
}

const status = composeStatus?.image_status.status;
const options = composeStatus?.image_status.upload_status?.options;

if (status !== 'success') {
return <div>error ;_;</div>;
}

return <div>Filepath to disk: {options.filename}</div>;
};
28 changes: 27 additions & 1 deletion src/Components/ImagesTable/Status.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ import {
AWS_S3_EXPIRATION_TIME_IN_HOURS,
OCI_STORAGE_EXPIRATION_TIME_IN_DAYS,
} from '../../constants';
import { useGetComposeStatusQuery } from '../../store/backendApi';
import {
ClonesResponseItem,
ComposeStatus,
ComposeStatusError,
ComposesResponseItem,
UploadStatus,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';

type StatusClonePropTypes = {
Expand Down Expand Up @@ -213,6 +213,32 @@ export const ExpiringStatus = ({
}
};

type LocalStatusPropTypes = {
compose: ComposesResponseItem;
};

export const LocalStatus = ({ compose }: LocalStatusPropTypes) => {
const { data: composeStatus, isSuccess } = useGetComposeStatusQuery({
composeId: compose.id,
});

if (!isSuccess) {
return <Skeleton />;
}

const status = composeStatus?.image_status.status;
if (status === 'failure') {
return (
<ErrorStatus
icon={statuses[status].icon}
text={statuses[status].text}
error={composeStatus?.image_status.error || ''}
/>
);
}
return <Status icon={statuses[status].icon} text={statuses[status].text} />;
};

const statuses = {
failure: {
icon: <ExclamationCircleIcon className="error" />,
Expand Down
6 changes: 6 additions & 0 deletions src/store/backendApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
useComposeBlueprintMutation as useCockpitComposeBlueprintMutation,
useGetComposesQuery as useCockpitGetComposesQuery,
useGetBlueprintComposesQuery as useCockpitGetBlueprintComposesQuery,
useGetComposeStatusQuery as useCockpitGetComposeStatusQuery,
} from './cockpitApi';
import { cockpitApi } from './enhancedCockpitApi';
import { imageBuilderApi } from './enhancedImageBuilderApi';
Expand All @@ -13,6 +14,7 @@ import {
useComposeBlueprintMutation as useImageBuilderComposeBlueprintMutation,
useGetComposesQuery as useImageBuilderGetComposesQuery,
useGetBlueprintComposesQuery as useImageBuilderGetBlueprintComposesQuery,
useGetComposeStatusQuery as useImageBuilderGetComposeStatusQuery,
} from './imageBuilderApi';

export const useGetBlueprintsQuery = process.env.IS_ON_PREMISE
Expand All @@ -35,6 +37,10 @@ export const useGetBlueprintComposesQuery = process.env.IS_ON_PREMISE
? useCockpitGetBlueprintComposesQuery
: useImageBuilderGetBlueprintComposesQuery;

export const useGetComposeStatusQuery = process.env.IS_ON_PREMISE
? useCockpitGetComposeStatusQuery
: useImageBuilderGetComposeStatusQuery;

export const backendApi = process.env.IS_ON_PREMISE
? cockpitApi
: imageBuilderApi;
51 changes: 51 additions & 0 deletions src/store/cockpitApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,56 @@ export const cockpitApi = emptyCockpitApi.injectEndpoints({
};
},
}),
getComposeStatus: builder.query<
GetComposeStatusApiResponse,
GetComposeStatusApiArg
>({
queryFn: async (queryArg) => {
const cloudapi = cockpit.http('/run/cloudapi/api.socket', {
superuser: 'require',
});
const resp = JSON.parse(
await cloudapi.get(
`/api/image-builder-composer/v2/composes/${queryArg.composeId}`
)
);
const blueprintsDir = await getBlueprintsPath();
const info = await fsinfo(blueprintsDir, ['entries'], {
superuser: 'try',
});
let request: ComposeRequest = {};
const entries = Object.entries(info?.entries || {});
for (const bpEntry of entries) {
const bpInfo = await fsinfo(
path.join(blueprintsDir, bpEntry[0]),
['entries'],
{
superuser: 'try',
}
);
const bpEntries = Object.entries(bpInfo?.entries || {});
for (const entry of bpEntries) {
if (entry[0] !== queryArg.composeId) {
continue;
}
request = await cockpit
.file(path.join(blueprintsDir, bpEntry[0], queryArg.composeId))
.read();
break;
}
if (request !== {}) {
break;
}
}

return {
data: {
image_status: resp.image_status,
request: request,
},
};
},
}),
};
},
});
Expand All @@ -313,4 +363,5 @@ export const {
useComposeBlueprintMutation,
useGetComposesQuery,
useGetBlueprintComposesQuery,
useGetComposeStatusQuery,
} = cockpitApi;

0 comments on commit d2479f6

Please sign in to comment.