@openshift-migration-advisor/shared-components 0.22.0-dd51551836b7 → 0.23.0-54185b7f1be8

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 (68) hide show
  1. package/README.md +6 -0
  2. package/dist/charts/MigrationDonutChart.d.ts +18 -1
  3. package/dist/charts/MigrationDonutChart.d.ts.map +1 -1
  4. package/dist/charts/MigrationDonutChart.js +103 -43
  5. package/dist/charts/index.d.ts +1 -1
  6. package/dist/charts/index.d.ts.map +1 -1
  7. package/dist/forms/RadioButtonFormGroup.d.ts.map +1 -1
  8. package/dist/forms/RadioButtonFormGroup.js +2 -2
  9. package/dist/report/FeatureStatusBadge.d.ts +7 -0
  10. package/dist/report/FeatureStatusBadge.d.ts.map +1 -0
  11. package/dist/report/FeatureStatusBadge.js +13 -0
  12. package/dist/report/HostPowerStates.d.ts +9 -0
  13. package/dist/report/HostPowerStates.d.ts.map +1 -0
  14. package/dist/report/HostPowerStates.js +11 -0
  15. package/dist/report/InfrastructureSummary.d.ts +7 -0
  16. package/dist/report/InfrastructureSummary.d.ts.map +1 -0
  17. package/dist/report/InfrastructureSummary.js +5 -0
  18. package/dist/report/OSDistribution.d.ts.map +1 -1
  19. package/dist/report/OSDistribution.js +5 -13
  20. package/dist/report/OsSupportTiersHelpPopover.d.ts.map +1 -1
  21. package/dist/report/OsSupportTiersHelpPopover.js +2 -31
  22. package/dist/report/OsUpgradeNotice.d.ts.map +1 -1
  23. package/dist/report/OsUpgradeNotice.js +1 -5
  24. package/dist/report/PowerStateCard.d.ts +17 -0
  25. package/dist/report/PowerStateCard.d.ts.map +1 -0
  26. package/dist/report/PowerStateCard.js +7 -0
  27. package/dist/report/SupportTierBadge.d.ts.map +1 -1
  28. package/dist/report/SupportTierBadge.js +4 -2
  29. package/dist/report/VCenterClusterDetails.d.ts +10 -0
  30. package/dist/report/VCenterClusterDetails.d.ts.map +1 -0
  31. package/dist/report/VCenterClusterDetails.js +26 -0
  32. package/dist/report/VmPowerStates.d.ts +9 -0
  33. package/dist/report/VmPowerStates.d.ts.map +1 -0
  34. package/dist/report/VmPowerStates.js +11 -0
  35. package/dist/report/constants.d.ts +2 -0
  36. package/dist/report/constants.d.ts.map +1 -1
  37. package/dist/report/constants.js +2 -0
  38. package/dist/report/index.d.ts +10 -0
  39. package/dist/report/index.d.ts.map +1 -1
  40. package/dist/report/index.js +8 -0
  41. package/dist/report/infrastructureSummary.d.ts +82 -0
  42. package/dist/report/infrastructureSummary.d.ts.map +1 -0
  43. package/dist/report/infrastructureSummary.js +139 -0
  44. package/dist/report/powerStates.d.ts +11 -0
  45. package/dist/report/powerStates.d.ts.map +1 -0
  46. package/dist/report/powerStates.js +113 -0
  47. package/package.json +1 -1
  48. package/src/charts/MigrationDonutChart.tsx +232 -111
  49. package/src/charts/index.ts +1 -0
  50. package/src/forms/RadioButtonFormGroup.tsx +10 -3
  51. package/src/report/FeatureStatusBadge.tsx +30 -0
  52. package/src/report/HostPowerStates.tsx +41 -0
  53. package/src/report/InfrastructureSummary.tsx +56 -0
  54. package/src/report/OSDistribution.tsx +60 -67
  55. package/src/report/OsSupportTiersHelpPopover.tsx +32 -61
  56. package/src/report/OsUpgradeNotice.tsx +1 -7
  57. package/src/report/PowerStateCard.tsx +73 -0
  58. package/src/report/SupportTierBadge.tsx +4 -2
  59. package/src/report/VCenterClusterDetails.tsx +211 -0
  60. package/src/report/VmPowerStates.tsx +41 -0
  61. package/src/report/__tests__/HostPowerStates.test.tsx +47 -0
  62. package/src/report/__tests__/InfrastructureSummary.test.tsx +148 -0
  63. package/src/report/__tests__/infrastructureSummary.test.ts +224 -0
  64. package/src/report/__tests__/powerStates.test.ts +70 -0
  65. package/src/report/constants.ts +2 -0
  66. package/src/report/index.ts +56 -0
  67. package/src/report/infrastructureSummary.ts +281 -0
  68. package/src/report/powerStates.ts +169 -0
