@terasky/backstage-plugin-vcf-automation 1.2.0 → 1.3.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/dist/api/VcfAutomationClient.esm.js +104 -0
- package/dist/api/VcfAutomationClient.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCINamespaceDetails.esm.js +16 -2
- package/dist/components/VCFAutomationCCINamespaceDetails.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCINamespaceOverview.esm.js +35 -7
- package/dist/components/VCFAutomationCCINamespaceOverview.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCIResourceDetails.esm.js +115 -15
- package/dist/components/VCFAutomationCCIResourceDetails.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCIResourceOverview.esm.js +90 -14
- package/dist/components/VCFAutomationCCIResourceOverview.esm.js.map +1 -1
- package/dist/components/VCFAutomationVMPowerManagement.esm.js +262 -0
- package/dist/components/VCFAutomationVMPowerManagement.esm.js.map +1 -0
- package/dist/index.d.ts +79 -1
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
2
3
|
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
+
import { useAsync } from 'react-use';
|
|
3
6
|
import { InfoCard, StructuredMetadataTable, Table, CodeSnippet, StatusPending, StatusError, StatusOK } from '@backstage/core-components';
|
|
4
7
|
import { Typography, Grid, Card, CardContent, Tabs, Tab, Box, Chip, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';
|
|
5
8
|
import { makeStyles } from '@material-ui/core/styles';
|
|
6
9
|
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
7
|
-
import yaml from 'js-yaml';
|
|
8
|
-
import {
|
|
10
|
+
import * as yaml from 'js-yaml';
|
|
11
|
+
import { vcfAutomationApiRef } from '../api/VcfAutomationClient.esm.js';
|
|
9
12
|
|
|
10
13
|
const useStyles = makeStyles((theme) => ({
|
|
11
14
|
statusChip: {
|
|
@@ -55,21 +58,118 @@ const VCFAutomationCCIResourceDetails = () => {
|
|
|
55
58
|
const classes = useStyles();
|
|
56
59
|
const { entity } = useEntity();
|
|
57
60
|
const [tabValue, setTabValue] = useState(0);
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
const api = useApi(vcfAutomationApiRef);
|
|
62
|
+
const deploymentId = entity.spec?.system;
|
|
63
|
+
const resourceId = entity.metadata.name;
|
|
64
|
+
const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
|
|
65
|
+
const isStandalone = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-origin"] === "STANDALONE";
|
|
66
|
+
const annotationData = useMemo(() => {
|
|
67
|
+
const resourceProperties = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-properties"];
|
|
68
|
+
const resourceManifest = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-manifest"];
|
|
69
|
+
const resourceObject = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-object"];
|
|
70
|
+
const resourceContext2 = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-context"];
|
|
71
|
+
const resourceState2 = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-state"];
|
|
72
|
+
const syncStatus2 = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-sync-status"];
|
|
73
|
+
const createdAt2 = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-created-at"];
|
|
74
|
+
const origin2 = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-origin"];
|
|
75
|
+
return {
|
|
76
|
+
resourceData: resourceProperties && resourceProperties !== "{}" ? JSON.parse(resourceProperties) : null,
|
|
77
|
+
manifest: resourceManifest && resourceManifest !== "{}" ? JSON.parse(resourceManifest) : null,
|
|
78
|
+
objectData: resourceObject && resourceObject !== "{}" ? JSON.parse(resourceObject) : null,
|
|
79
|
+
resourceContext: resourceContext2 || "",
|
|
80
|
+
resourceState: resourceState2,
|
|
81
|
+
syncStatus: syncStatus2,
|
|
82
|
+
createdAt: createdAt2,
|
|
83
|
+
origin: origin2
|
|
84
|
+
};
|
|
85
|
+
}, [
|
|
86
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-properties"],
|
|
87
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-manifest"],
|
|
88
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-object"],
|
|
89
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-context"],
|
|
90
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-state"],
|
|
91
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-sync-status"],
|
|
92
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-created-at"],
|
|
93
|
+
entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-origin"]
|
|
94
|
+
]);
|
|
95
|
+
const needsApiCall = !annotationData.resourceData || !annotationData.manifest || !annotationData.objectData;
|
|
96
|
+
const { value: apiResourceData, loading, error } = useAsync(async () => {
|
|
97
|
+
if (!needsApiCall || !resourceId) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
if (isStandalone) {
|
|
102
|
+
const response = await api.getSupervisorResource(resourceId, instanceName);
|
|
103
|
+
if (response) {
|
|
104
|
+
return {
|
|
105
|
+
id: response.id,
|
|
106
|
+
properties: {
|
|
107
|
+
manifest: {
|
|
108
|
+
apiVersion: response.apiVersion,
|
|
109
|
+
kind: response.kind,
|
|
110
|
+
metadata: response.metadata,
|
|
111
|
+
spec: response.spec
|
|
112
|
+
},
|
|
113
|
+
object: {
|
|
114
|
+
apiVersion: response.apiVersion,
|
|
115
|
+
kind: response.kind,
|
|
116
|
+
metadata: response.metadata,
|
|
117
|
+
spec: response.spec,
|
|
118
|
+
status: response.status
|
|
119
|
+
},
|
|
120
|
+
context: JSON.stringify({
|
|
121
|
+
namespace: response.metadata.namespace,
|
|
122
|
+
apiVersion: response.apiVersion,
|
|
123
|
+
kind: response.kind,
|
|
124
|
+
standalone: true
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
if (!deploymentId) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
const response = await api.getDeploymentResources(deploymentId, instanceName);
|
|
134
|
+
let resources = null;
|
|
135
|
+
if (response) {
|
|
136
|
+
if (Array.isArray(response)) {
|
|
137
|
+
resources = response;
|
|
138
|
+
} else if (response.content && Array.isArray(response.content)) {
|
|
139
|
+
resources = response.content;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (resources) {
|
|
143
|
+
return resources.find((r) => r.id === resourceId);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
} catch (apiError) {
|
|
148
|
+
console.error("Failed to fetch resource data:", apiError);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}, [needsApiCall, isStandalone, deploymentId, resourceId, instanceName]);
|
|
152
|
+
const resourceData = annotationData.resourceData || apiResourceData;
|
|
153
|
+
const manifest = annotationData.manifest || apiResourceData?.properties?.manifest;
|
|
154
|
+
const objectData = annotationData.objectData || apiResourceData?.properties?.object;
|
|
155
|
+
const resourceContext = annotationData.resourceContext || apiResourceData?.properties?.context;
|
|
156
|
+
const resourceState = annotationData.resourceState;
|
|
157
|
+
const syncStatus = annotationData.syncStatus;
|
|
158
|
+
const createdAt = annotationData.createdAt;
|
|
159
|
+
const origin = annotationData.origin;
|
|
69
160
|
const handleTabChange = (_event, newValue) => {
|
|
70
161
|
setTabValue(newValue);
|
|
71
162
|
};
|
|
72
|
-
if (
|
|
163
|
+
if (loading) {
|
|
164
|
+
return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource Details", children: /* @__PURE__ */ jsx(Typography, { children: "Loading resource details..." }) });
|
|
165
|
+
}
|
|
166
|
+
if (error) {
|
|
167
|
+
return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource Details", children: /* @__PURE__ */ jsxs(Typography, { color: "error", children: [
|
|
168
|
+
"Error loading resource details: ",
|
|
169
|
+
error.message
|
|
170
|
+
] }) });
|
|
171
|
+
}
|
|
172
|
+
if (!resourceData && !manifest && !objectData) {
|
|
73
173
|
return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource Details", children: /* @__PURE__ */ jsx(Typography, { children: "No resource data available." }) });
|
|
74
174
|
}
|
|
75
175
|
const renderStatusIcon = (conditionStatus) => {
|
|
@@ -109,7 +209,7 @@ const VCFAutomationCCIResourceDetails = () => {
|
|
|
109
209
|
noRefs: true,
|
|
110
210
|
sortKeys: false
|
|
111
211
|
});
|
|
112
|
-
} catch (
|
|
212
|
+
} catch (error2) {
|
|
113
213
|
return JSON.stringify(data, null, 2);
|
|
114
214
|
}
|
|
115
215
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VCFAutomationCCIResourceDetails.esm.js","sources":["../../src/components/VCFAutomationCCIResourceDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n StructuredMetadataTable,\n StatusOK,\n StatusError,\n StatusPending,\n Table,\n TableColumn,\n CodeSnippet,\n} from '@backstage/core-components';\nimport { \n Grid, \n Typography, \n Chip, \n Box, \n Card, \n CardContent, \n Tabs, \n Tab,\n Accordion,\n AccordionSummary,\n AccordionDetails\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport yaml from 'js-yaml';\nimport { useState } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n statusChip: {\n marginRight: theme.spacing(1),\n marginBottom: theme.spacing(0.5),\n },\n sectionTitle: {\n marginBottom: theme.spacing(2),\n },\n conditionChip: {\n margin: theme.spacing(0.25),\n },\n card: {\n marginBottom: theme.spacing(2),\n },\n statusCard: {\n border: `1px solid ${theme.palette.divider}`,\n },\n dependencyChip: {\n margin: theme.spacing(0.25),\n cursor: 'pointer',\n },\n yamlContainer: {\n '& .MuiAccordionSummary-root': {\n minHeight: 48,\n },\n },\n tabPanel: {\n paddingTop: theme.spacing(2),\n },\n}));\n\ninterface Condition {\n type: string;\n status: string;\n lastTransitionTime?: string;\n reason?: string;\n message?: string;\n}\n\ninterface WaitCondition {\n type: string;\n status: string;\n}\n\nfunction TabPanel(props: { children?: React.ReactNode; index: number; value: number }) {\n const { children, value, index } = props;\n const classes = useStyles();\n\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`resource-tabpanel-${index}`}\n aria-labelledby={`resource-tab-${index}`}\n >\n {value === index && (\n <Box className={classes.tabPanel}>\n {children}\n </Box>\n )}\n </div>\n );\n}\n\nexport const VCFAutomationCCIResourceDetails = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const [tabValue, setTabValue] = useState(0);\n\n const resourceProperties = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-properties'];\n const resourceManifest = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-manifest'];\n const resourceObject = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-object'];\n const resourceContext = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-context'];\n const resourceState = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-state'];\n const syncStatus = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-sync-status'];\n const createdAt = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-created-at'];\n const origin = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-origin'];\n\n const resourceData = resourceProperties ? JSON.parse(resourceProperties) : null;\n const manifest = resourceManifest ? JSON.parse(resourceManifest) : null;\n const objectData = resourceObject ? JSON.parse(resourceObject) : null;\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setTabValue(newValue);\n };\n\n if (!resourceData) {\n return (\n <InfoCard title=\"CCI Supervisor Resource Details\">\n <Typography>No resource data available.</Typography>\n </InfoCard>\n );\n }\n\n const renderStatusIcon = (conditionStatus: string) => {\n switch (conditionStatus.toLowerCase()) {\n case 'true':\n return <StatusOK />;\n case 'false':\n return <StatusError />;\n default:\n return <StatusPending />;\n }\n };\n\n const reorderKubernetesResource = (data: any) => {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n // Standard Kubernetes resource field order\n const orderedFields = ['apiVersion', 'kind', 'metadata', 'spec', 'status', 'data'];\n const reordered: any = {};\n\n // Add fields in the correct order\n orderedFields.forEach(field => {\n if (data[field] !== undefined) {\n reordered[field] = data[field];\n }\n });\n\n // Add any remaining fields that weren't in our standard list\n Object.keys(data).forEach(field => {\n if (!orderedFields.includes(field)) {\n reordered[field] = data[field];\n }\n });\n\n return reordered;\n };\n\n const formatYaml = (data: any) => {\n try {\n const reorderedData = reorderKubernetesResource(data);\n return yaml.dump(reorderedData, { \n indent: 2, \n lineWidth: -1,\n noRefs: true,\n sortKeys: false \n });\n } catch (error) {\n return JSON.stringify(data, null, 2);\n }\n };\n\n const basicInfo = {\n 'Resource Name': entity.metadata.title || entity.metadata.name,\n 'Resource ID': resourceData.id || 'Unknown',\n 'Context': resourceContext || 'Unknown',\n 'Resource Link': resourceData.resourceLink || 'Not available',\n 'Count': resourceData.count?.toString() || 'N/A',\n 'Count Index': resourceData.countIndex?.toString() || 'N/A',\n 'Existing': resourceData.existing ? 'Yes' : 'No',\n 'State': resourceState || 'Unknown',\n 'Sync Status': syncStatus || 'Unknown',\n 'Origin': origin || 'Unknown',\n 'Created At': createdAt ? new Date(createdAt).toLocaleString() : 'Unknown',\n };\n\n const getManifestInfo = () => {\n if (!manifest) return {};\n \n const info: any = {};\n if (manifest.kind) info['Kind'] = manifest.kind;\n if (manifest.apiVersion) info['API Version'] = manifest.apiVersion;\n if (manifest.metadata?.name) info['Manifest Name'] = manifest.metadata.name;\n if (manifest.metadata?.namespace) info['Namespace'] = manifest.metadata.namespace;\n if (manifest.metadata?.labels) {\n const labelCount = Object.keys(manifest.metadata.labels).length;\n info['Labels'] = `${labelCount} label(s)`;\n }\n if (manifest.metadata?.annotations) {\n const annotationCount = Object.keys(manifest.metadata.annotations).length;\n info['Annotations'] = `${annotationCount} annotation(s)`;\n }\n \n return info;\n };\n\n const getObjectStatus = () => {\n if (!objectData?.status) return null;\n \n const status = objectData.status;\n const statusInfo: any = {};\n \n if (status.powerState) statusInfo['Power State'] = status.powerState;\n if (status.phase) statusInfo['Phase'] = status.phase;\n if (status.primaryIP4) statusInfo['Primary IP'] = status.primaryIP4;\n if (status.host) statusInfo['Host'] = status.host;\n if (status.zone) statusInfo['Zone'] = status.zone;\n if (status.uniqueID) statusInfo['Unique ID'] = status.uniqueID;\n if (status.instanceUUID) statusInfo['Instance UUID'] = status.instanceUUID;\n if (status.biosUUID) statusInfo['BIOS UUID'] = status.biosUUID;\n if (status.hardwareVersion) statusInfo['Hardware Version'] = status.hardwareVersion;\n if (status.changeBlockTracking !== undefined) statusInfo['Change Block Tracking'] = status.changeBlockTracking ? 'Enabled' : 'Disabled';\n \n return Object.keys(statusInfo).length > 0 ? statusInfo : null;\n };\n\n const manifestInfo = getManifestInfo();\n const objectStatus = getObjectStatus();\n\n const waitConditionColumns: TableColumn<WaitCondition>[] = [\n { \n title: 'Status', \n field: 'status',\n render: (rowData) => (\n <Box display=\"flex\" alignItems=\"center\">\n {renderStatusIcon(rowData.status)}\n <span style={{ marginLeft: 8 }}>{rowData.status}</span>\n </Box>\n ),\n },\n { title: 'Type', field: 'type' },\n ];\n\n const resourceConditionColumns: TableColumn<Condition>[] = [\n { \n title: 'Status', \n field: 'status',\n render: (rowData) => (\n <Box display=\"flex\" alignItems=\"center\">\n {renderStatusIcon(rowData.status)}\n <span style={{ marginLeft: 8 }}>{rowData.status}</span>\n </Box>\n ),\n },\n { title: 'Type', field: 'type' },\n { title: 'Last Transition', field: 'lastTransitionTime' },\n { title: 'Reason', field: 'reason' },\n { title: 'Message', field: 'message' },\n ];\n\n const getNetworkInfo = () => {\n if (!objectData?.status?.network) return null;\n \n const network = objectData.status.network;\n const networkInfo: any = {};\n \n if (network.primaryIP4) networkInfo['Primary IPv4'] = network.primaryIP4;\n if (network.interfaces && network.interfaces.length > 0) {\n networkInfo['Network Interfaces'] = `${network.interfaces.length} interface(s)`;\n \n network.interfaces.forEach((iface: any, index: number) => {\n if (iface.ip?.macAddr) networkInfo[`Interface ${index + 1} MAC`] = iface.ip.macAddr;\n if (iface.ip?.addresses && iface.ip.addresses.length > 0) {\n const primaryAddr = iface.ip.addresses.find((addr: any) => addr.state === 'preferred');\n if (primaryAddr) networkInfo[`Interface ${index + 1} IP`] = primaryAddr.address;\n }\n });\n }\n \n return Object.keys(networkInfo).length > 0 ? networkInfo : null;\n };\n\n const networkInfo = getNetworkInfo();\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Resource Overview\">\n <Grid container spacing={2}>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n State\n </Typography>\n <Typography variant=\"h4\">\n {resourceState || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Sync Status\n </Typography>\n <Typography variant=\"h4\">\n {syncStatus || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Kind\n </Typography>\n <Typography variant=\"h4\">\n {manifest?.kind || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Power State\n </Typography>\n <Typography variant=\"h4\">\n {objectData?.status?.powerState || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard>\n <Tabs value={tabValue} onChange={handleTabChange} aria-label=\"resource details tabs\">\n <Tab label=\"Basic Information\" />\n <Tab label=\"Manifest Details\" />\n <Tab label=\"Object Status\" />\n <Tab label=\"Conditions\" />\n <Tab label=\"YAML Views\" />\n </Tabs>\n\n <TabPanel value={tabValue} index={0}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <StructuredMetadataTable metadata={basicInfo} />\n </Grid>\n \n {entity.spec?.dependsOn && Array.isArray(entity.spec.dependsOn) && entity.spec.dependsOn.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Dependencies\n </Typography>\n <Box>\n {entity.spec.dependsOn\n .filter((dep): dep is string => typeof dep === 'string')\n .map((dep: string, index: number) => (\n <Chip\n key={index}\n label={dep}\n size=\"small\"\n className={classes.dependencyChip}\n color=\"primary\"\n variant=\"outlined\"\n />\n ))}\n </Box>\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={1}>\n <Grid container spacing={3}>\n {Object.keys(manifestInfo).length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Manifest Information\n </Typography>\n <StructuredMetadataTable metadata={manifestInfo} />\n </Grid>\n )}\n \n {manifest?.metadata?.labels && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Labels\n </Typography>\n <StructuredMetadataTable metadata={manifest.metadata.labels} />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={2}>\n <Grid container spacing={3}>\n {objectStatus && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Object Status\n </Typography>\n <StructuredMetadataTable metadata={objectStatus} />\n </Grid>\n )}\n \n {networkInfo && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Network Information\n </Typography>\n <StructuredMetadataTable metadata={networkInfo} />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={3}>\n <Grid container spacing={3}>\n {resourceData.wait?.conditions && resourceData.wait.conditions.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Wait Conditions\n </Typography>\n <Table\n columns={waitConditionColumns}\n data={resourceData.wait.conditions}\n options={{\n search: false,\n paging: false,\n padding: 'dense',\n }}\n />\n </Grid>\n )}\n\n {objectData?.status?.conditions && objectData.status.conditions.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Conditions\n </Typography>\n <Table\n columns={resourceConditionColumns}\n data={objectData.status.conditions}\n options={{\n search: true,\n paging: objectData.status.conditions.length > 10,\n pageSize: 10,\n padding: 'dense',\n }}\n />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={4}>\n <Grid container spacing={3}>\n {manifest && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer} defaultExpanded>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"manifest-content\"\n id=\"manifest-header\"\n >\n <Typography variant=\"h6\">Resource Manifest</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <CodeSnippet\n text={formatYaml(manifest)}\n language=\"yaml\"\n showLineNumbers\n customStyle={{ \n fontSize: '12px',\n maxHeight: '600px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n\n {objectData && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"object-content\"\n id=\"object-header\"\n >\n <Typography variant=\"h6\">Live Kubernetes Object</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <CodeSnippet\n text={formatYaml(objectData)}\n language=\"yaml\"\n showLineNumbers\n customStyle={{ \n fontSize: '12px',\n maxHeight: '600px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n </TabPanel>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};"],"names":["networkInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VCFAutomationCCIResourceDetails.esm.js","sources":["../../src/components/VCFAutomationCCIResourceDetails.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsync } from 'react-use';\nimport {\n InfoCard,\n StructuredMetadataTable,\n StatusOK,\n StatusError,\n StatusPending,\n Table,\n TableColumn,\n CodeSnippet,\n} from '@backstage/core-components';\nimport { \n Grid, \n Typography, \n Chip, \n Box, \n Card, \n CardContent, \n Tabs, \n Tab,\n Accordion,\n AccordionSummary,\n AccordionDetails\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport * as yaml from 'js-yaml';\nimport { vcfAutomationApiRef } from '../api';\n\nconst useStyles = makeStyles(theme => ({\n statusChip: {\n marginRight: theme.spacing(1),\n marginBottom: theme.spacing(0.5),\n },\n sectionTitle: {\n marginBottom: theme.spacing(2),\n },\n conditionChip: {\n margin: theme.spacing(0.25),\n },\n card: {\n marginBottom: theme.spacing(2),\n },\n statusCard: {\n border: `1px solid ${theme.palette.divider}`,\n },\n dependencyChip: {\n margin: theme.spacing(0.25),\n cursor: 'pointer',\n },\n yamlContainer: {\n '& .MuiAccordionSummary-root': {\n minHeight: 48,\n },\n },\n tabPanel: {\n paddingTop: theme.spacing(2),\n },\n}));\n\ninterface Condition {\n type: string;\n status: string;\n lastTransitionTime?: string;\n reason?: string;\n message?: string;\n}\n\ninterface WaitCondition {\n type: string;\n status: string;\n}\n\nfunction TabPanel(props: { children?: React.ReactNode; index: number; value: number }) {\n const { children, value, index } = props;\n const classes = useStyles();\n\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`resource-tabpanel-${index}`}\n aria-labelledby={`resource-tab-${index}`}\n >\n {value === index && (\n <Box className={classes.tabPanel}>\n {children}\n </Box>\n )}\n </div>\n );\n}\n\nexport const VCFAutomationCCIResourceDetails = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const [tabValue, setTabValue] = useState(0);\n const api = useApi(vcfAutomationApiRef);\n\n // Extract stable values from entity\n const deploymentId = entity.spec?.system as string;\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n \n // Check if this is a standalone resource\n const isStandalone = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-origin'] === 'STANDALONE';\n\n // Parse annotation data once using useMemo\n const annotationData = useMemo(() => {\n const resourceProperties = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-properties'];\n const resourceManifest = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-manifest'];\n const resourceObject = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-object'];\n const resourceContext = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-context'];\n const resourceState = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-state'];\n const syncStatus = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-sync-status'];\n const createdAt = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-created-at'];\n const origin = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-origin'];\n \n return {\n resourceData: resourceProperties && resourceProperties !== '{}' ? JSON.parse(resourceProperties) : null,\n manifest: resourceManifest && resourceManifest !== '{}' ? JSON.parse(resourceManifest) : null,\n objectData: resourceObject && resourceObject !== '{}' ? JSON.parse(resourceObject) : null,\n resourceContext: resourceContext || '',\n resourceState,\n syncStatus,\n createdAt,\n origin,\n };\n }, [\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-properties'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-manifest'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-object'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-context'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-state'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-sync-status'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-created-at'],\n entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-origin'],\n ]);\n\n // Check if we need to make API call\n const needsApiCall = !annotationData.resourceData || !annotationData.manifest || !annotationData.objectData;\n\n // Fallback API call if annotation data is missing or empty\n const { value: apiResourceData, loading, error } = useAsync(async () => {\n if (!needsApiCall || !resourceId) {\n return null;\n }\n\n try {\n if (isStandalone) {\n // For standalone resources, fetch directly by resource ID\n const response = await api.getSupervisorResource(resourceId, instanceName);\n if (response) {\n // Transform standalone resource data to match expected structure\n return {\n id: response.id,\n properties: {\n manifest: {\n apiVersion: response.apiVersion,\n kind: response.kind,\n metadata: response.metadata,\n spec: response.spec,\n },\n object: {\n apiVersion: response.apiVersion,\n kind: response.kind,\n metadata: response.metadata,\n spec: response.spec,\n status: response.status,\n },\n context: JSON.stringify({\n namespace: response.metadata.namespace,\n apiVersion: response.apiVersion,\n kind: response.kind,\n standalone: true,\n }),\n },\n };\n }\n } else {\n // For deployment-managed resources, use existing logic\n if (!deploymentId) {\n return null;\n }\n \n const response = await api.getDeploymentResources(deploymentId, instanceName);\n let resources = null;\n if (response) {\n // Handle both direct array and paginated response with content wrapper\n if (Array.isArray(response)) {\n resources = response;\n } else if (response.content && Array.isArray(response.content)) {\n resources = response.content;\n }\n }\n if (resources) {\n return resources.find((r: any) => r.id === resourceId);\n }\n }\n return null;\n } catch (apiError) {\n console.error('Failed to fetch resource data:', apiError);\n return null;\n }\n }, [needsApiCall, isStandalone, deploymentId, resourceId, instanceName]);\n\n // Determine final data to use\n const resourceData = annotationData.resourceData || apiResourceData;\n const manifest = annotationData.manifest || apiResourceData?.properties?.manifest;\n const objectData = annotationData.objectData || apiResourceData?.properties?.object;\n const resourceContext = annotationData.resourceContext || apiResourceData?.properties?.context;\n const resourceState = annotationData.resourceState;\n const syncStatus = annotationData.syncStatus;\n const createdAt = annotationData.createdAt;\n const origin = annotationData.origin;\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setTabValue(newValue);\n };\n\n if (loading) {\n return (\n <InfoCard title=\"CCI Supervisor Resource Details\">\n <Typography>Loading resource details...</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return (\n <InfoCard title=\"CCI Supervisor Resource Details\">\n <Typography color=\"error\">Error loading resource details: {error.message}</Typography>\n </InfoCard>\n );\n }\n\n if (!resourceData && !manifest && !objectData) {\n return (\n <InfoCard title=\"CCI Supervisor Resource Details\">\n <Typography>No resource data available.</Typography>\n </InfoCard>\n );\n }\n\n const renderStatusIcon = (conditionStatus: string) => {\n switch (conditionStatus.toLowerCase()) {\n case 'true':\n return <StatusOK />;\n case 'false':\n return <StatusError />;\n default:\n return <StatusPending />;\n }\n };\n\n const reorderKubernetesResource = (data: any) => {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n // Standard Kubernetes resource field order\n const orderedFields = ['apiVersion', 'kind', 'metadata', 'spec', 'status', 'data'];\n const reordered: any = {};\n\n // Add fields in the correct order\n orderedFields.forEach(field => {\n if (data[field] !== undefined) {\n reordered[field] = data[field];\n }\n });\n\n // Add any remaining fields that weren't in our standard list\n Object.keys(data).forEach(field => {\n if (!orderedFields.includes(field)) {\n reordered[field] = data[field];\n }\n });\n\n return reordered;\n };\n\n const formatYaml = (data: any) => {\n try {\n const reorderedData = reorderKubernetesResource(data);\n return yaml.dump(reorderedData, { \n indent: 2, \n lineWidth: -1,\n noRefs: true,\n sortKeys: false \n });\n } catch (error) {\n return JSON.stringify(data, null, 2);\n }\n };\n\n const basicInfo = {\n 'Resource Name': entity.metadata.title || entity.metadata.name,\n 'Resource ID': resourceData.id || 'Unknown',\n 'Context': resourceContext || 'Unknown',\n 'Resource Link': resourceData.resourceLink || 'Not available',\n 'Count': resourceData.count?.toString() || 'N/A',\n 'Count Index': resourceData.countIndex?.toString() || 'N/A',\n 'Existing': resourceData.existing ? 'Yes' : 'No',\n 'State': resourceState || 'Unknown',\n 'Sync Status': syncStatus || 'Unknown',\n 'Origin': origin || 'Unknown',\n 'Created At': createdAt ? new Date(createdAt).toLocaleString() : 'Unknown',\n };\n\n const getManifestInfo = () => {\n if (!manifest) return {};\n \n const info: any = {};\n if (manifest.kind) info['Kind'] = manifest.kind;\n if (manifest.apiVersion) info['API Version'] = manifest.apiVersion;\n if (manifest.metadata?.name) info['Manifest Name'] = manifest.metadata.name;\n if (manifest.metadata?.namespace) info['Namespace'] = manifest.metadata.namespace;\n if (manifest.metadata?.labels) {\n const labelCount = Object.keys(manifest.metadata.labels).length;\n info['Labels'] = `${labelCount} label(s)`;\n }\n if (manifest.metadata?.annotations) {\n const annotationCount = Object.keys(manifest.metadata.annotations).length;\n info['Annotations'] = `${annotationCount} annotation(s)`;\n }\n \n return info;\n };\n\n const getObjectStatus = () => {\n if (!objectData?.status) return null;\n \n const status = objectData.status;\n const statusInfo: any = {};\n \n if (status.powerState) statusInfo['Power State'] = status.powerState;\n if (status.phase) statusInfo['Phase'] = status.phase;\n if (status.primaryIP4) statusInfo['Primary IP'] = status.primaryIP4;\n if (status.host) statusInfo['Host'] = status.host;\n if (status.zone) statusInfo['Zone'] = status.zone;\n if (status.uniqueID) statusInfo['Unique ID'] = status.uniqueID;\n if (status.instanceUUID) statusInfo['Instance UUID'] = status.instanceUUID;\n if (status.biosUUID) statusInfo['BIOS UUID'] = status.biosUUID;\n if (status.hardwareVersion) statusInfo['Hardware Version'] = status.hardwareVersion;\n if (status.changeBlockTracking !== undefined) statusInfo['Change Block Tracking'] = status.changeBlockTracking ? 'Enabled' : 'Disabled';\n \n return Object.keys(statusInfo).length > 0 ? statusInfo : null;\n };\n\n const manifestInfo = getManifestInfo();\n const objectStatus = getObjectStatus();\n\n const waitConditionColumns: TableColumn<WaitCondition>[] = [\n { \n title: 'Status', \n field: 'status',\n render: (rowData) => (\n <Box display=\"flex\" alignItems=\"center\">\n {renderStatusIcon(rowData.status)}\n <span style={{ marginLeft: 8 }}>{rowData.status}</span>\n </Box>\n ),\n },\n { title: 'Type', field: 'type' },\n ];\n\n const resourceConditionColumns: TableColumn<Condition>[] = [\n { \n title: 'Status', \n field: 'status',\n render: (rowData) => (\n <Box display=\"flex\" alignItems=\"center\">\n {renderStatusIcon(rowData.status)}\n <span style={{ marginLeft: 8 }}>{rowData.status}</span>\n </Box>\n ),\n },\n { title: 'Type', field: 'type' },\n { title: 'Last Transition', field: 'lastTransitionTime' },\n { title: 'Reason', field: 'reason' },\n { title: 'Message', field: 'message' },\n ];\n\n const getNetworkInfo = () => {\n if (!objectData?.status?.network) return null;\n \n const network = objectData.status.network;\n const networkInfo: any = {};\n \n if (network.primaryIP4) networkInfo['Primary IPv4'] = network.primaryIP4;\n if (network.interfaces && network.interfaces.length > 0) {\n networkInfo['Network Interfaces'] = `${network.interfaces.length} interface(s)`;\n \n network.interfaces.forEach((iface: any, index: number) => {\n if (iface.ip?.macAddr) networkInfo[`Interface ${index + 1} MAC`] = iface.ip.macAddr;\n if (iface.ip?.addresses && iface.ip.addresses.length > 0) {\n const primaryAddr = iface.ip.addresses.find((addr: any) => addr.state === 'preferred');\n if (primaryAddr) networkInfo[`Interface ${index + 1} IP`] = primaryAddr.address;\n }\n });\n }\n \n return Object.keys(networkInfo).length > 0 ? networkInfo : null;\n };\n\n const networkInfo = getNetworkInfo();\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Resource Overview\">\n <Grid container spacing={2}>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n State\n </Typography>\n <Typography variant=\"h4\">\n {resourceState || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Sync Status\n </Typography>\n <Typography variant=\"h4\">\n {syncStatus || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Kind\n </Typography>\n <Typography variant=\"h4\">\n {manifest?.kind || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Power State\n </Typography>\n <Typography variant=\"h4\">\n {objectData?.status?.powerState || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard>\n <Tabs value={tabValue} onChange={handleTabChange} aria-label=\"resource details tabs\">\n <Tab label=\"Basic Information\" />\n <Tab label=\"Manifest Details\" />\n <Tab label=\"Object Status\" />\n <Tab label=\"Conditions\" />\n <Tab label=\"YAML Views\" />\n </Tabs>\n\n <TabPanel value={tabValue} index={0}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <StructuredMetadataTable metadata={basicInfo} />\n </Grid>\n \n {entity.spec?.dependsOn && Array.isArray(entity.spec.dependsOn) && entity.spec.dependsOn.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Dependencies\n </Typography>\n <Box>\n {entity.spec.dependsOn\n .filter((dep): dep is string => typeof dep === 'string')\n .map((dep: string, index: number) => (\n <Chip\n key={index}\n label={dep}\n size=\"small\"\n className={classes.dependencyChip}\n color=\"primary\"\n variant=\"outlined\"\n />\n ))}\n </Box>\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={1}>\n <Grid container spacing={3}>\n {Object.keys(manifestInfo).length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Manifest Information\n </Typography>\n <StructuredMetadataTable metadata={manifestInfo} />\n </Grid>\n )}\n \n {manifest?.metadata?.labels && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Labels\n </Typography>\n <StructuredMetadataTable metadata={manifest.metadata.labels} />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={2}>\n <Grid container spacing={3}>\n {objectStatus && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Object Status\n </Typography>\n <StructuredMetadataTable metadata={objectStatus} />\n </Grid>\n )}\n \n {networkInfo && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Network Information\n </Typography>\n <StructuredMetadataTable metadata={networkInfo} />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={3}>\n <Grid container spacing={3}>\n {resourceData.wait?.conditions && resourceData.wait.conditions.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Wait Conditions\n </Typography>\n <Table\n columns={waitConditionColumns}\n data={resourceData.wait.conditions}\n options={{\n search: false,\n paging: false,\n padding: 'dense',\n }}\n />\n </Grid>\n )}\n\n {objectData?.status?.conditions && objectData.status.conditions.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Conditions\n </Typography>\n <Table\n columns={resourceConditionColumns}\n data={objectData.status.conditions}\n options={{\n search: true,\n paging: objectData.status.conditions.length > 10,\n pageSize: 10,\n padding: 'dense',\n }}\n />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={4}>\n <Grid container spacing={3}>\n {manifest && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer} defaultExpanded>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"manifest-content\"\n id=\"manifest-header\"\n >\n <Typography variant=\"h6\">Resource Manifest</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <CodeSnippet\n text={formatYaml(manifest)}\n language=\"yaml\"\n showLineNumbers\n customStyle={{ \n fontSize: '12px',\n maxHeight: '600px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n\n {objectData && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"object-content\"\n id=\"object-header\"\n >\n <Typography variant=\"h6\">Live Kubernetes Object</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <CodeSnippet\n text={formatYaml(objectData)}\n language=\"yaml\"\n showLineNumbers\n customStyle={{ \n fontSize: '12px',\n maxHeight: '600px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n </TabPanel>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};"],"names":["resourceContext","resourceState","syncStatus","createdAt","origin","error","networkInfo"],"mappings":"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"}
|
|
@@ -7,8 +7,9 @@ import { InfoCard, Progress, ResponseErrorPanel, StructuredMetadataTable, CodeSn
|
|
|
7
7
|
import { Typography, Grid, Box, Chip, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';
|
|
8
8
|
import { makeStyles } from '@material-ui/core/styles';
|
|
9
9
|
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
10
|
-
import
|
|
10
|
+
import yaml__default from 'js-yaml';
|
|
11
11
|
import useAsync from 'react-use/lib/useAsync';
|
|
12
|
+
import { VCFAutomationVMPowerManagement } from './VCFAutomationVMPowerManagement.esm.js';
|
|
12
13
|
|
|
13
14
|
const useStyles = makeStyles((theme) => ({
|
|
14
15
|
statusChip: {
|
|
@@ -38,6 +39,8 @@ const VCFAutomationCCIResourceOverview = () => {
|
|
|
38
39
|
const deploymentId = entity.spec?.system;
|
|
39
40
|
const resourceId = entity.metadata.name;
|
|
40
41
|
const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
|
|
42
|
+
const isStandalone = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-origin"] === "STANDALONE";
|
|
43
|
+
const vmOrganizationType = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-version"] === "9" && entity.metadata.tags?.some((tag) => tag.startsWith("vcf-automation:")) ? "all-apps" : "vm-apps";
|
|
41
44
|
const annotationData = useMemo(() => {
|
|
42
45
|
const resourceProperties = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-properties"];
|
|
43
46
|
const resourceManifest = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-manifest"];
|
|
@@ -57,32 +60,81 @@ const VCFAutomationCCIResourceOverview = () => {
|
|
|
57
60
|
]);
|
|
58
61
|
const needsApiCall = !annotationData.resourceData || !annotationData.manifest || !annotationData.objectData;
|
|
59
62
|
const { value: apiResourceData, loading, error } = useAsync(async () => {
|
|
60
|
-
if (!needsApiCall || !
|
|
63
|
+
if (!needsApiCall || !resourceId) {
|
|
61
64
|
return null;
|
|
62
65
|
}
|
|
63
66
|
try {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
if (isStandalone) {
|
|
68
|
+
const response = await api.getSupervisorResource(resourceId, instanceName);
|
|
69
|
+
if (response) {
|
|
70
|
+
return {
|
|
71
|
+
id: response.id,
|
|
72
|
+
properties: {
|
|
73
|
+
manifest: {
|
|
74
|
+
apiVersion: response.apiVersion,
|
|
75
|
+
kind: response.kind,
|
|
76
|
+
metadata: response.metadata,
|
|
77
|
+
spec: response.spec
|
|
78
|
+
},
|
|
79
|
+
object: {
|
|
80
|
+
apiVersion: response.apiVersion,
|
|
81
|
+
kind: response.kind,
|
|
82
|
+
metadata: response.metadata,
|
|
83
|
+
spec: response.spec,
|
|
84
|
+
status: response.status
|
|
85
|
+
},
|
|
86
|
+
context: JSON.stringify({
|
|
87
|
+
namespace: response.metadata.namespace,
|
|
88
|
+
apiVersion: response.apiVersion,
|
|
89
|
+
kind: response.kind,
|
|
90
|
+
standalone: true
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
if (!deploymentId) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const response = await api.getDeploymentResources(deploymentId, instanceName);
|
|
100
|
+
let resources = null;
|
|
101
|
+
if (response) {
|
|
102
|
+
if (Array.isArray(response)) {
|
|
103
|
+
resources = response;
|
|
104
|
+
} else if (response.content && Array.isArray(response.content)) {
|
|
105
|
+
resources = response.content;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (resources) {
|
|
109
|
+
return resources.find((r) => r.id === resourceId);
|
|
71
110
|
}
|
|
72
|
-
}
|
|
73
|
-
if (resources) {
|
|
74
|
-
return resources.find((r) => r.id === resourceId);
|
|
75
111
|
}
|
|
76
112
|
return null;
|
|
77
113
|
} catch (apiError) {
|
|
78
114
|
console.error("Failed to fetch resource data:", apiError);
|
|
79
115
|
return null;
|
|
80
116
|
}
|
|
81
|
-
}, [needsApiCall, deploymentId, resourceId, instanceName]);
|
|
117
|
+
}, [needsApiCall, isStandalone, deploymentId, resourceId, instanceName]);
|
|
82
118
|
const resourceData = annotationData.resourceData || apiResourceData;
|
|
83
119
|
const manifest = annotationData.manifest || apiResourceData?.properties?.manifest;
|
|
84
120
|
const objectData = annotationData.objectData || apiResourceData?.properties?.object;
|
|
85
121
|
const resourceContext = annotationData.resourceContext || apiResourceData?.properties?.context;
|
|
122
|
+
const resourceKind = manifest?.kind || objectData?.kind;
|
|
123
|
+
const vmName = manifest?.metadata?.name || objectData?.metadata?.name;
|
|
124
|
+
const namespaceName = manifest?.metadata?.namespace || objectData?.metadata?.namespace;
|
|
125
|
+
const namespaceUrnId = useMemo(() => {
|
|
126
|
+
if (!isStandalone || !namespaceName) return void 0;
|
|
127
|
+
const contextData = typeof resourceContext === "string" ? JSON.parse(resourceContext || "{}") : resourceContext;
|
|
128
|
+
const urnId = contextData?.namespaceUrnId || namespaceName;
|
|
129
|
+
console.log("Debug - Standalone VM URN ID resolution:", {
|
|
130
|
+
namespaceName,
|
|
131
|
+
resourceContext,
|
|
132
|
+
contextData,
|
|
133
|
+
urnId,
|
|
134
|
+
isStandalone
|
|
135
|
+
});
|
|
136
|
+
return urnId;
|
|
137
|
+
}, [isStandalone, namespaceName, resourceContext]);
|
|
86
138
|
if (loading) {
|
|
87
139
|
return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource", children: /* @__PURE__ */ jsx(Progress, {}) });
|
|
88
140
|
}
|
|
@@ -123,7 +175,7 @@ const VCFAutomationCCIResourceOverview = () => {
|
|
|
123
175
|
const formatYaml = (data) => {
|
|
124
176
|
try {
|
|
125
177
|
const reorderedData = reorderKubernetesResource(data);
|
|
126
|
-
return
|
|
178
|
+
return yaml__default.dump(reorderedData, {
|
|
127
179
|
indent: 2,
|
|
128
180
|
lineWidth: -1,
|
|
129
181
|
noRefs: true,
|
|
@@ -157,10 +209,34 @@ const VCFAutomationCCIResourceOverview = () => {
|
|
|
157
209
|
};
|
|
158
210
|
const objectStatus = getObjectStatus();
|
|
159
211
|
return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource Overview", children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
212
|
+
isStandalone && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Box, { mb: 2, children: /* @__PURE__ */ jsx(
|
|
213
|
+
Chip,
|
|
214
|
+
{
|
|
215
|
+
label: "Standalone Resource",
|
|
216
|
+
color: "secondary",
|
|
217
|
+
variant: "outlined",
|
|
218
|
+
size: "small"
|
|
219
|
+
}
|
|
220
|
+
) }) }),
|
|
160
221
|
/* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
161
222
|
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Basic Information" }),
|
|
162
223
|
/* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: basicInfo })
|
|
163
224
|
] }),
|
|
225
|
+
vmOrganizationType === "all-apps" && resourceKind === "VirtualMachine" && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
226
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Power Management" }),
|
|
227
|
+
/* @__PURE__ */ jsx(
|
|
228
|
+
VCFAutomationVMPowerManagement,
|
|
229
|
+
{
|
|
230
|
+
entity,
|
|
231
|
+
resourceId,
|
|
232
|
+
instanceName,
|
|
233
|
+
isStandalone,
|
|
234
|
+
vmName: isStandalone ? vmName : void 0,
|
|
235
|
+
namespaceName: isStandalone ? namespaceName : void 0,
|
|
236
|
+
namespaceUrnId: isStandalone ? namespaceUrnId : void 0
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
] }),
|
|
164
240
|
entity.spec?.dependsOn && Array.isArray(entity.spec.dependsOn) && entity.spec.dependsOn.length > 0 && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
165
241
|
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Dependencies" }),
|
|
166
242
|
/* @__PURE__ */ jsx(Box, { children: entity.spec.dependsOn.filter((dep) => typeof dep === "string").map((dep, index) => /* @__PURE__ */ jsx(
|