@skyhook-io/k8s-ui 1.12.0 → 1.13.3

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 (117) hide show
  1. package/package.json +4 -4
  2. package/src/components/applications/ApplicationDetail.tsx +2 -2
  3. package/src/components/cluster-switcher/ClusterSwitcher.tsx +32 -7
  4. package/src/components/issues/severity.ts +1 -0
  5. package/src/components/resources/ResourcesView.empty-note.test.ts +41 -0
  6. package/src/components/resources/ResourcesView.tsx +419 -9
  7. package/src/components/resources/index.ts +27 -0
  8. package/src/components/resources/kyverno-legacy-action.test.ts +98 -0
  9. package/src/components/resources/renderers/AnalysisRunRenderer.test.tsx +241 -0
  10. package/src/components/resources/renderers/AnalysisRunRenderer.tsx +166 -0
  11. package/src/components/resources/renderers/CNPGBackupRenderer.tsx +31 -2
  12. package/src/components/resources/renderers/CNPGClusterRenderer.test.tsx +33 -0
  13. package/src/components/resources/renderers/CNPGClusterRenderer.tsx +47 -4
  14. package/src/components/resources/renderers/CNPGDeclarativeRenderer.tsx +243 -0
  15. package/src/components/resources/renderers/CNPGObjectStoreRenderer.test.tsx +99 -0
  16. package/src/components/resources/renderers/CNPGObjectStoreRenderer.tsx +235 -0
  17. package/src/components/resources/renderers/CNPGScheduledBackupRenderer.tsx +23 -1
  18. package/src/components/resources/renderers/CNPGShared.tsx +27 -0
  19. package/src/components/resources/renderers/CalicoHostEndpointRenderer.tsx +71 -0
  20. package/src/components/resources/renderers/CalicoIPPoolRenderer.tsx +32 -0
  21. package/src/components/resources/renderers/CalicoNetworkPolicyDiagram.test.tsx +205 -0
  22. package/src/components/resources/renderers/CalicoNetworkPolicyDiagram.tsx +537 -0
  23. package/src/components/resources/renderers/CalicoNetworkPolicyRenderer.test.tsx +223 -0
  24. package/src/components/resources/renderers/CalicoNetworkPolicyRenderer.tsx +670 -0
  25. package/src/components/resources/renderers/CalicoTierRenderer.tsx +19 -0
  26. package/src/components/resources/renderers/KyvernoCELPolicyRenderers.tsx +13 -6
  27. package/src/components/resources/renderers/KyvernoExceptionRenderers.tsx +3 -2
  28. package/src/components/resources/renderers/KyvernoGlobalContextRenderer.test.ts +31 -0
  29. package/src/components/resources/renderers/KyvernoGlobalContextRenderer.tsx +124 -0
  30. package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +28 -2
  31. package/src/components/resources/renderers/KyvernoQueueRenderers.tsx +303 -0
  32. package/src/components/resources/renderers/LookupFailureNote.test.tsx +60 -0
  33. package/src/components/resources/renderers/LookupFailureNote.tsx +42 -0
  34. package/src/components/resources/renderers/NamespaceRenderer.test.ts +30 -0
  35. package/src/components/resources/renderers/NamespaceRenderer.tsx +7 -3
  36. package/src/components/resources/renderers/NetworkPolicyDiagram.tsx +27 -26
  37. package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +6 -3
  38. package/src/components/resources/renderers/PolicyCoverageSection.test.tsx +348 -0
  39. package/src/components/resources/renderers/PolicyCoverageSection.tsx +939 -0
  40. package/src/components/resources/renderers/PolicySection.test.tsx +59 -2
  41. package/src/components/resources/renderers/PolicySection.tsx +32 -5
  42. package/src/components/resources/renderers/RolloutRenderer.test.tsx +491 -0
  43. package/src/components/resources/renderers/RolloutRenderer.tsx +391 -92
  44. package/src/components/resources/renderers/VeleroBSLRenderer.test.tsx +374 -0
  45. package/src/components/resources/renderers/VeleroBSLRenderer.tsx +179 -3
  46. package/src/components/resources/renderers/VeleroBackupRenderer.test.tsx +221 -0
  47. package/src/components/resources/renderers/VeleroBackupRenderer.tsx +119 -6
  48. package/src/components/resources/renderers/VeleroBackupRepositoryRenderer.test.tsx +69 -0
  49. package/src/components/resources/renderers/VeleroBackupRepositoryRenderer.tsx +96 -0
  50. package/src/components/resources/renderers/VeleroRestoreRenderer.test.tsx +55 -0
  51. package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +22 -4
  52. package/src/components/resources/renderers/VeleroRunMessages.test.tsx +152 -0
  53. package/src/components/resources/renderers/VeleroRunMessages.tsx +139 -0
  54. package/src/components/resources/renderers/VeleroScheduleRenderer.test.tsx +88 -0
  55. package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +16 -6
  56. package/src/components/resources/renderers/calico-cells.tsx +177 -0
  57. package/src/components/resources/renderers/cnpg-cells.tsx +100 -0
  58. package/src/components/resources/renderers/index.ts +16 -1
  59. package/src/components/resources/renderers/kyverno-cells.tsx +81 -0
  60. package/src/components/resources/renderers/network-policy-peer-styles.ts +25 -0
  61. package/src/components/resources/renderers/velero-cells.tsx +29 -7
  62. package/src/components/resources/renderers/velero-dead-ends.test.tsx +142 -0
  63. package/src/components/resources/resource-utils-calico.test.ts +215 -0
  64. package/src/components/resources/resource-utils-calico.ts +261 -0
  65. package/src/components/resources/resource-utils-cnpg-declarative.test.ts +104 -0
  66. package/src/components/resources/resource-utils-cnpg-objectstore.test.ts +122 -0
  67. package/src/components/resources/resource-utils-cnpg.test.ts +54 -0
  68. package/src/components/resources/resource-utils-cnpg.ts +264 -3
  69. package/src/components/resources/resource-utils-kyverno-modern.ts +24 -0
  70. package/src/components/resources/resource-utils-kyverno-queue.test.ts +164 -0
  71. package/src/components/resources/resource-utils-kyverno-queue.ts +198 -0
  72. package/src/components/resources/resource-utils-kyverno.ts +43 -7
  73. package/src/components/resources/resource-utils-velero.test.ts +26 -0
  74. package/src/components/resources/resource-utils-velero.ts +68 -0
  75. package/src/components/resources/resource-utils.ts +98 -0
  76. package/src/components/shared/ResourceActionsBar.tsx +101 -16
  77. package/src/components/shared/ResourceRendererDispatch.test.tsx +379 -3
  78. package/src/components/shared/ResourceRendererDispatch.tsx +199 -22
  79. package/src/components/shared/index.ts +1 -1
  80. package/src/components/shared/revision-role-badges.test.ts +120 -0
  81. package/src/components/topology/K8sResourceNode.test.ts +10 -0
  82. package/src/components/topology/K8sResourceNode.tsx +22 -0
  83. package/src/components/topology/TopologyFilterSidebar.test.tsx +31 -0
  84. package/src/components/topology/TopologyFilterSidebar.tsx +5 -0
  85. package/src/components/topology/TopologyGraph.tsx +6 -6
  86. package/src/components/topology/TopologySearch.tsx +7 -0
  87. package/src/components/topology/layout.ts +3 -0
  88. package/src/components/trace/ReachabilityView.tsx +1 -0
  89. package/src/components/trace/TracePanel.tsx +13 -2
  90. package/src/components/trace/reachFixtures.ts +26 -1
  91. package/src/components/trace/reachGraphModel.test.ts +20 -0
  92. package/src/components/trace/reachGraphModel.ts +8 -1
  93. package/src/components/trace/reachOrigins.test.ts +31 -0
  94. package/src/components/trace/reachOrigins.ts +11 -1
  95. package/src/components/ui/Badge.tsx +10 -0
  96. package/src/components/ui/InClusterConsentDialog.tsx +5 -4
  97. package/src/components/ui/ScheduleValue.test.tsx +80 -0
  98. package/src/components/ui/ScheduleValue.tsx +85 -0
  99. package/src/components/ui/SelectMenu.tsx +202 -28
  100. package/src/components/ui/drawer-components.test.tsx +17 -1
  101. package/src/components/ui/drawer-components.tsx +9 -2
  102. package/src/components/ui/index.ts +2 -0
  103. package/src/components/workload/WorkloadView.tsx +5 -2
  104. package/src/types/core.ts +36 -4
  105. package/src/types/policy.ts +153 -2
  106. package/src/utils/clipboard.test.ts +86 -0
  107. package/src/utils/clipboard.ts +50 -0
  108. package/src/utils/extended-resources.ts +4 -7
  109. package/src/utils/format.test.ts +83 -1
  110. package/src/utils/format.ts +80 -1
  111. package/src/utils/inClusterConsent.test.ts +9 -0
  112. package/src/utils/inClusterConsent.ts +9 -9
  113. package/src/utils/index.ts +1 -0
  114. package/src/utils/navigation.test.ts +5 -0
  115. package/src/utils/navigation.ts +5 -0
  116. package/src/utils/resource-icons.test.ts +49 -2
  117. 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
+ })