Skip to content

Commit 0b4d90b

Browse files
authored
Remove six columns that cannot say anything, and fix two that can (#1658)
Seven curated table columns audited against the upstream CRD schemas rather than against Radar's own accessors. Six could not report anything about the object and are removed; two more turned out to be wrong rather than empty, and are fixed. ## Removed Each of these rendered the same value on every row of every cluster, or repeated the cell beside it. - **NodeClaim — Namespace.** `nodeclaims` is `scope=Cluster`, so the cell was a literal `-` everywhere while spending `w-36` the Name column could use. - **Calico NetworkPolicy / StagedNetworkPolicy — Namespace Selector.** `namespaceSelector` is declared on `GlobalNetworkPolicySpec`, not on the namespaced `NetworkPolicySpec`. The two Global kinds keep their column. The namespaced kinds already carry every selector field their schema does define — `selector`, `serviceAccountSelector`, `tier`, `order`. - **ResourceFlavor — Status.** The kind has no status field in v1beta1 or v1beta2; the accessor returned the constant `Configured`, so the badge reported the kind, not the object. - **JobTemplate — Status.** Same shape: the accessor returned the constant `Template`. - **RayCronJob — Suspend.** `getRayCronJobStatus` reads `spec.suspend` and nothing else, so the Status badge beside it already carried the bit. - **ExternalSecret — Provider.** Rendered the store's *name*, which the adjacent Store column already shows. The provider lives on the referenced SecretStore, which this row cannot reach. Dead cell cases, unused imports and the two filter branches reading removed columns go with them. The accessors all stay: `package.json` maps `./components/resources/*` onto every file in that directory, so each is reachable through a supported import path whether or not the barrel names it, and dropping one would be an API break rather than a cleanup. ## Fixed **SecretStore / ClusterSecretStore — Provider** named the wrong product. The column matched on the `aws` key and stopped, labelling Parameter Store and Certificate Manager stores as "AWS Secrets Manager". `spec.provider.aws.service` is a required enum with three values and is the only field that distinguishes them. An AWS store declaring no service now falls back to the vendor alone rather than naming a product that cannot be confirmed. The same map keyed Bitwarden on `bitwarden` — a field name in neither v1 nor v1beta1 — so those stores fell through to the raw-key fallback and rendered `bitwardensecretsmanager`. Nineteen providers added upstream since the map was written now have labels; `device42` and `alibaba` are kept for clusters still serving v1beta1, the only version that carries them. **RayCronJob gains Time Zone**, the column KubeRay itself prints by default. A cron expression is ambiguous without it. An unset zone is not UTC: KubeRay reads the schedule in the operator pod's own local zone, which the object cannot report — so the cell says that rather than implying a default. ## Testing `make tsc` clean. `npx vitest run packages/k8s-ui/src/components/resources/` — 1665 pass; the single failure is `resource-utils-hpa.test.ts` resolving its fixture path relative to `process.cwd()`, which is pre-existing and unrelated. 11 new tests pin the two fixes to their upstream contracts: the three AWS service labels and their vendor-only fallback, Bitwarden's real field name, v1beta1-only provider retention, the raw-key fallback for unrecognised providers, and the undeclared-time-zone rendering. No visual test — column set changes with no new layout or styling. ## Follow-ups - **ExternalSecret Provider, resolved properly.** The column's promise — which backend does this pull from? — is worth keeping. `getExternalSecretStore` returns `{name, kind}` and `getSecretStoreProviderType` turns a store into a label, so a host-injected store lookup (the `certExpiry` / `auditBadges` pattern, one list call per page) would answer it. The `PROVIDER_MAP` fix here was its prerequisite. - **Volcano JobTemplate** does have a status subresource — `JobTemplateStatus.jobDependsOnList`. It is not a phase, so it could not have backed the removed badge, but a "Depends On" column may be worth its own look. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > UI-only column and display-label changes in the k8s resources browser with no auth, API, or cluster mutation impact. > > **Overview** > **Trims the k8s Resources table** by dropping six columns that could not reflect real object data (NodeClaim namespace, Calico namespaced namespace selector, Kueue ResourceFlavor status, Volcano JobTemplate status, RayCronJob suspend duplicate, ExternalSecret provider duplicate of Store). Matching cell renderers and `getCellFilterValue` status branches for removed columns are removed; underlying utils stay exported. > > **Fixes SecretStore provider labeling** in `resource-utils-eso.ts`: AWS stores now use `spec.provider.aws.service` (Secrets Manager vs Parameter Store vs Certificate Manager), expands `PROVIDER_MAP` for newer ESO providers, and adds unit tests. > > **Adds RayCronJob Time Zone** column with `getRayCronJobTimeZone` (declared IANA zone or **Operator local** when unset), cell styling for undeclared zones, filter parity via `getCellFilterValue`, and tests. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit dd4aafe. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent a2be233 commit 0b4d90b

10 files changed

Lines changed: 154 additions & 42 deletions

File tree

‎packages/k8s-ui/src/components/resources/ResourcesView.tsx‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,6 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
839839
],
840840
nodeclaims: [
841841
{ key: 'name', label: 'Name' },
842-
{ key: 'namespace', label: 'Namespace', width: 'w-36' },
843842
{ key: 'status', label: 'Status', width: 'w-24' },
844843
{ key: 'instanceType', label: 'Instance Type', width: 'w-32' },
845844
{ key: 'capacityType', label: 'Capacity', width: 'w-24', tooltip: 'Spot or On-Demand' },
@@ -936,7 +935,6 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
936935
],
937936
resourceflavors: [
938937
{ key: 'name', label: 'Name' },
939-
{ key: 'status', label: 'Status', width: 'w-24' },
940938
{ key: 'nodeLabels', label: 'Node Labels', width: 'w-28', tooltip: 'Node label selector count' },
941939
{ key: 'taints', label: 'Taints', width: 'w-24' },
942940
{ key: 'age', label: 'Age', width: 'w-24' },
@@ -986,7 +984,7 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
986984
{ key: 'namespace', label: 'Namespace', width: 'w-36' },
987985
{ key: 'status', label: 'Status', width: 'w-24' },
988986
{ key: 'schedule', label: 'Schedule', width: 'w-32' },
989-
{ key: 'suspend', label: 'Suspend', width: 'w-20' },
987+
{ key: 'timeZone', label: 'Time Zone', width: 'w-36', tooltip: 'IANA zone the schedule is read in; unset follows the local zone of the KubeRay operator pod' },
990988
{ key: 'lastSchedule', label: 'Last Schedule', width: 'w-28' },
991989
{ key: 'age', label: 'Age', width: 'w-24' },
992990
],
@@ -1113,7 +1111,6 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
11131111
jobtemplates: [
11141112
{ key: 'name', label: 'Name' },
11151113
{ key: 'namespace', label: 'Namespace', width: 'w-36' },
1116-
{ key: 'status', label: 'Status', width: 'w-24' },
11171114
{ key: 'tasks', label: 'Tasks', width: 'w-20' },
11181115
{ key: 'age', label: 'Age', width: 'w-24' },
11191116
],
@@ -1480,7 +1477,6 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
14801477
{ key: 'name', label: 'Name' },
14811478
{ key: 'namespace', label: 'Namespace', width: 'w-36' },
14821479
{ key: 'selector', label: 'Selector', width: 'w-48' },
1483-
{ key: 'namespaceSelector', label: 'Namespace Selector', width: 'w-48', defaultVisible: false },
14841480
{ key: 'serviceAccountSelector', label: 'Service Account Selector', width: 'w-48', defaultVisible: false },
14851481
{ key: 'tier', label: 'Tier', width: 'w-28' },
14861482
{ key: 'order', label: 'Order', width: 'w-24' },
@@ -1503,7 +1499,6 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
15031499
{ key: 'name', label: 'Name' },
15041500
{ key: 'namespace', label: 'Namespace', width: 'w-36' },
15051501
{ key: 'selector', label: 'Selector', width: 'w-48' },
1506-
{ key: 'namespaceSelector', label: 'Namespace Selector', width: 'w-48', defaultVisible: false },
15071502
{ key: 'serviceAccountSelector', label: 'Service Account Selector', width: 'w-48', defaultVisible: false },
15081503
{ key: 'tier', label: 'Tier', width: 'w-28' },
15091504
{ key: 'order', label: 'Order', width: 'w-24' },
@@ -1834,7 +1829,6 @@ const KNOWN_COLUMNS: Record<string, Column[]> = {
18341829
{ key: 'namespace', label: 'Namespace', width: 'w-36' },
18351830
{ key: 'status', label: 'Status', width: 'w-24' },
18361831
{ key: 'store', label: 'Store', width: 'w-36' },
1837-
{ key: 'provider', label: 'Provider', width: 'w-28' },
18381832
{ key: 'refreshInterval', label: 'Refresh', width: 'w-24' },
18391833
{ key: 'lastSync', label: 'Last Sync', width: 'w-28' },
18401834
{ key: 'age', label: 'Age', width: 'w-24' },

‎packages/k8s-ui/src/components/resources/renderers/eso-cells.tsx‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
getExternalSecretStore,
77
getExternalSecretRefreshInterval,
88
getExternalSecretLastSync,
9-
getExternalSecretProvider,
109
getClusterExternalSecretStatus,
1110
getClusterExternalSecretNamespaceCount,
1211
getClusterExternalSecretFailedCount,
@@ -33,10 +32,6 @@ export function ExternalSecretCell({ resource, column }: { resource: any; column
3332
</span>
3433
)
3534
}
36-
case 'provider': {
37-
const provider = getExternalSecretProvider(resource)
38-
return <span className="text-sm text-theme-text-secondary truncate block">{provider}</span>
39-
}
4035
case 'refreshInterval': {
4136
const interval = getExternalSecretRefreshInterval(resource)
4237
return <span className="text-sm text-theme-text-secondary">{interval}</span>

‎packages/k8s-ui/src/components/resources/renderers/kueue-cells.tsx‎

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
getKueueWorkloadQueueName,
1616
getKueueWorkloadAdmittedBy,
1717
getKueueWorkloadPriority,
18-
getResourceFlavorStatus,
1918
getResourceFlavorNodeLabelCount,
2019
getResourceFlavorTaintCount,
2120
getAdmissionCheckStatus,
@@ -112,14 +111,6 @@ export function KueueWorkloadCell({ resource, column }: { resource: any; column:
112111

113112
export function ResourceFlavorCell({ resource, column }: { resource: any; column: string }) {
114113
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-
}
123114
case 'nodeLabels': {
124115
const count = getResourceFlavorNodeLabelCount(resource)
125116
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>

‎packages/k8s-ui/src/components/resources/renderers/ray-cells.tsx‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
getRayServiceClusters,
1616
getRayCronJobStatus,
1717
getRayCronJobSchedule,
18-
getRayCronJobSuspend,
18+
getRayCronJobTimeZone,
1919
getRayCronJobLastSchedule,
2020
} from '../resource-utils-ray'
2121

@@ -110,9 +110,17 @@ export function RayCronJobCell({ resource, column }: { resource: any; column: st
110110
const schedule = getRayCronJobSchedule(resource)
111111
return <span className="text-sm font-mono text-theme-text-secondary">{schedule}</span>
112112
}
113-
case 'suspend': {
114-
const suspended = getRayCronJobSuspend(resource)
115-
return <span className="text-sm text-theme-text-secondary">{suspended ? 'Yes' : 'No'}</span>
113+
case 'timeZone': {
114+
const zone = getRayCronJobTimeZone(resource)
115+
const declared = Boolean(resource.spec?.timeZone)
116+
return (
117+
<span
118+
className={clsx('text-sm truncate block', declared ? 'text-theme-text-secondary' : 'text-theme-text-tertiary')}
119+
title={zone}
120+
>
121+
{zone}
122+
</span>
123+
)
116124
}
117125
case 'lastSchedule': {
118126
const lastSchedule = getRayCronJobLastSchedule(resource)

‎packages/k8s-ui/src/components/resources/renderers/volcano-cells.tsx‎

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
getVolcanoPodGroupMinMember,
1717
getJobFlowStatus,
1818
getJobFlowFlowCount,
19-
getJobTemplateStatus,
2019
getJobTemplateTaskCount,
2120
} from '../resource-utils-volcano'
2221

@@ -122,14 +121,6 @@ export function JobFlowCell({ resource, column }: { resource: any; column: strin
122121

123122
export function JobTemplateCell({ resource, column }: { resource: any; column: string }) {
124123
switch (column) {
125-
case 'status': {
126-
const status = getJobTemplateStatus(resource)
127-
return (
128-
<span className={clsx('badge', status.color)}>
129-
{status.text}
130-
</span>
131-
)
132-
}
133124
case 'tasks': {
134125
const count = getJobTemplateTaskCount(resource)
135126
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { getSecretStoreProviderType, getSecretStoreProviderKey } from './resource-utils-eso'
3+
4+
// The provider label answers "which backend holds these secrets?", so it has to
5+
// track the upstream `spec.provider` field names rather than plausible ones.
6+
7+
describe('getSecretStoreProviderType', () => {
8+
it('names the AWS product rather than assuming Secrets Manager', () => {
9+
// One `aws` key addresses three services; `service` is required and is the
10+
// only thing that distinguishes them.
11+
const forService = (service: string) =>
12+
getSecretStoreProviderType({ spec: { provider: { aws: { service, region: 'us-east-1' } } } })
13+
14+
expect(forService('SecretsManager')).toBe('AWS Secrets Manager')
15+
expect(forService('ParameterStore')).toBe('AWS Parameter Store')
16+
expect(forService('CertificateManager')).toBe('AWS Certificate Manager')
17+
})
18+
19+
it('falls back to the vendor when an AWS store declares no service', () => {
20+
// Invalid per the CRD, but naming a product we cannot confirm is worse than
21+
// naming only the vendor.
22+
expect(getSecretStoreProviderType({ spec: { provider: { aws: {} } } })).toBe('AWS')
23+
})
24+
25+
it('recognises Bitwarden under its real field name', () => {
26+
expect(getSecretStoreProviderType({ spec: { provider: { bitwardensecretsmanager: {} } } }))
27+
.toBe('Bitwarden Secrets Manager')
28+
})
29+
30+
it('labels providers added after the map was first written', () => {
31+
expect(getSecretStoreProviderType({ spec: { provider: { openBao: {} } } })).toBe('OpenBao')
32+
expect(getSecretStoreProviderType({ spec: { provider: { conjur: {} } } })).toBe('CyberArk Conjur')
33+
})
34+
35+
it('keeps v1beta1-only providers, which v1 clusters never send', () => {
36+
expect(getSecretStoreProviderType({ spec: { provider: { device42: {} } } })).toBe('Device42')
37+
})
38+
39+
it('shows the raw key rather than Unknown for an unrecognised provider', () => {
40+
expect(getSecretStoreProviderType({ spec: { provider: { somefutureprovider: {} } } }))
41+
.toBe('somefutureprovider')
42+
})
43+
44+
it('reports nothing when there is no provider at all', () => {
45+
expect(getSecretStoreProviderType({ spec: {} })).toBe('Unknown')
46+
})
47+
})
48+
49+
describe('getSecretStoreProviderKey', () => {
50+
it('stays at the vendor level, which is what the badge colours by', () => {
51+
const key = (service: string) =>
52+
getSecretStoreProviderKey({ spec: { provider: { aws: { service } } } })
53+
expect(key('SecretsManager')).toBe('aws')
54+
expect(key('ParameterStore')).toBe('aws')
55+
})
56+
})

‎packages/k8s-ui/src/components/resources/resource-utils-eso.ts‎

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,63 @@ import { healthColors, formatAge } from './resource-utils'
77
// PROVIDER DETECTION
88
// ============================================================================
99

10+
// Keys are the SecretStore `spec.provider` field names. v1 and v1beta1 do not
11+
// carry the same set, so entries dropped upstream (device42, alibaba) stay for
12+
// clusters still serving v1beta1.
1013
const PROVIDER_MAP: Record<string, string> = {
11-
aws: 'AWS Secrets Manager',
14+
aws: 'AWS',
1215
azurekv: 'Azure Key Vault',
1316
gcpsm: 'GCP Secret Manager',
1417
vault: 'HashiCorp Vault',
18+
openBao: 'OpenBao',
1519
kubernetes: 'Kubernetes',
20+
crd: 'Kubernetes Resource',
1621
oracle: 'Oracle Vault',
1722
ibm: 'IBM Secrets Manager',
23+
alibaba: 'Alibaba Cloud KMS',
24+
ovh: 'OVHcloud Secret Manager',
25+
volcengine: 'Volcengine',
26+
cloudrusm: 'Cloud.ru Secret Manager',
27+
nebiusmysterybox: 'Nebius Mysterybox',
28+
barbican: 'OpenStack Barbican',
29+
yandexlockbox: 'Yandex Lockbox',
30+
yandexcertificatemanager: 'Yandex Certificate Manager',
1831
doppler: 'Doppler',
1932
onepassword: '1Password',
33+
onepasswordSDK: '1Password',
34+
bitwardensecretsmanager: 'Bitwarden Secrets Manager',
2035
senhasegura: 'senhasegura',
36+
github: 'GitHub',
2137
gitlab: 'GitLab',
2238
webhook: 'Webhook',
2339
fake: 'Fake',
2440
keepersecurity: 'Keeper Security',
2541
scaleway: 'Scaleway',
26-
delinea: 'Delinea',
42+
conjur: 'CyberArk Conjur',
43+
delinea: 'Delinea DevOps Secrets Vault',
44+
secretserver: 'Delinea Secret Server',
45+
beyondtrust: 'BeyondTrust',
46+
beyondtrustworkloadcredentials: 'BeyondTrust Workload Credentials',
2747
chef: 'Chef',
2848
pulumi: 'Pulumi ESC',
2949
fortanix: 'Fortanix',
3050
passworddepot: 'Password Depot',
51+
passbolt: 'Passbolt',
52+
previder: 'Previder',
53+
onboardbase: 'Onboardbase',
54+
dvls: 'Devolutions Server',
3155
device42: 'Device42',
3256
akeyless: 'Akeyless',
33-
beyondtrust: 'BeyondTrust',
3457
infisical: 'Infisical',
35-
passbolt: 'Passbolt',
36-
bitwarden: 'Bitwarden',
58+
ngrok: 'ngrok',
59+
}
60+
61+
// A single `aws` key addresses three unrelated AWS products; `service` is a
62+
// required enum and is the only thing that says which one holds the secrets.
63+
const AWS_SERVICE_LABELS: Record<string, string> = {
64+
SecretsManager: 'AWS Secrets Manager',
65+
ParameterStore: 'AWS Parameter Store',
66+
CertificateManager: 'AWS Certificate Manager',
3767
}
3868

3969
/**
@@ -44,6 +74,8 @@ export function getSecretStoreProviderType(resource: any): string {
4474
const provider = resource.spec?.provider
4575
if (!provider) return 'Unknown'
4676

77+
if (provider.aws) return AWS_SERVICE_LABELS[provider.aws.service] ?? 'AWS'
78+
4779
for (const [key, label] of Object.entries(PROVIDER_MAP)) {
4880
if (provider[key]) return label
4981
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { getRayCronJobTimeZone, getRayCronJobStatus } from './resource-utils-ray'
3+
import { getCellFilterValue } from './resource-utils'
4+
5+
describe('getRayCronJobTimeZone', () => {
6+
it('shows the declared zone', () => {
7+
expect(getRayCronJobTimeZone({ spec: { schedule: '0 2 * * *', timeZone: 'America/New_York' } }))
8+
.toBe('America/New_York')
9+
})
10+
11+
it('does not present an undeclared zone as UTC', () => {
12+
// KubeRay reads the schedule in the operator pod's local zone when timeZone
13+
// is unset, so the object cannot say what the cron expression means.
14+
expect(getRayCronJobTimeZone({ spec: { schedule: '0 2 * * *' } })).toBe('Operator local')
15+
})
16+
})
17+
18+
describe('getRayCronJobStatus', () => {
19+
it('reports only what spec.suspend says, which is all the CRD carries', () => {
20+
// RayCronJobStatus holds lastScheduleTime and nothing else — there is no
21+
// controller-reported phase for this badge to reflect.
22+
expect(getRayCronJobStatus({ spec: { suspend: true } }).text).toBe('Suspended')
23+
expect(getRayCronJobStatus({ spec: {} }).text).toBe('Active')
24+
})
25+
})
26+
27+
describe('getCellFilterValue for raycronjobs timeZone', () => {
28+
it('offers the same value the cell renders, so undeclared rows stay filterable', () => {
29+
// The generic fallback reads spec.timeZone and yields '' when unset, which
30+
// would hide those rows from a filter whose column shows them a value.
31+
expect(getCellFilterValue({ spec: { schedule: '0 2 * * *' } }, 'timeZone', 'raycronjobs'))
32+
.toBe('Operator local')
33+
expect(getCellFilterValue({ spec: { timeZone: 'Europe/Berlin' } }, 'timeZone', 'raycronjobs'))
34+
.toBe('Europe/Berlin')
35+
})
36+
})

‎packages/k8s-ui/src/components/resources/resource-utils-ray.ts‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ export function getRayCronJobSchedule(resource: any): string {
203203
return resource.spec?.schedule || '-'
204204
}
205205

206+
// An unset timeZone does not mean UTC: KubeRay reads the schedule in the
207+
// operator pod's own local zone, which this object cannot report.
208+
export function getRayCronJobTimeZone(resource: any): string {
209+
return resource.spec?.timeZone || 'Operator local'
210+
}
211+
206212
export function getRayCronJobSuspend(resource: any): boolean {
207213
return resource.spec?.suspend === true
208214
}

‎packages/k8s-ui/src/components/resources/resource-utils.ts‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { getPolicyReportStatus as _getPolicyReportStatus, getKyvernoPolicyStatus
1515
import { getResourceClaimStatus as _getResourceClaimStatus, getResourceClaimDeviceClasses as _getResourceClaimDeviceClasses, getResourceClaimTemplateDeviceClasses as _getResourceClaimTemplateDeviceClasses, getResourceClaimAllocation as _getResourceClaimAllocation, getResourceClaimReservedFor as _getResourceClaimReservedFor } from './resource-utils-dra'
1616
import { getNvidiaClusterPolicyStatus as _getNvidiaClusterPolicyStatus, getNvidiaClusterPolicyEnabledComponents as _getNvidiaClusterPolicyEnabledComponents, getNvidiaDriverStatus as _getNvidiaDriverStatus } from './resource-utils-nvidia'
1717
import { getClusterQueueStatus as _getClusterQueueStatus, getLocalQueueStatus as _getLocalQueueStatus, getKueueWorkloadStatus as _getKueueWorkloadStatus, getResourceFlavorStatus as _getResourceFlavorStatus, getAdmissionCheckStatus as _getAdmissionCheckStatus, getProvisioningRequestStatus as _getProvisioningRequestStatus } from './resource-utils-kueue'
18-
import { getRayClusterStatus as _getRayClusterStatus, getRayJobStatus as _getRayJobStatus, getRayServiceStatus as _getRayServiceStatus, getRayCronJobStatus as _getRayCronJobStatus } from './resource-utils-ray'
18+
import { getRayClusterStatus as _getRayClusterStatus, getRayJobStatus as _getRayJobStatus, getRayServiceStatus as _getRayServiceStatus, getRayCronJobStatus as _getRayCronJobStatus, getRayCronJobTimeZone as _getRayCronJobTimeZone } from './resource-utils-ray'
1919
import { getLeaderWorkerSetStatus as _getLeaderWorkerSetStatus, getJobSetStatus as _getJobSetStatus } from './resource-utils-jobset-lws'
2020
import { getInferenceServiceStatus as _getInferenceServiceStatus, getServingRuntimeStatus as _getServingRuntimeStatus, getInferenceGraphStatus as _getInferenceGraphStatus, getTrainedModelStatus as _getTrainedModelStatus, getLLMInferenceServiceStatus as _getLLMInferenceServiceStatus } from './resource-utils-kserve'
2121
import { getInferencePoolStatus as _getInferencePoolStatus, getInferenceObjectiveStatus as _getInferenceObjectiveStatus } from './resource-utils-inference-gateway'
@@ -2370,7 +2370,6 @@ export function getCellFilterValue(resource: any, column: string, kind: string):
23702370
if (kindLower === 'clusterqueues') return _getClusterQueueStatus(resource).text
23712371
if (kindLower === 'localqueues') return _getLocalQueueStatus(resource).text
23722372
if (kindLower === 'workloads') return _getKueueWorkloadStatus(resource).text
2373-
if (kindLower === 'resourceflavors') return _getResourceFlavorStatus(resource).text
23742373
if (kindLower === 'admissionchecks') return _getAdmissionCheckStatus(resource).text
23752374
if (kindLower === 'provisioningrequests') return _getProvisioningRequestStatus(resource).text
23762375
if (kindLower === 'rayclusters') return _getRayClusterStatus(resource).text
@@ -2390,7 +2389,6 @@ export function getCellFilterValue(resource: any, column: string, kind: string):
23902389
if (kindLower === 'volcanoqueues') return _getVolcanoQueueStatus(resource).text
23912390
if (kindLower === 'volcanopodgroups') return _getVolcanoPodGroupStatus(resource).text
23922391
if (kindLower === 'jobflows') return _getJobFlowStatus(resource).text
2393-
if (kindLower === 'jobtemplates') return _getJobTemplateStatus(resource).text
23942392
if (kindLower === 'kaiqueues') return _getKaiQueueStatus(resource).text
23952393
if (kindLower === 'kaipodgroups') return _getKaiPodGroupStatus(resource).text
23962394
if (kindLower === 'kaitoworkspaces') return _getKaitoWorkspaceStatus(resource).text
@@ -2596,6 +2594,11 @@ export function getCellFilterValue(resource: any, column: string, kind: string):
25962594
case 'mig':
25972595
if (kindLower === 'nvidiaclusterpolicies') return resource.spec?.mig?.strategy || ''
25982596
break
2597+
// The fallback would read spec.timeZone and yield '' for an undeclared
2598+
// zone, so those rows would drop out of a filter the cell shows a value for.
2599+
case 'timeZone':
2600+
if (kindLower === 'raycronjobs') return _getRayCronJobTimeZone(resource)
2601+
break
25992602
}
26002603

26012604
// Fallback: try common paths

0 commit comments

Comments
 (0)