@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
@@ -0,0 +1,223 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { renderToString } from 'react-dom/server'
3
+ import { CalicoNetworkPolicyRenderer } from './CalicoNetworkPolicyRenderer'
4
+
5
+ describe('CalicoNetworkPolicyRenderer', () => {
6
+ it('renders policy metadata and operational rule fields', () => {
7
+ const html = renderToString(
8
+ <CalicoNetworkPolicyRenderer
9
+ data={{
10
+ apiVersion: 'crd.projectcalico.org/v1',
11
+ kind: 'StagedGlobalNetworkPolicy',
12
+ spec: {
13
+ selector: "app == 'api'",
14
+ namespaceSelector: "project == 'prod'",
15
+ serviceAccountSelector: "role == 'api'",
16
+ tier: 'security',
17
+ order: 100,
18
+ types: ['Ingress', 'Egress'],
19
+ stagedAction: 'Set',
20
+ preDNAT: true,
21
+ applyOnForward: true,
22
+ doNotTrack: false,
23
+ performanceHints: ['AssumeNeededOnEveryPacket'],
24
+ ingress: [
25
+ {
26
+ action: 'Deny',
27
+ protocol: 'TCP',
28
+ notProtocol: 'UDP',
29
+ source: {
30
+ selector: "role == 'frontend'",
31
+ notSelector: "app == 'debug'",
32
+ namespaceSelector: "team == 'payments'",
33
+ notNamespaceSelector: "env == 'test'",
34
+ nets: ['10.0.0.0/8'],
35
+ notNets: ['10.1.0.0/16'],
36
+ serviceAccounts: {
37
+ names: ['frontend'],
38
+ selector: "track == 'stable'",
39
+ },
40
+ notServiceAccounts: { names: ['debug'] },
41
+ ports: [80, { port: 443, protocol: 'TCP', endPort: 445 }],
42
+ notPorts: [8080],
43
+ },
44
+ http: {
45
+ methods: ['GET'],
46
+ notMethods: ['DELETE'],
47
+ paths: ['/api'],
48
+ notPaths: ['/admin'],
49
+ },
50
+ icmp: { type: 8, code: 0 },
51
+ notICMP: { type: 3 },
52
+ },
53
+ ],
54
+ egress: [
55
+ {
56
+ action: 'Allow',
57
+ destination: {
58
+ selector: "app == 'db'",
59
+ nets: ['192.168.0.0/16'],
60
+ ports: ['5432'],
61
+ },
62
+ },
63
+ ],
64
+ },
65
+ }}
66
+ />,
67
+ )
68
+
69
+ for (const value of [
70
+ 'StagedGlobalNetworkPolicy',
71
+ 'Policy Flow',
72
+ 'app == &#x27;api&#x27;',
73
+ 'project == &#x27;prod&#x27;',
74
+ 'role == &#x27;api&#x27;',
75
+ 'security',
76
+ '100',
77
+ 'Ingress',
78
+ 'Egress',
79
+ 'Deny',
80
+ 'Pre-DNAT',
81
+ 'Apply On Forward',
82
+ 'Do Not Track',
83
+ 'AssumeNeededOnEveryPacket',
84
+ 'Source',
85
+ 'role == &#x27;frontend&#x27;',
86
+ 'app == &#x27;debug&#x27;',
87
+ 'team == &#x27;payments&#x27;',
88
+ 'env == &#x27;test&#x27;',
89
+ '10.0.0.0/8',
90
+ '10.1.0.0/16',
91
+ 'frontend',
92
+ 'Source Ports',
93
+ 'Ports',
94
+ 'TCP/80',
95
+ 'TCP/443-445',
96
+ 'not TCP/8080',
97
+ 'HTTP',
98
+ 'GET',
99
+ 'DELETE',
100
+ '/api',
101
+ '/admin',
102
+ 'ICMP',
103
+ 'type 8, code 0',
104
+ 'Not ICMP',
105
+ 'type 3',
106
+ 'Destination',
107
+ 'db',
108
+ '192.168.0.0/16',
109
+ 'TCP/5432',
110
+ ]) {
111
+ expect(html).toContain(value)
112
+ }
113
+ expect(html).toContain('Allow')
114
+ expect(html).not.toContain('Rule 1')
115
+ expect(html).not.toContain('Not Ports')
116
+ expect(html).not.toMatch(/badge-sm[^>]*>TCP<\/span>/)
117
+ })
118
+
119
+ it('keeps a standalone protocol badge when detailed rules have no ports', () => {
120
+ const html = renderToString(
121
+ <CalicoNetworkPolicyRenderer
122
+ data={{
123
+ apiVersion: 'projectcalico.org/v3',
124
+ kind: 'NetworkPolicy',
125
+ spec: {
126
+ selector: "app == 'api'",
127
+ types: ['Ingress'],
128
+ ingress: [
129
+ {
130
+ action: 'Log',
131
+ protocol: 'TCP',
132
+ notProtocol: 'UDP',
133
+ source: { selector: "app == 'client'" },
134
+ },
135
+ ],
136
+ },
137
+ }}
138
+ />,
139
+ )
140
+
141
+ expect(html).toMatch(/badge-sm[^>]*>TCP<\/span>/)
142
+ expect(html).toContain('not')
143
+ expect(html).toContain('UDP')
144
+ expect(html).not.toContain('Source Ports')
145
+ })
146
+
147
+ it('does not show staged-only metadata for an ordinary policy', () => {
148
+ const html = renderToString(
149
+ <CalicoNetworkPolicyRenderer
150
+ data={{ kind: 'NetworkPolicy', spec: { selector: 'all()' } }}
151
+ />,
152
+ )
153
+
154
+ expect(html).toContain('CalicoNetworkPolicy')
155
+ expect(html).not.toContain('Staged Action')
156
+ })
157
+
158
+ it('renders Tier as a navigable cluster-scoped Calico reference', () => {
159
+ const html = renderToString(
160
+ <CalicoNetworkPolicyRenderer
161
+ data={{
162
+ apiVersion: 'projectcalico.org/v3',
163
+ kind: 'NetworkPolicy',
164
+ spec: { tier: 'security' },
165
+ }}
166
+ onNavigate={() => {}}
167
+ />,
168
+ )
169
+
170
+ expect(html).toMatch(/tier[\s\S]*security/)
171
+ expect(html).toContain('security')
172
+ expect(html).toContain('<button')
173
+ })
174
+ })
175
+
176
+ describe('CalicoNetworkPolicyRenderer staged deletions', () => {
177
+ it('says a deletion previews nothing instead of drawing a policy flow', () => {
178
+ const html = renderToString(
179
+ <CalicoNetworkPolicyRenderer
180
+ data={{
181
+ apiVersion: 'projectcalico.org/v3',
182
+ kind: 'StagedNetworkPolicy',
183
+ metadata: { name: 'db-lockdown', namespace: 'prod' },
184
+ // The Calico API rejects every other spec field alongside Delete.
185
+ spec: { stagedAction: 'Delete', tier: 'default' },
186
+ }}
187
+ />,
188
+ )
189
+
190
+ expect(html).toContain('Staged deletion')
191
+ expect(html).toContain('Nothing is previewed as protected')
192
+ expect(html).toContain('db-lockdown')
193
+ expect(html).not.toContain('all workloads')
194
+ // The flow diagram's own staged banner must not also render.
195
+ expect(html).not.toContain('Dashed paths are evaluated but not enforced')
196
+ })
197
+ })
198
+
199
+ describe('CalicoNetworkPolicyRenderer ignored staged policies', () => {
200
+ it('does not present an ignored staged policy as a preview of protection', () => {
201
+ const html = renderToString(
202
+ <CalicoNetworkPolicyRenderer
203
+ data={{
204
+ apiVersion: 'projectcalico.org/v3',
205
+ kind: 'StagedNetworkPolicy',
206
+ metadata: { name: 'parked', namespace: 'prod' },
207
+ // Ignore keeps its rules, but Calico skips the policy, so the rules
208
+ // preview nothing.
209
+ spec: {
210
+ stagedAction: 'Ignore',
211
+ selector: "app == 'web'",
212
+ types: ['Ingress'],
213
+ ingress: [{ action: 'Allow' }],
214
+ },
215
+ }}
216
+ />,
217
+ )
218
+
219
+ expect(html).toContain('Staged, ignored')
220
+ expect(html).toContain('Nothing is previewed as protected')
221
+ expect(html).not.toContain('Dashed paths are evaluated but not enforced')
222
+ })
223
+ })