@skyhook-io/k8s-ui 1.11.0 → 1.13.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.
Files changed (123) hide show
  1. package/package.json +4 -4
  2. package/src/components/gitops/GitOpsStatusBadge.tsx +40 -0
  3. package/src/components/gitops/GitOpsTableView.tsx +22 -2
  4. package/src/components/gitops/ReconcilingIndicator.test.tsx +31 -0
  5. package/src/components/gitops/detail-helpers.ts +4 -1
  6. package/src/components/issues/severity.ts +1 -0
  7. package/src/components/resources/ResourcesView.empty-note.test.ts +41 -0
  8. package/src/components/resources/ResourcesView.tsx +412 -5
  9. package/src/components/resources/index.ts +27 -0
  10. package/src/components/resources/kyverno-legacy-action.test.ts +98 -0
  11. package/src/components/resources/renderers/AlertRenderer.tsx +4 -1
  12. package/src/components/resources/renderers/AnalysisRunRenderer.test.tsx +241 -0
  13. package/src/components/resources/renderers/AnalysisRunRenderer.tsx +166 -0
  14. package/src/components/resources/renderers/CNPGBackupRenderer.tsx +31 -2
  15. package/src/components/resources/renderers/CNPGClusterRenderer.test.tsx +33 -0
  16. package/src/components/resources/renderers/CNPGClusterRenderer.tsx +71 -4
  17. package/src/components/resources/renderers/CNPGDeclarativeRenderer.tsx +243 -0
  18. package/src/components/resources/renderers/CNPGObjectStoreRenderer.test.tsx +99 -0
  19. package/src/components/resources/renderers/CNPGObjectStoreRenderer.tsx +235 -0
  20. package/src/components/resources/renderers/CNPGPoolerRenderer.tsx +11 -0
  21. package/src/components/resources/renderers/CNPGScheduledBackupRenderer.tsx +23 -1
  22. package/src/components/resources/renderers/CNPGShared.tsx +27 -0
  23. package/src/components/resources/renderers/CalicoHostEndpointRenderer.tsx +71 -0
  24. package/src/components/resources/renderers/CalicoIPPoolRenderer.tsx +32 -0
  25. package/src/components/resources/renderers/CalicoNetworkPolicyDiagram.test.tsx +205 -0
  26. package/src/components/resources/renderers/CalicoNetworkPolicyDiagram.tsx +537 -0
  27. package/src/components/resources/renderers/CalicoNetworkPolicyRenderer.test.tsx +223 -0
  28. package/src/components/resources/renderers/CalicoNetworkPolicyRenderer.tsx +670 -0
  29. package/src/components/resources/renderers/CalicoTierRenderer.tsx +19 -0
  30. package/src/components/resources/renderers/CompositeRenderer.test.tsx +81 -0
  31. package/src/components/resources/renderers/CompositeRenderer.tsx +67 -7
  32. package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +4 -1
  33. package/src/components/resources/renderers/GitRepositoryRenderer.tsx +4 -1
  34. package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +4 -1
  35. package/src/components/resources/renderers/KustomizationRenderer.tsx +4 -1
  36. package/src/components/resources/renderers/KyvernoCELPolicyRenderers.tsx +13 -6
  37. package/src/components/resources/renderers/KyvernoExceptionRenderers.tsx +3 -2
  38. package/src/components/resources/renderers/KyvernoGlobalContextRenderer.test.ts +31 -0
  39. package/src/components/resources/renderers/KyvernoGlobalContextRenderer.tsx +124 -0
  40. package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +28 -2
  41. package/src/components/resources/renderers/KyvernoQueueRenderers.tsx +303 -0
  42. package/src/components/resources/renderers/LookupFailureNote.test.tsx +60 -0
  43. package/src/components/resources/renderers/LookupFailureNote.tsx +42 -0
  44. package/src/components/resources/renderers/NetworkPolicyDiagram.tsx +27 -26
  45. package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +6 -3
  46. package/src/components/resources/renderers/OCIRepositoryRenderer.tsx +4 -1
  47. package/src/components/resources/renderers/PodRenderer.tsx +13 -0
  48. package/src/components/resources/renderers/PolicyCoverageSection.test.tsx +348 -0
  49. package/src/components/resources/renderers/PolicyCoverageSection.tsx +939 -0
  50. package/src/components/resources/renderers/PolicySection.test.tsx +159 -0
  51. package/src/components/resources/renderers/PolicySection.tsx +197 -0
  52. package/src/components/resources/renderers/RolloutRenderer.test.tsx +491 -0
  53. package/src/components/resources/renderers/RolloutRenderer.tsx +391 -92
  54. package/src/components/resources/renderers/VeleroBSLRenderer.test.tsx +374 -0
  55. package/src/components/resources/renderers/VeleroBSLRenderer.tsx +179 -3
  56. package/src/components/resources/renderers/VeleroBackupRenderer.test.tsx +221 -0
  57. package/src/components/resources/renderers/VeleroBackupRenderer.tsx +119 -6
  58. package/src/components/resources/renderers/VeleroBackupRepositoryRenderer.test.tsx +69 -0
  59. package/src/components/resources/renderers/VeleroBackupRepositoryRenderer.tsx +96 -0
  60. package/src/components/resources/renderers/VeleroRestoreRenderer.test.tsx +55 -0
  61. package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +22 -4
  62. package/src/components/resources/renderers/VeleroRunMessages.test.tsx +152 -0
  63. package/src/components/resources/renderers/VeleroRunMessages.tsx +139 -0
  64. package/src/components/resources/renderers/VeleroScheduleRenderer.test.tsx +88 -0
  65. package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +16 -6
  66. package/src/components/resources/renderers/WorkloadRenderer.tsx +15 -1
  67. package/src/components/resources/renderers/calico-cells.tsx +177 -0
  68. package/src/components/resources/renderers/cnpg-cells.tsx +100 -0
  69. package/src/components/resources/renderers/index.ts +16 -0
  70. package/src/components/resources/renderers/kyverno-cells.tsx +90 -0
  71. package/src/components/resources/renderers/network-policy-peer-styles.ts +25 -0
  72. package/src/components/resources/renderers/policyreport-subject.test.tsx +27 -0
  73. package/src/components/resources/renderers/velero-cells.tsx +29 -7
  74. package/src/components/resources/renderers/velero-dead-ends.test.tsx +142 -0
  75. package/src/components/resources/resource-utils-calico.test.ts +215 -0
  76. package/src/components/resources/resource-utils-calico.ts +261 -0
  77. package/src/components/resources/resource-utils-cnpg-declarative.test.ts +104 -0
  78. package/src/components/resources/resource-utils-cnpg-objectstore.test.ts +122 -0
  79. package/src/components/resources/resource-utils-cnpg.test.ts +117 -0
  80. package/src/components/resources/resource-utils-cnpg.ts +324 -3
  81. package/src/components/resources/resource-utils-crossplane.test.ts +68 -0
  82. package/src/components/resources/resource-utils-kyverno-modern.ts +24 -0
  83. package/src/components/resources/resource-utils-kyverno-queue.test.ts +164 -0
  84. package/src/components/resources/resource-utils-kyverno-queue.ts +198 -0
  85. package/src/components/resources/resource-utils-kyverno.ts +43 -7
  86. package/src/components/resources/resource-utils-velero.test.ts +26 -0
  87. package/src/components/resources/resource-utils-velero.ts +68 -0
  88. package/src/components/resources/resource-utils.ts +98 -0
  89. package/src/components/shared/ResourceActionsBar.tsx +101 -16
  90. package/src/components/shared/ResourceRendererDispatch.test.tsx +379 -3
  91. package/src/components/shared/ResourceRendererDispatch.tsx +199 -22
  92. package/src/components/shared/index.ts +1 -1
  93. package/src/components/shared/revision-role-badges.test.ts +120 -0
  94. package/src/components/topology/K8sResourceNode.test.ts +10 -0
  95. package/src/components/topology/K8sResourceNode.tsx +22 -0
  96. package/src/components/topology/TopologyFilterSidebar.test.tsx +31 -0
  97. package/src/components/topology/TopologyFilterSidebar.tsx +5 -0
  98. package/src/components/topology/TopologyGraph.tsx +6 -6
  99. package/src/components/topology/TopologySearch.tsx +7 -0
  100. package/src/components/topology/layout.ts +3 -0
  101. package/src/components/trace/ReachabilityView.tsx +1 -0
  102. package/src/components/trace/TracePanel.tsx +12 -2
  103. package/src/components/trace/reachFixtures.ts +26 -1
  104. package/src/components/trace/reachGraphModel.test.ts +20 -0
  105. package/src/components/trace/reachGraphModel.ts +8 -1
  106. package/src/components/trace/reachOrigins.test.ts +31 -0
  107. package/src/components/trace/reachOrigins.ts +11 -1
  108. package/src/components/ui/Badge.tsx +10 -0
  109. package/src/components/ui/ScheduleValue.test.tsx +80 -0
  110. package/src/components/ui/ScheduleValue.tsx +85 -0
  111. package/src/components/ui/drawer-components.test.tsx +17 -1
  112. package/src/components/ui/drawer-components.tsx +9 -2
  113. package/src/components/ui/index.ts +2 -0
  114. package/src/components/workload/WorkloadView.tsx +3 -0
  115. package/src/types/core.ts +29 -0
  116. package/src/types/gitops-flux-status.test.ts +163 -0
  117. package/src/types/gitops.ts +80 -24
  118. package/src/types/index.ts +1 -0
  119. package/src/types/policy.ts +193 -0
  120. package/src/utils/navigation.test.ts +5 -0
  121. package/src/utils/navigation.ts +5 -0
  122. package/src/utils/resource-icons.test.ts +49 -2
  123. package/src/utils/resource-icons.ts +29 -2
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { Database, Server, Puzzle } from 'lucide-react'
3
- import { getResourceIcon, DEFAULT_RESOURCE_ICON } from './resource-icons'
2
+ import { Database, Network, Server, ShieldCheck, Puzzle } from 'lucide-react'
3
+ import { getResourceIcon, getTopologyIcon, DEFAULT_RESOURCE_ICON } from './resource-icons'
4
4
 