@@ -0,0 +1,47 @@
1
+ import "@testing-library/jest-dom";
2
+ import { cleanup, render, screen } from "@testing-library/react";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { HostPowerStates } from "../HostPowerStates.js";
5
+ import { VmPowerStates } from "../VmPowerStates.js";
6
+
7
+ vi.mock("../../charts/MigrationDonutChart.js", () => ({
8
+ MigrationDonutChart: ({
9
+ title,
10
+ subTitle,
11
+ }: {
12
+ title?: string;
13
+ subTitle?: string;
14
+ }): JSX.Element => (
15
+ <div data-testid="power-donut">
16
+ {title} {subTitle}
17
+ </div>
18
+ ),
19
+ }));
20
+
21
+ afterEach(() => cleanup());
22
+
23
+ describe("HostPowerStates", () => {
24
+ it("renders the host power donut from inventory data", () => {
25
+ render(<HostPowerStates hostPowerStates={{ green: 7 }} />);
26
+
27
+ expect(screen.getByText("ESXi host power states")).toBeInTheDocument();
28
+ expect(screen.getByTestId("power-donut")).toHaveTextContent("7 Hosts");
29
+ });
30
+
31
+ it("shows an empty state when host power data is missing", () => {
32
+ render(<HostPowerStates hostPowerStates={{}} />);
33
+
34
+ expect(
35
+ screen.getByText("Host power state data not collected"),
36
+ ).toBeInTheDocument();
37
+ });
38
+ });
39
+
40
+ describe("VmPowerStates", () => {
41
+ it("renders the VM power donut from inventory data", () => {
42
+ render(<VmPowerStates powerStates={{ poweredOff: 297, poweredOn: 53 }} />);
43
+
44
+ expect(screen.getByText("VM power states")).toBeInTheDocument();
45
+ expect(screen.getByTestId("power-donut")).toHaveTextContent("350 VMs");
46
+ });
47
+ });
@@ -0,0 +1,148 @@
1
+ import "@testing-library/jest-dom";
2
+ import { cleanup, render, screen } from "@testing-library/react";
3
+ import { afterEach, describe, expect, it } from "vitest";
4
+ import { InfrastructureSummary } from "../InfrastructureSummary.js";
5
+ import { VCenterClusterDetails } from "../VCenterClusterDetails.js";
6
+
7
+ afterEach(() => cleanup());
8
+
9
+ describe("InfrastructureSummary", () => {
10
+ it("renders inventory summary fields from the mapped model", () => {
11
+ render(
12
+ <InfrastructureSummary
13
+ summary={{
14
+ vmwareVersion: "vSphere 7.0.3",
15
+ datacenters: 1,
16
+ vCenters: 1,
17
+ esxiHosts: 12,
18
+ }}
19
+ />,
20
+ );
21
+
22
+ expect(screen.getByText("Infrastructure summary")).toBeInTheDocument();
23
+ expect(screen.getByText("vSphere 7.0.3")).toBeInTheDocument();
24
+ expect(screen.getByText("Datacenters")).toBeInTheDocument();
25
+ expect(screen.getByText("vCenters")).toBeInTheDocument();
26
+ expect(screen.getByText("ESXi hosts")).toBeInTheDocument();
27
+ expect(screen.getByText("12")).toBeInTheDocument();
28
+ });
29
+ });
30
+
31
+ describe("VCenterClusterDetails", () => {
32
+ it("renders the aggregate cluster table with feature statuses", () => {
33
+ render(
34
+ <VCenterClusterDetails
35
+ isAggregateView
36
+ rows={[
37
+ {
38
+ id: "Cluster-Prod-01",
39
+ name: "Cluster-Prod-01",
40
+ hosts: 5,
41
+ vms: 280,
42
+ vmotion: "enabled",
43
+ drs: "enabled",
44
+ vsan: "enabled",
45
+ },
46
+ {
47
+ id: "Cluster-Dev-02",
48
+ name: "Cluster-Dev-02",
49
+ hosts: 7,
50
+ vms: 350,
51
+ vmotion: "enabled",
52
+ drs: "disabled",
53
+ vsan: "enabled",
54
+ },
55
+ ]}
56
+ />,
57
+ );
58
+
59
+ expect(screen.getByText("vCenter cluster details")).toBeInTheDocument();
60
+ expect(screen.getByText("Cluster-Prod-01")).toBeInTheDocument();
61
+ expect(screen.getByText("Cluster-Dev-02")).toBeInTheDocument();
62
+ expect(screen.getAllByText("Enabled").length).toBeGreaterThan(0);
63
+ expect(screen.getByText("Disabled")).toBeInTheDocument();
64
+ });
65
+
66
+ it("limits the aggregate table height so long cluster lists can scroll", () => {
67
+ render(
68
+ <VCenterClusterDetails
69
+ isAggregateView
70
+ rows={Array.from({ length: 12 }, (_, index) => ({
71
+ id: `cluster-${index}`,
72
+ name: `cluster-${index}`,
73
+ hosts: index + 1,
74
+ vms: (index + 1) * 10,
75
+ vmotion: "unknown",
76
+ drs: "unknown",
77
+ vsan: "disabled",
78
+ }))}
79
+ />,
80
+ );
81
+
82
+ expect(
83
+ screen.getByTestId("vcenter-cluster-details-table").parentElement,
84
+ ).toHaveAttribute("data-scroll-constrained", "true");
85
+ });
86
+
87
+ it("does not clip the aggregate table in export mode", () => {
88
+ render(
89
+ <VCenterClusterDetails
90
+ isAggregateView
91
+ isExportMode
92
+ rows={Array.from({ length: 12 }, (_, index) => ({
93
+ id: `cluster-${index}`,
94
+ name: `cluster-${index}`,
95
+ hosts: index + 1,
96
+ vms: (index + 1) * 10,
97
+ vmotion: "unknown",
98
+ drs: "unknown",
99
+ vsan: "disabled",
100
+ }))}
101
+ />,
102
+ );
103
+
104
+ expect(
105
+ screen.getByTestId("vcenter-cluster-details-table").parentElement,
106
+ ).not.toHaveAttribute("data-scroll-constrained");
107
+ });
108
+
109
+ it("renders the detailed cluster cards for a single cluster", () => {
110
+ render(
111
+ <VCenterClusterDetails
112
+ isAggregateView={false}
113
+ rows={[]}
114
+ details={{
115
+ hosts: 7,
116
+ vms: 350,
117
+ networksDetected: 2,
118
+ vmotion: "enabled",
119
+ drs: "disabled",
120
+ ha: "enabled",
121
+ vsan: "disabled",
122
+ networks: [
123
+ {
124
+ name: "VDS-Dev",
125
+ vlanId: "10",
126
+ displayName: "VDS-Dev (VLAN 10)",
127
+ },
128
+ {
129
+ name: "VDS-Dev",
130
+ vlanId: "11",
131
+ displayName: "VDS-Dev (VLAN 11)",
132
+ },
133
+ ],
134
+ }}
135
+ />,
136
+ );
137
+
138
+ expect(screen.getByText("Core infrastructure")).toBeInTheDocument();
139
+ expect(screen.getByText("vSAN capabilities")).toBeInTheDocument();
140
+ expect(screen.getByText("Network topology")).toBeInTheDocument();
141
+ expect(screen.getByText("vMotion")).toBeInTheDocument();
142
+ expect(screen.getByText("DRS")).toBeInTheDocument();
143
+ expect(screen.getByText("HA")).toBeInTheDocument();
144
+ expect(screen.getByText("VDS-Dev (VLAN 10)")).toBeInTheDocument();
145
+ expect(screen.getByText("VDS-Dev (VLAN 11)")).toBeInTheDocument();
146
+ expect(screen.queryByText("VM encryption")).toBeNull();
147
+ });
148
+ });
@@ -0,0 +1,224 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ booleanToFeatureStatus,
4
+ buildClusterDetailRows,
5
+ buildClusterDetails,
6
+ buildInfrastructureSummary,
7
+ countVCenters,
8
+ formatVSphereVersion,
9
+ hostCapabilityStatus,
10
+ type InventoryCluster,
11
+ type InventoryHost,
12
+ type InventoryInfra,
13
+ visibleNetworks,
14
+ vsanStatus,
15
+ } from "../infrastructureSummary.js";
16
+
17
+ const createInfra = (
18
+ overrides: Partial<InventoryInfra> = {},
19
+ ): InventoryInfra => ({
20
+ totalHosts: 0,
21
+ networks: [],
22
+ datastores: [],
23
+ ...overrides,
24
+ });
25
+
26
+ describe("formatVSphereVersion", () => {
27
+ it("formats API versions as vSphere labels and drops trailing build zeros", () => {
28
+ expect(formatVSphereVersion("7.0.3.0")).toBe("vSphere 7.0.3");
29
+ expect(formatVSphereVersion("8.0.3.0")).toBe("vSphere 8.0.3");
30
+ });
31
+
32
+ it("keeps an existing vSphere prefix and missing values", () => {
33
+ expect(formatVSphereVersion("vSphere 7.0.3")).toBe("vSphere 7.0.3");
34
+ expect(formatVSphereVersion(undefined)).toBe("—");
35
+ expect(formatVSphereVersion("")).toBe("—");
36
+ });
37
+ });
38
+
39
+ describe("feature status helpers", () => {
40
+ it("maps booleans to enabled, disabled, or unknown", () => {
41
+ expect(booleanToFeatureStatus(true)).toBe("enabled");
42
+ expect(booleanToFeatureStatus(false)).toBe("disabled");
43
+ expect(booleanToFeatureStatus(undefined)).toBe("unknown");
44
+ });
45
+
46
+ it("treats vMotion as enabled when any host supports it", () => {
47
+ const hosts: InventoryHost[] = [
48
+ { vmotionSupported: false },
49
+ { vmotionSupported: true },
50
+ ];
51
+ expect(hostCapabilityStatus(hosts, "vmotionSupported")).toBe("enabled");
52
+ });
53
+
54
+ it("treats vMotion as disabled when every known host reports false", () => {
55
+ const hosts: InventoryHost[] = [
56
+ { vmotionSupported: false },
57
+ { vmotionSupported: false },
58
+ ];
59
+ expect(hostCapabilityStatus(hosts, "vmotionSupported")).toBe("disabled");
60
+ });
61
+
62
+ it("treats missing host capability flags as unknown", () => {
63
+ expect(hostCapabilityStatus([{}], "vmotionSupported")).toBe("unknown");
64
+ expect(hostCapabilityStatus([], "vmotionSupported")).toBe("unknown");
65
+ });
66
+
67
+ it("detects vSAN from datastore type or disk type", () => {
68
+ expect(
69
+ vsanStatus(
70
+ createInfra({
71
+ datastores: [{ type: "vSAN" }],
72
+ }),
73
+ ),
74
+ ).toBe("enabled");
75
+ expect(
76
+ vsanStatus(createInfra(), { total: 10, diskTypes: { vSAN: {} } }),
77
+ ).toBe("enabled");
78
+ expect(vsanStatus(createInfra({ datastores: [] }))).toBe("disabled");
79
+ expect(vsanStatus()).toBe("unknown");
80
+ });
81
+ });
82
+
83
+ describe("buildInfrastructureSummary", () => {
84
+ it("maps inventory metadata into the summary card model", () => {
85
+ const summary = buildInfrastructureSummary({
86
+ infra: createInfra({
87
+ totalHosts: 12,
88
+ totalDatacenters: 1,
89
+ }),
90
+ vcenterVersion: "7.0.3.0",
91
+ vcenterId: "vc-1",
92
+ clusters: {},
93
+ });
94
+
95
+ expect(summary).toEqual({
96
+ vmwareVersion: "vSphere 7.0.3",
97
+ datacenters: 1,
98
+ vCenters: 1,
99
+ esxiHosts: 12,
100
+ });
101
+ });
102
+
103
+ it("falls back to clustersPerDatacenter length and unique vCenter ids", () => {
104
+ const summary = buildInfrastructureSummary({
105
+ infra: createInfra({
106
+ totalHosts: 7,
107
+ clustersPerDatacenter: [1, 1],
108
+ }),
109
+ clusters: {
110
+ A: {
111
+ infra: createInfra(),
112
+ vms: { total: 1 },
113
+ vcenter: { id: "vc-a" },
114
+ },
115
+ B: {
116
+ infra: createInfra(),
117
+ vms: { total: 1 },
118
+ vcenter: { id: "vc-b" },
119
+ },
120
+ },
121
+ });
122
+
123
+ expect(summary.datacenters).toBe(2);
124
+ expect(summary.vCenters).toBe(2);
125
+ });
126
+ });
127
+
128
+ describe("countVCenters", () => {
129
+ it("returns undefined when no vCenter identity is present", () => {
130
+ expect(countVCenters(undefined, undefined)).toBeUndefined();
131
+ });
132
+ });
133
+
134
+ describe("cluster details", () => {
135
+ it("builds sorted aggregate rows from cluster features", () => {
136
+ const clusters: Record<string, InventoryCluster> = {
137
+ "Cluster-Dev-02": {
138
+ infra: createInfra({
139
+ totalHosts: 7,
140
+ hosts: [{ vmotionSupported: true }],
141
+ datastores: [],
142
+ }),
143
+ vms: { total: 350 },
144
+ clusterFeatures: { drsEnabled: false, haEnabled: true },
145
+ },
146
+ "Cluster-Prod-01": {
147
+ infra: createInfra({
148
+ totalHosts: 5,
149
+ hosts: [{ vmotionSupported: true }],
150
+ datastores: [{ type: "vSAN" }],
151
+ }),
152
+ vms: { total: 280 },
153
+ clusterFeatures: { drsEnabled: true, haEnabled: true },
154
+ },
155
+ };
156
+
157
+ const rows = buildClusterDetailRows(clusters);
158
+ expect(rows.map((row) => row.name)).toEqual([
159
+ "Cluster-Dev-02",
160
+ "Cluster-Prod-01",
161
+ ]);
162
+ expect(rows[0]).toMatchObject({
163
+ hosts: 7,
164
+ vms: 350,
165
+ vmotion: "enabled",
166
+ drs: "disabled",
167
+ vsan: "disabled",
168
+ });
169
+ expect(rows[1]).toMatchObject({
170
+ hosts: 5,
171
+ vms: 280,
172
+ drs: "enabled",
173
+ vsan: "enabled",
174
+ });
175
+ });
176
+
177
+ it("builds the detailed cluster model including HA and network labels", () => {
178
+ const details = buildClusterDetails({
179
+ infra: createInfra({
180
+ totalHosts: 7,
181
+ hosts: [{ vmotionSupported: true }],
182
+ networks: [
183
+ { type: "distributed", name: "VDS-Dev", vlanId: "10" },
184
+ { type: "distributed", name: "VDS-Dev", vlanId: "11" },
185
+ { type: "dvswitch", name: "vDSwitch0" },
186
+ ],
187
+ }),
188
+ vms: { total: 350 },
189
+ clusterFeatures: { drsEnabled: false, haEnabled: true },
190
+ });
191
+
192
+ expect(details).toMatchObject({
193
+ hosts: 7,
194
+ vms: 350,
195
+ networksDetected: 2,
196
+ vmotion: "enabled",
197
+ drs: "disabled",
198
+ ha: "enabled",
199
+ vsan: "disabled",
200
+ });
201
+ expect(details?.networks.map((network) => network.displayName)).toEqual([
202
+ "VDS-Dev (VLAN 10)",
203
+ "VDS-Dev (VLAN 11)",
204
+ ]);
205
+ });
206
+ });
207
+
208
+ describe("visibleNetworks", () => {
209
+ it("omits unnamed networks and dvswitches", () => {
210
+ expect(
211
+ visibleNetworks(
212
+ createInfra({
213
+ networks: [
214
+ { type: "distributed", name: " " },
215
+ { type: "dvswitch", name: "switch" },
216
+ { type: "standard", name: "VM Network" },
217
+ ],
218
+ }),
219
+ ),
220
+ ).toEqual([
221
+ { name: "VM Network", vlanId: undefined, displayName: "VM Network" },
222
+ ]);
223
+ });
224
+ });
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildHostPowerStateChart,
4
+ buildVmPowerStateChart,
5
+ } from "../powerStates.js";
6
+
7
+ describe("buildHostPowerStateChart", () => {
8
+ it("maps overallStatus green to powered on and keeps zero categories", () => {
9
+ const chart = buildHostPowerStateChart({ green: 7 });
10
+
11
+ expect(chart.total).toBe(7);
12
+ expect(chart.slices.map((slice) => [slice.name, slice.count])).toEqual([
13
+ ["Powered on", 7],
14
+ ["Powered off", 0],
15
+ ["Standby", 0],
16
+ ["Not responding", 0],
17
+ ["Maintenance", 0],
18
+ ]);
19
+ expect(chart.slices[0].countDisplay).toBe("7 hosts");
20
+ });
21
+
22
+ it("maps explicit host power and maintenance keys", () => {
23
+ const chart = buildHostPowerStateChart({
24
+ poweredOn: 5,
25
+ poweredOff: 1,
26
+ standBy: 1,
27
+ notResponding: 1,
28
+ inMaintenanceMode: 2,
29
+ });
30
+
31
+ expect(chart.total).toBe(10);
32
+ expect(
33
+ chart.slices.find((slice) => slice.name === "Maintenance")?.count,
34
+ ).toBe(2);
35
+ expect(
36
+ chart.slices.find((slice) => slice.name === "Not responding")?.count,
37
+ ).toBe(1);
38
+ });
39
+ });
40
+
41
+ describe("buildVmPowerStateChart", () => {
42
+ it("maps VM power states and omits unused suspended", () => {
43
+ const chart = buildVmPowerStateChart({
44
+ poweredOff: 297,
45
+ poweredOn: 53,
46
+ });
47
+
48
+ expect(chart.total).toBe(350);
49
+ expect(chart.slices.map((slice) => [slice.name, slice.count])).toEqual([
50
+ ["Powered off", 297],
51
+ ["Powered on", 53],
52
+ ]);
53
+ expect(chart.slices[0].countDisplay).toBe("297 VMs");
54
+ });
55
+
56
+ it("includes suspended when present", () => {
57
+ const chart = buildVmPowerStateChart({
58
+ poweredOn: 10,
59
+ poweredOff: 2,
60
+ suspended: 1,
61
+ });
62
+
63
+ expect(chart.slices.map((slice) => slice.name)).toEqual([
64
+ "Powered off",
65
+ "Powered on",
66
+ "Suspended",
67
+ ]);
68
+ expect(chart.slices[2].countDisplay).toBe("1 VM");
69
+ });
70
+ });
@@ -25,4 +25,6 @@ export const REPORT_CARD_EMPTY_STATE_TITLES = {
25
25
  operatingSystems: "Operating system data not collected",
26
26
  migrationStatus: "Migration status data not collected",
27
27
  issuesBreakdown: "Issues breakdown data not collected",
28
+ hostPowerStates: "Host power state data not collected",
29
+ vmPowerStates: "VM power state data not collected",
28
30
  } as const;
