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 529f0c9 commit 253559b
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 7 deletions.
37 changes: 36 additions & 1 deletion src/Components/ImagesTable/ImageDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ import { extractProvisioningList } from '../../store/helpers';
import {
ComposesResponseItem,
GcpUploadRequestOptions,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';
import {
useGetComposeStatusQuery,
} from '../../store/backendApi';
import { useGetSourceListQuery } from '../../store/provisioningApi';
import {
isAwsUploadRequestOptions,
Expand Down Expand Up @@ -478,3 +480,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>
</>
)
};
33 changes: 29 additions & 4 deletions src/Components/ImagesTable/ImagesTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,17 @@ 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 Down Expand Up @@ -66,9 +71,9 @@ import {
ComposeStatus,
GetBlueprintComposesApiArg,
GetBlueprintsApiArg,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';
import {
useGetComposeStatusQuery,
useGetComposesQuery,
useGetBlueprintComposesQuery,
} from '../../store/backendApi';
Expand Down Expand Up @@ -320,7 +325,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 @@ -462,6 +467,26 @@ const AwsRow = ({ compose, composeStatus, rowIndex }: AwsRowPropTypes) => {
);
};

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

const LocalRow = ({ compose, composeStatus, 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
32 changes: 31 additions & 1 deletion src/Components/ImagesTable/Instance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ import {
ComposesResponseItem,
ComposeStatus,
ImageTypes,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';
import {
useGetComposeStatusQuery,
} from '../../store/backendApi';
import {
isAwsUploadRequestOptions,
isAwss3UploadStatus,
Expand Down Expand Up @@ -407,3 +409,31 @@ 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>
);
};
35 changes: 34 additions & 1 deletion src/Components/ImagesTable/Status.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,12 @@ import {
ComposeStatusError,
ComposesResponseItem,
UploadStatus,
useGetComposeStatusQuery,
} from '../../store/imageBuilderApi';

import {
useGetComposeStatusQuery,
} from '../../store/backendApi';

type StatusClonePropTypes = {
clone: ClonesResponseItem;
status: UploadStatus | undefined;
Expand Down Expand Up @@ -213,6 +216,36 @@ 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;
const imageType = compose.request.image_requests[0].upload_request.type;

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;
41 changes: 41 additions & 0 deletions src/store/cockpitApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,46 @@ 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 (let bpEntry of entries) {
const bpInfo = await fsinfo(path.join(blueprintsDir, bpEntry[0]), ['entries'], {
superuser: 'try',
});
const bpEntries = Object.entries(bpInfo?.entries || {});
for (let 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 @@ -290,4 +330,5 @@ export const {
useComposeBlueprintMutation,
useGetComposesQuery,
useGetBlueprintComposesQuery,
useGetComposeStatusQuery,
} = cockpitApi;

0 comments on commit 253559b

Please sign in to comment.