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
7 changes: 7 additions & 0 deletions kueue/src/components/workloads/Detail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
} from '../../resources/workload';
import {
renderPodSetRequests,
renderPodSetUpdates,
renderResourceList,
renderStringMap,
renderText,
Expand Down Expand Up @@ -70,6 +71,7 @@ interface AdmissionCheckRow {
requeueAfterSeconds: number | string;
/** Retry count. */
retryCount: number | string;
podSetUpdates: string;
}

/** Row rendered for status.reclaimablePods. */
Expand Down Expand Up @@ -164,6 +166,7 @@ function getAdmissionCheckRows(admissionChecks: AdmissionCheckState[] = []): Adm
message: renderText(admissionCheck.message),
requeueAfterSeconds: admissionCheck.requeueAfterSeconds ?? '-',
retryCount: admissionCheck.retryCount ?? '-',
podSetUpdates: renderPodSetUpdates(admissionCheck.podSetUpdates),
}));
}

Expand Down Expand Up @@ -340,6 +343,10 @@ function getAdmissionChecksSection(workload: Workload) {
label: 'Retry Count',
getter: (row: AdmissionCheckRow) => row.retryCount,
},
{
label: 'Pod Set Updates',
getter: (row: AdmissionCheckRow) => row.podSetUpdates,
},
]}
/>
</SectionBox>
Expand Down
17 changes: 17 additions & 0 deletions kueue/src/resources/workload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,20 @@ export interface PodSetRequest {
resources?: ResourceList;
}

/**
* Pod set modifications suggested by an AdmissionCheck for a Workload pod set.
*
* @see https://kueue.sigs.k8s.io/docs/reference/kueue.v1beta2/#podsetupdate
*/
export interface PodSetUpdate {
name: string;
labels?: Record<string, string>;
annotations?: Record<string, string>;
nodeSelector?: Record<string, string>;
tolerations?: unknown[];
schedulingGates?: { name: string }[];
}

/**
* Admission check state reported for a Workload.
*
Expand Down Expand Up @@ -456,6 +470,9 @@ export interface AdmissionCheckState {
* @see https://kueue.sigs.k8s.io/docs/reference/kueue.v1beta2/#admissioncheckstate
*/
retryCount?: number;

/** Pod set modifications suggested by this AdmissionCheck. */
podSetUpdates?: PodSetUpdate[];
}

/**
Expand Down
8 changes: 8 additions & 0 deletions kueue/src/resources/workloadFormatters.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
renderOwnerReferences,
renderPodSetRequests,
renderPodSetsSummary,
renderPodSetUpdates,
renderPriority,
renderPriorityClassName,
renderQueueName,
Expand Down Expand Up @@ -45,6 +46,13 @@ describe('Workload formatters', () => {
expect(renderBoolean(undefined)).toBe('-');
});

it('formats admission check pod set updates', () => {
expect(renderPodSetUpdates()).toBe('-');
expect(
renderPodSetUpdates([{ name: 'main', labels: { role: 'worker' } }, { name: 'sidecar' }])
).toBe('main: labels role=worker | sidecar: -');
});

it('formats common Workload list values', () => {
expect(renderQueueName('sample-local-queue')).toBe('sample-local-queue');
expect(renderQueueName()).toBe('-');
Expand Down
24 changes: 24 additions & 0 deletions kueue/src/resources/workloadFormatters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { KubeOwnerReference } from '@kinvolk/headlamp-plugin/lib/k8s/cluste
import type {
Admission,
PodSet,
PodSetUpdate,
ReclaimablePod,
RequeueState,
ResourceList,
Expand Down Expand Up @@ -272,6 +273,29 @@ export function renderRequeueState(requeueState?: RequeueState) {
return values.length > 0 ? values.join('; ') : '-';
}

/** Render the pod set modifications suggested by an AdmissionCheck. */
export function renderPodSetUpdates(podSetUpdates: PodSetUpdate[] = []) {
if (podSetUpdates.length === 0) {
return '-';
}

return podSetUpdates
.map(update => {
const parts = [
renderStringMap(update.labels) !== '-' ? `labels ${renderStringMap(update.labels)}` : '',
renderStringMap(update.annotations) !== '-'
? `annotations ${renderStringMap(update.annotations)}`
: '',
renderStringMap(update.nodeSelector) !== '-'
? `nodeSelector ${renderStringMap(update.nodeSelector)}`
: '',
].filter(Boolean);

return parts.length ? `${update.name}: ${parts.join('; ')}` : `${update.name}: -`;
})
.join(' | ');
}

/** Render owner references without dumping raw objects. */
export function renderOwnerReferences(ownerReferences: KubeOwnerReference[] = []) {
if (ownerReferences.length === 0) {
Expand Down