@@ -17,6 +17,43 @@ export {
17
17
  EmptySearchResults,
18
18
  type EmptySearchResultsProps,
19
19
  } from "./EmptySearchResults.js";
20
+ export {
21
+ FeatureStatusBadge,
22
+ type FeatureStatusBadgeProps,
23
+ } from "./FeatureStatusBadge.js";
24
+ export {
25
+ HostPowerStates,
26
+ type HostPowerStatesProps,
27
+ } from "./HostPowerStates.js";
28
+ export {
29
+ InfrastructureSummary,
30
+ type InfrastructureSummaryProps,
31
+ } from "./InfrastructureSummary.js";
32
+ export type {
33
+ ClusterDetailRow,
34
+ ClusterDetailsModel,
35
+ FeatureStatus,
36
+ HostCapability,
37
+ InfrastructureSummaryModel,
38
+ InventoryCluster,
39
+ InventoryDatastore,
40
+ InventoryHost,
41
+ InventoryInfra,
42
+ InventoryNetwork,
43
+ InventoryVms,
44
+ NetworkLabel,
45
+ } from "./infrastructureSummary.js";
46
+ export {
47
+ booleanToFeatureStatus,
48
+ buildClusterDetailRows,
49
+ buildClusterDetails,
50
+ buildInfrastructureSummary,
51
+ countVCenters,
52
+ formatVSphereVersion,
53
+ hostCapabilityStatus,
54
+ visibleNetworks,
55
+ vsanStatus,
56
+ } from "./infrastructureSummary.js";
20
57
  export { OSBarChart, OSDistribution } from "./OSDistribution.js";
