@terasky/backstage-plugin-vcf-automation 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/VcfAutomationClient.esm.js +104 -0
- package/dist/api/VcfAutomationClient.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCINamespaceDetails.esm.js +16 -2
- package/dist/components/VCFAutomationCCINamespaceDetails.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCINamespaceOverview.esm.js +35 -7
- package/dist/components/VCFAutomationCCINamespaceOverview.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCIResourceDetails.esm.js +115 -15
- package/dist/components/VCFAutomationCCIResourceDetails.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCIResourceOverview.esm.js +90 -14
- package/dist/components/VCFAutomationCCIResourceOverview.esm.js.map +1 -1
- package/dist/components/VCFAutomationVMPowerManagement.esm.js +262 -0
- package/dist/components/VCFAutomationVMPowerManagement.esm.js.map +1 -0
- package/dist/index.d.ts +79 -1
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VCFAutomationCCIResourceOverview.esm.js","sources":["../../src/components/VCFAutomationCCIResourceOverview.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport {\n InfoCard,\n StructuredMetadataTable,\n CodeSnippet,\n StatusOK,\n StatusError,\n StatusPending,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { Grid, Typography, Chip, Box, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport yaml from 'js-yaml';\nimport useAsync from 'react-use/lib/useAsync';\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}));\n\nexport const VCFAutomationCCIResourceOverview = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n\n // Extract stable values from entity\n const deploymentId = entity.spec?.system as string;\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n // 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 || !deploymentId || !resourceId) {\n return null;\n }\n\n try {\n // Fetch detailed resource data from the backend\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 return null;\n } catch (apiError) {\n console.error('Failed to fetch resource data:', apiError);\n return null;\n }\n }, [needsApiCall, 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 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 <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Basic Information\n </Typography>\n <StructuredMetadataTable metadata={basicInfo} />\n </Grid>\n\n {entity.spec?.dependsOn && Array.isArray(entity.spec.dependsOn) && entity.spec.dependsOn.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Dependencies\n </Typography>\n <Box>\n {entity.spec.dependsOn\n .filter((dep): dep is string => typeof dep === 'string')\n .map((dep: string, index: number) => (\n <Chip\n key={index}\n label={dep}\n size=\"small\"\n className={classes.dependencyChip}\n color=\"primary\"\n variant=\"outlined\"\n />\n ))}\n </Box>\n </Grid>\n )}\n\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 </InfoCard>\n );\n};"],"names":["resourceContext","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VCFAutomationCCIResourceOverview.esm.js","sources":["../../src/components/VCFAutomationCCIResourceOverview.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport {\n InfoCard,\n StructuredMetadataTable,\n CodeSnippet,\n StatusOK,\n StatusError,\n StatusPending,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { Grid, Typography, Chip, Box, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\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}));\n\nexport const VCFAutomationCCIResourceOverview = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n\n // Extract stable values from entity\n const deploymentId = entity.spec?.system as string;\n const resourceId = entity.metadata.name;\n const instanceName = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-instance'];\n\n // Check if this is a standalone resource\n const isStandalone = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-origin'] === 'STANDALONE';\n \n // 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 VM-specific information for power management\n const resourceKind = manifest?.kind || objectData?.kind;\n const vmName = manifest?.metadata?.name || objectData?.metadata?.name;\n const namespaceName = manifest?.metadata?.namespace || objectData?.metadata?.namespace;\n \n // For standalone VMs, we need the namespace URN ID from the supervisor namespace\n // This is stored in the resource context during ingestion\n const namespaceUrnId = useMemo(() => {\n if (!isStandalone || !namespaceName) return undefined;\n \n // Extract the URN ID from the resource context (stored during ingestion)\n const contextData = typeof resourceContext === 'string' ? JSON.parse(resourceContext || '{}') : resourceContext;\n const urnId = contextData?.namespaceUrnId || namespaceName; // Fallback to namespace name if URN not available\n \n // Debug logging to help troubleshoot\n console.log('Debug - Standalone VM URN ID resolution:', {\n namespaceName,\n resourceContext,\n contextData,\n urnId,\n isStandalone,\n });\n \n return urnId;\n }, [isStandalone, namespaceName, resourceContext]);\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 {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 </InfoCard>\n );\n};"],"names":["resourceContext","yaml","error"],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
+
import { vcfAutomationApiRef } from '../api/VcfAutomationClient.esm.js';
|
|
5
|
+
import { Box, CircularProgress, Typography, Button, Chip, Dialog, DialogTitle, DialogContent, DialogActions, Snackbar } from '@material-ui/core';
|
|
6
|
+
import { Alert } from '@material-ui/lab';
|
|
7
|
+
import { makeStyles } from '@material-ui/core/styles';
|
|
8
|
+
import PowerSettingsNewIcon from '@material-ui/icons/PowerSettingsNew';
|
|
9
|
+
import PlayArrowIcon from '@material-ui/icons/PlayArrow';
|
|
10
|
+
import StopIcon from '@material-ui/icons/Stop';
|
|
11
|
+
import useAsync from 'react-use/lib/useAsync';
|
|
12
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
13
|
+
import { vmPowerManagementPermission } from '@terasky/backstage-plugin-vcf-automation-common';
|
|
14
|
+
|
|
15
|
+
const useStyles = makeStyles((theme) => ({
|
|
16
|
+
powerButtons: {
|
|
17
|
+
display: "flex",
|
|
18
|
+
gap: theme.spacing(1),
|
|
19
|
+
alignItems: "center"
|
|
20
|
+
},
|
|
21
|
+
powerOnButton: {
|
|
22
|
+
backgroundColor: theme.palette.success.main,
|
|
23
|
+
color: theme.palette.success.contrastText,
|
|
24
|
+
"&:hover": {
|
|
25
|
+
backgroundColor: theme.palette.success.dark
|
|
26
|
+
},
|
|
27
|
+
"&:disabled": {
|
|
28
|
+
backgroundColor: theme.palette.action.disabled,
|
|
29
|
+
color: theme.palette.action.disabled
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
powerOffButton: {
|
|
33
|
+
backgroundColor: theme.palette.error.main,
|
|
34
|
+
color: theme.palette.error.contrastText,
|
|
35
|
+
"&:hover": {
|
|
36
|
+
backgroundColor: theme.palette.error.dark
|
|
37
|
+
},
|
|
38
|
+
"&:disabled": {
|
|
39
|
+
backgroundColor: theme.palette.action.disabled,
|
|
40
|
+
color: theme.palette.action.disabled
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
statusChip: {
|
|
44
|
+
marginLeft: theme.spacing(1)
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
const VCFAutomationVMPowerManagement = ({
|
|
48
|
+
entity,
|
|
49
|
+
resourceId,
|
|
50
|
+
instanceName,
|
|
51
|
+
isStandalone,
|
|
52
|
+
vmName,
|
|
53
|
+
namespaceName,
|
|
54
|
+
namespaceUrnId
|
|
55
|
+
}) => {
|
|
56
|
+
const classes = useStyles();
|
|
57
|
+
const api = useApi(vcfAutomationApiRef);
|
|
58
|
+
const [confirmDialog, setConfirmDialog] = useState({
|
|
59
|
+
open: false,
|
|
60
|
+
action: null
|
|
61
|
+
});
|
|
62
|
+
const [executing, setExecuting] = useState(false);
|
|
63
|
+
const [snackbar, setSnackbar] = useState({
|
|
64
|
+
open: false,
|
|
65
|
+
message: "",
|
|
66
|
+
severity: "success"
|
|
67
|
+
});
|
|
68
|
+
const { allowed: hasPermission } = usePermission({
|
|
69
|
+
permission: vmPowerManagementPermission
|
|
70
|
+
});
|
|
71
|
+
const { value: vmData, loading, error } = useAsync(async () => {
|
|
72
|
+
if (isStandalone) {
|
|
73
|
+
if (!vmName || !namespaceName || !namespaceUrnId) {
|
|
74
|
+
throw new Error("Missing required parameters for standalone VM");
|
|
75
|
+
}
|
|
76
|
+
const vmStatus = await api.getStandaloneVmStatus(namespaceUrnId, namespaceName, vmName, instanceName);
|
|
77
|
+
return {
|
|
78
|
+
powerState: vmStatus.spec.powerState,
|
|
79
|
+
isStandalone: true,
|
|
80
|
+
vmData: vmStatus
|
|
81
|
+
};
|
|
82
|
+
} else {
|
|
83
|
+
const [powerOnAction, powerOffAction] = await Promise.all([
|
|
84
|
+
api.checkVmPowerAction(resourceId, "PowerOn", instanceName),
|
|
85
|
+
api.checkVmPowerAction(resourceId, "PowerOff", instanceName)
|
|
86
|
+
]);
|
|
87
|
+
const powerState = powerOnAction.valid ? "PoweredOff" : "PoweredOn";
|
|
88
|
+
return {
|
|
89
|
+
powerState,
|
|
90
|
+
isStandalone: false,
|
|
91
|
+
availableActions: {
|
|
92
|
+
PowerOn: powerOnAction,
|
|
93
|
+
PowerOff: powerOffAction
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}, [resourceId, instanceName, isStandalone, vmName, namespaceName, namespaceUrnId]);
|
|
98
|
+
const availableAction = useMemo(() => {
|
|
99
|
+
if (!vmData) return null;
|
|
100
|
+
if (isStandalone) {
|
|
101
|
+
return vmData.powerState === "PoweredOff" ? "PowerOn" : "PowerOff";
|
|
102
|
+
} else {
|
|
103
|
+
const powerOnValid = vmData.availableActions?.PowerOn?.valid;
|
|
104
|
+
const powerOffValid = vmData.availableActions?.PowerOff?.valid;
|
|
105
|
+
if (powerOnValid) return "PowerOn";
|
|
106
|
+
if (powerOffValid) return "PowerOff";
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}, [vmData, isStandalone]);
|
|
110
|
+
const handleActionClick = useCallback((action) => {
|
|
111
|
+
if (!hasPermission) return;
|
|
112
|
+
const actionDisplayName = action === "PowerOn" ? "Power On" : "Power Off";
|
|
113
|
+
setConfirmDialog({
|
|
114
|
+
open: true,
|
|
115
|
+
action,
|
|
116
|
+
actionDisplayName
|
|
117
|
+
});
|
|
118
|
+
}, [hasPermission]);
|
|
119
|
+
const handleConfirmAction = useCallback(async () => {
|
|
120
|
+
if (!confirmDialog.action || !vmData) return;
|
|
121
|
+
setExecuting(true);
|
|
122
|
+
setConfirmDialog({ open: false, action: null });
|
|
123
|
+
try {
|
|
124
|
+
if (isStandalone) {
|
|
125
|
+
if (!vmName || !namespaceName || !namespaceUrnId) {
|
|
126
|
+
throw new Error("Missing required parameters for standalone VM");
|
|
127
|
+
}
|
|
128
|
+
const newPowerState = confirmDialog.action === "PowerOn" ? "PoweredOn" : "PoweredOff";
|
|
129
|
+
await api.executeStandaloneVmPowerAction(namespaceUrnId, namespaceName, vmName, newPowerState, vmData.vmData, instanceName);
|
|
130
|
+
} else {
|
|
131
|
+
await api.executeVmPowerAction(resourceId, confirmDialog.action, instanceName);
|
|
132
|
+
}
|
|
133
|
+
setSnackbar({
|
|
134
|
+
open: true,
|
|
135
|
+
message: `Successfully executed ${confirmDialog.action} action`,
|
|
136
|
+
severity: "success"
|
|
137
|
+
});
|
|
138
|
+
setTimeout(() => window.location.reload(), 1e3);
|
|
139
|
+
} catch (error2) {
|
|
140
|
+
setSnackbar({
|
|
141
|
+
open: true,
|
|
142
|
+
message: `Failed to execute ${confirmDialog.action} action: ${error2 instanceof Error ? error2.message : "Unknown error"}`,
|
|
143
|
+
severity: "error"
|
|
144
|
+
});
|
|
145
|
+
} finally {
|
|
146
|
+
setExecuting(false);
|
|
147
|
+
}
|
|
148
|
+
}, [confirmDialog.action, vmData, isStandalone, vmName, namespaceName, namespaceUrnId, api, instanceName, resourceId]);
|
|
149
|
+
const handleCancelAction = useCallback(() => {
|
|
150
|
+
setConfirmDialog({ open: false, action: null });
|
|
151
|
+
}, []);
|
|
152
|
+
const handleCloseSnackbar = useCallback(() => {
|
|
153
|
+
setSnackbar((prev) => ({ ...prev, open: false }));
|
|
154
|
+
}, []);
|
|
155
|
+
if (loading) {
|
|
156
|
+
return /* @__PURE__ */ jsxs(Box, { className: classes.powerButtons, children: [
|
|
157
|
+
/* @__PURE__ */ jsx(CircularProgress, { size: 20 }),
|
|
158
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Loading power status..." })
|
|
159
|
+
] });
|
|
160
|
+
}
|
|
161
|
+
if (error) {
|
|
162
|
+
return /* @__PURE__ */ jsx(Box, { className: classes.powerButtons, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "error", children: "Failed to load power status" }) });
|
|
163
|
+
}
|
|
164
|
+
if (!vmData) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const canExecuteAction = hasPermission && availableAction && !executing;
|
|
168
|
+
const buttonIcon = availableAction === "PowerOn" ? /* @__PURE__ */ jsx(PlayArrowIcon, {}) : /* @__PURE__ */ jsx(StopIcon, {});
|
|
169
|
+
const buttonClass = availableAction === "PowerOn" ? classes.powerOnButton : classes.powerOffButton;
|
|
170
|
+
const buttonText = availableAction === "PowerOn" ? "Power On" : "Power Off";
|
|
171
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
172
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.powerButtons, children: [
|
|
173
|
+
/* @__PURE__ */ jsx(
|
|
174
|
+
Button,
|
|
175
|
+
{
|
|
176
|
+
variant: "contained",
|
|
177
|
+
size: "small",
|
|
178
|
+
startIcon: buttonIcon,
|
|
179
|
+
className: buttonClass,
|
|
180
|
+
disabled: !canExecuteAction,
|
|
181
|
+
onClick: () => availableAction && handleActionClick(availableAction),
|
|
182
|
+
title: !hasPermission ? "You do not have permission to manage VM power state" : !availableAction ? "No power action available" : `${buttonText} this virtual machine`,
|
|
183
|
+
children: executing ? /* @__PURE__ */ jsx(CircularProgress, { size: 16, color: "inherit" }) : buttonText
|
|
184
|
+
}
|
|
185
|
+
),
|
|
186
|
+
/* @__PURE__ */ jsx(
|
|
187
|
+
Chip,
|
|
188
|
+
{
|
|
189
|
+
label: vmData.powerState,
|
|
190
|
+
size: "small",
|
|
191
|
+
className: classes.statusChip,
|
|
192
|
+
color: vmData.powerState === "PoweredOn" ? "primary" : "default",
|
|
193
|
+
icon: /* @__PURE__ */ jsx(PowerSettingsNewIcon, {})
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
] }),
|
|
197
|
+
/* @__PURE__ */ jsxs(
|
|
198
|
+
Dialog,
|
|
199
|
+
{
|
|
200
|
+
open: confirmDialog.open,
|
|
201
|
+
onClose: handleCancelAction,
|
|
202
|
+
maxWidth: "sm",
|
|
203
|
+
fullWidth: true,
|
|
204
|
+
children: [
|
|
205
|
+
/* @__PURE__ */ jsxs(DialogTitle, { children: [
|
|
206
|
+
"Confirm ",
|
|
207
|
+
confirmDialog.actionDisplayName
|
|
208
|
+
] }),
|
|
209
|
+
/* @__PURE__ */ jsxs(DialogContent, { children: [
|
|
210
|
+
/* @__PURE__ */ jsxs(Typography, { children: [
|
|
211
|
+
"Are you sure you want to ",
|
|
212
|
+
confirmDialog.actionDisplayName?.toLowerCase(),
|
|
213
|
+
" this virtual machine?"
|
|
214
|
+
] }),
|
|
215
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", style: { marginTop: 8 }, children: [
|
|
216
|
+
"VM: ",
|
|
217
|
+
vmName || entity.metadata.name
|
|
218
|
+
] }),
|
|
219
|
+
isStandalone && /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", children: [
|
|
220
|
+
"Namespace: ",
|
|
221
|
+
namespaceName
|
|
222
|
+
] })
|
|
223
|
+
] }),
|
|
224
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
225
|
+
/* @__PURE__ */ jsx(Button, { onClick: handleCancelAction, color: "primary", children: "Cancel" }),
|
|
226
|
+
/* @__PURE__ */ jsx(
|
|
227
|
+
Button,
|
|
228
|
+
{
|
|
229
|
+
onClick: handleConfirmAction,
|
|
230
|
+
color: "primary",
|
|
231
|
+
variant: "contained",
|
|
232
|
+
autoFocus: true,
|
|
233
|
+
children: confirmDialog.actionDisplayName
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
] })
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
),
|
|
240
|
+
/* @__PURE__ */ jsx(
|
|
241
|
+
Snackbar,
|
|
242
|
+
{
|
|
243
|
+
open: snackbar.open,
|
|
244
|
+
autoHideDuration: 6e3,
|
|
245
|
+
onClose: handleCloseSnackbar,
|
|
246
|
+
anchorOrigin: { vertical: "bottom", horizontal: "right" },
|
|
247
|
+
children: /* @__PURE__ */ jsx(
|
|
248
|
+
Alert,
|
|
249
|
+
{
|
|
250
|
+
onClose: handleCloseSnackbar,
|
|
251
|
+
severity: snackbar.severity,
|
|
252
|
+
variant: "filled",
|
|
253
|
+
children: snackbar.message
|
|
254
|
+
}
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
] });
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export { VCFAutomationVMPowerManagement };
|
|
262
|
+
//# sourceMappingURL=VCFAutomationVMPowerManagement.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VCFAutomationVMPowerManagement.esm.js","sources":["../../src/components/VCFAutomationVMPowerManagement.tsx"],"sourcesContent":["import React, { useState, useCallback, useMemo } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { vcfAutomationApiRef } from '../api/VcfAutomationClient';\nimport { VmPowerAction, VmPowerActionType, StandaloneVmStatus } from '../types';\nimport {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n Box,\n CircularProgress,\n Snackbar,\n Chip,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { makeStyles } from '@material-ui/core/styles';\nimport PowerSettingsNewIcon from '@material-ui/icons/PowerSettingsNew';\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport StopIcon from '@material-ui/icons/Stop';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { vmPowerManagementPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nconst useStyles = makeStyles(theme => ({\n powerButtons: {\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n },\n powerOnButton: {\n backgroundColor: theme.palette.success.main,\n color: theme.palette.success.contrastText,\n '&:hover': {\n backgroundColor: theme.palette.success.dark,\n },\n '&:disabled': {\n backgroundColor: theme.palette.action.disabled,\n color: theme.palette.action.disabled,\n },\n },\n powerOffButton: {\n backgroundColor: theme.palette.error.main,\n color: theme.palette.error.contrastText,\n '&:hover': {\n backgroundColor: theme.palette.error.dark,\n },\n '&:disabled': {\n backgroundColor: theme.palette.action.disabled,\n color: theme.palette.action.disabled,\n },\n },\n statusChip: {\n marginLeft: theme.spacing(1),\n },\n}));\n\n// Permission is defined in vcf-automation-common plugin\n\ninterface VCFAutomationVMPowerManagementProps {\n entity: any;\n resourceId: string;\n instanceName?: string;\n isStandalone: boolean;\n vmName?: string;\n namespaceName?: string;\n namespaceUrnId?: string;\n}\n\nexport const VCFAutomationVMPowerManagement: React.FC<VCFAutomationVMPowerManagementProps> = ({\n entity,\n resourceId,\n instanceName,\n isStandalone,\n vmName,\n namespaceName,\n namespaceUrnId,\n}) => {\n const classes = useStyles();\n const api = useApi(vcfAutomationApiRef);\n \n const [confirmDialog, setConfirmDialog] = useState<{\n open: boolean;\n action: VmPowerActionType | null;\n actionDisplayName?: string;\n }>({\n open: false,\n action: null,\n });\n \n const [executing, setExecuting] = useState(false);\n const [snackbar, setSnackbar] = useState<{\n open: boolean;\n message: string;\n severity: 'success' | 'error';\n }>({\n open: false,\n message: '',\n severity: 'success',\n });\n\n // Check permissions\n const { allowed: hasPermission } = usePermission({ \n permission: vmPowerManagementPermission,\n });\n\n // Get current power state and available actions\n const { value: vmData, loading, error } = useAsync(async () => {\n if (isStandalone) {\n if (!vmName || !namespaceName || !namespaceUrnId) {\n throw new Error('Missing required parameters for standalone VM');\n }\n \n // Get standalone VM status\n const vmStatus: StandaloneVmStatus = await api.getStandaloneVmStatus(namespaceUrnId, namespaceName, vmName, instanceName);\n return {\n powerState: vmStatus.spec.powerState,\n isStandalone: true,\n vmData: vmStatus,\n };\n } else {\n // For deployment-managed VMs, check both power actions\n const [powerOnAction, powerOffAction] = await Promise.all([\n api.checkVmPowerAction(resourceId, 'PowerOn', instanceName),\n api.checkVmPowerAction(resourceId, 'PowerOff', instanceName),\n ]);\n \n // Determine current power state based on which action is valid\n const powerState = powerOnAction.valid ? 'PoweredOff' : 'PoweredOn';\n \n return {\n powerState,\n isStandalone: false,\n availableActions: {\n PowerOn: powerOnAction as VmPowerAction,\n PowerOff: powerOffAction as VmPowerAction,\n },\n };\n }\n }, [resourceId, instanceName, isStandalone, vmName, namespaceName, namespaceUrnId]);\n\n // Determine which action is available\n const availableAction = useMemo(() => {\n if (!vmData) return null;\n \n if (isStandalone) {\n return vmData.powerState === 'PoweredOff' ? 'PowerOn' : 'PowerOff';\n } else {\n // For deployment-managed VMs, check which action is valid\n const powerOnValid = vmData.availableActions?.PowerOn?.valid;\n const powerOffValid = vmData.availableActions?.PowerOff?.valid;\n \n if (powerOnValid) return 'PowerOn';\n if (powerOffValid) return 'PowerOff';\n return null;\n }\n }, [vmData, isStandalone]);\n\n const handleActionClick = useCallback((action: VmPowerActionType) => {\n if (!hasPermission) return;\n \n const actionDisplayName = action === 'PowerOn' ? 'Power On' : 'Power Off';\n setConfirmDialog({\n open: true,\n action,\n actionDisplayName,\n });\n }, [hasPermission]);\n\n const handleConfirmAction = useCallback(async () => {\n if (!confirmDialog.action || !vmData) return;\n \n setExecuting(true);\n setConfirmDialog({ open: false, action: null });\n \n try {\n if (isStandalone) {\n if (!vmName || !namespaceName || !namespaceUrnId) {\n throw new Error('Missing required parameters for standalone VM');\n }\n \n const newPowerState = confirmDialog.action === 'PowerOn' ? 'PoweredOn' : 'PoweredOff';\n await api.executeStandaloneVmPowerAction(namespaceUrnId, namespaceName, vmName, newPowerState, vmData.vmData, instanceName);\n } else {\n await api.executeVmPowerAction(resourceId, confirmDialog.action, instanceName);\n }\n \n setSnackbar({\n open: true,\n message: `Successfully executed ${confirmDialog.action} action`,\n severity: 'success',\n });\n \n // Refresh the data\n setTimeout(() => window.location.reload(), 1000); // Wait a bit for the action to take effect\n } catch (error) {\n setSnackbar({\n open: true,\n message: `Failed to execute ${confirmDialog.action} action: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n });\n } finally {\n setExecuting(false);\n }\n }, [confirmDialog.action, vmData, isStandalone, vmName, namespaceName, namespaceUrnId, api, instanceName, resourceId]);\n\n const handleCancelAction = useCallback(() => {\n setConfirmDialog({ open: false, action: null });\n }, []);\n\n const handleCloseSnackbar = useCallback(() => {\n setSnackbar(prev => ({ ...prev, open: false }));\n }, []);\n\n if (loading) {\n return (\n <Box className={classes.powerButtons}>\n <CircularProgress size={20} />\n <Typography variant=\"body2\">Loading power status...</Typography>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box className={classes.powerButtons}>\n <Typography variant=\"body2\" color=\"error\">\n Failed to load power status\n </Typography>\n </Box>\n );\n }\n\n if (!vmData) {\n return null;\n }\n\n const canExecuteAction = hasPermission && availableAction && !executing;\n const buttonIcon = availableAction === 'PowerOn' ? <PlayArrowIcon /> : <StopIcon />;\n const buttonClass = availableAction === 'PowerOn' ? classes.powerOnButton : classes.powerOffButton;\n const buttonText = availableAction === 'PowerOn' ? 'Power On' : 'Power Off';\n\n return (\n <>\n <Box className={classes.powerButtons}>\n <Button\n variant=\"contained\"\n size=\"small\"\n startIcon={buttonIcon}\n className={buttonClass}\n disabled={!canExecuteAction}\n onClick={() => availableAction && handleActionClick(availableAction)}\n title={\n !hasPermission \n ? 'You do not have permission to manage VM power state'\n : !availableAction\n ? 'No power action available'\n : `${buttonText} this virtual machine`\n }\n >\n {executing ? <CircularProgress size={16} color=\"inherit\" /> : buttonText}\n </Button>\n \n <Chip\n label={vmData.powerState}\n size=\"small\"\n className={classes.statusChip}\n color={vmData.powerState === 'PoweredOn' ? 'primary' : 'default'}\n icon={<PowerSettingsNewIcon />}\n />\n </Box>\n\n {/* Confirmation Dialog */}\n <Dialog\n open={confirmDialog.open}\n onClose={handleCancelAction}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n Confirm {confirmDialog.actionDisplayName}\n </DialogTitle>\n <DialogContent>\n <Typography>\n Are you sure you want to {confirmDialog.actionDisplayName?.toLowerCase()} this virtual machine?\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\" style={{ marginTop: 8 }}>\n VM: {vmName || entity.metadata.name}\n </Typography>\n {isStandalone && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Namespace: {namespaceName}\n </Typography>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleCancelAction} color=\"primary\">\n Cancel\n </Button>\n <Button \n onClick={handleConfirmAction} \n color=\"primary\" \n variant=\"contained\"\n autoFocus\n >\n {confirmDialog.actionDisplayName}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* Success/Error Snackbar */}\n <Snackbar\n open={snackbar.open}\n autoHideDuration={6000}\n onClose={handleCloseSnackbar}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n >\n <Alert \n onClose={handleCloseSnackbar} \n severity={snackbar.severity}\n variant=\"filled\"\n >\n {snackbar.message}\n </Alert>\n </Snackbar>\n </>\n );\n};"],"names":["error"],"mappings":";;;;;;;;;;;;;;AAyBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,YAAc,EAAA;AAAA,IACZ,OAAS,EAAA,MAAA;AAAA,IACT,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,UAAY,EAAA;AAAA,GACd;AAAA,EACA,aAAe,EAAA;AAAA,IACb,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA;AAAA,IACvC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA;AAAA,IAC7B,SAAW,EAAA;AAAA,MACT,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA;AAAA,KACzC;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,QAAA;AAAA,MACtC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA;AAAA;AAC9B,GACF;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA,IAAA;AAAA,IACrC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA,YAAA;AAAA,IAC3B,SAAW,EAAA;AAAA,MACT,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA;AAAA,KACvC;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,QAAA;AAAA,MACtC,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA;AAAA;AAC9B,GACF;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAE/B,CAAE,CAAA,CAAA;AAcK,MAAM,iCAAgF,CAAC;AAAA,EAC5F,MAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAM,KAAA;AACJ,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,GAAA,GAAM,OAAO,mBAAmB,CAAA;AAEtC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAIvC,CAAA;AAAA,IACD,IAAM,EAAA,KAAA;AAAA,IACN,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAI7B,CAAA;AAAA,IACD,IAAM,EAAA,KAAA;AAAA,IACN,OAAS,EAAA,EAAA;AAAA,IACT,QAAU,EAAA;AAAA,GACX,CAAA;AAGD,EAAA,MAAM,EAAE,OAAA,EAAS,aAAc,EAAA,GAAI,aAAc,CAAA;AAAA,IAC/C,UAAY,EAAA;AAAA,GACb,CAAA;AAGD,EAAA,MAAM,EAAE,KAAO,EAAA,MAAA,EAAQ,SAAS,KAAM,EAAA,GAAI,SAAS,YAAY;AAC7D,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,aAAA,IAAiB,CAAC,cAAgB,EAAA;AAChD,QAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA;AAAA;AAIjE,MAAA,MAAM,WAA+B,MAAM,GAAA,CAAI,sBAAsB,cAAgB,EAAA,aAAA,EAAe,QAAQ,YAAY,CAAA;AACxH,MAAO,OAAA;AAAA,QACL,UAAA,EAAY,SAAS,IAAK,CAAA,UAAA;AAAA,QAC1B,YAAc,EAAA,IAAA;AAAA,QACd,MAAQ,EAAA;AAAA,OACV;AAAA,KACK,MAAA;AAEL,MAAA,MAAM,CAAC,aAAe,EAAA,cAAc,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QACxD,GAAI,CAAA,kBAAA,CAAmB,UAAY,EAAA,SAAA,EAAW,YAAY,CAAA;AAAA,QAC1D,GAAI,CAAA,kBAAA,CAAmB,UAAY,EAAA,UAAA,EAAY,YAAY;AAAA,OAC5D,CAAA;AAGD,MAAM,MAAA,UAAA,GAAa,aAAc,CAAA,KAAA,GAAQ,YAAe,GAAA,WAAA;AAExD,MAAO,OAAA;AAAA,QACL,UAAA;AAAA,QACA,YAAc,EAAA,KAAA;AAAA,QACd,gBAAkB,EAAA;AAAA,UAChB,OAAS,EAAA,aAAA;AAAA,UACT,QAAU,EAAA;AAAA;AACZ,OACF;AAAA;AACF,GACF,EAAG,CAAC,UAAY,EAAA,YAAA,EAAc,cAAc,MAAQ,EAAA,aAAA,EAAe,cAAc,CAAC,CAAA;AAGlF,EAAM,MAAA,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAI,IAAA,CAAC,QAAe,OAAA,IAAA;AAEpB,IAAA,IAAI,YAAc,EAAA;AAChB,MAAO,OAAA,MAAA,CAAO,UAAe,KAAA,YAAA,GAAe,SAAY,GAAA,UAAA;AAAA,KACnD,MAAA;AAEL,MAAM,MAAA,YAAA,GAAe,MAAO,CAAA,gBAAA,EAAkB,OAAS,EAAA,KAAA;AACvD,MAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,gBAAA,EAAkB,QAAU,EAAA,KAAA;AAEzD,MAAA,IAAI,cAAqB,OAAA,SAAA;AACzB,MAAA,IAAI,eAAsB,OAAA,UAAA;AAC1B,MAAO,OAAA,IAAA;AAAA;AACT,GACC,EAAA,CAAC,MAAQ,EAAA,YAAY,CAAC,CAAA;AAEzB,EAAM,MAAA,iBAAA,GAAoB,WAAY,CAAA,CAAC,MAA8B,KAAA;AACnE,IAAA,IAAI,CAAC,aAAe,EAAA;AAEpB,IAAM,MAAA,iBAAA,GAAoB,MAAW,KAAA,SAAA,GAAY,UAAa,GAAA,WAAA;AAC9D,IAAiB,gBAAA,CAAA;AAAA,MACf,IAAM,EAAA,IAAA;AAAA,MACN,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,GACH,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAM,MAAA,mBAAA,GAAsB,YAAY,YAAY;AAClD,IAAA,IAAI,CAAC,aAAA,CAAc,MAAU,IAAA,CAAC,MAAQ,EAAA;AAEtC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAO,EAAA,MAAA,EAAQ,MAAM,CAAA;AAE9C,IAAI,IAAA;AACF,MAAA,IAAI,YAAc,EAAA;AAChB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,aAAA,IAAiB,CAAC,cAAgB,EAAA;AAChD,UAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA;AAAA;AAGjE,QAAA,MAAM,aAAgB,GAAA,aAAA,CAAc,MAAW,KAAA,SAAA,GAAY,WAAc,GAAA,YAAA;AACzE,QAAM,MAAA,GAAA,CAAI,+BAA+B,cAAgB,EAAA,aAAA,EAAe,QAAQ,aAAe,EAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA,OACrH,MAAA;AACL,QAAA,MAAM,GAAI,CAAA,oBAAA,CAAqB,UAAY,EAAA,aAAA,CAAc,QAAQ,YAAY,CAAA;AAAA;AAG/E,MAAY,WAAA,CAAA;AAAA,QACV,IAAM,EAAA,IAAA;AAAA,QACN,OAAA,EAAS,CAAyB,sBAAA,EAAA,aAAA,CAAc,MAAM,CAAA,OAAA,CAAA;AAAA,QACtD,QAAU,EAAA;AAAA,OACX,CAAA;AAGD,MAAA,UAAA,CAAW,MAAM,MAAA,CAAO,QAAS,CAAA,MAAA,IAAU,GAAI,CAAA;AAAA,aACxCA,MAAO,EAAA;AACd,MAAY,WAAA,CAAA;AAAA,QACV,IAAM,EAAA,IAAA;AAAA,QACN,OAAA,EAAS,qBAAqB,aAAc,CAAA,MAAM,YAAYA,MAAiB,YAAA,KAAA,GAAQA,MAAM,CAAA,OAAA,GAAU,eAAe,CAAA,CAAA;AAAA,QACtH,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,KACD,SAAA;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA;AACpB,GACC,EAAA,CAAC,aAAc,CAAA,MAAA,EAAQ,MAAQ,EAAA,YAAA,EAAc,MAAQ,EAAA,aAAA,EAAe,cAAgB,EAAA,GAAA,EAAK,YAAc,EAAA,UAAU,CAAC,CAAA;AAErH,EAAM,MAAA,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAO,EAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,GAChD,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,WAAA,CAAY,WAAS,EAAE,GAAG,IAAM,EAAA,IAAA,EAAM,OAAQ,CAAA,CAAA;AAAA,GAChD,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,uBACG,IAAA,CAAA,GAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,YACtB,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,gBAAA,EAAA,EAAiB,MAAM,EAAI,EAAA,CAAA;AAAA,sBAC3B,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAQ,QAAuB,EAAA,yBAAA,EAAA;AAAA,KACrD,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,uBACG,GAAA,CAAA,GAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,YACtB,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAQ,EAAA,KAAA,EAAM,OAAQ,EAAA,QAAA,EAAA,6BAAA,EAE1C,CACF,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,gBAAA,GAAmB,aAAiB,IAAA,eAAA,IAAmB,CAAC,SAAA;AAC9D,EAAA,MAAM,aAAa,eAAoB,KAAA,SAAA,uBAAa,aAAc,EAAA,EAAA,CAAA,uBAAM,QAAS,EAAA,EAAA,CAAA;AACjF,EAAA,MAAM,WAAc,GAAA,eAAA,KAAoB,SAAY,GAAA,OAAA,CAAQ,gBAAgB,OAAQ,CAAA,cAAA;AACpF,EAAM,MAAA,UAAA,GAAa,eAAoB,KAAA,SAAA,GAAY,UAAa,GAAA,WAAA;AAEhE,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,GAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,YACtB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,WAAA;AAAA,UACR,IAAK,EAAA,OAAA;AAAA,UACL,SAAW,EAAA,UAAA;AAAA,UACX,SAAW,EAAA,WAAA;AAAA,UACX,UAAU,CAAC,gBAAA;AAAA,UACX,OAAS,EAAA,MAAM,eAAmB,IAAA,iBAAA,CAAkB,eAAe,CAAA;AAAA,UACnE,KAAA,EACE,CAAC,aACG,GAAA,qDAAA,GACA,CAAC,eACD,GAAA,2BAAA,GACA,GAAG,UAAU,CAAA,qBAAA,CAAA;AAAA,UAGlB,sCAAa,GAAA,CAAA,gBAAA,EAAA,EAAiB,MAAM,EAAI,EAAA,KAAA,EAAM,WAAU,CAAK,GAAA;AAAA;AAAA,OAChE;AAAA,sBAEA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAO,MAAO,CAAA,UAAA;AAAA,UACd,IAAK,EAAA,OAAA;AAAA,UACL,WAAW,OAAQ,CAAA,UAAA;AAAA,UACnB,KAAO,EAAA,MAAA,CAAO,UAAe,KAAA,WAAA,GAAc,SAAY,GAAA,SAAA;AAAA,UACvD,IAAA,sBAAO,oBAAqB,EAAA,EAAA;AAAA;AAAA;AAC9B,KACF,EAAA,CAAA;AAAA,oBAGA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,MAAM,aAAc,CAAA,IAAA;AAAA,QACpB,OAAS,EAAA,kBAAA;AAAA,QACT,QAAS,EAAA,IAAA;AAAA,QACT,SAAS,EAAA,IAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,WAAY,EAAA,EAAA,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YACF,aAAc,CAAA;AAAA,WACzB,EAAA,CAAA;AAAA,+BACC,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,UAAW,EAAA,EAAA,QAAA,EAAA;AAAA,cAAA,2BAAA;AAAA,cACgB,aAAA,CAAc,mBAAmB,WAAY,EAAA;AAAA,cAAE;AAAA,aAC3E,EAAA,CAAA;AAAA,4BACA,IAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAQ,EAAA,KAAA,EAAM,iBAAgB,KAAO,EAAA,EAAE,SAAW,EAAA,CAAA,EAAK,EAAA,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,cACpE,MAAA,IAAU,OAAO,QAAS,CAAA;AAAA,aACjC,EAAA,CAAA;AAAA,YACC,gCACE,IAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAQ,OAAM,eAAgB,EAAA,QAAA,EAAA;AAAA,cAAA,aAAA;AAAA,cACpC;AAAA,aACd,EAAA;AAAA,WAEJ,EAAA,CAAA;AAAA,+BACC,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAS,kBAAoB,EAAA,KAAA,EAAM,WAAU,QAErD,EAAA,QAAA,EAAA,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAS,EAAA,mBAAA;AAAA,gBACT,KAAM,EAAA,SAAA;AAAA,gBACN,OAAQ,EAAA,WAAA;AAAA,gBACR,SAAS,EAAA,IAAA;AAAA,gBAER,QAAc,EAAA,aAAA,CAAA;AAAA;AAAA;AACjB,WACF,EAAA;AAAA;AAAA;AAAA,KACF;AAAA,oBAGA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,MAAM,QAAS,CAAA,IAAA;AAAA,QACf,gBAAkB,EAAA,GAAA;AAAA,QAClB,OAAS,EAAA,mBAAA;AAAA,QACT,YAAc,EAAA,EAAE,QAAU,EAAA,QAAA,EAAU,YAAY,OAAQ,EAAA;AAAA,QAExD,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,OAAS,EAAA,mBAAA;AAAA,YACT,UAAU,QAAS,CAAA,QAAA;AAAA,YACnB,OAAQ,EAAA,QAAA;AAAA,YAEP,QAAS,EAAA,QAAA,CAAA;AAAA;AAAA;AACZ;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
2
2
|
import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
|
+
import React from 'react';
|
|
4
5
|
|
|
5
6
|
declare const vcfAutomationPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
6
7
|
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
@@ -32,6 +33,17 @@ declare const VCFAutomationCCINamespaceDetails: () => react_jsx_runtime.JSX.Elem
|
|
|
32
33
|
|
|
33
34
|
declare const VCFAutomationCCIResourceDetails: () => react_jsx_runtime.JSX.Element;
|
|
34
35
|
|
|
36
|
+
interface VCFAutomationVMPowerManagementProps {
|
|
37
|
+
entity: any;
|
|
38
|
+
resourceId: string;
|
|
39
|
+
instanceName?: string;
|
|
40
|
+
isStandalone: boolean;
|
|
41
|
+
vmName?: string;
|
|
42
|
+
namespaceName?: string;
|
|
43
|
+
namespaceUrnId?: string;
|
|
44
|
+
}
|
|
45
|
+
declare const VCFAutomationVMPowerManagement: React.FC<VCFAutomationVMPowerManagementProps>;
|
|
46
|
+
|
|
35
47
|
interface VcfPageable {
|
|
36
48
|
pageNumber: number;
|
|
37
49
|
pageSize: number;
|
|
@@ -267,6 +279,56 @@ interface CciSupervisorResource {
|
|
|
267
279
|
dependsOn: string[];
|
|
268
280
|
state: string;
|
|
269
281
|
}
|
|
282
|
+
interface VmPowerAction {
|
|
283
|
+
id: string;
|
|
284
|
+
name: string;
|
|
285
|
+
displayName: string;
|
|
286
|
+
description: string;
|
|
287
|
+
dependents: string[];
|
|
288
|
+
valid: boolean;
|
|
289
|
+
actionType: string;
|
|
290
|
+
}
|
|
291
|
+
interface VmPowerActionRequest {
|
|
292
|
+
actionId: string;
|
|
293
|
+
}
|
|
294
|
+
interface StandaloneVmStatus {
|
|
295
|
+
apiVersion: string;
|
|
296
|
+
kind: string;
|
|
297
|
+
metadata: {
|
|
298
|
+
name: string;
|
|
299
|
+
namespace: string;
|
|
300
|
+
annotations?: {
|
|
301
|
+
[key: string]: string;
|
|
302
|
+
};
|
|
303
|
+
labels?: {
|
|
304
|
+
[key: string]: string;
|
|
305
|
+
};
|
|
306
|
+
creationTimestamp: string;
|
|
307
|
+
uid: string;
|
|
308
|
+
resourceVersion: string;
|
|
309
|
+
};
|
|
310
|
+
spec: {
|
|
311
|
+
powerState: 'PoweredOn' | 'PoweredOff';
|
|
312
|
+
className: string;
|
|
313
|
+
imageName: string;
|
|
314
|
+
network?: any;
|
|
315
|
+
bootstrap?: any;
|
|
316
|
+
[key: string]: any;
|
|
317
|
+
};
|
|
318
|
+
status: {
|
|
319
|
+
powerState: 'PoweredOn' | 'PoweredOff';
|
|
320
|
+
conditions: Array<{
|
|
321
|
+
type: string;
|
|
322
|
+
status: string;
|
|
323
|
+
lastTransitionTime: string;
|
|
324
|
+
reason?: string;
|
|
325
|
+
message?: string;
|
|
326
|
+
}>;
|
|
327
|
+
[key: string]: any;
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
type VmPowerState = 'PoweredOn' | 'PoweredOff';
|
|
331
|
+
type VmPowerActionType = 'PowerOn' | 'PowerOff';
|
|
270
332
|
|
|
271
333
|
interface VcfDeploymentEvent {
|
|
272
334
|
timestamp: string;
|
|
@@ -391,6 +453,14 @@ interface VcfAutomationApi {
|
|
|
391
453
|
getProjects(instanceName?: string): Promise<any>;
|
|
392
454
|
getDeployments(instanceName?: string): Promise<any>;
|
|
393
455
|
getDeploymentResources(deploymentId: string, instanceName?: string): Promise<any>;
|
|
456
|
+
getSupervisorResources(instanceName?: string): Promise<any>;
|
|
457
|
+
getSupervisorResource(resourceId: string, instanceName?: string): Promise<any>;
|
|
458
|
+
getSupervisorNamespaces(instanceName?: string): Promise<any>;
|
|
459
|
+
getSupervisorNamespace(namespaceId: string, instanceName?: string): Promise<any>;
|
|
460
|
+
checkVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;
|
|
461
|
+
executeVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;
|
|
462
|
+
getStandaloneVmStatus(namespaceUrnId: string, namespaceName: string, vmName: string, instanceName?: string): Promise<any>;
|
|
463
|
+
executeStandaloneVmPowerAction(namespaceUrnId: string, namespaceName: string, vmName: string, powerState: 'PoweredOn' | 'PoweredOff', vmData: any, instanceName?: string): Promise<any>;
|
|
394
464
|
}
|
|
395
465
|
declare const vcfAutomationApiRef: _backstage_core_plugin_api.ApiRef<VcfAutomationApi>;
|
|
396
466
|
declare class VcfAutomationClient implements VcfAutomationApi {
|
|
@@ -409,8 +479,16 @@ declare class VcfAutomationClient implements VcfAutomationApi {
|
|
|
409
479
|
getProjects(instanceName?: string): Promise<any>;
|
|
410
480
|
getDeployments(instanceName?: string): Promise<any>;
|
|
411
481
|
getDeploymentResources(deploymentId: string, instanceName?: string): Promise<any>;
|
|
482
|
+
getSupervisorResources(instanceName?: string): Promise<any>;
|
|
483
|
+
getSupervisorResource(resourceId: string, instanceName?: string): Promise<any>;
|
|
484
|
+
getSupervisorNamespaces(instanceName?: string): Promise<any>;
|
|
485
|
+
getSupervisorNamespace(namespaceId: string, instanceName?: string): Promise<any>;
|
|
486
|
+
checkVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;
|
|
487
|
+
executeVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;
|
|
488
|
+
getStandaloneVmStatus(namespaceUrnId: string, namespaceName: string, vmName: string, instanceName?: string): Promise<any>;
|
|
489
|
+
executeStandaloneVmPowerAction(namespaceUrnId: string, namespaceName: string, vmName: string, powerState: 'PoweredOn' | 'PoweredOff', vmData: any, instanceName?: string): Promise<any>;
|
|
412
490
|
}
|
|
413
491
|
|
|
414
492
|
declare const rootRouteRef: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
415
493
|
|
|
416
|
-
export { type CciSupervisorNamespace, type CciSupervisorResource, VCFAutomationCCINamespaceDetails, VCFAutomationCCINamespaceOverview, VCFAutomationCCIResourceDetails, VCFAutomationCCIResourceOverview, VCFAutomationDeploymentDetails, VCFAutomationDeploymentOverview, VCFAutomationGenericResourceDetails, VCFAutomationGenericResourceOverview, VCFAutomationProjectDetails, VCFAutomationProjectOverview, VCFAutomationVSphereVMDetails, VCFAutomationVSphereVMOverview, type VcfAutomationApi, VcfAutomationClient, type VcfDeploymentEvent$1 as VcfDeploymentEvent, type VcfDeploymentHistory, type VcfPageResponse, type VcfPageable, type VcfProject$1 as VcfProject, type VcfProjectZone, type VcfResource, type VcfResourceDisk, type VcfResourceExpense, type VcfResourceNetwork, rootRouteRef, vcfAutomationApiRef, vcfAutomationPlugin };
|
|
494
|
+
export { type CciSupervisorNamespace, type CciSupervisorResource, type StandaloneVmStatus, VCFAutomationCCINamespaceDetails, VCFAutomationCCINamespaceOverview, VCFAutomationCCIResourceDetails, VCFAutomationCCIResourceOverview, VCFAutomationDeploymentDetails, VCFAutomationDeploymentOverview, VCFAutomationGenericResourceDetails, VCFAutomationGenericResourceOverview, VCFAutomationProjectDetails, VCFAutomationProjectOverview, VCFAutomationVMPowerManagement, VCFAutomationVSphereVMDetails, VCFAutomationVSphereVMOverview, type VcfAutomationApi, VcfAutomationClient, type VcfDeploymentEvent$1 as VcfDeploymentEvent, type VcfDeploymentHistory, type VcfPageResponse, type VcfPageable, type VcfProject$1 as VcfProject, type VcfProjectZone, type VcfResource, type VcfResourceDisk, type VcfResourceExpense, type VcfResourceNetwork, type VmPowerAction, type VmPowerActionRequest, type VmPowerActionType, type VmPowerState, rootRouteRef, vcfAutomationApiRef, vcfAutomationPlugin };
|
package/dist/index.esm.js
CHANGED
|
@@ -11,6 +11,7 @@ export { VCFAutomationCCINamespaceOverview } from './components/VCFAutomationCCI
|
|
|
11
11
|
export { VCFAutomationCCIResourceOverview } from './components/VCFAutomationCCIResourceOverview.esm.js';
|
|
12
12
|
export { VCFAutomationCCINamespaceDetails } from './components/VCFAutomationCCINamespaceDetails.esm.js';
|
|
13
13
|
export { VCFAutomationCCIResourceDetails } from './components/VCFAutomationCCIResourceDetails.esm.js';
|
|
14
|
+
export { VCFAutomationVMPowerManagement } from './components/VCFAutomationVMPowerManagement.esm.js';
|
|
14
15
|
export { VcfAutomationClient, vcfAutomationApiRef } from './api/VcfAutomationClient.esm.js';
|
|
15
16
|
export { rootRouteRef } from './routes.esm.js';
|
|
16
17
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@terasky/backstage-plugin-vcf-automation",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@material-ui/core": "^4.12.4",
|
|
44
44
|
"@material-ui/icons": "^4.11.3",
|
|
45
45
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
46
|
-
"@terasky/backstage-plugin-vcf-automation-common": "^1.0
|
|
46
|
+
"@terasky/backstage-plugin-vcf-automation-common": "^1.1.0",
|
|
47
47
|
"js-yaml": "^4.1.0",
|
|
48
48
|
"react-use": "^17.6.0"
|
|
49
49
|
},
|