5
5
  describe('getResourceIcon', () => {
6
6
  it('disambiguates colliding kinds by API group', () => {
@@ -14,6 +14,53 @@ describe('getResourceIcon', () => {
14
14
  // A third operator's `clusters` CRD must not inherit a Postgres icon.
15
15
  expect(getResourceIcon('Cluster', 'apps.kubeblocks.io')).toBe(DEFAULT_RESOURCE_ICON)
16
16
  expect(getResourceIcon('Backup', 'kubevirt.io')).toBe(DEFAULT_RESOURCE_ICON)
17
+ expect(getResourceIcon('HostEndpoint', 'networking.example.io')).toBe(DEFAULT_RESOURCE_ICON)
18
+ expect(getResourceIcon('IPPool', 'networking.example.io')).toBe(DEFAULT_RESOURCE_ICON)
19
+ expect(getResourceIcon('IPPool', 'extension.projectcalico.org')).toBe(DEFAULT_RESOURCE_ICON)
20
+ expect(getResourceIcon('Tier', 'extension.projectcalico.org')).toBe(DEFAULT_RESOURCE_ICON)
21
+ })
22
+
23
+ it('resolves Calico IPPool only for Calico API groups', () => {
24
+ expect(getResourceIcon('IPPool', 'crd.projectcalico.org')).toBe(Network)
25
+ expect(getResourceIcon('IPPool', 'projectcalico.org')).toBe(Network)
26
+ expect(getResourceIcon('IPPool')).toBe(DEFAULT_RESOURCE_ICON)
27
+ })
28
+
29
+ it('resolves Calico HostEndpoint only for Calico API groups', () => {
30
+ expect(getResourceIcon('HostEndpoint', 'crd.projectcalico.org')).toBe(Network)
31
+ expect(getResourceIcon('HostEndpoint', 'projectcalico.org')).toBe(Network)
32
+ expect(getResourceIcon('HostEndpoint')).toBe(DEFAULT_RESOURCE_ICON)
33
+ })
34
+
35
+ it('resolves Calico Tier only for Calico API groups', () => {
36
+ expect(getResourceIcon('Tier', 'crd.projectcalico.org')).toBe(Network)
37
+ expect(getResourceIcon('Tier', 'projectcalico.org')).toBe(Network)
38
+ expect(getResourceIcon('Tier')).toBe(DEFAULT_RESOURCE_ICON)
39
+ })
40
+
41
+ it('disambiguates NetworkPolicy and Calico policy kinds by API group', () => {
42
+ expect(getResourceIcon('NetworkPolicy', 'networking.k8s.io')).toBe(ShieldCheck)
43
+ expect(getResourceIcon('NetworkPolicy', 'projectcalico.org')).toBe(ShieldCheck)
44
+ expect(getResourceIcon('NetworkPolicy', 'crd.projectcalico.org')).toBe(ShieldCheck)
45
+ expect(getResourceIcon('NetworkPolicy', 'networking.example.io')).toBe(DEFAULT_RESOURCE_ICON)
46
+ expect(getResourceIcon('GlobalNetworkPolicy', 'projectcalico.org')).toBe(ShieldCheck)
47
+ expect(getResourceIcon('StagedNetworkPolicy', 'crd.projectcalico.org')).toBe(ShieldCheck)
48
+ expect(getResourceIcon('StagedGlobalNetworkPolicy', 'projectcalico.org')).toBe(ShieldCheck)
49
+ expect(getResourceIcon('StagedKubernetesNetworkPolicy', 'crd.projectcalico.org')).toBe(ShieldCheck)
50
+ expect(getResourceIcon('GlobalNetworkPolicy', 'networking.example.io')).toBe(DEFAULT_RESOURCE_ICON)
51
+ })
52
+
53
+ it('uses ShieldCheck for all Calico policy topology nodes', () => {
54
+ for (const kind of [
55
+ 'CalicoNetworkPolicy',
56
+ 'CalicoGlobalNetworkPolicy',
57
+ 'CalicoStagedNetworkPolicy',
58
+ 'CalicoStagedGlobalNetworkPolicy',
59
+ 'CalicoStagedKubernetesNetworkPolicy',
60
+ ]) {
61
+ expect(getTopologyIcon(kind)).toBe(ShieldCheck)
62
+ expect(getResourceIcon(kind)).toBe(ShieldCheck)
63
+ }
17
64
  })
18
65
 
19
66
  it('ignores the group for kinds that do not collide', () => {
@@ -20,6 +20,7 @@ import {
20
20
  ShieldAlert,
21
21
  Radio,
22
22
  Globe,
23
+ Network,
23
24
 
24
25
  // Config
25
26
  FileSliders,
@@ -96,6 +97,11 @@ const KIND_ICON_MAP: Record<string, LucideIcon> = {
96
97
  service: Plug,
97
98
  ingress: DoorOpen,
98
99
  networkpolicy: ShieldCheck,
100
+ caliconetworkpolicy: ShieldCheck,
101
+ calicoglobalnetworkpolicy: ShieldCheck,
102
+ calicostagednetworkpolicy: ShieldCheck,
103
+ calicostagedglobalnetworkpolicy: ShieldCheck,
104
+ calicostagedkubernetesnetworkpolicy: ShieldCheck,
99
105
  ciliumnetworkpolicy: ShieldCheck,
100
106
  ciliumclusterwidenetworkpolicy: ShieldCheck,
101
107
  clusternetworkpolicy: ShieldCheck,
@@ -291,13 +297,33 @@ const GROUP_QUALIFIED_KIND_ICONS: Record<string, Record<string, LucideIcon>> = {
291
297
  backup: { 'postgresql.cnpg.io': DatabaseBackup },
292
298
  scheduledbackup: { 'postgresql.cnpg.io': DatabaseBackup },
293
299
  pooler: { 'postgresql.cnpg.io': Waypoints },
300
+ networkpolicy: {
301
+ 'networking.k8s.io': ShieldCheck,
302
+ 'crd.projectcalico.org': ShieldCheck,
303
+ 'projectcalico.org': ShieldCheck,
304
+ },
305
+ hostendpoint: { 'crd.projectcalico.org': Network, 'projectcalico.org': Network },
306
+ ippool: { 'crd.projectcalico.org': Network, 'projectcalico.org': Network },
307
+ tier: { 'crd.projectcalico.org': Network, 'projectcalico.org': Network },
308
+ globalnetworkpolicy: { 'crd.projectcalico.org': ShieldCheck, 'projectcalico.org': ShieldCheck },
309
+ stagednetworkpolicy: { 'crd.projectcalico.org': ShieldCheck, 'projectcalico.org': ShieldCheck },
310
+ stagedglobalnetworkpolicy: { 'crd.projectcalico.org': ShieldCheck, 'projectcalico.org': ShieldCheck },
311
+ stagedkubernetesnetworkpolicy: { 'crd.projectcalico.org': ShieldCheck, 'projectcalico.org': ShieldCheck },
312
+ }
313
+
314
+ const TOPOLOGY_KIND_ICONS: Record<string, LucideIcon> = {
315
+ CalicoNetworkPolicy: ShieldCheck,
316
+ CalicoGlobalNetworkPolicy: ShieldCheck,
317
+ CalicoStagedNetworkPolicy: ShieldCheck,
318
+ CalicoStagedGlobalNetworkPolicy: ShieldCheck,
319
+ CalicoStagedKubernetesNetworkPolicy: ShieldCheck,
294
320
  }
295
321
 
296
322
  export function getResourceIcon(kind: string, group?: string): LucideIcon {
297
323
  const k = kind.toLowerCase()
298
324
  if (group) {
299
- const byGroup = GROUP_QUALIFIED_KIND_ICONS[k]?.[group]
300
- if (byGroup) return byGroup
325
+ const groupMap = GROUP_QUALIFIED_KIND_ICONS[k]
326
+ if (groupMap) return groupMap[group] ?? DEFAULT_RESOURCE_ICON
301
327
  }
302
328
  return KIND_ICON_MAP[k] ?? Puzzle
303
329
  }
@@ -306,6 +332,7 @@ export function getResourceIcon(kind: string, group?: string): LucideIcon {
306
332
  export function getTopologyIcon(kind: string): LucideIcon {
307
333
  if (kind === 'Internet') return Globe
308
334
  if (kind === 'PodGroup') return Boxes
335
+ if (TOPOLOGY_KIND_ICONS[kind]) return TOPOLOGY_KIND_ICONS[kind]
309
336
  return getResourceIcon(kind)
310
337
  }
311
338