@skyhook-io/k8s-ui 1.13.3 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/components/applications/AppTooltips.tsx +13 -1
- package/src/components/applications/ApplicationDetail.test.tsx +25 -0
- package/src/components/applications/ApplicationDetail.tsx +39 -7
- package/src/components/applications/ApplicationsView.tsx +18 -3
- package/src/components/applications/ReadyBar.tsx +3 -2
- package/src/components/applications/applications-view.test.tsx +91 -0
- package/src/components/cluster-switcher/ClusterSwitcher.tsx +4 -1
- package/src/components/issues/IssuesView.tsx +40 -31
- package/src/components/issues/ResourceIssuesSection.tsx +3 -2
- package/src/components/issues/index.ts +3 -1
- package/src/components/issues/issue-timing.ts +123 -4
- package/src/components/issues/issues.test.ts +221 -10
- package/src/components/issues/types.ts +31 -5
- package/src/components/namespace-switcher/NamespacePicker.tsx +21 -13
- package/src/components/resources/ResourcesView.tsx +966 -98
- package/src/components/resources/column-settings-key.test.ts +98 -0
- package/src/components/resources/column-visibility-merge.test.ts +64 -0
- package/src/components/resources/curated-column-ownership.test.ts +236 -0
- package/src/components/resources/gateway-policy-status.test.ts +291 -0
- package/src/components/resources/gateway-policy-status.ts +237 -0
- package/src/components/resources/generic-status.test.ts +199 -0
- package/src/components/resources/generic-status.ts +171 -0
- package/src/components/resources/gpu-ecosystem-registry.test.ts +63 -0
- package/src/components/resources/index.ts +9 -1
- package/src/components/resources/istio-gateway-filter.test.ts +97 -0
- package/src/components/resources/kyverno-legacy-action.test.ts +100 -1
- package/src/components/resources/kyverno-modern-posture.test.ts +36 -0
- package/src/components/resources/printer-columns.test.ts +298 -0
- package/src/components/resources/printer-columns.ts +249 -0
- package/src/components/resources/renderers/CNPGBackupRenderer.test.tsx +29 -0
- package/src/components/resources/renderers/CNPGBackupRenderer.tsx +3 -2
- package/src/components/resources/renderers/CNPGClusterRenderer.test.tsx +69 -3
- package/src/components/resources/renderers/CNPGClusterRenderer.tsx +6 -2
- package/src/components/resources/renderers/EventRenderer.test.tsx +50 -1
- package/src/components/resources/renderers/EventRenderer.tsx +3 -5
- package/src/components/resources/renderers/GenericRenderer.tsx +18 -83
- package/src/components/resources/renderers/HPARenderer.test.tsx +28 -0
- package/src/components/resources/renderers/HPARenderer.tsx +6 -1
- package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +12 -7
- package/src/components/resources/renderers/MetricsUnavailableNotice.tsx +2 -1
- package/src/components/resources/renderers/PVCRenderer.test.tsx +44 -0
- package/src/components/resources/renderers/PVCRenderer.tsx +19 -2
- package/src/components/resources/renderers/PolicyCoverageSection.test.tsx +92 -1
- package/src/components/resources/renderers/PolicyCoverageSection.tsx +64 -8
- package/src/components/resources/renderers/RolloutRenderer.test.tsx +35 -0
- package/src/components/resources/renderers/RolloutRenderer.tsx +22 -3
- package/src/components/resources/renderers/VeleroBSLRenderer.test.tsx +47 -0
- package/src/components/resources/renderers/VeleroBSLRenderer.tsx +16 -1
- package/src/components/resources/renderers/VeleroRestoreRenderer.test.tsx +88 -0
- package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +44 -2
- package/src/components/resources/renderers/WorkloadRenderer.test.tsx +83 -0
- package/src/components/resources/renderers/WorkloadRenderer.tsx +25 -65
- package/src/components/resources/renderers/amd-gpu-cells.tsx +36 -0
- package/src/components/resources/renderers/cnpg-cells.tsx +12 -1
- package/src/components/resources/renderers/inference-gateway-cells.tsx +62 -0
- package/src/components/resources/renderers/jobset-lws-cells.tsx +82 -0
- package/src/components/resources/renderers/kai-cells.tsx +67 -0
- package/src/components/resources/renderers/kaito-cells.tsx +62 -0
- package/src/components/resources/renderers/kserve-cells.tsx +145 -0
- package/src/components/resources/renderers/kubeflow-training-cells.tsx +72 -0
- package/src/components/resources/renderers/kueue-cells.tsx +176 -0
- package/src/components/resources/renderers/kyverno-cells.tsx +8 -4
- package/src/components/resources/renderers/nim-cells.tsx +81 -0
- package/src/components/resources/renderers/ray-cells.tsx +124 -0
- package/src/components/resources/renderers/volcano-cells.tsx +140 -0
- package/src/components/resources/resource-utils-amd-gpu.ts +61 -0
- package/src/components/resources/resource-utils-cnpg.golden.test.ts +13 -5
- package/src/components/resources/resource-utils-cnpg.test.ts +142 -2
- package/src/components/resources/resource-utils-cnpg.ts +132 -7
- package/src/components/resources/resource-utils-gpu-ecosystem.test.ts +236 -0
- package/src/components/resources/resource-utils-hpa.test.ts +4 -0
- package/src/components/resources/resource-utils-hpa.ts +6 -2
- package/src/components/resources/resource-utils-inference-gateway.ts +119 -0
- package/src/components/resources/resource-utils-jobset-lws.ts +117 -0
- package/src/components/resources/resource-utils-kai.ts +105 -0
- package/src/components/resources/resource-utils-kaito.ts +114 -0
- package/src/components/resources/resource-utils-kserve.ts +186 -0
- package/src/components/resources/resource-utils-kubeflow-training.ts +121 -0
- package/src/components/resources/resource-utils-kueue.ts +200 -0
- package/src/components/resources/resource-utils-kyverno-modern.ts +3 -1
- package/src/components/resources/resource-utils-kyverno.ts +51 -2
- package/src/components/resources/resource-utils-nim.ts +109 -0
- package/src/components/resources/resource-utils-ray.ts +214 -0
- package/src/components/resources/resource-utils-rollout.test.ts +183 -0
- package/src/components/resources/resource-utils-velero.test.ts +30 -0
- package/src/components/resources/resource-utils-velero.ts +32 -0
- package/src/components/resources/resource-utils-volcano.ts +176 -0
- package/src/components/resources/resource-utils.ts +156 -47
- package/src/components/resources/resources-column-filter.test.ts +27 -1
- package/src/components/resources/workload-rollout-golden.test.ts +55 -0
- package/src/components/shared/CreateResourceDialog.tsx +1 -0
- package/src/components/shared/EditableYamlView.tsx +4 -2
- package/src/components/shared/ResourceActionsBar.tsx +170 -25
- package/src/components/shared/ResourceRendererDispatch.test.tsx +206 -1
- package/src/components/shared/ResourceRendererDispatch.tsx +84 -40
- package/src/components/shared/SetImageDialog.test.ts +129 -0
- package/src/components/shared/SetImageDialog.tsx +577 -0
- package/src/components/shared/index.ts +1 -0
- package/src/components/shared/revision-role-badges.test.ts +56 -4
- package/src/components/timeline/TimelineList.tsx +19 -3
- package/src/components/timeline/TimelineSwimlanes.tsx +11 -3
- package/src/components/trace/ReachabilityView.tsx +1 -1
- package/src/components/ui/SelectMenu.tsx +10 -1
- package/src/components/ui/drawer-components.tsx +12 -0
- package/src/components/workload/WorkloadRolloutNotice.tsx +60 -0
- package/src/components/workload/WorkloadView.tsx +144 -81
- package/src/hooks/useProgressiveRefresh.ts +37 -0
- package/src/source-hygiene.test.ts +28 -0
- package/src/theme/tailwind-theme.css +4 -0
- package/src/types/core.ts +55 -0
- package/src/utils/api-resources.test.ts +40 -1
- package/src/utils/api-resources.ts +11 -1
- package/src/utils/applications.ts +50 -0
- package/src/utils/bulk-workload-actions.test.ts +20 -0
- package/src/utils/bulk-workload-actions.ts +15 -0
- package/src/utils/navigation.test.ts +31 -1
- package/src/utils/navigation.ts +21 -2
- package/src/utils/workload-rollout.ts +292 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// KServe cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import {
|
|
5
|
+
getInferenceServiceStatus,
|
|
6
|
+
getInferenceServiceUrl,
|
|
7
|
+
getInferenceServiceModelFormat,
|
|
8
|
+
getInferenceServiceRuntime,
|
|
9
|
+
getInferenceServiceDeploymentMode,
|
|
10
|
+
getServingRuntimeStatus,
|
|
11
|
+
getServingRuntimeModelFormats,
|
|
12
|
+
getServingRuntimeImage,
|
|
13
|
+
getInferenceGraphStatus,
|
|
14
|
+
getInferenceGraphNodeCount,
|
|
15
|
+
getTrainedModelStatus,
|
|
16
|
+
getTrainedModelFramework,
|
|
17
|
+
getTrainedModelStorageUri,
|
|
18
|
+
getTrainedModelInferenceService,
|
|
19
|
+
getLLMInferenceServiceStatus,
|
|
20
|
+
getLLMInferenceServiceModel,
|
|
21
|
+
getLLMInferenceServiceReplicas,
|
|
22
|
+
} from '../resource-utils-kserve'
|
|
23
|
+
|
|
24
|
+
export function InferenceServiceCell({ resource, column }: { resource: any; column: string }) {
|
|
25
|
+
switch (column) {
|
|
26
|
+
case 'status': {
|
|
27
|
+
const status = getInferenceServiceStatus(resource)
|
|
28
|
+
return (
|
|
29
|
+
<span className={clsx('badge', status.color)}>
|
|
30
|
+
{status.text}
|
|
31
|
+
</span>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
case 'url': {
|
|
35
|
+
const url = getInferenceServiceUrl(resource)
|
|
36
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{url}</span>
|
|
37
|
+
}
|
|
38
|
+
case 'modelFormat': {
|
|
39
|
+
const format = getInferenceServiceModelFormat(resource)
|
|
40
|
+
return <span className="text-sm text-theme-text-secondary">{format}</span>
|
|
41
|
+
}
|
|
42
|
+
case 'runtime': {
|
|
43
|
+
const runtime = getInferenceServiceRuntime(resource)
|
|
44
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{runtime}</span>
|
|
45
|
+
}
|
|
46
|
+
case 'deploymentMode': {
|
|
47
|
+
const mode = getInferenceServiceDeploymentMode(resource)
|
|
48
|
+
return <span className="text-sm text-theme-text-secondary">{mode}</span>
|
|
49
|
+
}
|
|
50
|
+
default:
|
|
51
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function ServingRuntimeCell({ resource, column }: { resource: any; column: string }) {
|
|
56
|
+
switch (column) {
|
|
57
|
+
case 'status': {
|
|
58
|
+
const status = getServingRuntimeStatus(resource)
|
|
59
|
+
return (
|
|
60
|
+
<span className={clsx('badge', status.color)}>
|
|
61
|
+
{status.text}
|
|
62
|
+
</span>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
case 'modelFormats': {
|
|
66
|
+
const formats = getServingRuntimeModelFormats(resource)
|
|
67
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{formats}</span>
|
|
68
|
+
}
|
|
69
|
+
case 'image': {
|
|
70
|
+
const image = getServingRuntimeImage(resource)
|
|
71
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{image}</span>
|
|
72
|
+
}
|
|
73
|
+
default:
|
|
74
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function InferenceGraphCell({ resource, column }: { resource: any; column: string }) {
|
|
79
|
+
switch (column) {
|
|
80
|
+
case 'status': {
|
|
81
|
+
const status = getInferenceGraphStatus(resource)
|
|
82
|
+
return (
|
|
83
|
+
<span className={clsx('badge', status.color)}>
|
|
84
|
+
{status.text}
|
|
85
|
+
</span>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
case 'nodes': {
|
|
89
|
+
const count = getInferenceGraphNodeCount(resource)
|
|
90
|
+
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function TrainedModelCell({ resource, column }: { resource: any; column: string }) {
|
|
98
|
+
switch (column) {
|
|
99
|
+
case 'status': {
|
|
100
|
+
const status = getTrainedModelStatus(resource)
|
|
101
|
+
return (
|
|
102
|
+
<span className={clsx('badge', status.color)}>
|
|
103
|
+
{status.text}
|
|
104
|
+
</span>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
case 'framework': {
|
|
108
|
+
const framework = getTrainedModelFramework(resource)
|
|
109
|
+
return <span className="text-sm text-theme-text-secondary">{framework}</span>
|
|
110
|
+
}
|
|
111
|
+
case 'storageUri': {
|
|
112
|
+
const uri = getTrainedModelStorageUri(resource)
|
|
113
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{uri}</span>
|
|
114
|
+
}
|
|
115
|
+
case 'inferenceService': {
|
|
116
|
+
const parent = getTrainedModelInferenceService(resource)
|
|
117
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{parent}</span>
|
|
118
|
+
}
|
|
119
|
+
default:
|
|
120
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function LLMInferenceServiceCell({ resource, column }: { resource: any; column: string }) {
|
|
125
|
+
switch (column) {
|
|
126
|
+
case 'status': {
|
|
127
|
+
const status = getLLMInferenceServiceStatus(resource)
|
|
128
|
+
return (
|
|
129
|
+
<span className={clsx('badge', status.color)}>
|
|
130
|
+
{status.text}
|
|
131
|
+
</span>
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
case 'model': {
|
|
135
|
+
const model = getLLMInferenceServiceModel(resource)
|
|
136
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{model}</span>
|
|
137
|
+
}
|
|
138
|
+
case 'replicas': {
|
|
139
|
+
const replicas = getLLMInferenceServiceReplicas(resource)
|
|
140
|
+
return <span className="text-sm text-theme-text-secondary">{replicas}</span>
|
|
141
|
+
}
|
|
142
|
+
default:
|
|
143
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Kubeflow training cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import type { StatusBadge } from '../resource-utils'
|
|
5
|
+
import {
|
|
6
|
+
getPyTorchJobStatus,
|
|
7
|
+
getTFJobStatus,
|
|
8
|
+
getMPIJobStatus,
|
|
9
|
+
getTrainingJobReplicas,
|
|
10
|
+
getTrainingJobElapsed,
|
|
11
|
+
getTrainJobStatus,
|
|
12
|
+
getTrainJobRuntime,
|
|
13
|
+
getTrainJobSuspended,
|
|
14
|
+
} from '../resource-utils-kubeflow-training'
|
|
15
|
+
|
|
16
|
+
function TrainingOperatorJobCell({ resource, column, getStatus }: { resource: any; column: string; getStatus: (resource: any) => StatusBadge }) {
|
|
17
|
+
switch (column) {
|
|
18
|
+
case 'status': {
|
|
19
|
+
const status = getStatus(resource)
|
|
20
|
+
return (
|
|
21
|
+
<span className={clsx('badge', status.color)}>
|
|
22
|
+
{status.text}
|
|
23
|
+
</span>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
case 'replicas': {
|
|
27
|
+
const replicas = getTrainingJobReplicas(resource)
|
|
28
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{replicas}</span>
|
|
29
|
+
}
|
|
30
|
+
case 'elapsed': {
|
|
31
|
+
const elapsed = getTrainingJobElapsed(resource)
|
|
32
|
+
return <span className="text-sm text-theme-text-secondary">{elapsed}</span>
|
|
33
|
+
}
|
|
34
|
+
default:
|
|
35
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function PyTorchJobCell({ resource, column }: { resource: any; column: string }) {
|
|
40
|
+
return <TrainingOperatorJobCell resource={resource} column={column} getStatus={getPyTorchJobStatus} />
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function TFJobCell({ resource, column }: { resource: any; column: string }) {
|
|
44
|
+
return <TrainingOperatorJobCell resource={resource} column={column} getStatus={getTFJobStatus} />
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function MPIJobCell({ resource, column }: { resource: any; column: string }) {
|
|
48
|
+
return <TrainingOperatorJobCell resource={resource} column={column} getStatus={getMPIJobStatus} />
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function TrainJobCell({ resource, column }: { resource: any; column: string }) {
|
|
52
|
+
switch (column) {
|
|
53
|
+
case 'status': {
|
|
54
|
+
const status = getTrainJobStatus(resource)
|
|
55
|
+
return (
|
|
56
|
+
<span className={clsx('badge', status.color)}>
|
|
57
|
+
{status.text}
|
|
58
|
+
</span>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
case 'runtime': {
|
|
62
|
+
const runtime = getTrainJobRuntime(resource)
|
|
63
|
+
return <span className="text-sm text-theme-text-secondary">{runtime}</span>
|
|
64
|
+
}
|
|
65
|
+
case 'suspended': {
|
|
66
|
+
const suspended = getTrainJobSuspended(resource)
|
|
67
|
+
return <span className="text-sm text-theme-text-secondary">{suspended ? 'Yes' : '-'}</span>
|
|
68
|
+
}
|
|
69
|
+
default:
|
|
70
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Kueue + Cluster Autoscaler ProvisioningRequest cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import {
|
|
5
|
+
getClusterQueueStatus,
|
|
6
|
+
getClusterQueueCohort,
|
|
7
|
+
getClusterQueuePendingWorkloads,
|
|
8
|
+
getClusterQueueAdmittedWorkloads,
|
|
9
|
+
getClusterQueueFlavors,
|
|
10
|
+
getLocalQueueStatus,
|
|
11
|
+
getLocalQueueClusterQueue,
|
|
12
|
+
getLocalQueuePendingWorkloads,
|
|
13
|
+
getLocalQueueAdmittedWorkloads,
|
|
14
|
+
getKueueWorkloadStatus,
|
|
15
|
+
getKueueWorkloadQueueName,
|
|
16
|
+
getKueueWorkloadAdmittedBy,
|
|
17
|
+
getKueueWorkloadPriority,
|
|
18
|
+
getResourceFlavorStatus,
|
|
19
|
+
getResourceFlavorNodeLabelCount,
|
|
20
|
+
getResourceFlavorTaintCount,
|
|
21
|
+
getAdmissionCheckStatus,
|
|
22
|
+
getAdmissionCheckControllerName,
|
|
23
|
+
getProvisioningRequestStatus,
|
|
24
|
+
getProvisioningRequestClassName,
|
|
25
|
+
getProvisioningRequestPodSetCount,
|
|
26
|
+
} from '../resource-utils-kueue'
|
|
27
|
+
|
|
28
|
+
export function ClusterQueueCell({ resource, column }: { resource: any; column: string }) {
|
|
29
|
+
switch (column) {
|
|
30
|
+
case 'status': {
|
|
31
|
+
const status = getClusterQueueStatus(resource)
|
|
32
|
+
return (
|
|
33
|
+
<span className={clsx('badge', status.color)}>
|
|
34
|
+
{status.text}
|
|
35
|
+
</span>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
case 'cohort': {
|
|
39
|
+
const cohort = getClusterQueueCohort(resource)
|
|
40
|
+
return <span className="text-sm text-theme-text-secondary">{cohort}</span>
|
|
41
|
+
}
|
|
42
|
+
case 'pendingWorkloads': {
|
|
43
|
+
const pending = getClusterQueuePendingWorkloads(resource)
|
|
44
|
+
return <span className="text-sm text-theme-text-secondary">{pending}</span>
|
|
45
|
+
}
|
|
46
|
+
case 'admittedWorkloads': {
|
|
47
|
+
const admitted = getClusterQueueAdmittedWorkloads(resource)
|
|
48
|
+
return <span className="text-sm text-theme-text-secondary">{admitted}</span>
|
|
49
|
+
}
|
|
50
|
+
case 'flavors': {
|
|
51
|
+
const flavors = getClusterQueueFlavors(resource)
|
|
52
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{flavors}</span>
|
|
53
|
+
}
|
|
54
|
+
default:
|
|
55
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function LocalQueueCell({ resource, column }: { resource: any; column: string }) {
|
|
60
|
+
switch (column) {
|
|
61
|
+
case 'status': {
|
|
62
|
+
const status = getLocalQueueStatus(resource)
|
|
63
|
+
return (
|
|
64
|
+
<span className={clsx('badge', status.color)}>
|
|
65
|
+
{status.text}
|
|
66
|
+
</span>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
case 'clusterQueue': {
|
|
70
|
+
const clusterQueue = getLocalQueueClusterQueue(resource)
|
|
71
|
+
return <span className="text-sm text-theme-text-secondary">{clusterQueue}</span>
|
|
72
|
+
}
|
|
73
|
+
case 'pendingWorkloads': {
|
|
74
|
+
const pending = getLocalQueuePendingWorkloads(resource)
|
|
75
|
+
return <span className="text-sm text-theme-text-secondary">{pending}</span>
|
|
76
|
+
}
|
|
77
|
+
case 'admittedWorkloads': {
|
|
78
|
+
const admitted = getLocalQueueAdmittedWorkloads(resource)
|
|
79
|
+
return <span className="text-sm text-theme-text-secondary">{admitted}</span>
|
|
80
|
+
}
|
|
81
|
+
default:
|
|
82
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function KueueWorkloadCell({ resource, column }: { resource: any; column: string }) {
|
|
87
|
+
switch (column) {
|
|
88
|
+
case 'status': {
|
|
89
|
+
const status = getKueueWorkloadStatus(resource)
|
|
90
|
+
return (
|
|
91
|
+
<span className={clsx('badge', status.color)}>
|
|
92
|
+
{status.text}
|
|
93
|
+
</span>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
case 'queueName': {
|
|
97
|
+
const queueName = getKueueWorkloadQueueName(resource)
|
|
98
|
+
return <span className="text-sm text-theme-text-secondary">{queueName}</span>
|
|
99
|
+
}
|
|
100
|
+
case 'admittedBy': {
|
|
101
|
+
const admittedBy = getKueueWorkloadAdmittedBy(resource)
|
|
102
|
+
return <span className="text-sm text-theme-text-secondary">{admittedBy}</span>
|
|
103
|
+
}
|
|
104
|
+
case 'priority': {
|
|
105
|
+
const priority = getKueueWorkloadPriority(resource)
|
|
106
|
+
return <span className="text-sm text-theme-text-secondary">{priority}</span>
|
|
107
|
+
}
|
|
108
|
+
default:
|
|
109
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function ResourceFlavorCell({ resource, column }: { resource: any; column: string }) {
|
|
114
|
+
switch (column) {
|
|
115
|
+
case 'status': {
|
|
116
|
+
const status = getResourceFlavorStatus(resource)
|
|
117
|
+
return (
|
|
118
|
+
<span className={clsx('badge', status.color)}>
|
|
119
|
+
{status.text}
|
|
120
|
+
</span>
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
case 'nodeLabels': {
|
|
124
|
+
const count = getResourceFlavorNodeLabelCount(resource)
|
|
125
|
+
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>
|
|
126
|
+
}
|
|
127
|
+
case 'taints': {
|
|
128
|
+
const count = getResourceFlavorTaintCount(resource)
|
|
129
|
+
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>
|
|
130
|
+
}
|
|
131
|
+
default:
|
|
132
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function AdmissionCheckCell({ resource, column }: { resource: any; column: string }) {
|
|
137
|
+
switch (column) {
|
|
138
|
+
case 'status': {
|
|
139
|
+
const status = getAdmissionCheckStatus(resource)
|
|
140
|
+
return (
|
|
141
|
+
<span className={clsx('badge', status.color)}>
|
|
142
|
+
{status.text}
|
|
143
|
+
</span>
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
case 'controllerName': {
|
|
147
|
+
const controllerName = getAdmissionCheckControllerName(resource)
|
|
148
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{controllerName}</span>
|
|
149
|
+
}
|
|
150
|
+
default:
|
|
151
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function ProvisioningRequestCell({ resource, column }: { resource: any; column: string }) {
|
|
156
|
+
switch (column) {
|
|
157
|
+
case 'status': {
|
|
158
|
+
const status = getProvisioningRequestStatus(resource)
|
|
159
|
+
return (
|
|
160
|
+
<span className={clsx('badge', status.color)}>
|
|
161
|
+
{status.text}
|
|
162
|
+
</span>
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
case 'provisioningClassName': {
|
|
166
|
+
const className = getProvisioningRequestClassName(resource)
|
|
167
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{className}</span>
|
|
168
|
+
}
|
|
169
|
+
case 'podSets': {
|
|
170
|
+
const count = getProvisioningRequestPodSetCount(resource)
|
|
171
|
+
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>
|
|
172
|
+
}
|
|
173
|
+
default:
|
|
174
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getPolicyReportStatus,
|
|
7
7
|
getPolicyReportSummary,
|
|
8
8
|
getKyvernoPolicyStatus,
|
|
9
|
-
|
|
9
|
+
getKyvernoEnforcement,
|
|
10
10
|
getKyvernoPolicyRuleCount,
|
|
11
11
|
} from '../resource-utils-kyverno'
|
|
12
12
|
import {
|
|
@@ -79,13 +79,17 @@ export function KyvernoPolicyCell({ resource, column }: { resource: any; column:
|
|
|
79
79
|
)
|
|
80
80
|
}
|
|
81
81
|
case 'action': {
|
|
82
|
-
const
|
|
82
|
+
const { label, blocks, discrepancy } = getKyvernoEnforcement(resource)
|
|
83
83
|
return (
|
|
84
84
|
<span className={clsx(
|
|
85
85
|
'badge',
|
|
86
|
-
|
|
86
|
+
blocks
|
|
87
|
+
? 'bg-red-500/20 text-red-400'
|
|
88
|
+
: discrepancy
|
|
89
|
+
? 'bg-orange-500/20 text-orange-400'
|
|
90
|
+
: 'bg-yellow-500/20 text-yellow-400',
|
|
87
91
|
)}>
|
|
88
|
-
{
|
|
92
|
+
{label}
|
|
89
93
|
</span>
|
|
90
94
|
)
|
|
91
95
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// NVIDIA NIM Operator cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import {
|
|
5
|
+
getNIMServiceStatus,
|
|
6
|
+
getNIMServiceModel,
|
|
7
|
+
getNIMServiceReplicas,
|
|
8
|
+
getNIMCacheStatus,
|
|
9
|
+
getNIMCacheSourceType,
|
|
10
|
+
getNIMCacheModelSource,
|
|
11
|
+
getNIMCacheStorageSize,
|
|
12
|
+
getNIMPipelineStatus,
|
|
13
|
+
getNIMPipelineServiceCount,
|
|
14
|
+
} from '../resource-utils-nim'
|
|
15
|
+
|
|
16
|
+
export function NIMServiceCell({ resource, column }: { resource: any; column: string }) {
|
|
17
|
+
switch (column) {
|
|
18
|
+
case 'status': {
|
|
19
|
+
const status = getNIMServiceStatus(resource)
|
|
20
|
+
return (
|
|
21
|
+
<span className={clsx('badge', status.color)}>
|
|
22
|
+
{status.text}
|
|
23
|
+
</span>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
case 'model': {
|
|
27
|
+
const model = getNIMServiceModel(resource)
|
|
28
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{model}</span>
|
|
29
|
+
}
|
|
30
|
+
case 'replicas': {
|
|
31
|
+
const replicas = getNIMServiceReplicas(resource)
|
|
32
|
+
return <span className="text-sm text-theme-text-secondary">{replicas}</span>
|
|
33
|
+
}
|
|
34
|
+
default:
|
|
35
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function NIMCacheCell({ resource, column }: { resource: any; column: string }) {
|
|
40
|
+
switch (column) {
|
|
41
|
+
case 'status': {
|
|
42
|
+
const status = getNIMCacheStatus(resource)
|
|
43
|
+
return (
|
|
44
|
+
<span className={clsx('badge', status.color)}>
|
|
45
|
+
{status.text}
|
|
46
|
+
</span>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
case 'source': {
|
|
50
|
+
const type = getNIMCacheSourceType(resource)
|
|
51
|
+
const model = getNIMCacheModelSource(resource)
|
|
52
|
+
const text = type !== '-' && model !== '-' ? `${type}: ${model}` : model
|
|
53
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{text}</span>
|
|
54
|
+
}
|
|
55
|
+
case 'storage': {
|
|
56
|
+
const size = getNIMCacheStorageSize(resource)
|
|
57
|
+
return <span className="text-sm text-theme-text-secondary">{size}</span>
|
|
58
|
+
}
|
|
59
|
+
default:
|
|
60
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function NIMPipelineCell({ resource, column }: { resource: any; column: string }) {
|
|
65
|
+
switch (column) {
|
|
66
|
+
case 'status': {
|
|
67
|
+
const status = getNIMPipelineStatus(resource)
|
|
68
|
+
return (
|
|
69
|
+
<span className={clsx('badge', status.color)}>
|
|
70
|
+
{status.text}
|
|
71
|
+
</span>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
case 'services': {
|
|
75
|
+
const count = getNIMPipelineServiceCount(resource)
|
|
76
|
+
return <span className="text-sm text-theme-text-secondary">{count}</span>
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// KubeRay cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import {
|
|
5
|
+
getRayClusterStatus,
|
|
6
|
+
getRayClusterVersion,
|
|
7
|
+
getRayClusterWorkers,
|
|
8
|
+
getRayClusterHeadService,
|
|
9
|
+
getRayJobStatus,
|
|
10
|
+
getRayJobJobStatus,
|
|
11
|
+
getRayJobDeploymentStatus,
|
|
12
|
+
getRayJobClusterName,
|
|
13
|
+
getRayServiceStatus,
|
|
14
|
+
getRayServiceServiceStatus,
|
|
15
|
+
getRayServiceClusters,
|
|
16
|
+
getRayCronJobStatus,
|
|
17
|
+
getRayCronJobSchedule,
|
|
18
|
+
getRayCronJobSuspend,
|
|
19
|
+
getRayCronJobLastSchedule,
|
|
20
|
+
} from '../resource-utils-ray'
|
|
21
|
+
|
|
22
|
+
export function RayClusterCell({ resource, column }: { resource: any; column: string }) {
|
|
23
|
+
switch (column) {
|
|
24
|
+
case 'status': {
|
|
25
|
+
const status = getRayClusterStatus(resource)
|
|
26
|
+
return (
|
|
27
|
+
<span className={clsx('badge', status.color)}>
|
|
28
|
+
{status.text}
|
|
29
|
+
</span>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
case 'rayVersion': {
|
|
33
|
+
const version = getRayClusterVersion(resource)
|
|
34
|
+
return <span className="text-sm text-theme-text-secondary">{version}</span>
|
|
35
|
+
}
|
|
36
|
+
case 'workers': {
|
|
37
|
+
const workers = getRayClusterWorkers(resource)
|
|
38
|
+
return <span className="text-sm text-theme-text-secondary">{workers}</span>
|
|
39
|
+
}
|
|
40
|
+
case 'headService': {
|
|
41
|
+
const svc = getRayClusterHeadService(resource)
|
|
42
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{svc}</span>
|
|
43
|
+
}
|
|
44
|
+
default:
|
|
45
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function RayJobCell({ resource, column }: { resource: any; column: string }) {
|
|
50
|
+
switch (column) {
|
|
51
|
+
case 'status': {
|
|
52
|
+
const status = getRayJobStatus(resource)
|
|
53
|
+
return (
|
|
54
|
+
<span className={clsx('badge', status.color)}>
|
|
55
|
+
{status.text}
|
|
56
|
+
</span>
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
case 'jobStatus': {
|
|
60
|
+
const jobStatus = getRayJobJobStatus(resource)
|
|
61
|
+
return <span className="text-sm text-theme-text-secondary">{jobStatus}</span>
|
|
62
|
+
}
|
|
63
|
+
case 'deploymentStatus': {
|
|
64
|
+
const deploymentStatus = getRayJobDeploymentStatus(resource)
|
|
65
|
+
return <span className="text-sm text-theme-text-secondary">{deploymentStatus}</span>
|
|
66
|
+
}
|
|
67
|
+
case 'cluster': {
|
|
68
|
+
const cluster = getRayJobClusterName(resource)
|
|
69
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{cluster}</span>
|
|
70
|
+
}
|
|
71
|
+
default:
|
|
72
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function RayServiceCell({ resource, column }: { resource: any; column: string }) {
|
|
77
|
+
switch (column) {
|
|
78
|
+
case 'status': {
|
|
79
|
+
const status = getRayServiceStatus(resource)
|
|
80
|
+
return (
|
|
81
|
+
<span className={clsx('badge', status.color)}>
|
|
82
|
+
{status.text}
|
|
83
|
+
</span>
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
case 'serviceStatus': {
|
|
87
|
+
const serviceStatus = getRayServiceServiceStatus(resource)
|
|
88
|
+
return <span className="text-sm text-theme-text-secondary">{serviceStatus}</span>
|
|
89
|
+
}
|
|
90
|
+
case 'clusters': {
|
|
91
|
+
const clusters = getRayServiceClusters(resource)
|
|
92
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{clusters}</span>
|
|
93
|
+
}
|
|
94
|
+
default:
|
|
95
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function RayCronJobCell({ resource, column }: { resource: any; column: string }) {
|
|
100
|
+
switch (column) {
|
|
101
|
+
case 'status': {
|
|
102
|
+
const status = getRayCronJobStatus(resource)
|
|
103
|
+
return (
|
|
104
|
+
<span className={clsx('badge', status.color)}>
|
|
105
|
+
{status.text}
|
|
106
|
+
</span>
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
case 'schedule': {
|
|
110
|
+
const schedule = getRayCronJobSchedule(resource)
|
|
111
|
+
return <span className="text-sm font-mono text-theme-text-secondary">{schedule}</span>
|
|
112
|
+
}
|
|
113
|
+
case 'suspend': {
|
|
114
|
+
const suspended = getRayCronJobSuspend(resource)
|
|
115
|
+
return <span className="text-sm text-theme-text-secondary">{suspended ? 'Yes' : 'No'}</span>
|
|
116
|
+
}
|
|
117
|
+
case 'lastSchedule': {
|
|
118
|
+
const lastSchedule = getRayCronJobLastSchedule(resource)
|
|
119
|
+
return <span className="text-sm text-theme-text-secondary">{lastSchedule}</span>
|
|
120
|
+
}
|
|
121
|
+
default:
|
|
122
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
123
|
+
}
|
|
124
|
+
}
|