@terasky/backstage-plugin-vcf-automation 1.7.0 → 1.8.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationCCIResourceOverview.esm.js","sources":["../../src/components/VCFAutomationCCIResourceOverview.tsx"],"sourcesContent":["import { useMemo, useState, useCallback } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport { supervisorResourceEditPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport Editor from '@monaco-editor/react';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n StructuredMetadataTable,\n CodeSnippet,\n StatusOK,\n StatusError,\n StatusPending,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { \n Grid, \n Typography, \n Chip, \n Box, \n Accordion, \n AccordionSummary, \n AccordionDetails,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Snackbar\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport EditIcon from '@material-ui/icons/Edit';\nimport yaml from 'js-yaml';\nimport useAsync from 'react-use/lib/useAsync';\nimport { VCFAutomationVMPowerManagement } from './VCFAutomationVMPowerManagement';\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 yamlContainer: {\n '& .MuiAccordionSummary-root': {\n minHeight: 48,\n },\n },\n dependencyChip: {\n margin: theme.spacing(0.25),\n cursor: 'pointer',\n },\n editButton: {\n marginTop: theme.spacing(1),\n },\n monacoEditor: {\n flex: 1,\n minHeight: '500px',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n },\n validationStatus: {\n padding: theme.spacing(1),\n borderTop: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n flexShrink: 0,\n },\n dialogContent: {\n padding: theme.spacing(2),\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n },\n editorContainer: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n overflow: 'hidden',\n },\n yamlValidationError: {\n color: theme.palette.error.main,\n marginTop: theme.spacing(1),\n fontSize: '0.875rem',\n },\n}));\n\nexport const VCFAutomationCCIResourceOverview = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n // Permission check for supervisor resource editing\n const { allowed: canEditResource } = usePermission({\n permission: supervisorResourceEditPermission,\n });\n\n // State for YAML editor modal\n const [editModalOpen, setEditModalOpen] = useState(false);\n const [editingYaml, setEditingYaml] = useState('');\n const [originalManifest, setOriginalManifest] = useState<any>(null);\n const [isLoadingManifest, setIsLoadingManifest] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const [yamlValidationError, setYamlValidationError] = useState<string>('');\n const [snackbar, setSnackbar] = useState({\n open: false,\n message: '',\n severity: 'success' as 'success' | 'error',\n });\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 // Get VM organization type from entity tags\n const vmOrganizationType = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-version'] === '9' && \n entity.metadata.tags?.some((tag: string) => tag.startsWith('vcf-automation:')) ? 'all-apps' : 'vm-apps';\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 \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 };\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 ]);\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\n // Extract resource-specific information\n const resourceKind = manifest?.kind || objectData?.kind;\n const resourceName = manifest?.metadata?.name || objectData?.metadata?.name;\n const namespaceName = manifest?.metadata?.namespace || objectData?.metadata?.namespace;\n const apiVersion = manifest?.apiVersion || objectData?.apiVersion;\n \n // For backward compatibility, keep vmName for power management\n const vmName = resourceName;\n \n // Helper function to extract namespace URN ID from CCI namespace endpoint annotation\n const extractNamespaceUrnId = useCallback((endpoint: string): string | undefined => {\n // Parse: https://polo-vra.terasky.local/proxy/k8s/namespaces/urn:vcloud:namespace:0a354079-dfe4-4bf9-bce0-4fd87fbffc25\n const match = endpoint.match(/\\/namespaces\\/(urn:vcloud:namespace:[^\\/]+)/);\n return match ? match[1] : undefined;\n }, []);\n\n // Recursive function to find CCI Supervisor Namespace parent component (up to 3 levels deep)\n const findCCINamespaceParent = useCallback(async (currentEntity: any, depth = 0): Promise<string | undefined> => {\n if (depth >= 3) return undefined; // Max 3 levels deep\n \n // Check if current entity is a CCI Supervisor Namespace\n if (currentEntity.spec?.type === 'CCI.Supervisor.Namespace') {\n const endpoint = currentEntity.metadata?.annotations?.['terasky.backstage.io/vcf-automation-cci-namespace-endpoint'];\n if (endpoint) {\n return extractNamespaceUrnId(endpoint);\n }\n }\n \n // Look for parent component\n const parentRef = currentEntity.spec?.subcomponentOf;\n if (!parentRef) return undefined;\n \n try {\n // Get parent entity from catalog\n const parentEntity = await catalogApi.getEntityByRef(parentRef);\n if (parentEntity) {\n return await findCCINamespaceParent(parentEntity, depth + 1);\n }\n } catch (error) {\n console.warn('Failed to fetch parent entity:', parentRef, error);\n }\n \n return undefined;\n }, [catalogApi, extractNamespaceUrnId]);\n\n // For CCI resources, we need the namespace URN ID from the supervisor namespace\n // For standalone: stored in resource context, for deployment-managed: found via parent component hierarchy\n const { value: namespaceUrnId } = useAsync(async () => {\n if (!namespaceName) return undefined;\n \n if (isStandalone) {\n // For standalone resources, try to extract from resource context\n let contextData = null;\n try {\n contextData = typeof resourceContext === 'string' ? JSON.parse(resourceContext || '{}') : resourceContext;\n } catch (error) {\n console.log('Debug - Resource context is not JSON, treating as string:', resourceContext);\n contextData = null;\n }\n \n const urnId = contextData?.namespaceUrnId || namespaceName;\n console.log('Debug - Standalone CCI Resource URN ID resolution:', {\n namespaceName,\n resourceContext,\n contextData,\n urnId,\n });\n \n return urnId;\n } else {\n // For deployment-managed resources, traverse parent hierarchy to find CCI Supervisor Namespace\n console.log('Debug - Looking for CCI Supervisor Namespace parent for deployment-managed resource');\n const urnId = await findCCINamespaceParent(entity);\n \n console.log('Debug - Deployment-managed CCI Resource URN ID resolution:', {\n namespaceName,\n urnId,\n entityRef: entity.metadata.name,\n });\n \n return urnId || namespaceName; // Fallback to namespace name if not found\n }\n }, [namespaceName, resourceContext, isStandalone, entity, findCCINamespaceParent]);\n\n // Handle edit resource manifest action\n const handleEditResource = useCallback(async () => {\n if (!canEditResource || !namespaceName || !resourceName || !namespaceUrnId || !apiVersion || !resourceKind) {\n return;\n }\n\n setIsLoadingManifest(true);\n setEditModalOpen(true);\n\n try {\n const manifestResponse = await api.getSupervisorResourceManifest(\n namespaceUrnId,\n namespaceName,\n resourceName,\n apiVersion,\n resourceKind,\n instanceName\n );\n\n setOriginalManifest(manifestResponse);\n const yamlContent = yaml.dump(manifestResponse, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n sortKeys: false,\n });\n setEditingYaml(yamlContent);\n setYamlValidationError(''); // Reset validation error\n } catch (error) {\n setSnackbar({\n open: true,\n message: `Failed to fetch resource manifest: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n });\n setEditModalOpen(false);\n } finally {\n setIsLoadingManifest(false);\n }\n }, [canEditResource, namespaceName, resourceName, namespaceUrnId, apiVersion, resourceKind, instanceName, api]);\n\n const handleSaveResource = useCallback(async () => {\n if (!originalManifest || !namespaceName || !resourceName || !namespaceUrnId || !apiVersion || !resourceKind) {\n return;\n }\n\n setIsSaving(true);\n setConfirmDialogOpen(false);\n\n try {\n // Parse the edited YAML back to JSON\n const updatedManifest = yaml.load(editingYaml);\n \n await api.updateSupervisorResourceManifest(\n namespaceUrnId,\n namespaceName,\n resourceName,\n apiVersion,\n resourceKind,\n updatedManifest,\n instanceName\n );\n\n setSnackbar({\n open: true,\n message: 'Resource manifest updated successfully',\n severity: 'success',\n });\n\n setEditModalOpen(false);\n\n // Refresh the page after a brief delay\n setTimeout(() => window.location.reload(), 1000);\n } catch (error) {\n setSnackbar({\n open: true,\n message: `Failed to update resource manifest: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n });\n } finally {\n setIsSaving(false);\n }\n }, [originalManifest, namespaceName, resourceName, namespaceUrnId, apiVersion, resourceKind, editingYaml, instanceName, api]);\n\n const handleCloseSnackbar = useCallback(() => {\n setSnackbar(prev => ({ ...prev, open: false }));\n }, []);\n\n // YAML validation function\n const validateYaml = useCallback((yamlString: string) => {\n try {\n yaml.load(yamlString);\n setYamlValidationError('');\n return true;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Invalid YAML syntax';\n setYamlValidationError(errorMessage);\n return false;\n }\n }, []);\n\n // Handle YAML editor changes with validation\n const handleYamlChange = useCallback((value: string) => {\n setEditingYaml(value);\n if (value.trim()) {\n validateYaml(value);\n } else {\n setYamlValidationError('');\n }\n }, [validateYaml]);\n\n if (loading) {\n return (\n <InfoCard title=\"CCI Supervisor Resource\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!resourceData) {\n return (\n <InfoCard title=\"CCI Supervisor Resource\">\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': 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 };\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 \n return Object.keys(statusInfo).length > 0 ? statusInfo : null;\n };\n\n const objectStatus = getObjectStatus();\n\n return (\n <InfoCard title=\"CCI Supervisor Resource Overview\">\n <Grid container spacing={3}>\n {isStandalone && (\n <Grid item xs={12}>\n <Box mb={2}>\n <Chip\n label=\"Standalone Resource\"\n color=\"secondary\"\n variant=\"outlined\"\n size=\"small\"\n />\n </Box>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Basic Information\n </Typography>\n <StructuredMetadataTable metadata={basicInfo} />\n </Grid>\n\n {/* VM Power Management for VirtualMachine resources in all-apps organizations */}\n {vmOrganizationType === 'all-apps' && resourceKind === 'VirtualMachine' && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Power Management\n </Typography>\n <VCFAutomationVMPowerManagement\n entity={entity}\n resourceId={resourceId}\n instanceName={instanceName}\n isStandalone={isStandalone}\n vmName={isStandalone ? vmName : undefined}\n namespaceName={isStandalone ? namespaceName : undefined}\n namespaceUrnId={isStandalone ? namespaceUrnId : undefined}\n />\n </Grid>\n )}\n\n {/* Edit Resource Manifest for VirtualMachine resources with permission */}\n {canEditResource && vmOrganizationType === 'all-apps' && resourceKind === 'VirtualMachine' && resourceName && namespaceName && namespaceUrnId && apiVersion && (\n <Grid item xs={12}>\n <Box mt={vmOrganizationType === 'all-apps' ? 0 : 2}>\n {vmOrganizationType !== 'all-apps' && (\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Management\n </Typography>\n )}\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<EditIcon />}\n onClick={handleEditResource}\n className={classes.editButton}\n disabled={isLoadingManifest}\n >\n Edit Resource Manifest\n </Button>\n </Box>\n </Grid>\n )}\n\n {/* Edit Resource Manifest for non-VirtualMachine resources with permission */}\n {canEditResource && (resourceKind !== 'VirtualMachine' || vmOrganizationType !== 'all-apps') && resourceName && namespaceName && namespaceUrnId && apiVersion && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Management\n </Typography>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<EditIcon />}\n onClick={handleEditResource}\n className={classes.editButton}\n disabled={isLoadingManifest}\n >\n Edit Resource Manifest\n </Button>\n </Grid>\n )}\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\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 <Box>\n {resourceData.wait.conditions.map((condition: any, index: number) => (\n <Box key={index} display=\"flex\" alignItems=\"center\" mb={1}>\n {renderStatusIcon(condition.status)}\n <Chip\n label={`${condition.type}: ${condition.status}`}\n size=\"small\"\n className={classes.conditionChip}\n color={condition.status === 'True' ? 'primary' : 'default'}\n />\n </Box>\n ))}\n </Box>\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 <Box>\n {objectData.status.conditions.map((condition: any, index: number) => (\n <Box key={index} display=\"flex\" alignItems=\"center\" mb={1}>\n {renderStatusIcon(condition.status)}\n <Chip\n label={`${condition.type}: ${condition.status}`}\n size=\"small\"\n className={classes.conditionChip}\n color={condition.status === 'True' ? 'primary' : 'default'}\n />\n <Typography variant=\"caption\" style={{ marginLeft: 8 }}>\n {condition.lastTransitionTime}\n </Typography>\n </Box>\n ))}\n </Box>\n </Grid>\n )}\n\n {objectStatus && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Status\n </Typography>\n <StructuredMetadataTable metadata={objectStatus} />\n </Grid>\n )}\n\n {manifest && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer}>\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: '500px',\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\">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: '500px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n\n {/* YAML Editor Modal */}\n <Dialog\n open={editModalOpen}\n onClose={() => setEditModalOpen(false)}\n maxWidth=\"xl\"\n fullWidth\n PaperProps={{\n style: {\n height: '90vh',\n maxHeight: '90vh',\n },\n }}\n >\n <DialogTitle>\n <Typography variant=\"h6\">Edit Resource Manifest</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {resourceName} ({resourceKind})\n </Typography>\n </DialogTitle>\n <DialogContent className={classes.dialogContent} dividers>\n {isLoadingManifest ? (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" flex={1}>\n <Progress />\n </Box>\n ) : (\n <Box className={classes.editorContainer}>\n <Typography variant=\"subtitle2\" gutterBottom>\n YAML Editor\n </Typography>\n \n <Box className={classes.monacoEditor}>\n <Editor\n height=\"100%\"\n defaultLanguage=\"yaml\"\n value={editingYaml}\n onChange={(value) => handleYamlChange(value || '')}\n theme=\"vs-dark\"\n options={{\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n fontSize: 14,\n lineNumbers: 'on',\n wordWrap: 'off',\n automaticLayout: true,\n tabSize: 2,\n insertSpaces: true,\n folding: true,\n renderWhitespace: 'selection',\n }}\n />\n </Box>\n \n {/* Fixed Validation Status Bar */}\n <Box className={classes.validationStatus}>\n {yamlValidationError ? (\n <Typography className={classes.yamlValidationError}>\n ⚠️ YAML Validation Error: {yamlValidationError}\n </Typography>\n ) : editingYaml.trim() ? (\n <Typography variant=\"caption\" color=\"textSecondary\">\n ✅ YAML syntax is valid\n </Typography>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Enter YAML content above\n </Typography>\n )}\n </Box>\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setEditModalOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={() => setConfirmDialogOpen(true)}\n color=\"primary\"\n variant=\"contained\"\n disabled={isLoadingManifest || !editingYaml.trim() || !!yamlValidationError}\n >\n Save Changes\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Confirmation Dialog */}\n <Dialog\n open={confirmDialogOpen}\n onClose={() => setConfirmDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>Confirm Changes</DialogTitle>\n <DialogContent>\n <Typography>\n Are you sure you want to apply these changes to the resource? \n This action will update the Kubernetes resource based on your modifications.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setConfirmDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={handleSaveResource}\n color=\"primary\"\n variant=\"contained\"\n disabled={isSaving}\n >\n {isSaving ? 'Applying...' : 'Apply Changes'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Snackbar for notifications */}\n <Snackbar\n open={snackbar.open}\n autoHideDuration={6000}\n onClose={handleCloseSnackbar}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert onClose={handleCloseSnackbar} severity={snackbar.severity}>\n {snackbar.message}\n </Alert>\n </Snackbar>\n </InfoCard>\n );\n};"],"names":["resourceContext","error","yaml"],"mappings":"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"}
1
+ {"version":3,"file":"VCFAutomationCCIResourceOverview.esm.js","sources":["../../src/components/VCFAutomationCCIResourceOverview.tsx"],"sourcesContent":["import { useMemo, useState, useCallback } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport { supervisorResourceEditPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport Editor from '@monaco-editor/react';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n StructuredMetadataTable,\n CodeSnippet,\n StatusOK,\n StatusError,\n StatusPending,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { \n Grid, \n Typography, \n Chip, \n Box, \n Accordion, \n AccordionSummary, \n AccordionDetails,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Snackbar\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport EditIcon from '@material-ui/icons/Edit';\nimport yaml from 'js-yaml';\nimport useAsync from 'react-use/lib/useAsync';\nimport { VCFAutomationVMPowerManagement } from './VCFAutomationVMPowerManagement';\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 yamlContainer: {\n '& .MuiAccordionSummary-root': {\n minHeight: 48,\n },\n },\n dependencyChip: {\n margin: theme.spacing(0.25),\n cursor: 'pointer',\n },\n editButton: {\n marginTop: theme.spacing(1),\n },\n monacoEditor: {\n flex: 1,\n minHeight: '500px',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n },\n validationStatus: {\n padding: theme.spacing(1),\n borderTop: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n flexShrink: 0,\n },\n dialogContent: {\n padding: theme.spacing(2),\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n },\n editorContainer: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n overflow: 'hidden',\n },\n yamlValidationError: {\n color: theme.palette.error.main,\n marginTop: theme.spacing(1),\n fontSize: '0.875rem',\n },\n}));\n\nexport const VCFAutomationCCIResourceOverview = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n // Permission check for supervisor resource editing\n const { allowed: canEditResource } = usePermission({\n permission: supervisorResourceEditPermission,\n });\n\n // State for YAML editor modal\n const [editModalOpen, setEditModalOpen] = useState(false);\n const [editingYaml, setEditingYaml] = useState('');\n const [originalManifest, setOriginalManifest] = useState<any>(null);\n const [isLoadingManifest, setIsLoadingManifest] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const [yamlValidationError, setYamlValidationError] = useState<string>('');\n const [snackbar, setSnackbar] = useState({\n open: false,\n message: '',\n severity: 'success' as 'success' | 'error',\n });\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 // Get VM organization type from entity tags\n const vmOrganizationType = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-version'] === '9' && \n entity.metadata.tags?.some((tag: string) => tag.startsWith('vcf-automation:')) ? 'all-apps' : 'vm-apps';\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 \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 };\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 ]);\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\n // Extract resource-specific information\n const resourceKind = manifest?.kind || objectData?.kind;\n const resourceName = manifest?.metadata?.name || objectData?.metadata?.name;\n const namespaceName = manifest?.metadata?.namespace || objectData?.metadata?.namespace;\n const apiVersion = manifest?.apiVersion || objectData?.apiVersion;\n \n // For backward compatibility, keep vmName for power management\n const vmName = resourceName;\n \n // Helper function to extract namespace URN ID from CCI namespace endpoint annotation\n const extractNamespaceUrnId = useCallback((endpoint: string): string | undefined => {\n // Parse: https://polo-vra.terasky.local/proxy/k8s/namespaces/urn:vcloud:namespace:0a354079-dfe4-4bf9-bce0-4fd87fbffc25\n const match = endpoint.match(/\\/namespaces\\/(urn:vcloud:namespace:[^\\/]+)/);\n return match ? match[1] : undefined;\n }, []);\n\n // Recursive function to find CCI Supervisor Namespace parent component (up to 3 levels deep)\n const findCCINamespaceParent = useCallback(async (currentEntity: any, depth = 0): Promise<string | undefined> => {\n if (depth >= 3) return undefined; // Max 3 levels deep\n \n // Check if current entity is a CCI Supervisor Namespace\n if (currentEntity.spec?.type === 'CCI.Supervisor.Namespace') {\n const endpoint = currentEntity.metadata?.annotations?.['terasky.backstage.io/vcf-automation-cci-namespace-endpoint'];\n if (endpoint) {\n return extractNamespaceUrnId(endpoint);\n }\n }\n \n // Look for parent component\n const parentRef = currentEntity.spec?.subcomponentOf;\n if (!parentRef) return undefined;\n \n try {\n // Get parent entity from catalog\n const parentEntity = await catalogApi.getEntityByRef(parentRef);\n if (parentEntity) {\n return await findCCINamespaceParent(parentEntity, depth + 1);\n }\n } catch (error) {\n console.warn('Failed to fetch parent entity:', parentRef, error);\n }\n \n return undefined;\n }, [catalogApi, extractNamespaceUrnId]);\n\n // For CCI resources, we need the namespace URN ID from the supervisor namespace\n // For standalone: stored in resource context, for deployment-managed: found via parent component hierarchy\n const { value: namespaceUrnId } = useAsync(async () => {\n if (!namespaceName) return undefined;\n \n if (isStandalone) {\n // For standalone resources, try to extract from resource context\n let contextData = null;\n try {\n contextData = typeof resourceContext === 'string' ? JSON.parse(resourceContext || '{}') : resourceContext;\n } catch (error) {\n console.log('Debug - Resource context is not JSON, treating as string:', resourceContext);\n contextData = null;\n }\n \n const urnId = contextData?.namespaceUrnId || namespaceName;\n console.log('Debug - Standalone CCI Resource URN ID resolution:', {\n namespaceName,\n resourceContext,\n contextData,\n urnId,\n });\n \n return urnId;\n } else {\n // For deployment-managed resources, traverse parent hierarchy to find CCI Supervisor Namespace\n console.log('Debug - Looking for CCI Supervisor Namespace parent for deployment-managed resource');\n const urnId = await findCCINamespaceParent(entity);\n \n console.log('Debug - Deployment-managed CCI Resource URN ID resolution:', {\n namespaceName,\n urnId,\n entityRef: entity.metadata.name,\n });\n \n return urnId || namespaceName; // Fallback to namespace name if not found\n }\n }, [namespaceName, resourceContext, isStandalone, entity, findCCINamespaceParent]);\n\n // Handle edit resource manifest action\n const handleEditResource = useCallback(async () => {\n if (!canEditResource || !namespaceName || !resourceName || !namespaceUrnId || !apiVersion || !resourceKind) {\n return;\n }\n\n setIsLoadingManifest(true);\n setEditModalOpen(true);\n\n try {\n const manifestResponse = await api.getSupervisorResourceManifest(\n namespaceUrnId,\n namespaceName,\n resourceName,\n apiVersion,\n resourceKind,\n instanceName\n );\n\n setOriginalManifest(manifestResponse);\n const yamlContent = yaml.dump(manifestResponse, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n sortKeys: false,\n });\n setEditingYaml(yamlContent);\n setYamlValidationError(''); // Reset validation error\n } catch (error) {\n setSnackbar({\n open: true,\n message: `Failed to fetch resource manifest: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n });\n setEditModalOpen(false);\n } finally {\n setIsLoadingManifest(false);\n }\n }, [canEditResource, namespaceName, resourceName, namespaceUrnId, apiVersion, resourceKind, instanceName, api]);\n\n const handleSaveResource = useCallback(async () => {\n if (!originalManifest || !namespaceName || !resourceName || !namespaceUrnId || !apiVersion || !resourceKind) {\n return;\n }\n\n setIsSaving(true);\n setConfirmDialogOpen(false);\n\n try {\n // Parse the edited YAML back to JSON\n const updatedManifest = yaml.load(editingYaml);\n \n await api.updateSupervisorResourceManifest(\n namespaceUrnId,\n namespaceName,\n resourceName,\n apiVersion,\n resourceKind,\n updatedManifest,\n instanceName\n );\n\n setSnackbar({\n open: true,\n message: 'Resource manifest updated successfully',\n severity: 'success',\n });\n\n setEditModalOpen(false);\n\n // Refresh the page after a brief delay\n setTimeout(() => window.location.reload(), 1000);\n } catch (error) {\n setSnackbar({\n open: true,\n message: `Failed to update resource manifest: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n });\n } finally {\n setIsSaving(false);\n }\n }, [originalManifest, namespaceName, resourceName, namespaceUrnId, apiVersion, resourceKind, editingYaml, instanceName, api]);\n\n const handleCloseSnackbar = useCallback(() => {\n setSnackbar(prev => ({ ...prev, open: false }));\n }, []);\n\n // YAML validation function\n const validateYaml = useCallback((yamlString: string) => {\n try {\n yaml.load(yamlString);\n setYamlValidationError('');\n return true;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Invalid YAML syntax';\n setYamlValidationError(errorMessage);\n return false;\n }\n }, []);\n\n // Handle YAML editor changes with validation\n const handleYamlChange = useCallback((value: string) => {\n setEditingYaml(value);\n if (value.trim()) {\n validateYaml(value);\n } else {\n setYamlValidationError('');\n }\n }, [validateYaml]);\n\n if (loading) {\n return (\n <InfoCard title=\"CCI Supervisor Resource\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!resourceData) {\n return (\n <InfoCard title=\"CCI Supervisor Resource\">\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': 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 };\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 \n return Object.keys(statusInfo).length > 0 ? statusInfo : null;\n };\n\n const objectStatus = getObjectStatus();\n\n return (\n <InfoCard title=\"CCI Supervisor Resource Overview\">\n <Grid container spacing={3}>\n {isStandalone && (\n <Grid item xs={12}>\n <Box mb={2}>\n <Chip\n label=\"Standalone Resource\"\n color=\"secondary\"\n variant=\"outlined\"\n size=\"small\"\n />\n </Box>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Basic Information\n </Typography>\n <StructuredMetadataTable metadata={basicInfo} />\n </Grid>\n\n {/* VM Power Management for VirtualMachine resources in all-apps organizations */}\n {vmOrganizationType === 'all-apps' && resourceKind === 'VirtualMachine' && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Power Management\n </Typography>\n <VCFAutomationVMPowerManagement\n entity={entity}\n resourceId={resourceId}\n instanceName={instanceName}\n isStandalone={isStandalone}\n vmName={isStandalone ? vmName : undefined}\n namespaceName={isStandalone ? namespaceName : undefined}\n namespaceUrnId={isStandalone ? namespaceUrnId : undefined}\n />\n </Grid>\n )}\n\n {/* Edit Resource Manifest for VirtualMachine resources with permission */}\n {canEditResource && vmOrganizationType === 'all-apps' && resourceKind === 'VirtualMachine' && resourceName && namespaceName && namespaceUrnId && apiVersion && (\n <Grid item xs={12}>\n <Box mt={vmOrganizationType === 'all-apps' ? 0 : 2}>\n {vmOrganizationType !== 'all-apps' && (\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Management\n </Typography>\n )}\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<EditIcon />}\n onClick={handleEditResource}\n className={classes.editButton}\n disabled={isLoadingManifest}\n >\n Edit Resource Manifest\n </Button>\n </Box>\n </Grid>\n )}\n\n {/* Edit Resource Manifest for non-VirtualMachine resources with permission */}\n {canEditResource && (resourceKind !== 'VirtualMachine' || vmOrganizationType !== 'all-apps') && resourceName && namespaceName && namespaceUrnId && apiVersion && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Management\n </Typography>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n startIcon={<EditIcon />}\n onClick={handleEditResource}\n className={classes.editButton}\n disabled={isLoadingManifest}\n >\n Edit Resource Manifest\n </Button>\n </Grid>\n )}\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\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 <Box>\n {resourceData.wait.conditions.map((condition: any, index: number) => (\n <Box key={index} display=\"flex\" alignItems=\"center\" mb={1}>\n {renderStatusIcon(condition.status)}\n <Chip\n label={`${condition.type}: ${condition.status}`}\n size=\"small\"\n className={classes.conditionChip}\n color={condition.status === 'True' ? 'primary' : 'default'}\n />\n </Box>\n ))}\n </Box>\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 <Box>\n {objectData.status.conditions.map((condition: any, index: number) => (\n <Box key={index} display=\"flex\" alignItems=\"center\" mb={1}>\n {renderStatusIcon(condition.status)}\n <Chip\n label={`${condition.type}: ${condition.status}`}\n size=\"small\"\n className={classes.conditionChip}\n color={condition.status === 'True' ? 'primary' : 'default'}\n />\n <Typography variant=\"caption\" style={{ marginLeft: 8 }}>\n {condition.lastTransitionTime}\n </Typography>\n </Box>\n ))}\n </Box>\n </Grid>\n )}\n\n {objectStatus && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Status\n </Typography>\n <StructuredMetadataTable metadata={objectStatus} />\n </Grid>\n )}\n\n {manifest && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer}>\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: '500px',\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\">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: '500px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n\n {/* YAML Editor Modal */}\n <Dialog\n open={editModalOpen}\n onClose={() => setEditModalOpen(false)}\n maxWidth=\"xl\"\n fullWidth\n PaperProps={{\n style: {\n height: '90vh',\n maxHeight: '90vh',\n },\n }}\n >\n <DialogTitle>\n <Typography variant=\"h6\">Edit Resource Manifest</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {resourceName} ({resourceKind})\n </Typography>\n </DialogTitle>\n <DialogContent className={classes.dialogContent} dividers>\n {isLoadingManifest ? (\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" flex={1}>\n <Progress />\n </Box>\n ) : (\n <Box className={classes.editorContainer}>\n <Typography variant=\"subtitle2\" gutterBottom>\n YAML Editor\n </Typography>\n \n <Box className={classes.monacoEditor}>\n <Editor\n height=\"100%\"\n defaultLanguage=\"yaml\"\n value={editingYaml}\n onChange={(value) => handleYamlChange(value || '')}\n theme=\"vs-dark\"\n options={{\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n fontSize: 14,\n lineNumbers: 'on',\n wordWrap: 'off',\n automaticLayout: true,\n tabSize: 2,\n insertSpaces: true,\n folding: true,\n renderWhitespace: 'selection',\n }}\n />\n </Box>\n \n {/* Fixed Validation Status Bar */}\n <Box className={classes.validationStatus}>\n {yamlValidationError ? (\n <Typography className={classes.yamlValidationError}>\n ⚠️ YAML Validation Error: {yamlValidationError}\n </Typography>\n ) : editingYaml.trim() ? (\n <Typography variant=\"caption\" color=\"textSecondary\">\n ✅ YAML syntax is valid\n </Typography>\n ) : (\n <Typography variant=\"caption\" color=\"textSecondary\">\n Enter YAML content above\n </Typography>\n )}\n </Box>\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setEditModalOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={() => setConfirmDialogOpen(true)}\n color=\"primary\"\n variant=\"contained\"\n disabled={isLoadingManifest || !editingYaml.trim() || !!yamlValidationError}\n >\n Save Changes\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Confirmation Dialog */}\n <Dialog\n open={confirmDialogOpen}\n onClose={() => setConfirmDialogOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>Confirm Changes</DialogTitle>\n <DialogContent>\n <Typography>\n Are you sure you want to apply these changes to the resource? \n This action will update the Kubernetes resource based on your modifications.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setConfirmDialogOpen(false)} color=\"primary\">\n Cancel\n </Button>\n <Button\n onClick={handleSaveResource}\n color=\"primary\"\n variant=\"contained\"\n disabled={isSaving}\n >\n {isSaving ? 'Applying...' : 'Apply Changes'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Snackbar for notifications */}\n <Snackbar\n open={snackbar.open}\n autoHideDuration={6000}\n onClose={handleCloseSnackbar}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n >\n <Alert onClose={handleCloseSnackbar} severity={snackbar.severity}>\n {snackbar.message}\n </Alert>\n </Snackbar>\n </InfoCard>\n );\n};"],"names":["resourceContext","error","yaml"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationDeploymentDetails.esm.js","sources":["../../src/components/VCFAutomationDeploymentDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n Table,\n TableColumn,\n StructuredMetadataTable,\n Link,\n} from '@backstage/core-components';\nimport { Grid, Typography } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { viewDeploymentHistoryPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity } from '@backstage/catalog-model';\n\ntype DeploymentEvent = {\n id: string;\n name: string;\n status: string;\n requestedBy: string;\n createdAt: string;\n updatedAt: string;\n details: string;\n requestId: string;\n resourceIds: string[];\n};\n\ntype DeploymentResource = {\n name: string;\n title: string;\n kind: string;\n type: string;\n namespace: string;\n};\n\nconst eventColumns: TableColumn<DeploymentEvent>[] = [\n {\n title: 'Operation',\n field: 'name',\n },\n {\n title: 'Status',\n field: 'status',\n },\n {\n title: 'User',\n field: 'requestedBy',\n },\n {\n title: 'Created',\n field: 'createdAt',\n render: (row: DeploymentEvent) => new Date(row.createdAt).toLocaleString(),\n },\n {\n title: 'Last Updated',\n field: 'updatedAt',\n render: (row: DeploymentEvent) => new Date(row.updatedAt).toLocaleString(),\n },\n {\n title: 'Details',\n field: 'details',\n },\n];\n\nconst resourceColumns: TableColumn<DeploymentResource>[] = [\n {\n title: 'Name',\n field: 'title',\n render: (row: DeploymentResource) => (\n <Link to={`/catalog/${row.namespace}/${row.kind.toLowerCase()}/${row.name}`}>\n {row.title || row.name}\n </Link>\n ),\n },\n {\n title: 'Type',\n field: 'type',\n },\n];\n\nconst getEntityType = (entity: Entity): string => {\n const type = entity.spec?.type;\n if (typeof type === 'string') {\n return type;\n }\n if (typeof type === 'object' && type !== null) {\n return JSON.stringify(type);\n }\n return String(type || 'N/A');\n};\n\nexport const VCFAutomationDeploymentDetails = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const catalogApi = useApi(catalogApiRef);\n const deploymentId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: viewDeploymentHistoryPermission,\n });\n\n const { value: deploymentDetails, loading: detailsLoading, error: detailsError } = useAsync(async () => {\n if (!deploymentId || !hasViewPermission) {\n return undefined;\n }\n return await api.getDeploymentDetails(deploymentId, instanceName);\n }, [deploymentId, hasViewPermission, instanceName]);\n\n const { value: eventsResponse, loading: eventsLoading, error: eventsError } = useAsync(async () => {\n if (!deploymentId || !hasViewPermission) {\n return undefined;\n }\n const response = await api.getDeploymentEvents(deploymentId, instanceName);\n return response;\n }, [deploymentId, hasViewPermission, instanceName]);\n\n const { value: resources, loading: resourcesLoading, error: resourcesError } = useAsync(async () => {\n if (!deploymentId) {\n return undefined;\n }\n\n // Get all components that belong to this system\n const components = await catalogApi.getEntities({\n filter: {\n kind: 'Component',\n 'spec.system': deploymentId,\n },\n });\n\n // Get all resources that belong to this system\n const resources = await catalogApi.getEntities({\n filter: {\n kind: 'Resource',\n 'spec.system': deploymentId,\n },\n });\n\n // Combine and format the results\n const allResources: DeploymentResource[] = [\n ...components.items.map((component: Entity) => ({\n name: component.metadata.name,\n title: component.metadata.title || component.metadata.name,\n kind: component.kind,\n type: getEntityType(component),\n namespace: component.metadata.namespace || 'default',\n })),\n ...resources.items.map((resource: Entity) => ({\n name: resource.metadata.name,\n title: resource.metadata.title || resource.metadata.name,\n kind: resource.kind,\n type: getEntityType(resource),\n namespace: resource.metadata.namespace || 'default',\n })),\n ];\n\n return allResources;\n }, [deploymentId]);\n\n if (!deploymentId) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>No deployment ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (detailsLoading || eventsLoading || permissionLoading || resourcesLoading) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>You don't have permission to view deployment information.</Typography>\n </InfoCard>\n );\n }\n\n if (detailsError || eventsError || resourcesError) {\n return <ResponseErrorPanel error={detailsError ?? eventsError ?? resourcesError ?? new Error('Unknown error')} />;\n }\n\n const metadata: Record<string, any> = {\n 'Basic Information': {\n Name: deploymentDetails?.name,\n Description: deploymentDetails?.description || 'No description',\n Status: deploymentDetails?.status,\n 'Owner Type': deploymentDetails?.ownerType,\n 'Owned By': deploymentDetails?.ownedBy,\n 'Project ID': deploymentDetails?.projectId,\n 'Blueprint ID': deploymentDetails?.blueprintId,\n 'Organization ID': deploymentDetails?.orgId,\n },\n 'Timing Information': {\n 'Created By': deploymentDetails?.createdBy,\n 'Created At': deploymentDetails?.createdAt ? new Date(deploymentDetails.createdAt).toLocaleString() : '',\n 'Last Updated By': deploymentDetails?.lastUpdatedBy,\n 'Last Updated At': deploymentDetails?.lastUpdatedAt ? new Date(deploymentDetails.lastUpdatedAt).toLocaleString() : '',\n 'Lease Grace Period (Days)': deploymentDetails?.leaseGracePeriodDays,\n },\n 'Expense Information': deploymentDetails?.expense ? {\n 'Total Expense': deploymentDetails.expense.totalExpense !== undefined ? `${deploymentDetails.expense.totalExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Compute Expense': deploymentDetails.expense.computeExpense !== undefined ? `${deploymentDetails.expense.computeExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Storage Expense': deploymentDetails.expense.storageExpense !== undefined ? `${deploymentDetails.expense.storageExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Additional Expense': deploymentDetails.expense.additionalExpense !== undefined ? `${deploymentDetails.expense.additionalExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Last Updated': deploymentDetails.expense.lastUpdatedTime ? new Date(deploymentDetails.expense.lastUpdatedTime).toLocaleString() : 'N/A',\n } : 'No expense information available',\n 'Input Parameters': deploymentDetails?.inputs || {},\n };\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Deployment Details\">\n <StructuredMetadataTable metadata={metadata} />\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Deployment Resources\">\n {resources && resources.length > 0 ? (\n <Table\n columns={resourceColumns}\n data={resources}\n options={{\n search: true,\n paging: true,\n pageSize: 10,\n padding: 'dense',\n }}\n />\n ) : (\n <Typography>No resources found for this deployment.</Typography>\n )}\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Deployment Events\">\n {eventsResponse?.content && eventsResponse.content.length > 0 ? (\n <Table\n columns={eventColumns}\n data={eventsResponse.content}\n options={{\n search: true,\n paging: true,\n pageSize: eventsResponse.pageable?.pageSize || 10,\n padding: 'dense',\n }}\n />\n ) : (\n <Typography>No deployment events available.</Typography>\n )}\n </InfoCard>\n </Grid>\n </Grid>\n );\n}; "],"names":["resources"],"mappings":"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"}
1
+ {"version":3,"file":"VCFAutomationDeploymentDetails.esm.js","sources":["../../src/components/VCFAutomationDeploymentDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n Table,\n TableColumn,\n StructuredMetadataTable,\n Link,\n} from '@backstage/core-components';\nimport { Grid, Typography } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { viewDeploymentHistoryPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Entity } from '@backstage/catalog-model';\n\ntype DeploymentEvent = {\n id: string;\n name: string;\n status: string;\n requestedBy: string;\n createdAt: string;\n updatedAt: string;\n details: string;\n requestId: string;\n resourceIds: string[];\n};\n\ntype DeploymentResource = {\n name: string;\n title: string;\n kind: string;\n type: string;\n namespace: string;\n};\n\nconst eventColumns: TableColumn<DeploymentEvent>[] = [\n {\n title: 'Operation',\n field: 'name',\n },\n {\n title: 'Status',\n field: 'status',\n },\n {\n title: 'User',\n field: 'requestedBy',\n },\n {\n title: 'Created',\n field: 'createdAt',\n render: (row: DeploymentEvent) => new Date(row.createdAt).toLocaleString(),\n },\n {\n title: 'Last Updated',\n field: 'updatedAt',\n render: (row: DeploymentEvent) => new Date(row.updatedAt).toLocaleString(),\n },\n {\n title: 'Details',\n field: 'details',\n },\n];\n\nconst resourceColumns: TableColumn<DeploymentResource>[] = [\n {\n title: 'Name',\n field: 'title',\n render: (row: DeploymentResource) => (\n <Link to={`/catalog/${row.namespace}/${row.kind.toLowerCase()}/${row.name}`}>\n {row.title || row.name}\n </Link>\n ),\n },\n {\n title: 'Type',\n field: 'type',\n },\n];\n\nconst getEntityType = (entity: Entity): string => {\n const type = entity.spec?.type;\n if (typeof type === 'string') {\n return type;\n }\n if (typeof type === 'object' && type !== null) {\n return JSON.stringify(type);\n }\n return String(type || 'N/A');\n};\n\nexport const VCFAutomationDeploymentDetails = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const catalogApi = useApi(catalogApiRef);\n const deploymentId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: viewDeploymentHistoryPermission,\n });\n\n const { value: deploymentDetails, loading: detailsLoading, error: detailsError } = useAsync(async () => {\n if (!deploymentId || !hasViewPermission) {\n return undefined;\n }\n return await api.getDeploymentDetails(deploymentId, instanceName);\n }, [deploymentId, hasViewPermission, instanceName]);\n\n const { value: eventsResponse, loading: eventsLoading, error: eventsError } = useAsync(async () => {\n if (!deploymentId || !hasViewPermission) {\n return undefined;\n }\n const response = await api.getDeploymentEvents(deploymentId, instanceName);\n return response;\n }, [deploymentId, hasViewPermission, instanceName]);\n\n const { value: resources, loading: resourcesLoading, error: resourcesError } = useAsync(async () => {\n if (!deploymentId) {\n return undefined;\n }\n\n // Get all components that belong to this system\n const components = await catalogApi.getEntities({\n filter: {\n kind: 'Component',\n 'spec.system': deploymentId,\n },\n });\n\n // Get all resources that belong to this system\n const resources = await catalogApi.getEntities({\n filter: {\n kind: 'Resource',\n 'spec.system': deploymentId,\n },\n });\n\n // Combine and format the results\n const allResources: DeploymentResource[] = [\n ...components.items.map((component: Entity) => ({\n name: component.metadata.name,\n title: component.metadata.title || component.metadata.name,\n kind: component.kind,\n type: getEntityType(component),\n namespace: component.metadata.namespace || 'default',\n })),\n ...resources.items.map((resource: Entity) => ({\n name: resource.metadata.name,\n title: resource.metadata.title || resource.metadata.name,\n kind: resource.kind,\n type: getEntityType(resource),\n namespace: resource.metadata.namespace || 'default',\n })),\n ];\n\n return allResources;\n }, [deploymentId]);\n\n if (!deploymentId) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>No deployment ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (detailsLoading || eventsLoading || permissionLoading || resourcesLoading) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>You don't have permission to view deployment information.</Typography>\n </InfoCard>\n );\n }\n\n if (detailsError || eventsError || resourcesError) {\n return <ResponseErrorPanel error={detailsError ?? eventsError ?? resourcesError ?? new Error('Unknown error')} />;\n }\n\n const metadata: Record<string, any> = {\n 'Basic Information': {\n Name: deploymentDetails?.name,\n Description: deploymentDetails?.description || 'No description',\n Status: deploymentDetails?.status,\n 'Owner Type': deploymentDetails?.ownerType,\n 'Owned By': deploymentDetails?.ownedBy,\n 'Project ID': deploymentDetails?.projectId,\n 'Blueprint ID': deploymentDetails?.blueprintId,\n 'Organization ID': deploymentDetails?.orgId,\n },\n 'Timing Information': {\n 'Created By': deploymentDetails?.createdBy,\n 'Created At': deploymentDetails?.createdAt ? new Date(deploymentDetails.createdAt).toLocaleString() : '',\n 'Last Updated By': deploymentDetails?.lastUpdatedBy,\n 'Last Updated At': deploymentDetails?.lastUpdatedAt ? new Date(deploymentDetails.lastUpdatedAt).toLocaleString() : '',\n 'Lease Grace Period (Days)': deploymentDetails?.leaseGracePeriodDays,\n },\n 'Expense Information': deploymentDetails?.expense ? {\n 'Total Expense': deploymentDetails.expense.totalExpense !== undefined ? `${deploymentDetails.expense.totalExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Compute Expense': deploymentDetails.expense.computeExpense !== undefined ? `${deploymentDetails.expense.computeExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Storage Expense': deploymentDetails.expense.storageExpense !== undefined ? `${deploymentDetails.expense.storageExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Additional Expense': deploymentDetails.expense.additionalExpense !== undefined ? `${deploymentDetails.expense.additionalExpense} ${deploymentDetails.expense.unit || ''}` : 'N/A',\n 'Last Updated': deploymentDetails.expense.lastUpdatedTime ? new Date(deploymentDetails.expense.lastUpdatedTime).toLocaleString() : 'N/A',\n } : 'No expense information available',\n 'Input Parameters': deploymentDetails?.inputs || {},\n };\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Deployment Details\">\n <StructuredMetadataTable metadata={metadata} />\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Deployment Resources\">\n {resources && resources.length > 0 ? (\n <Table\n columns={resourceColumns}\n data={resources}\n options={{\n search: true,\n paging: true,\n pageSize: 10,\n padding: 'dense',\n }}\n />\n ) : (\n <Typography>No resources found for this deployment.</Typography>\n )}\n </InfoCard>\n </Grid>\n <Grid item xs={12}>\n <InfoCard title=\"Deployment Events\">\n {eventsResponse?.content && eventsResponse.content.length > 0 ? (\n <Table\n columns={eventColumns}\n data={eventsResponse.content}\n options={{\n search: true,\n paging: true,\n pageSize: eventsResponse.pageable?.pageSize || 10,\n padding: 'dense',\n }}\n />\n ) : (\n <Typography>No deployment events available.</Typography>\n )}\n </InfoCard>\n </Grid>\n </Grid>\n );\n}; "],"names":["resources"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationDeploymentOverview.esm.js","sources":["../../src/components/VCFAutomationDeploymentOverview.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { Grid, Typography } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { viewDeploymentHistoryPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nexport const VCFAutomationDeploymentOverview = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const deploymentId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: viewDeploymentHistoryPermission,\n });\n\n const { value: deploymentDetails, loading, error } = useAsync(async () => {\n if (!deploymentId || !hasViewPermission) {\n return undefined;\n }\n return await api.getDeploymentDetails(deploymentId, instanceName);\n }, [deploymentId, hasViewPermission, instanceName]);\n\n if (!deploymentId) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>No deployment ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permissionLoading) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>You don't have permission to view deployment details.</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!deploymentDetails) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>No deployment details available.</Typography>\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Deployment Information</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Name</Typography>\n <Typography>{deploymentDetails.name}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Status</Typography>\n <Typography>{deploymentDetails.status}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Created By</Typography>\n <Typography>{deploymentDetails.createdBy}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Created At</Typography>\n <Typography>\n {new Date(deploymentDetails.createdAt).toLocaleString()}\n </Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Last Updated By</Typography>\n <Typography>{deploymentDetails.lastUpdatedBy}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Last Updated At</Typography>\n <Typography>\n {new Date(deploymentDetails.lastUpdatedAt).toLocaleString()}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Expenses</Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Total</Typography>\n <Typography>\n {deploymentDetails.expense?.totalExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Compute</Typography>\n <Typography>\n {deploymentDetails.expense?.computeExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Storage</Typography>\n <Typography>\n {deploymentDetails.expense?.storageExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Additional</Typography>\n <Typography>\n {deploymentDetails.expense?.additionalExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n </Grid>\n </InfoCard>\n );\n}; "],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VCFAutomationDeploymentOverview.esm.js","sources":["../../src/components/VCFAutomationDeploymentOverview.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { Grid, Typography } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { viewDeploymentHistoryPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nexport const VCFAutomationDeploymentOverview = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const deploymentId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: viewDeploymentHistoryPermission,\n });\n\n const { value: deploymentDetails, loading, error } = useAsync(async () => {\n if (!deploymentId || !hasViewPermission) {\n return undefined;\n }\n return await api.getDeploymentDetails(deploymentId, instanceName);\n }, [deploymentId, hasViewPermission, instanceName]);\n\n if (!deploymentId) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>No deployment ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permissionLoading) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>You don't have permission to view deployment details.</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!deploymentDetails) {\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Typography>No deployment details available.</Typography>\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title=\"VCF Automation Deployment\">\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Deployment Information</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Name</Typography>\n <Typography>{deploymentDetails.name}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Status</Typography>\n <Typography>{deploymentDetails.status}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Created By</Typography>\n <Typography>{deploymentDetails.createdBy}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Created At</Typography>\n <Typography>\n {new Date(deploymentDetails.createdAt).toLocaleString()}\n </Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Last Updated By</Typography>\n <Typography>{deploymentDetails.lastUpdatedBy}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Last Updated At</Typography>\n <Typography>\n {new Date(deploymentDetails.lastUpdatedAt).toLocaleString()}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Expenses</Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Total</Typography>\n <Typography>\n {deploymentDetails.expense?.totalExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Compute</Typography>\n <Typography>\n {deploymentDetails.expense?.computeExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Storage</Typography>\n <Typography>\n {deploymentDetails.expense?.storageExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\">Additional</Typography>\n <Typography>\n {deploymentDetails.expense?.additionalExpense || 'N/A'} {deploymentDetails.expense?.unit || ''}\n </Typography>\n </Grid>\n </Grid>\n </InfoCard>\n );\n}; "],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationGenericResourceDetails.esm.js","sources":["../../src/components/VCFAutomationGenericResourceDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\n\nconst formatValue = (value: any): any => {\n if (value === null) return 'null';\n if (typeof value === 'undefined') return 'undefined';\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return value.map(formatValue);\n }\n const formattedObj: Record<string, any> = {};\n Object.entries(value).forEach(([key, val]) => {\n formattedObj[key] = formatValue(val);\n });\n return formattedObj;\n }\n if (typeof value === 'string' && value.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/)) {\n return new Date(value).toLocaleString();\n }\n return value;\n};\n\nexport const VCFAutomationGenericResourceDetails = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const deploymentId = entity.spec?.system || '';\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { value: resourceData, loading, error } = useAsync(async () => {\n if (!deploymentId || !resourceId) return undefined;\n return await vcfAutomationApi.getGenericResourceDetails(deploymentId as string, resourceId as string, instanceName);\n }, [deploymentId, resourceId, instanceName]);\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!deploymentId || !resourceId) {\n return (\n <InfoCard title=\"No Resource Information\">\n This entity is not associated with a VCF resource.\n </InfoCard>\n );\n }\n\n if (!resourceData) {\n return <InfoCard title=\"No Data\">No resource details available.</InfoCard>;\n }\n\n // Format all data for display\n const formattedData = formatValue(resourceData);\n\n return (\n <InfoCard title=\"Resource Details\">\n <StructuredMetadataTable metadata={formattedData} />\n </InfoCard>\n );\n}; "],"names":[],"mappings":";;;;;;;AAWA,MAAM,WAAA,GAAc,CAAC,KAAoB,KAAA;AACvC,EAAI,IAAA,KAAA,KAAU,MAAa,OAAA,MAAA;AAC3B,EAAI,IAAA,OAAO,KAAU,KAAA,WAAA,EAAoB,OAAA,WAAA;AACzC,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,MAAO,OAAA,KAAA,CAAM,IAAI,WAAW,CAAA;AAAA;AAE9B,IAAA,MAAM,eAAoC,EAAC;AAC3C,IAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,GAAG,CAAM,KAAA;AAC5C,MAAa,YAAA,CAAA,GAAG,CAAI,GAAA,WAAA,CAAY,GAAG,CAAA;AAAA,KACpC,CAAA;AACD,IAAO,OAAA,YAAA;AAAA;AAET,EAAA,IAAI,OAAO,KAAU,KAAA,QAAA,IAAY,KAAM,CAAA,KAAA,CAAM,sCAAsC,CAAG,EAAA;AACpF,IAAA,OAAO,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,cAAe,EAAA;AAAA;AAExC,EAAO,OAAA,KAAA;AACT,CAAA;AAEO,MAAM,sCAAsC,MAAM;AACvD,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,YAAA,GAAe,MAAO,CAAA,IAAA,EAAM,MAAU,IAAA,EAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,OAAO,QAAS,CAAA,IAAA;AACnC,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,8CAA8C,CAAA;AAEjG,EAAA,MAAM,EAAE,KAAO,EAAA,YAAA,EAAc,SAAS,KAAM,EAAA,GAAI,SAAS,YAAY;AACnE,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAmB,OAAA,KAAA,CAAA;AACzC,IAAA,OAAO,MAAM,gBAAA,CAAiB,yBAA0B,CAAA,YAAA,EAAwB,YAAsB,YAAY,CAAA;AAAA,GACjH,EAAA,CAAC,YAAc,EAAA,UAAA,EAAY,YAAY,CAAC,CAAA;AAE3C,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAA,GAAA,CAAC,sBAAmB,KAAc,EAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAGnB,EAAI,IAAA,CAAC,YAAgB,IAAA,CAAC,UAAY,EAAA;AAChC,IAAA,uBACG,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,yBAAA,EAA0B,QAE1C,EAAA,oDAAA,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,SAAA,EAAU,QAA8B,EAAA,gCAAA,EAAA,CAAA;AAAA;AAIjE,EAAM,MAAA,aAAA,GAAgB,YAAY,YAAY,CAAA;AAE9C,EACE,uBAAA,GAAA,CAAC,YAAS,KAAM,EAAA,kBAAA,EACd,8BAAC,uBAAwB,EAAA,EAAA,QAAA,EAAU,eAAe,CACpD,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"VCFAutomationGenericResourceDetails.esm.js","sources":["../../src/components/VCFAutomationGenericResourceDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\n\nconst formatValue = (value: any): any => {\n if (value === null) return 'null';\n if (typeof value === 'undefined') return 'undefined';\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return value.map(formatValue);\n }\n const formattedObj: Record<string, any> = {};\n Object.entries(value).forEach(([key, val]) => {\n formattedObj[key] = formatValue(val);\n });\n return formattedObj;\n }\n if (typeof value === 'string' && value.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/)) {\n return new Date(value).toLocaleString();\n }\n return value;\n};\n\nexport const VCFAutomationGenericResourceDetails = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const deploymentId = entity.spec?.system || '';\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { value: resourceData, loading, error } = useAsync(async () => {\n if (!deploymentId || !resourceId) return undefined;\n return await vcfAutomationApi.getGenericResourceDetails(deploymentId as string, resourceId as string, instanceName);\n }, [deploymentId, resourceId, instanceName]);\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!deploymentId || !resourceId) {\n return (\n <InfoCard title=\"No Resource Information\">\n This entity is not associated with a VCF resource.\n </InfoCard>\n );\n }\n\n if (!resourceData) {\n return <InfoCard title=\"No Data\">No resource details available.</InfoCard>;\n }\n\n // Format all data for display\n const formattedData = formatValue(resourceData);\n\n return (\n <InfoCard title=\"Resource Details\">\n <StructuredMetadataTable metadata={formattedData} />\n </InfoCard>\n );\n}; "],"names":[],"mappings":";;;;;;;AAWA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAoB;AACvC,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,OAAO,KAAA,KAAU,WAAA,EAAa,OAAO,WAAA;AACzC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAO,KAAA,CAAM,IAAI,WAAW,CAAA;AAAA,IAC9B;AACA,IAAA,MAAM,eAAoC,EAAC;AAC3C,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,KAAM;AAC5C,MAAA,YAAA,CAAa,GAAG,CAAA,GAAI,WAAA,CAAY,GAAG,CAAA;AAAA,IACrC,CAAC,CAAA;AACD,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,KAAA,CAAM,sCAAsC,CAAA,EAAG;AACpF,IAAA,OAAO,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,EACxC;AACA,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,MAAM,sCAAsC,MAAM;AACvD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,EAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA;AACnC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,8CAA8C,CAAA;AAEjG,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,SAAS,KAAA,EAAM,GAAI,SAAS,YAAY;AACnE,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY,OAAO,MAAA;AACzC,IAAA,OAAO,MAAM,gBAAA,CAAiB,yBAAA,CAA0B,YAAA,EAAwB,YAAsB,YAAY,CAAA;AAAA,EACpH,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,YAAY,CAAC,CAAA;AAE3C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBAAO,GAAA,CAAC,sBAAmB,KAAA,EAAc,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChC,IAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,yBAAA,EAA0B,QAAA,EAAA,oDAAA,EAE1C,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,gCAAA,EAA8B,CAAA;AAAA,EACjE;AAGA,EAAA,MAAM,aAAA,GAAgB,YAAY,YAAY,CAAA;AAE9C,EAAA,uBACE,GAAA,CAAC,YAAS,KAAA,EAAM,kBAAA,EACd,8BAAC,uBAAA,EAAA,EAAwB,QAAA,EAAU,eAAe,CAAA,EACpD,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationGenericResourceOverview.esm.js","sources":["../../src/components/VCFAutomationGenericResourceOverview.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\n\nexport const VCFAutomationGenericResourceOverview = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const deploymentId = entity.spec?.system || '';\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { value: resourceData, loading, error } = useAsync(async () => {\n if (!deploymentId || !resourceId) return undefined;\n return await vcfAutomationApi.getGenericResourceDetails(deploymentId as string, resourceId as string, instanceName);\n }, [deploymentId, resourceId, instanceName]);\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!deploymentId || !resourceId) {\n return (\n <InfoCard title=\"No Resource Information\">\n This entity is not associated with a VCF resource.\n </InfoCard>\n );\n }\n\n if (!resourceData) {\n return <InfoCard title=\"No Data\">No resource details available.</InfoCard>;\n }\n\n // Extract the overview fields if they exist\n const overviewData: Record<string, any> = {};\n \n if (resourceData.name) overviewData['Name'] = resourceData.name;\n if (resourceData.type) overviewData['Type'] = resourceData.type;\n if (resourceData.createdAt) overviewData['Created At'] = new Date(resourceData.createdAt).toLocaleString();\n if (resourceData.syncStatus) overviewData['Sync Status'] = resourceData.syncStatus;\n if (resourceData.origin) overviewData['Origin'] = resourceData.origin;\n if (resourceData.status) overviewData['Status'] = resourceData.status;\n\n return (\n <InfoCard title=\"Resource Overview\">\n <StructuredMetadataTable metadata={overviewData} />\n </InfoCard>\n );\n}; "],"names":[],"mappings":";;;;;;;AAWO,MAAM,uCAAuC,MAAM;AACxD,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,YAAA,GAAe,MAAO,CAAA,IAAA,EAAM,MAAU,IAAA,EAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,OAAO,QAAS,CAAA,IAAA;AACnC,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,8CAA8C,CAAA;AAEjG,EAAA,MAAM,EAAE,KAAO,EAAA,YAAA,EAAc,SAAS,KAAM,EAAA,GAAI,SAAS,YAAY;AACnE,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAmB,OAAA,KAAA,CAAA;AACzC,IAAA,OAAO,MAAM,gBAAA,CAAiB,yBAA0B,CAAA,YAAA,EAAwB,YAAsB,YAAY,CAAA;AAAA,GACjH,EAAA,CAAC,YAAc,EAAA,UAAA,EAAY,YAAY,CAAC,CAAA;AAE3C,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAA,GAAA,CAAC,sBAAmB,KAAc,EAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAGnB,EAAI,IAAA,CAAC,YAAgB,IAAA,CAAC,UAAY,EAAA;AAChC,IAAA,uBACG,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,yBAAA,EAA0B,QAE1C,EAAA,oDAAA,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,SAAA,EAAU,QAA8B,EAAA,gCAAA,EAAA,CAAA;AAAA;AAIjE,EAAA,MAAM,eAAoC,EAAC;AAE3C,EAAA,IAAI,YAAa,CAAA,IAAA,EAAmB,YAAA,CAAA,MAAM,IAAI,YAAa,CAAA,IAAA;AAC3D,EAAA,IAAI,YAAa,CAAA,IAAA,EAAmB,YAAA,CAAA,MAAM,IAAI,YAAa,CAAA,IAAA;AAC3D,EAAI,IAAA,YAAA,CAAa,SAAW,EAAA,YAAA,CAAa,YAAY,CAAA,GAAI,IAAI,IAAK,CAAA,YAAA,CAAa,SAAS,CAAA,CAAE,cAAe,EAAA;AACzG,EAAA,IAAI,YAAa,CAAA,UAAA,EAAyB,YAAA,CAAA,aAAa,IAAI,YAAa,CAAA,UAAA;AACxE,EAAA,IAAI,YAAa,CAAA,MAAA,EAAqB,YAAA,CAAA,QAAQ,IAAI,YAAa,CAAA,MAAA;AAC/D,EAAA,IAAI,YAAa,CAAA,MAAA,EAAqB,YAAA,CAAA,QAAQ,IAAI,YAAa,CAAA,MAAA;AAE/D,EACE,uBAAA,GAAA,CAAC,YAAS,KAAM,EAAA,mBAAA,EACd,8BAAC,uBAAwB,EAAA,EAAA,QAAA,EAAU,cAAc,CACnD,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"VCFAutomationGenericResourceOverview.esm.js","sources":["../../src/components/VCFAutomationGenericResourceOverview.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n} from '@backstage/core-components';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\n\nexport const VCFAutomationGenericResourceOverview = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const deploymentId = entity.spec?.system || '';\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { value: resourceData, loading, error } = useAsync(async () => {\n if (!deploymentId || !resourceId) return undefined;\n return await vcfAutomationApi.getGenericResourceDetails(deploymentId as string, resourceId as string, instanceName);\n }, [deploymentId, resourceId, instanceName]);\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!deploymentId || !resourceId) {\n return (\n <InfoCard title=\"No Resource Information\">\n This entity is not associated with a VCF resource.\n </InfoCard>\n );\n }\n\n if (!resourceData) {\n return <InfoCard title=\"No Data\">No resource details available.</InfoCard>;\n }\n\n // Extract the overview fields if they exist\n const overviewData: Record<string, any> = {};\n \n if (resourceData.name) overviewData['Name'] = resourceData.name;\n if (resourceData.type) overviewData['Type'] = resourceData.type;\n if (resourceData.createdAt) overviewData['Created At'] = new Date(resourceData.createdAt).toLocaleString();\n if (resourceData.syncStatus) overviewData['Sync Status'] = resourceData.syncStatus;\n if (resourceData.origin) overviewData['Origin'] = resourceData.origin;\n if (resourceData.status) overviewData['Status'] = resourceData.status;\n\n return (\n <InfoCard title=\"Resource Overview\">\n <StructuredMetadataTable metadata={overviewData} />\n </InfoCard>\n );\n}; "],"names":[],"mappings":";;;;;;;AAWO,MAAM,uCAAuC,MAAM;AACxD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,EAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA;AACnC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,8CAA8C,CAAA;AAEjG,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,SAAS,KAAA,EAAM,GAAI,SAAS,YAAY;AACnE,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY,OAAO,MAAA;AACzC,IAAA,OAAO,MAAM,gBAAA,CAAiB,yBAAA,CAA0B,YAAA,EAAwB,YAAsB,YAAY,CAAA;AAAA,EACpH,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,YAAY,CAAC,CAAA;AAE3C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBAAO,GAAA,CAAC,sBAAmB,KAAA,EAAc,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChC,IAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,yBAAA,EAA0B,QAAA,EAAA,oDAAA,EAE1C,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,uBAAO,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,gCAAA,EAA8B,CAAA;AAAA,EACjE;AAGA,EAAA,MAAM,eAAoC,EAAC;AAE3C,EAAA,IAAI,YAAA,CAAa,IAAA,EAAM,YAAA,CAAa,MAAM,IAAI,YAAA,CAAa,IAAA;AAC3D,EAAA,IAAI,YAAA,CAAa,IAAA,EAAM,YAAA,CAAa,MAAM,IAAI,YAAA,CAAa,IAAA;AAC3D,EAAA,IAAI,YAAA,CAAa,SAAA,EAAW,YAAA,CAAa,YAAY,CAAA,GAAI,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,CAAE,cAAA,EAAe;AACzG,EAAA,IAAI,YAAA,CAAa,UAAA,EAAY,YAAA,CAAa,aAAa,IAAI,YAAA,CAAa,UAAA;AACxE,EAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,YAAA,CAAa,QAAQ,IAAI,YAAA,CAAa,MAAA;AAC/D,EAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,YAAA,CAAa,QAAQ,IAAI,YAAA,CAAa,MAAA;AAE/D,EAAA,uBACE,GAAA,CAAC,YAAS,KAAA,EAAM,mBAAA,EACd,8BAAC,uBAAA,EAAA,EAAwB,QAAA,EAAU,cAAc,CAAA,EACnD,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationProjectDetails.esm.js","sources":["../../src/components/VCFAutomationProjectDetails.tsx"],"sourcesContent":["import { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n Table,\n Link,\n} from '@backstage/core-components';\nimport { Grid } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport { viewProjectDetailsPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { VcfProjectZone } from '../types';\n\ntype ProjectMember = {\n email: string;\n type: string;\n};\n\ntype SystemDeployment = {\n name: string;\n title: string;\n owner: string;\n vmCount: number;\n resourceCount: number;\n entityRef: string;\n};\n\nexport const VCFAutomationProjectDetails = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const catalogApi = useApi(catalogApiRef);\n const projectId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { allowed } = usePermission({\n permission: viewProjectDetailsPermission,\n });\n\n const { value: projectData, loading: projectLoading, error: projectError } = useAsync(async () => {\n if (!projectId || !allowed) return undefined;\n return await vcfAutomationApi.getProjectDetails(projectId, instanceName);\n }, [projectId, allowed, instanceName]);\n\n const { value: systemsData, loading: systemsLoading } = useAsync(async () => {\n if (!projectId || !allowed) return undefined;\n\n // Get all systems that belong to this project's domain\n const systems = await catalogApi.getEntities({\n filter: {\n kind: 'System',\n 'spec.domain': projectId,\n },\n });\n\n const deployments = await Promise.all(\n systems.items.map(async (system) => {\n // Get VMs belonging to this system\n const vms = await catalogApi.getEntities({\n filter: {\n kind: 'Component',\n 'spec.type': 'Cloud.vSphere.Machine',\n 'spec.system': system.metadata.name,\n },\n });\n\n // Get other resources belonging to this system\n const resources = await catalogApi.getEntities({\n filter: {\n kind: 'Resource',\n 'spec.system': system.metadata.name,\n },\n });\n\n const owner = system.spec?.owner;\n return {\n name: system.metadata.name,\n title: system.metadata.title || system.metadata.name,\n owner: typeof owner === 'string' ? owner : 'N/A',\n vmCount: vms.items.length,\n resourceCount: resources.items.length,\n entityRef: `/catalog/${system.metadata.namespace || 'default'}/system/${system.metadata.name}`,\n } as SystemDeployment;\n }),\n );\n\n return deployments;\n }, [projectId, allowed]);\n\n if (projectError) {\n return <ResponseErrorPanel error={projectError} />;\n }\n\n if (projectLoading || systemsLoading) {\n return <Progress />;\n }\n\n if (!projectId) {\n return <InfoCard title=\"No project ID found\">This entity is not associated with a VCF project.</InfoCard>;\n }\n\n if (!allowed) {\n return <InfoCard title=\"Permission Denied\">You don't have permission to view project details.</InfoCard>;\n }\n\n if (!projectData) {\n return <InfoCard title=\"No Data\">No project details available.</InfoCard>;\n }\n\n const renderMemberTable = (members: ProjectMember[], title: string) => (\n <Grid item xs={12} md={6}>\n <InfoCard title={title}>\n <Table\n columns={[\n { title: 'Email', field: 'email' },\n { title: 'Type', field: 'type' },\n ]}\n data={members}\n options={{ search: false, paging: false }}\n />\n </InfoCard>\n </Grid>\n );\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Project Overview\">\n <StructuredMetadataTable\n metadata={{\n 'Project Name': projectData.name,\n 'Project ID': projectData.id,\n Description: projectData.description,\n 'Organization ID': projectData.organizationId || projectData.orgId,\n 'Operation Timeout': `${projectData.operationTimeout} seconds`,\n 'Machine Naming Template': projectData.machineNamingTemplate || 'N/A',\n 'Shared Resources': projectData.sharedResources ? 'Yes' : 'No',\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard title=\"Project Deployments\">\n <Table\n columns={[\n { \n title: 'Name', \n field: 'title',\n render: (row: SystemDeployment) => (\n <Link to={row.entityRef}>{row.title}</Link>\n ),\n },\n { title: 'Owner', field: 'owner' },\n { \n title: 'VMs', \n field: 'vmCount',\n align: 'right',\n },\n { \n title: 'Additional Resources', \n field: 'resourceCount',\n align: 'right',\n },\n ]}\n data={systemsData || []}\n options={{\n search: true,\n paging: true,\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard title=\"Project Members\">\n <Grid container spacing={3}>\n {renderMemberTable(projectData.administrators || [], 'Administrators')}\n {renderMemberTable(projectData.members || [], 'Members')}\n {renderMemberTable(projectData.viewers || [], 'Viewers')}\n {renderMemberTable(projectData.supervisors || [], 'Supervisors')}\n {projectData.users && projectData.users.length > 0 && renderMemberTable(projectData.users, 'Users')}\n {projectData.auditors && projectData.auditors.length > 0 && renderMemberTable(projectData.auditors, 'Auditors')}\n </Grid>\n </InfoCard>\n </Grid>\n\n {projectData.zones && projectData.zones.length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Project Zones\">\n <Table\n columns={[\n { title: 'Zone ID', field: 'zoneId' },\n { title: 'Priority', field: 'priority' },\n { \n title: 'Instances', \n field: 'instances',\n render: (row: VcfProjectZone) => `${row.allocatedInstancesCount}/${row.maxNumberInstances || '∞'}`,\n },\n { \n title: 'Memory (MB)', \n field: 'memory',\n render: (row: VcfProjectZone) => `${row.allocatedMemoryMB}/${row.memoryLimitMB || '∞'}`,\n },\n { \n title: 'CPU', \n field: 'cpu',\n render: (row: VcfProjectZone) => `${row.allocatedCpu}/${row.cpuLimit || '∞'}`,\n },\n { \n title: 'Storage (GB)', \n field: 'storage',\n render: (row: VcfProjectZone) => `${row.allocatedStorageGB}/${row.storageLimitGB || '∞'}`,\n },\n ]}\n data={projectData.zones}\n options={{\n search: true,\n paging: true,\n }}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.constraints && Object.keys(projectData.constraints).length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Constraints\">\n <StructuredMetadataTable\n metadata={projectData.constraints}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.customProperties && Object.keys(projectData.customProperties).length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Custom Properties\">\n <StructuredMetadataTable\n metadata={projectData.customProperties}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.properties && Object.keys(projectData.properties).length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Properties\">\n <StructuredMetadataTable\n metadata={projectData.properties}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.orgId && (\n <Grid item xs={12}>\n <InfoCard title=\"Organization Information\">\n <StructuredMetadataTable\n metadata={{\n 'Organization ID': projectData.orgId,\n 'Operation Timeout': projectData.operationTimeout ? `${projectData.operationTimeout} minutes` : 'Not configured',\n }}\n />\n </InfoCard>\n </Grid>\n )}\n </Grid>\n );\n}; "],"names":[],"mappings":";;;;;;;;;;AA+BO,MAAM,8BAA8B,MAAM;AAC/C,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAM,MAAA,SAAA,GAAY,OAAO,QAAS,CAAA,IAAA;AAClC,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,8CAA8C,CAAA;AAEjG,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,aAAc,CAAA;AAAA,IAChC,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAM,MAAA,EAAE,OAAO,WAAa,EAAA,OAAA,EAAS,gBAAgB,KAAO,EAAA,YAAA,EAAiB,GAAA,QAAA,CAAS,YAAY;AAChG,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAgB,OAAA,KAAA,CAAA;AACnC,IAAA,OAAO,MAAM,gBAAA,CAAiB,iBAAkB,CAAA,SAAA,EAAW,YAAY,CAAA;AAAA,GACtE,EAAA,CAAC,SAAW,EAAA,OAAA,EAAS,YAAY,CAAC,CAAA;AAErC,EAAA,MAAM,EAAE,KAAO,EAAA,WAAA,EAAa,SAAS,cAAe,EAAA,GAAI,SAAS,YAAY;AAC3E,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAgB,OAAA,KAAA,CAAA;AAGnC,IAAM,MAAA,OAAA,GAAU,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,MAC3C,MAAQ,EAAA;AAAA,QACN,IAAM,EAAA,QAAA;AAAA,QACN,aAAe,EAAA;AAAA;AACjB,KACD,CAAA;AAED,IAAM,MAAA,WAAA,GAAc,MAAM,OAAQ,CAAA,GAAA;AAAA,MAChC,OAAQ,CAAA,KAAA,CAAM,GAAI,CAAA,OAAO,MAAW,KAAA;AAElC,QAAM,MAAA,GAAA,GAAM,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,UACvC,MAAQ,EAAA;AAAA,YACN,IAAM,EAAA,WAAA;AAAA,YACN,WAAa,EAAA,uBAAA;AAAA,YACb,aAAA,EAAe,OAAO,QAAS,CAAA;AAAA;AACjC,SACD,CAAA;AAGD,QAAM,MAAA,SAAA,GAAY,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,UAC7C,MAAQ,EAAA;AAAA,YACN,IAAM,EAAA,UAAA;AAAA,YACN,aAAA,EAAe,OAAO,QAAS,CAAA;AAAA;AACjC,SACD,CAAA;AAED,QAAM,MAAA,KAAA,GAAQ,OAAO,IAAM,EAAA,KAAA;AAC3B,QAAO,OAAA;AAAA,UACL,IAAA,EAAM,OAAO,QAAS,CAAA,IAAA;AAAA,UACtB,KAAO,EAAA,MAAA,CAAO,QAAS,CAAA,KAAA,IAAS,OAAO,QAAS,CAAA,IAAA;AAAA,UAChD,KAAO,EAAA,OAAO,KAAU,KAAA,QAAA,GAAW,KAAQ,GAAA,KAAA;AAAA,UAC3C,OAAA,EAAS,IAAI,KAAM,CAAA,MAAA;AAAA,UACnB,aAAA,EAAe,UAAU,KAAM,CAAA,MAAA;AAAA,UAC/B,SAAA,EAAW,YAAY,MAAO,CAAA,QAAA,CAAS,aAAa,SAAS,CAAA,QAAA,EAAW,MAAO,CAAA,QAAA,CAAS,IAAI,CAAA;AAAA,SAC9F;AAAA,OACD;AAAA,KACH;AAEA,IAAO,OAAA,WAAA;AAAA,GACN,EAAA,CAAC,SAAW,EAAA,OAAO,CAAC,CAAA;AAEvB,EAAA,IAAI,YAAc,EAAA;AAChB,IAAO,uBAAA,GAAA,CAAC,kBAAmB,EAAA,EAAA,KAAA,EAAO,YAAc,EAAA,CAAA;AAAA;AAGlD,EAAA,IAAI,kBAAkB,cAAgB,EAAA;AACpC,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAGnB,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,qBAAA,EAAsB,QAAiD,EAAA,mDAAA,EAAA,CAAA;AAAA;AAGhG,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,mBAAA,EAAoB,QAAkD,EAAA,oDAAA,EAAA,CAAA;AAAA;AAG/F,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAA,uBAAQ,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,SAAA,EAAU,QAA6B,EAAA,+BAAA,EAAA,CAAA;AAAA;AAGhE,EAAA,MAAM,iBAAoB,GAAA,CAAC,OAA0B,EAAA,KAAA,yBAClD,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,CACrB,EAAA,QAAA,kBAAA,GAAA,CAAC,YAAS,KACR,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA;AAAA,QACP,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAO,OAAQ,EAAA;AAAA,QACjC,EAAE,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,MAAO;AAAA,OACjC;AAAA,MACA,IAAM,EAAA,OAAA;AAAA,MACN,OAAS,EAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,QAAQ,KAAM;AAAA;AAAA,KAE5C,CACF,EAAA,CAAA;AAGF,EAAA,uBACG,IAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IACb,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,OAAM,kBACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,QAAU,EAAA;AAAA,UACR,gBAAgB,WAAY,CAAA,IAAA;AAAA,UAC5B,cAAc,WAAY,CAAA,EAAA;AAAA,UAC1B,aAAa,WAAY,CAAA,WAAA;AAAA,UACzB,iBAAA,EAAmB,WAAY,CAAA,cAAA,IAAkB,WAAY,CAAA,KAAA;AAAA,UAC7D,mBAAA,EAAqB,CAAG,EAAA,WAAA,CAAY,gBAAgB,CAAA,QAAA,CAAA;AAAA,UACpD,yBAAA,EAA2B,YAAY,qBAAyB,IAAA,KAAA;AAAA,UAChE,kBAAA,EAAoB,WAAY,CAAA,eAAA,GAAkB,KAAQ,GAAA;AAAA;AAC5D;AAAA,OAEJ,CACF,EAAA,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,qBACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,OAAS,EAAA;AAAA,UACP;AAAA,YACE,KAAO,EAAA,MAAA;AAAA,YACP,KAAO,EAAA,OAAA;AAAA,YACP,MAAA,EAAQ,CAAC,GACP,qBAAA,GAAA,CAAC,QAAK,EAAI,EAAA,GAAA,CAAI,SAAY,EAAA,QAAA,EAAA,GAAA,CAAI,KAAM,EAAA;AAAA,WAExC;AAAA,UACA,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAO,OAAQ,EAAA;AAAA,UACjC;AAAA,YACE,KAAO,EAAA,KAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,KAAO,EAAA;AAAA,WACT;AAAA,UACA;AAAA,YACE,KAAO,EAAA,sBAAA;AAAA,YACP,KAAO,EAAA,eAAA;AAAA,YACP,KAAO,EAAA;AAAA;AACT,SACF;AAAA,QACA,IAAA,EAAM,eAAe,EAAC;AAAA,QACtB,OAAS,EAAA;AAAA,UACP,MAAQ,EAAA,IAAA;AAAA,UACR,MAAQ,EAAA;AAAA;AACV;AAAA,OAEJ,CACF,EAAA,CAAA;AAAA,oBAEC,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,mBACd,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACtB,EAAA,QAAA,EAAA;AAAA,MAAA,iBAAA,CAAkB,WAAY,CAAA,cAAA,IAAkB,EAAC,EAAG,gBAAgB,CAAA;AAAA,MACpE,iBAAkB,CAAA,WAAA,CAAY,OAAW,IAAA,IAAI,SAAS,CAAA;AAAA,MACtD,iBAAkB,CAAA,WAAA,CAAY,OAAW,IAAA,IAAI,SAAS,CAAA;AAAA,MACtD,iBAAkB,CAAA,WAAA,CAAY,WAAe,IAAA,IAAI,aAAa,CAAA;AAAA,MAC9D,WAAA,CAAY,SAAS,WAAY,CAAA,KAAA,CAAM,SAAS,CAAK,IAAA,iBAAA,CAAkB,WAAY,CAAA,KAAA,EAAO,OAAO,CAAA;AAAA,MACjG,WAAA,CAAY,YAAY,WAAY,CAAA,QAAA,CAAS,SAAS,CAAK,IAAA,iBAAA,CAAkB,WAAY,CAAA,QAAA,EAAU,UAAU;AAAA,KAAA,EAChH,GACF,CACF,EAAA,CAAA;AAAA,IAEC,WAAY,CAAA,KAAA,IAAS,WAAY,CAAA,KAAA,CAAM,SAAS,CAC/C,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EACb,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,OAAM,eACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,OAAS,EAAA;AAAA,UACP,EAAE,KAAA,EAAO,SAAW,EAAA,KAAA,EAAO,QAAS,EAAA;AAAA,UACpC,EAAE,KAAA,EAAO,UAAY,EAAA,KAAA,EAAO,UAAW,EAAA;AAAA,UACvC;AAAA,YACE,KAAO,EAAA,WAAA;AAAA,YACP,KAAO,EAAA,WAAA;AAAA,YACP,MAAA,EAAQ,CAAC,GAAwB,KAAA,CAAA,EAAG,IAAI,uBAAuB,CAAA,CAAA,EAAI,GAAI,CAAA,kBAAA,IAAsB,QAAG,CAAA;AAAA,WAClG;AAAA,UACA;AAAA,YACE,KAAO,EAAA,aAAA;AAAA,YACP,KAAO,EAAA,QAAA;AAAA,YACP,MAAA,EAAQ,CAAC,GAAwB,KAAA,CAAA,EAAG,IAAI,iBAAiB,CAAA,CAAA,EAAI,GAAI,CAAA,aAAA,IAAiB,QAAG,CAAA;AAAA,WACvF;AAAA,UACA;AAAA,YACE,KAAO,EAAA,KAAA;AAAA,YACP,KAAO,EAAA,KAAA;AAAA,YACP,MAAA,EAAQ,CAAC,GAAwB,KAAA,CAAA,EAAG,IAAI,YAAY,CAAA,CAAA,EAAI,GAAI,CAAA,QAAA,IAAY,QAAG,CAAA;AAAA,WAC7E;AAAA,UACA;AAAA,YACE,KAAO,EAAA,cAAA;AAAA,YACP,KAAO,EAAA,SAAA;AAAA,YACP,MAAA,EAAQ,CAAC,GAAwB,KAAA,CAAA,EAAG,IAAI,kBAAkB,CAAA,CAAA,EAAI,GAAI,CAAA,cAAA,IAAkB,QAAG,CAAA;AAAA;AACzF,SACF;AAAA,QACA,MAAM,WAAY,CAAA,KAAA;AAAA,QAClB,OAAS,EAAA;AAAA,UACP,MAAQ,EAAA,IAAA;AAAA,UACR,MAAQ,EAAA;AAAA;AACV;AAAA,OAEJ,CACF,EAAA,CAAA;AAAA,IAGD,YAAY,WAAe,IAAA,MAAA,CAAO,KAAK,WAAY,CAAA,WAAW,EAAE,MAAS,GAAA,CAAA,oBACvE,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IACb,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,OAAM,aACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,UAAU,WAAY,CAAA;AAAA;AAAA,OAE1B,CACF,EAAA,CAAA;AAAA,IAGD,YAAY,gBAAoB,IAAA,MAAA,CAAO,KAAK,WAAY,CAAA,gBAAgB,EAAE,MAAS,GAAA,CAAA,oBACjF,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IACb,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,OAAM,mBACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,UAAU,WAAY,CAAA;AAAA;AAAA,OAE1B,CACF,EAAA,CAAA;AAAA,IAGD,YAAY,UAAc,IAAA,MAAA,CAAO,KAAK,WAAY,CAAA,UAAU,EAAE,MAAS,GAAA,CAAA,oBACrE,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IACb,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,OAAM,YACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,UAAU,WAAY,CAAA;AAAA;AAAA,OAE1B,CACF,EAAA,CAAA;AAAA,IAGD,WAAA,CAAY,KACX,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,0BACd,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,QAAU,EAAA;AAAA,UACR,mBAAmB,WAAY,CAAA,KAAA;AAAA,UAC/B,qBAAqB,WAAY,CAAA,gBAAA,GAAmB,CAAG,EAAA,WAAA,CAAY,gBAAgB,CAAa,QAAA,CAAA,GAAA;AAAA;AAClG;AAAA,OAEJ,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"VCFAutomationProjectDetails.esm.js","sources":["../../src/components/VCFAutomationProjectDetails.tsx"],"sourcesContent":["import { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\n Table,\n Link,\n} from '@backstage/core-components';\nimport { Grid } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport { viewProjectDetailsPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { VcfProjectZone } from '../types';\n\ntype ProjectMember = {\n email: string;\n type: string;\n};\n\ntype SystemDeployment = {\n name: string;\n title: string;\n owner: string;\n vmCount: number;\n resourceCount: number;\n entityRef: string;\n};\n\nexport const VCFAutomationProjectDetails = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const catalogApi = useApi(catalogApiRef);\n const projectId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n const { allowed } = usePermission({\n permission: viewProjectDetailsPermission,\n });\n\n const { value: projectData, loading: projectLoading, error: projectError } = useAsync(async () => {\n if (!projectId || !allowed) return undefined;\n return await vcfAutomationApi.getProjectDetails(projectId, instanceName);\n }, [projectId, allowed, instanceName]);\n\n const { value: systemsData, loading: systemsLoading } = useAsync(async () => {\n if (!projectId || !allowed) return undefined;\n\n // Get all systems that belong to this project's domain\n const systems = await catalogApi.getEntities({\n filter: {\n kind: 'System',\n 'spec.domain': projectId,\n },\n });\n\n const deployments = await Promise.all(\n systems.items.map(async (system) => {\n // Get VMs belonging to this system\n const vms = await catalogApi.getEntities({\n filter: {\n kind: 'Component',\n 'spec.type': 'Cloud.vSphere.Machine',\n 'spec.system': system.metadata.name,\n },\n });\n\n // Get other resources belonging to this system\n const resources = await catalogApi.getEntities({\n filter: {\n kind: 'Resource',\n 'spec.system': system.metadata.name,\n },\n });\n\n const owner = system.spec?.owner;\n return {\n name: system.metadata.name,\n title: system.metadata.title || system.metadata.name,\n owner: typeof owner === 'string' ? owner : 'N/A',\n vmCount: vms.items.length,\n resourceCount: resources.items.length,\n entityRef: `/catalog/${system.metadata.namespace || 'default'}/system/${system.metadata.name}`,\n } as SystemDeployment;\n }),\n );\n\n return deployments;\n }, [projectId, allowed]);\n\n if (projectError) {\n return <ResponseErrorPanel error={projectError} />;\n }\n\n if (projectLoading || systemsLoading) {\n return <Progress />;\n }\n\n if (!projectId) {\n return <InfoCard title=\"No project ID found\">This entity is not associated with a VCF project.</InfoCard>;\n }\n\n if (!allowed) {\n return <InfoCard title=\"Permission Denied\">You don't have permission to view project details.</InfoCard>;\n }\n\n if (!projectData) {\n return <InfoCard title=\"No Data\">No project details available.</InfoCard>;\n }\n\n const renderMemberTable = (members: ProjectMember[], title: string) => (\n <Grid item xs={12} md={6}>\n <InfoCard title={title}>\n <Table\n columns={[\n { title: 'Email', field: 'email' },\n { title: 'Type', field: 'type' },\n ]}\n data={members}\n options={{ search: false, paging: false }}\n />\n </InfoCard>\n </Grid>\n );\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Project Overview\">\n <StructuredMetadataTable\n metadata={{\n 'Project Name': projectData.name,\n 'Project ID': projectData.id,\n Description: projectData.description,\n 'Organization ID': projectData.organizationId || projectData.orgId,\n 'Operation Timeout': `${projectData.operationTimeout} seconds`,\n 'Machine Naming Template': projectData.machineNamingTemplate || 'N/A',\n 'Shared Resources': projectData.sharedResources ? 'Yes' : 'No',\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard title=\"Project Deployments\">\n <Table\n columns={[\n { \n title: 'Name', \n field: 'title',\n render: (row: SystemDeployment) => (\n <Link to={row.entityRef}>{row.title}</Link>\n ),\n },\n { title: 'Owner', field: 'owner' },\n { \n title: 'VMs', \n field: 'vmCount',\n align: 'right',\n },\n { \n title: 'Additional Resources', \n field: 'resourceCount',\n align: 'right',\n },\n ]}\n data={systemsData || []}\n options={{\n search: true,\n paging: true,\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard title=\"Project Members\">\n <Grid container spacing={3}>\n {renderMemberTable(projectData.administrators || [], 'Administrators')}\n {renderMemberTable(projectData.members || [], 'Members')}\n {renderMemberTable(projectData.viewers || [], 'Viewers')}\n {renderMemberTable(projectData.supervisors || [], 'Supervisors')}\n {projectData.users && projectData.users.length > 0 && renderMemberTable(projectData.users, 'Users')}\n {projectData.auditors && projectData.auditors.length > 0 && renderMemberTable(projectData.auditors, 'Auditors')}\n </Grid>\n </InfoCard>\n </Grid>\n\n {projectData.zones && projectData.zones.length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Project Zones\">\n <Table\n columns={[\n { title: 'Zone ID', field: 'zoneId' },\n { title: 'Priority', field: 'priority' },\n { \n title: 'Instances', \n field: 'instances',\n render: (row: VcfProjectZone) => `${row.allocatedInstancesCount}/${row.maxNumberInstances || '∞'}`,\n },\n { \n title: 'Memory (MB)', \n field: 'memory',\n render: (row: VcfProjectZone) => `${row.allocatedMemoryMB}/${row.memoryLimitMB || '∞'}`,\n },\n { \n title: 'CPU', \n field: 'cpu',\n render: (row: VcfProjectZone) => `${row.allocatedCpu}/${row.cpuLimit || '∞'}`,\n },\n { \n title: 'Storage (GB)', \n field: 'storage',\n render: (row: VcfProjectZone) => `${row.allocatedStorageGB}/${row.storageLimitGB || '∞'}`,\n },\n ]}\n data={projectData.zones}\n options={{\n search: true,\n paging: true,\n }}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.constraints && Object.keys(projectData.constraints).length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Constraints\">\n <StructuredMetadataTable\n metadata={projectData.constraints}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.customProperties && Object.keys(projectData.customProperties).length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Custom Properties\">\n <StructuredMetadataTable\n metadata={projectData.customProperties}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.properties && Object.keys(projectData.properties).length > 0 && (\n <Grid item xs={12}>\n <InfoCard title=\"Properties\">\n <StructuredMetadataTable\n metadata={projectData.properties}\n />\n </InfoCard>\n </Grid>\n )}\n\n {projectData.orgId && (\n <Grid item xs={12}>\n <InfoCard title=\"Organization Information\">\n <StructuredMetadataTable\n metadata={{\n 'Organization ID': projectData.orgId,\n 'Operation Timeout': projectData.operationTimeout ? `${projectData.operationTimeout} minutes` : 'Not configured',\n }}\n />\n </InfoCard>\n </Grid>\n )}\n </Grid>\n );\n}; "],"names":[],"mappings":"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"}