@skyhook-io/k8s-ui 1.0.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 +63 -0
- package/src/components/dock/BottomDock.tsx +204 -0
- package/src/components/dock/DockContext.tsx +212 -0
- package/src/components/dock/TerminalTab.tsx +333 -0
- package/src/components/dock/index.ts +3 -0
- package/src/components/gitops/GitOpsActions.tsx +227 -0
- package/src/components/gitops/GitOpsStatusBadge.tsx +221 -0
- package/src/components/gitops/ManagedResourcesList.tsx +210 -0
- package/src/components/gitops/SyncCountdown.tsx +146 -0
- package/src/components/gitops/index.ts +4 -0
- package/src/components/logs/JsonLogLine.tsx +90 -0
- package/src/components/logs/LogCore.tsx +553 -0
- package/src/components/logs/LogToolbarSelects.tsx +74 -0
- package/src/components/logs/LogsViewer.tsx +146 -0
- package/src/components/logs/WorkloadLogsViewer.tsx +263 -0
- package/src/components/logs/index.ts +13 -0
- package/src/components/logs/useLogBuffer.ts +138 -0
- package/src/components/logs/useLogSearch.ts +151 -0
- package/src/components/logs/useLogStream.ts +61 -0
- package/src/components/resources/ResourcesView.tsx +5494 -0
- package/src/components/resources/index.ts +17 -0
- package/src/components/resources/renderers/AlertRenderer.tsx +166 -0
- package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +233 -0
- package/src/components/resources/renderers/CNPGBackupRenderer.tsx +89 -0
- package/src/components/resources/renderers/CNPGClusterRenderer.tsx +194 -0
- package/src/components/resources/renderers/CNPGPoolerRenderer.tsx +79 -0
- package/src/components/resources/renderers/CNPGScheduledBackupRenderer.tsx +68 -0
- package/src/components/resources/renderers/CertificateRenderer.tsx +209 -0
- package/src/components/resources/renderers/CertificateRequestRenderer.tsx +123 -0
- package/src/components/resources/renderers/ChallengeRenderer.tsx +111 -0
- package/src/components/resources/renderers/ClusterComplianceReportRenderer.tsx +164 -0
- package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +140 -0
- package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +153 -0
- package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +221 -0
- package/src/components/resources/renderers/ConfigMapRenderer.tsx +124 -0
- package/src/components/resources/renderers/CronJobRenderer.tsx +86 -0
- package/src/components/resources/renderers/EventRenderer.tsx +175 -0
- package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +119 -0
- package/src/components/resources/renderers/ExternalSecretRenderer.tsx +172 -0
- package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +242 -0
- package/src/components/resources/renderers/GRPCRouteRenderer.tsx +263 -0
- package/src/components/resources/renderers/GatewayClassRenderer.tsx +68 -0
- package/src/components/resources/renderers/GatewayRenderer.tsx +218 -0
- package/src/components/resources/renderers/GenericRenderer.tsx +476 -0
- package/src/components/resources/renderers/GitRepositoryRenderer.tsx +154 -0
- package/src/components/resources/renderers/HPARenderer.tsx +164 -0
- package/src/components/resources/renderers/HTTPRouteRenderer.tsx +303 -0
- package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +167 -0
- package/src/components/resources/renderers/IngressClassRenderer.tsx +49 -0
- package/src/components/resources/renderers/IngressRenderer.tsx +104 -0
- package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +175 -0
- package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +176 -0
- package/src/components/resources/renderers/IstioGatewayRenderer.tsx +125 -0
- package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +84 -0
- package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +112 -0
- package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +288 -0
- package/src/components/resources/renderers/JobRenderer.tsx +103 -0
- package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +157 -0
- package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +188 -0
- package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +148 -0
- package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +90 -0
- package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +136 -0
- package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +151 -0
- package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +70 -0
- package/src/components/resources/renderers/KnativeEventingRenderer.tsx +309 -0
- package/src/components/resources/renderers/KnativeFlowRenderer.tsx +142 -0
- package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +232 -0
- package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +97 -0
- package/src/components/resources/renderers/KnativeRouteRenderer.tsx +74 -0
- package/src/components/resources/renderers/KnativeServiceRenderer.tsx +138 -0
- package/src/components/resources/renderers/KnativeSourceRenderer.tsx +220 -0
- package/src/components/resources/renderers/KustomizationRenderer.tsx +151 -0
- package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +352 -0
- package/src/components/resources/renderers/LeaseRenderer.tsx +93 -0
- package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +208 -0
- package/src/components/resources/renderers/NodeRenderer.tsx +282 -0
- package/src/components/resources/renderers/OCIRepositoryRenderer.tsx +153 -0
- package/src/components/resources/renderers/OrderRenderer.tsx +108 -0
- package/src/components/resources/renderers/PVCRenderer.tsx +98 -0
- package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +138 -0
- package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +126 -0
- package/src/components/resources/renderers/PodMonitorRenderer.tsx +63 -0
- package/src/components/resources/renderers/PodRenderer.tsx +677 -0
- package/src/components/resources/renderers/PriorityClassRenderer.tsx +50 -0
- package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +62 -0
- package/src/components/resources/renderers/ReplicaSetRenderer.tsx +71 -0
- package/src/components/resources/renderers/RoleBindingRenderer.tsx +97 -0
- package/src/components/resources/renderers/RoleRenderer.tsx +192 -0
- package/src/components/resources/renderers/RolloutRenderer.tsx +227 -0
- package/src/components/resources/renderers/RuntimeClassRenderer.tsx +75 -0
- package/src/components/resources/renderers/SbomReportRenderer.tsx +98 -0
- package/src/components/resources/renderers/SealedSecretRenderer.tsx +121 -0
- package/src/components/resources/renderers/SecretRenderer.tsx +321 -0
- package/src/components/resources/renderers/SecretStoreRenderer.tsx +111 -0
- package/src/components/resources/renderers/ServiceAccountRenderer.tsx +81 -0
- package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +65 -0
- package/src/components/resources/renderers/ServiceRenderer.tsx +98 -0
- package/src/components/resources/renderers/SimpleRouteRenderer.tsx +195 -0
- package/src/components/resources/renderers/StorageClassRenderer.tsx +82 -0
- package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +257 -0
- package/src/components/resources/renderers/VPARenderer.tsx +193 -0
- package/src/components/resources/renderers/VeleroBSLRenderer.tsx +73 -0
- package/src/components/resources/renderers/VeleroBackupRenderer.tsx +193 -0
- package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +161 -0
- package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +134 -0
- package/src/components/resources/renderers/VeleroVSLRenderer.tsx +36 -0
- package/src/components/resources/renderers/VulnerabilityReportRenderer.tsx +347 -0
- package/src/components/resources/renderers/WebhookConfigRenderer.tsx +156 -0
- package/src/components/resources/renderers/WorkflowRenderer.tsx +202 -0
- package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +91 -0
- package/src/components/resources/renderers/WorkloadRenderer.tsx +311 -0
- package/src/components/resources/renderers/argo-cells.tsx +118 -0
- package/src/components/resources/renderers/certmanager-cells.tsx +164 -0
- package/src/components/resources/renderers/cnpg-cells.tsx +161 -0
- package/src/components/resources/renderers/eso-cells.tsx +115 -0
- package/src/components/resources/renderers/flux-cells.tsx +253 -0
- package/src/components/resources/renderers/index.ts +105 -0
- package/src/components/resources/renderers/istio-cells.tsx +210 -0
- package/src/components/resources/renderers/karpenter-cells.tsx +107 -0
- package/src/components/resources/renderers/keda-cells.tsx +94 -0
- package/src/components/resources/renderers/knative-cells.tsx +396 -0
- package/src/components/resources/renderers/kyverno-cells.tsx +85 -0
- package/src/components/resources/renderers/prometheus-cells.tsx +74 -0
- package/src/components/resources/renderers/traefik-cells.tsx +120 -0
- package/src/components/resources/renderers/trivy-cells.tsx +153 -0
- package/src/components/resources/renderers/trivy-shared.tsx +67 -0
- package/src/components/resources/renderers/velero-cells.tsx +164 -0
- package/src/components/resources/resource-utils-argo.ts +155 -0
- package/src/components/resources/resource-utils-certmanager.ts +198 -0
- package/src/components/resources/resource-utils-cnpg.ts +344 -0
- package/src/components/resources/resource-utils-eso.ts +385 -0
- package/src/components/resources/resource-utils-flux.ts +186 -0
- package/src/components/resources/resource-utils-istio.ts +372 -0
- package/src/components/resources/resource-utils-karpenter.ts +150 -0
- package/src/components/resources/resource-utils-keda.ts +203 -0
- package/src/components/resources/resource-utils-knative.ts +218 -0
- package/src/components/resources/resource-utils-kyverno.ts +224 -0
- package/src/components/resources/resource-utils-prometheus.ts +159 -0
- package/src/components/resources/resource-utils-traefik.ts +180 -0
- package/src/components/resources/resource-utils-trivy.ts +146 -0
- package/src/components/resources/resource-utils-velero.ts +293 -0
- package/src/components/resources/resource-utils.ts +1558 -0
- package/src/components/shared/EditableYamlView.tsx +302 -0
- package/src/components/shared/ResourceActionsBar.tsx +924 -0
- package/src/components/shared/ResourceRendererDispatch.tsx +557 -0
- package/src/components/shared/index.ts +3 -0
- package/src/components/timeline/index.ts +1 -0
- package/src/components/timeline/shared.tsx +614 -0
- package/src/components/topology/GroupNode.tsx +198 -0
- package/src/components/topology/K8sResourceNode.tsx +440 -0
- package/src/components/topology/TopologyControls.tsx +62 -0
- package/src/components/topology/TopologyFilterSidebar.tsx +377 -0
- package/src/components/topology/TopologyGraph.tsx +748 -0
- package/src/components/topology/TopologySearch.tsx +304 -0
- package/src/components/topology/index.ts +7 -0
- package/src/components/topology/layout.ts +734 -0
- package/src/components/topology/layout.worker.ts +272 -0
- package/src/components/topology/topology.css +129 -0
- package/src/components/ui/CodeViewer.tsx +451 -0
- package/src/components/ui/ConfirmDialog.tsx +188 -0
- package/src/components/ui/ForceDeleteConfirmDialog.tsx +57 -0
- package/src/components/ui/HealthRing.tsx +72 -0
- package/src/components/ui/MetricsChart.tsx +259 -0
- package/src/components/ui/ResourceBar.tsx +68 -0
- package/src/components/ui/Toast.tsx +225 -0
- package/src/components/ui/Tooltip.tsx +165 -0
- package/src/components/ui/YamlEditor.tsx +280 -0
- package/src/components/ui/drawer-components.tsx +792 -0
- package/src/components/ui/index.ts +10 -0
- package/src/components/workload/ResourceDetailDrawer.tsx +158 -0
- package/src/components/workload/WorkloadView.tsx +1109 -0
- package/src/components/workload/index.ts +2 -0
- package/src/hooks/index.ts +9 -0
- package/src/hooks/useAnimatedUnmount.ts +30 -0
- package/src/hooks/useKeyboardShortcuts.tsx +336 -0
- package/src/hooks/useRefreshAnimation.ts +58 -0
- package/src/index.ts +35 -0
- package/src/types/core.ts +894 -0
- package/src/types/gitops.ts +458 -0
- package/src/types/index.ts +2 -0
- package/src/utils/animation.ts +40 -0
- package/src/utils/api-resources.ts +185 -0
- package/src/utils/badge-colors.ts +399 -0
- package/src/utils/context-name.ts +72 -0
- package/src/utils/download.ts +19 -0
- package/src/utils/format.ts +233 -0
- package/src/utils/index.ts +10 -0
- package/src/utils/log-format.ts +300 -0
- package/src/utils/navigation.ts +119 -0
- package/src/utils/resource-hierarchy.ts +630 -0
- package/src/utils/resource-icons.ts +206 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// ArgoCD cell components for ResourcesView table — extracted from ResourcesView.tsx
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import { Tooltip } from '../../ui/Tooltip'
|
|
5
|
+
import {
|
|
6
|
+
getArgoApplicationProject,
|
|
7
|
+
getArgoApplicationSync,
|
|
8
|
+
getArgoApplicationHealth,
|
|
9
|
+
getArgoApplicationRepo,
|
|
10
|
+
getArgoApplicationSetGenerators,
|
|
11
|
+
getArgoApplicationSetTemplate,
|
|
12
|
+
getArgoApplicationSetAppCount,
|
|
13
|
+
getArgoApplicationSetStatus,
|
|
14
|
+
getArgoAppProjectDescription,
|
|
15
|
+
getArgoAppProjectDestinations,
|
|
16
|
+
getArgoAppProjectSources,
|
|
17
|
+
} from '../resource-utils'
|
|
18
|
+
|
|
19
|
+
export function ArgoApplicationCell({ resource, column }: { resource: any; column: string }) {
|
|
20
|
+
switch (column) {
|
|
21
|
+
case 'project': {
|
|
22
|
+
const project = getArgoApplicationProject(resource)
|
|
23
|
+
return <span className="text-sm text-theme-text-secondary">{project}</span>
|
|
24
|
+
}
|
|
25
|
+
case 'sync': {
|
|
26
|
+
const { status, color } = getArgoApplicationSync(resource)
|
|
27
|
+
return (
|
|
28
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', color)}>
|
|
29
|
+
{status}
|
|
30
|
+
</span>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
case 'health': {
|
|
34
|
+
const { status, color } = getArgoApplicationHealth(resource)
|
|
35
|
+
return (
|
|
36
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', color)}>
|
|
37
|
+
{status}
|
|
38
|
+
</span>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
case 'repo': {
|
|
42
|
+
const repo = getArgoApplicationRepo(resource)
|
|
43
|
+
return (
|
|
44
|
+
<Tooltip content={resource.spec?.source?.repoURL || resource.spec?.sources?.[0]?.repoURL || repo}>
|
|
45
|
+
<span className="text-sm text-theme-text-secondary truncate block">{repo}</span>
|
|
46
|
+
</Tooltip>
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function ArgoApplicationSetCell({ resource, column }: { resource: any; column: string }) {
|
|
55
|
+
switch (column) {
|
|
56
|
+
case 'generators': {
|
|
57
|
+
const generators = getArgoApplicationSetGenerators(resource)
|
|
58
|
+
return (
|
|
59
|
+
<Tooltip content={generators}>
|
|
60
|
+
<span className="text-sm text-theme-text-secondary truncate block">{generators}</span>
|
|
61
|
+
</Tooltip>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
case 'template': {
|
|
65
|
+
const template = getArgoApplicationSetTemplate(resource)
|
|
66
|
+
return <span className="text-sm text-theme-text-secondary">{template}</span>
|
|
67
|
+
}
|
|
68
|
+
case 'applications': {
|
|
69
|
+
const count = getArgoApplicationSetAppCount(resource)
|
|
70
|
+
return (
|
|
71
|
+
<span className="text-sm text-theme-text-secondary">
|
|
72
|
+
{count > 0 ? count : '-'}
|
|
73
|
+
</span>
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
case 'status': {
|
|
77
|
+
const status = getArgoApplicationSetStatus(resource)
|
|
78
|
+
return (
|
|
79
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
80
|
+
{status.text}
|
|
81
|
+
</span>
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
default:
|
|
85
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function ArgoAppProjectCell({ resource, column }: { resource: any; column: string }) {
|
|
90
|
+
switch (column) {
|
|
91
|
+
case 'description': {
|
|
92
|
+
const desc = getArgoAppProjectDescription(resource)
|
|
93
|
+
return (
|
|
94
|
+
<Tooltip content={desc}>
|
|
95
|
+
<span className="text-sm text-theme-text-secondary truncate block">{desc}</span>
|
|
96
|
+
</Tooltip>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
case 'destinations': {
|
|
100
|
+
const count = getArgoAppProjectDestinations(resource)
|
|
101
|
+
return (
|
|
102
|
+
<span className="text-sm text-theme-text-secondary">
|
|
103
|
+
{count === Infinity ? '*' : count}
|
|
104
|
+
</span>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
case 'sources': {
|
|
108
|
+
const count = getArgoAppProjectSources(resource)
|
|
109
|
+
return (
|
|
110
|
+
<span className="text-sm text-theme-text-secondary">
|
|
111
|
+
{count === Infinity ? '*' : count}
|
|
112
|
+
</span>
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
default:
|
|
116
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// cert-manager cell components for ResourcesView table — extracted from ResourcesView.tsx
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import { Tooltip } from '../../ui/Tooltip'
|
|
5
|
+
import {
|
|
6
|
+
getCertificateStatus,
|
|
7
|
+
getCertificateDomains,
|
|
8
|
+
getCertificateIssuer,
|
|
9
|
+
getCertificateExpiry,
|
|
10
|
+
getCertificateRequestStatus,
|
|
11
|
+
getCertificateRequestIssuer,
|
|
12
|
+
getCertificateRequestApproved,
|
|
13
|
+
getClusterIssuerStatus,
|
|
14
|
+
getClusterIssuerType,
|
|
15
|
+
getIssuerStatus,
|
|
16
|
+
getIssuerType,
|
|
17
|
+
getOrderState,
|
|
18
|
+
getOrderDomains,
|
|
19
|
+
getOrderIssuer,
|
|
20
|
+
getChallengeState,
|
|
21
|
+
getChallengeType,
|
|
22
|
+
getChallengeDomain,
|
|
23
|
+
getChallengePresented,
|
|
24
|
+
} from '../resource-utils'
|
|
25
|
+
|
|
26
|
+
export function CertificateCell({ resource, column }: { resource: any; column: string }) {
|
|
27
|
+
switch (column) {
|
|
28
|
+
case 'status': {
|
|
29
|
+
const status = getCertificateStatus(resource)
|
|
30
|
+
return (
|
|
31
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
32
|
+
{status.text}
|
|
33
|
+
</span>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
case 'domains': {
|
|
37
|
+
const domains = getCertificateDomains(resource)
|
|
38
|
+
return (
|
|
39
|
+
<Tooltip content={domains}>
|
|
40
|
+
<span className="text-sm text-theme-text-secondary truncate block">{domains || '-'}</span>
|
|
41
|
+
</Tooltip>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
case 'issuer': {
|
|
45
|
+
const issuer = getCertificateIssuer(resource)
|
|
46
|
+
return <span className="text-sm text-theme-text-secondary">{issuer}</span>
|
|
47
|
+
}
|
|
48
|
+
case 'expires': {
|
|
49
|
+
const expiry = getCertificateExpiry(resource)
|
|
50
|
+
return (
|
|
51
|
+
<span className={clsx(
|
|
52
|
+
'text-sm font-medium',
|
|
53
|
+
expiry.level === 'unhealthy' ? 'text-red-400' :
|
|
54
|
+
expiry.level === 'degraded' ? 'text-yellow-400' :
|
|
55
|
+
expiry.level === 'healthy' ? 'text-green-400' :
|
|
56
|
+
'text-theme-text-tertiary'
|
|
57
|
+
)}>
|
|
58
|
+
{expiry.text}
|
|
59
|
+
</span>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
default:
|
|
63
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function CertificateRequestCell({ resource, column }: { resource: any; column: string }) {
|
|
68
|
+
switch (column) {
|
|
69
|
+
case 'status': {
|
|
70
|
+
const status = getCertificateRequestStatus(resource)
|
|
71
|
+
return (
|
|
72
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
73
|
+
{status.text}
|
|
74
|
+
</span>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
case 'issuer':
|
|
78
|
+
return <span className="text-sm text-theme-text-secondary">{getCertificateRequestIssuer(resource)}</span>
|
|
79
|
+
case 'approved':
|
|
80
|
+
return <span className="text-sm text-theme-text-secondary">{getCertificateRequestApproved(resource)}</span>
|
|
81
|
+
default:
|
|
82
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function ClusterIssuerCell({ resource, column }: { resource: any; column: string }) {
|
|
87
|
+
switch (column) {
|
|
88
|
+
case 'status': {
|
|
89
|
+
const status = getClusterIssuerStatus(resource)
|
|
90
|
+
return (
|
|
91
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
92
|
+
{status.text}
|
|
93
|
+
</span>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
case 'issuerType':
|
|
97
|
+
return <span className="text-sm text-theme-text-secondary">{getClusterIssuerType(resource)}</span>
|
|
98
|
+
default:
|
|
99
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function IssuerCell({ resource, column }: { resource: any; column: string }) {
|
|
104
|
+
switch (column) {
|
|
105
|
+
case 'status': {
|
|
106
|
+
const status = getIssuerStatus(resource)
|
|
107
|
+
return (
|
|
108
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
109
|
+
{status.text}
|
|
110
|
+
</span>
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
case 'issuerType':
|
|
114
|
+
return <span className="text-sm text-theme-text-secondary">{getIssuerType(resource)}</span>
|
|
115
|
+
default:
|
|
116
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function OrderCell({ resource, column }: { resource: any; column: string }) {
|
|
121
|
+
switch (column) {
|
|
122
|
+
case 'state': {
|
|
123
|
+
const state = getOrderState(resource)
|
|
124
|
+
return (
|
|
125
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', state.color)}>
|
|
126
|
+
{state.text}
|
|
127
|
+
</span>
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
case 'domains': {
|
|
131
|
+
const domains = getOrderDomains(resource)
|
|
132
|
+
return (
|
|
133
|
+
<Tooltip content={domains}>
|
|
134
|
+
<span className="text-sm text-theme-text-secondary truncate block">{domains}</span>
|
|
135
|
+
</Tooltip>
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
case 'issuer':
|
|
139
|
+
return <span className="text-sm text-theme-text-secondary">{getOrderIssuer(resource)}</span>
|
|
140
|
+
default:
|
|
141
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function ChallengeCell({ resource, column }: { resource: any; column: string }) {
|
|
146
|
+
switch (column) {
|
|
147
|
+
case 'state': {
|
|
148
|
+
const state = getChallengeState(resource)
|
|
149
|
+
return (
|
|
150
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', state.color)}>
|
|
151
|
+
{state.text}
|
|
152
|
+
</span>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
case 'challengeType':
|
|
156
|
+
return <span className="text-sm text-theme-text-secondary">{getChallengeType(resource)}</span>
|
|
157
|
+
case 'domain':
|
|
158
|
+
return <span className="text-sm text-theme-text-secondary">{getChallengeDomain(resource)}</span>
|
|
159
|
+
case 'presented':
|
|
160
|
+
return <span className="text-sm text-theme-text-secondary">{getChallengePresented(resource)}</span>
|
|
161
|
+
default:
|
|
162
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// CloudNativePG cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import {
|
|
5
|
+
getCNPGClusterStatus,
|
|
6
|
+
getCNPGClusterInstances,
|
|
7
|
+
getCNPGClusterPrimary,
|
|
8
|
+
getCNPGClusterImageTag,
|
|
9
|
+
getCNPGClusterStorage,
|
|
10
|
+
getCNPGBackupStatus,
|
|
11
|
+
getCNPGBackupCluster,
|
|
12
|
+
getCNPGBackupMethod,
|
|
13
|
+
getCNPGBackupDuration,
|
|
14
|
+
getCNPGScheduledBackupStatus,
|
|
15
|
+
getCNPGScheduledBackupCluster,
|
|
16
|
+
getCNPGScheduleCron,
|
|
17
|
+
getCNPGScheduledBackupLastSchedule,
|
|
18
|
+
getCNPGScheduledBackupIsSuspended,
|
|
19
|
+
getCNPGPoolerStatus,
|
|
20
|
+
getCNPGPoolerCluster,
|
|
21
|
+
getCNPGPoolerType,
|
|
22
|
+
getCNPGPoolerMode,
|
|
23
|
+
getCNPGPoolerInstances,
|
|
24
|
+
} from '../resource-utils-cnpg'
|
|
25
|
+
|
|
26
|
+
export function CNPGClusterCell({ resource, column }: { resource: any; column: string }) {
|
|
27
|
+
switch (column) {
|
|
28
|
+
case 'status': {
|
|
29
|
+
const status = getCNPGClusterStatus(resource)
|
|
30
|
+
return (
|
|
31
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
32
|
+
{status.text}
|
|
33
|
+
</span>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
case 'instances': {
|
|
37
|
+
const instances = getCNPGClusterInstances(resource)
|
|
38
|
+
const desired = resource.spec?.instances ?? 0
|
|
39
|
+
const ready = resource.status?.readyInstances ?? 0
|
|
40
|
+
return (
|
|
41
|
+
<span className={clsx('text-sm', ready < desired ? 'text-yellow-400' : 'text-theme-text-secondary')}>
|
|
42
|
+
{instances}
|
|
43
|
+
</span>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
case 'primary': {
|
|
47
|
+
const primary = getCNPGClusterPrimary(resource)
|
|
48
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{primary}</span>
|
|
49
|
+
}
|
|
50
|
+
case 'image': {
|
|
51
|
+
const tag = getCNPGClusterImageTag(resource)
|
|
52
|
+
return <span className="text-sm text-theme-text-secondary font-mono">{tag}</span>
|
|
53
|
+
}
|
|
54
|
+
case 'storage': {
|
|
55
|
+
const storage = getCNPGClusterStorage(resource)
|
|
56
|
+
return <span className="text-sm text-theme-text-secondary">{storage}</span>
|
|
57
|
+
}
|
|
58
|
+
default:
|
|
59
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function CNPGBackupCell({ resource, column }: { resource: any; column: string }) {
|
|
64
|
+
switch (column) {
|
|
65
|
+
case 'status': {
|
|
66
|
+
const status = getCNPGBackupStatus(resource)
|
|
67
|
+
return (
|
|
68
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
69
|
+
{status.text}
|
|
70
|
+
</span>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
case 'cluster': {
|
|
74
|
+
const cluster = getCNPGBackupCluster(resource)
|
|
75
|
+
return <span className="text-sm text-theme-text-secondary">{cluster}</span>
|
|
76
|
+
}
|
|
77
|
+
case 'method': {
|
|
78
|
+
const method = getCNPGBackupMethod(resource)
|
|
79
|
+
return <span className="text-sm text-theme-text-secondary">{method}</span>
|
|
80
|
+
}
|
|
81
|
+
case 'duration': {
|
|
82
|
+
const duration = getCNPGBackupDuration(resource)
|
|
83
|
+
return <span className="text-sm text-theme-text-secondary">{duration}</span>
|
|
84
|
+
}
|
|
85
|
+
default:
|
|
86
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function CNPGScheduledBackupCell({ resource, column }: { resource: any; column: string }) {
|
|
91
|
+
switch (column) {
|
|
92
|
+
case 'status': {
|
|
93
|
+
const status = getCNPGScheduledBackupStatus(resource)
|
|
94
|
+
return (
|
|
95
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
96
|
+
{status.text}
|
|
97
|
+
</span>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
case 'cluster': {
|
|
101
|
+
const cluster = getCNPGScheduledBackupCluster(resource)
|
|
102
|
+
return <span className="text-sm text-theme-text-secondary">{cluster}</span>
|
|
103
|
+
}
|
|
104
|
+
case 'schedule': {
|
|
105
|
+
const cron = getCNPGScheduleCron(resource)
|
|
106
|
+
return <span className="text-sm text-theme-text-secondary font-mono">{cron}</span>
|
|
107
|
+
}
|
|
108
|
+
case 'lastSchedule': {
|
|
109
|
+
const last = getCNPGScheduledBackupLastSchedule(resource)
|
|
110
|
+
return <span className="text-sm text-theme-text-secondary">{last}</span>
|
|
111
|
+
}
|
|
112
|
+
case 'suspended': {
|
|
113
|
+
const suspended = getCNPGScheduledBackupIsSuspended(resource)
|
|
114
|
+
return (
|
|
115
|
+
<span className={clsx('text-sm', suspended ? 'text-yellow-400' : 'text-theme-text-tertiary')}>
|
|
116
|
+
{suspended ? 'Yes' : '-'}
|
|
117
|
+
</span>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function CNPGPoolerCell({ resource, column }: { resource: any; column: string }) {
|
|
126
|
+
switch (column) {
|
|
127
|
+
case 'status': {
|
|
128
|
+
const status = getCNPGPoolerStatus(resource)
|
|
129
|
+
return (
|
|
130
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
131
|
+
{status.text}
|
|
132
|
+
</span>
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
case 'cluster': {
|
|
136
|
+
const cluster = getCNPGPoolerCluster(resource)
|
|
137
|
+
return <span className="text-sm text-theme-text-secondary">{cluster}</span>
|
|
138
|
+
}
|
|
139
|
+
case 'type': {
|
|
140
|
+
const type = getCNPGPoolerType(resource)
|
|
141
|
+
return (
|
|
142
|
+
<span className={clsx(
|
|
143
|
+
'inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium',
|
|
144
|
+
type === 'rw' ? 'bg-blue-500/20 text-blue-400' : 'bg-purple-500/20 text-purple-400'
|
|
145
|
+
)}>
|
|
146
|
+
{type}
|
|
147
|
+
</span>
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
case 'poolMode': {
|
|
151
|
+
const mode = getCNPGPoolerMode(resource)
|
|
152
|
+
return <span className="text-sm text-theme-text-secondary">{mode}</span>
|
|
153
|
+
}
|
|
154
|
+
case 'instances': {
|
|
155
|
+
const instances = getCNPGPoolerInstances(resource)
|
|
156
|
+
return <span className="text-sm text-theme-text-secondary">{instances}</span>
|
|
157
|
+
}
|
|
158
|
+
default:
|
|
159
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// External Secrets Operator cell components for ResourcesView table
|
|
2
|
+
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import {
|
|
5
|
+
getExternalSecretStatus,
|
|
6
|
+
getExternalSecretStore,
|
|
7
|
+
getExternalSecretRefreshInterval,
|
|
8
|
+
getExternalSecretLastSync,
|
|
9
|
+
getExternalSecretProvider,
|
|
10
|
+
getClusterExternalSecretStatus,
|
|
11
|
+
getClusterExternalSecretNamespaceCount,
|
|
12
|
+
getClusterExternalSecretFailedCount,
|
|
13
|
+
getSecretStoreStatus,
|
|
14
|
+
getSecretStoreProviderType,
|
|
15
|
+
getClusterSecretStoreStatus,
|
|
16
|
+
} from '../resource-utils-eso'
|
|
17
|
+
|
|
18
|
+
export function ExternalSecretCell({ resource, column }: { resource: any; column: string }) {
|
|
19
|
+
switch (column) {
|
|
20
|
+
case 'status': {
|
|
21
|
+
const status = getExternalSecretStatus(resource)
|
|
22
|
+
return (
|
|
23
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
24
|
+
{status.text}
|
|
25
|
+
</span>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
case 'store': {
|
|
29
|
+
const store = getExternalSecretStore(resource)
|
|
30
|
+
return (
|
|
31
|
+
<span className="text-sm text-theme-text-secondary truncate block" title={`${store.kind}/${store.name}`}>
|
|
32
|
+
{store.name}
|
|
33
|
+
</span>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
case 'provider': {
|
|
37
|
+
const provider = getExternalSecretProvider(resource)
|
|
38
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{provider}</span>
|
|
39
|
+
}
|
|
40
|
+
case 'refreshInterval': {
|
|
41
|
+
const interval = getExternalSecretRefreshInterval(resource)
|
|
42
|
+
return <span className="text-sm text-theme-text-secondary">{interval}</span>
|
|
43
|
+
}
|
|
44
|
+
case 'lastSync': {
|
|
45
|
+
const lastSync = getExternalSecretLastSync(resource)
|
|
46
|
+
return <span className="text-sm text-theme-text-secondary">{lastSync}</span>
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function ClusterExternalSecretCell({ resource, column }: { resource: any; column: string }) {
|
|
54
|
+
switch (column) {
|
|
55
|
+
case 'status': {
|
|
56
|
+
const status = getClusterExternalSecretStatus(resource)
|
|
57
|
+
return (
|
|
58
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
59
|
+
{status.text}
|
|
60
|
+
</span>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
case 'namespaces': {
|
|
64
|
+
const count = getClusterExternalSecretNamespaceCount(resource)
|
|
65
|
+
return <span className="text-sm text-theme-text-secondary">{count > 0 ? count : '-'}</span>
|
|
66
|
+
}
|
|
67
|
+
case 'failed': {
|
|
68
|
+
const failedCount = getClusterExternalSecretFailedCount(resource)
|
|
69
|
+
if (failedCount > 0) {
|
|
70
|
+
return <span className="text-sm text-red-400 font-medium">{failedCount}</span>
|
|
71
|
+
}
|
|
72
|
+
return <span className="text-sm text-theme-text-secondary">0</span>
|
|
73
|
+
}
|
|
74
|
+
default:
|
|
75
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function SecretStoreCell({ resource, column }: { resource: any; column: string }) {
|
|
80
|
+
switch (column) {
|
|
81
|
+
case 'status': {
|
|
82
|
+
const status = getSecretStoreStatus(resource)
|
|
83
|
+
return (
|
|
84
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
85
|
+
{status.text}
|
|
86
|
+
</span>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
case 'provider': {
|
|
90
|
+
const provider = getSecretStoreProviderType(resource)
|
|
91
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{provider}</span>
|
|
92
|
+
}
|
|
93
|
+
default:
|
|
94
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function ClusterSecretStoreCell({ resource, column }: { resource: any; column: string }) {
|
|
99
|
+
switch (column) {
|
|
100
|
+
case 'status': {
|
|
101
|
+
const status = getClusterSecretStoreStatus(resource)
|
|
102
|
+
return (
|
|
103
|
+
<span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-xs font-medium', status.color)}>
|
|
104
|
+
{status.text}
|
|
105
|
+
</span>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
case 'provider': {
|
|
109
|
+
const provider = getSecretStoreProviderType(resource)
|
|
110
|
+
return <span className="text-sm text-theme-text-secondary truncate block">{provider}</span>
|
|
111
|
+
}
|
|
112
|
+
default:
|
|
113
|
+
return <span className="text-sm text-theme-text-tertiary">-</span>
|
|
114
|
+
}
|
|
115
|
+
}
|