21
58
  export { OsSupportTiersHelpPopover } from "./OsSupportTiersHelpPopover.js";
22
59
  export { OsUpgradeNotice } from "./OsUpgradeNotice.js";
@@ -45,6 +82,17 @@ export {
45
82
  SupportTier,
46
83
  } from "./osSupportTier.js";
47
84
  export { default as PopoverIcon } from "./PopoverIcon.js";
85
+ export {
86
+ PowerStateCard,
87
+ type PowerStateCardProps,
88
+ } from "./PowerStateCard.js";
89
+ export type { PowerStateChartModel } from "./powerStates.js";
90
+ export {
91
+ buildHostPowerStateChart,
92
+ buildVmPowerStateChart,
93
+ HOST_POWER_COLORS,
94
+ VM_POWER_COLORS,
95
+ } from "./powerStates.js";
48
96
  export { SupportTierBadge } from "./SupportTierBadge.js";
49
97
  export {
50
98
  ALL_TIERS_FILTER,
@@ -52,3 +100,11 @@ export {
52
100
  type OsTableRow,
53
101
  useOsBarChartViewModel,
54
102
  } from "./useOsBarChartViewModel.js";
103
+ export {
104
+ VCenterClusterDetails,
105
+ type VCenterClusterDetailsProps,
106
+ } from "./VCenterClusterDetails.js";
107
+ export {
108
+ VmPowerStates,
109
+ type VmPowerStatesProps,
110
+ } from "./VmPowerStates.js";