@terasky/backstage-plugin-vcf-automation 1.0.0 → 1.1.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.
package/README.md CHANGED
@@ -4,290 +4,12 @@ Welcome to the vcf-automation plugin!
4
4
 
5
5
  [![npm latest version](https://img.shields.io/npm/v/@terasky/backstage-plugin-vcf-automation/latest.svg)](https://www.npmjs.com/package/@terasky/backstage-plugin-vcf-automation)
6
6
 
7
- ## Description
8
-
9
7
  The `vcf-automation` plugin for Backstage provides visibility into VCF deployments, resources, and projects. It offers detailed views of deployment operations, resource states, and project configurations. The plugin integrates with Backstage's permission framework to ensure secure access control.
10
8
 
11
- ## Prerequisites
12
-
13
- Before installing this plugin, ensure you have:
14
-
15
- 1. [VCF Automation Backend Plugin](../vcf-automation-backend/README.md) - Required for API integration
16
- 2. [VCF Ingestor Plugin](../vcf-ingestor/README.md) - Required for entity synchronization
17
-
18
- ## Installation
19
-
20
- ### 1. Install the Plugin
21
-
22
- Add the plugin to your Backstage project:
23
-
24
- ```bash
25
- # From your Backstage root directory
26
- yarn --cwd packages/app add @terasky/backstage-plugin-vcf-automation
27
- ```
28
-
29
- ### 2. Register the Plugin
30
-
31
- Add the plugin to your app's APIs in `packages/app/src/apis.ts`:
32
-
33
- ```typescript
34
- import {
35
- vcfAutomationApiRef,
36
- VcfAutomationClient,
37
- } from '@terasky/backstage-plugin-vcf-automation';
38
-
39
- export const apis: AnyApiFactory[] = [
40
- // ... other API factories
41
- createApiFactory({
42
- api: vcfAutomationApiRef,
43
- deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef },
44
- factory: ({ discoveryApi, identityApi }) =>
45
- new VcfAutomationClient({ discoveryApi, identityApi }),
46
- }),
47
- ];
48
- ```
49
- ### 3. Add to your App.tsx file
50
-
51
- ```typescript
52
- import { vcfAutomationPlugin } from '@terasky/backstage-plugin-vcf-automation';
53
-
54
- const app = createApp({
55
- apis,
56
- bindRoutes({ bind }) {
57
-
58
- ...
59
-
60
- bind(vcfAutomationPlugin.externalRoutes, {
61
- catalogIndex: catalogPlugin.routes.catalogIndex,
62
- });
63
-
64
- ...
65
-
66
- },
67
-
68
- ```
69
- ### 4. Add Components to Entity Pages
70
-
71
- Add the VCF Automation components to your entity pages in `packages/app/src/components/catalog/EntityPage.tsx`:
72
-
73
- ```typescript
74
- import {
75
- VCFAutomationDeploymentOverview,
76
- VCFAutomationDeploymentDetails,
77
- VCFAutomationVSphereVMOverview,
78
- VCFAutomationVSphereVMDetails,
79
- VCFAutomationGenericResourceOverview,
80
- VCFAutomationGenericResourceDetails,
81
- VCFAutomationProjectOverview,
82
- VCFAutomationProjectDetails,
83
- } from '@terasky/backstage-plugin-vcf-automation';
84
- import { Entity } from '@backstage/catalog-model';
85
-
86
- // For VSphere VMs
87
- const vcfAutomationVSphereVMPage = (
88
- <EntityLayout>
89
- <EntityLayout.Route path="/" title="Overview">
90
- <Grid container spacing={3} alignItems="stretch">
91
- <Grid item md={6}>
92
- <EntityAboutCard variant="gridItem" />
93
- </Grid>
94
- <Grid item md={6}>
95
- <VCFAutomationVSphereVMOverview />
96
- </Grid>
97
- </Grid>
98
- </EntityLayout.Route>
99
- <EntityLayout.Route path="/vcf-automation" title="VCF Automation">
100
- <VCFAutomationVSphereVMDetails />
101
- </EntityLayout.Route>
102
- </EntityLayout>
103
- );
104
-
105
- // Add to your component page switch
106
- const componentPage = (
107
- <EntitySwitch>
108
- <EntitySwitch.Case if={isComponentType('Cloud.vSphere.Machine')}>
109
- {vcfAutomationVSphereVMPage}
110
- </EntitySwitch.Case>
111
- // ... other cases
112
- </EntitySwitch>
113
- );
114
-
115
- // For VCF Deployments
116
- const hasVcfAutomationDeploymentStatus = (entity: Entity): boolean =>
117
- Boolean(entity.metadata?.annotations?.['terasky.backstage.io/vcf-automation-deployment-status']);
118
-
119
- const vcfAutomationDeploymentPage = (
120
- <EntityLayout>
121
- <EntityLayout.Route path="/" title="Overview">
122
- <Grid container spacing={3} alignItems="stretch">
123
- <Grid item md={6}>
124
- <VCFAutomationDeploymentOverview />
125
- </Grid>
126
- </Grid>
127
- </EntityLayout.Route>
128
- <EntityLayout.Route path="/vcf-automation" title="VCF Automation">
129
- <VCFAutomationDeploymentDetails />
130
- </EntityLayout.Route>
131
- </EntityLayout>
132
- );
133
-
134
- // For Generic Resources
135
- const hasVcfAutomationResourceType = (entity: Entity): boolean =>
136
- Boolean(entity.metadata?.annotations?.['terasky.backstage.io/vcf-automation-resource-type']);
137
-
138
- const vcfAutomationGenericResourcePage = (
139
- <EntityLayout>
140
- <EntityLayout.Route path="/" title="Overview">
141
- <Grid container spacing={3} alignItems="stretch">
142
- <Grid item md={6}>
143
- <VCFAutomationGenericResourceOverview />
144
- </Grid>
145
- </Grid>
146
- </EntityLayout.Route>
147
- <EntityLayout.Route path="/vcf-automation" title="VCF Automation">
148
- <VCFAutomationGenericResourceDetails />
149
- </EntityLayout.Route>
150
- </EntityLayout>
151
- );
152
-
153
- // For Projects (in Domain page)
154
- const domainPage = (
155
- <EntityLayout>
156
- <EntityLayout.Route path="/" title="Overview">
157
- <Grid container spacing={3} alignItems="stretch">
158
- <Grid item md={6}>
159
- <VCFAutomationProjectOverview />
160
- </Grid>
161
- </Grid>
162
- </EntityLayout.Route>
163
- <EntityLayout.Route path="/vcf-automation" title="VCF Automation">
164
- <VCFAutomationProjectDetails />
165
- </EntityLayout.Route>
166
- </EntityLayout>
167
- );
168
-
169
- // Add a Resources Page
170
- const resourcePage = (
171
- <EntitySwitch>
172
- <EntitySwitch.Case if={hasVcfAutomationResourceType}>
173
- {vcfAutomationGenericResourcePage}
174
- </EntitySwitch.Case>
175
- <EntitySwitch.Case>
176
- {defaultEntityPage}
177
- </EntitySwitch.Case>
178
- </EntitySwitch>
179
- );
180
-
181
- // Update the entityPage constant to include the resource page
182
- export const entityPage = (
183
- <EntitySwitch>
184
- ...
185
- <EntitySwitch.Case if={isKind('resource')} children={resourcePage} />
186
- ...
187
- </EntitySwitch>
188
- );
189
- ```
190
-
191
- ### 5. Configure Backend Integration
192
-
193
- Add the following to your `app-config.yaml`:
194
-
195
- ```yaml
196
- vcfAutomation:
197
- baseUrl: http://your-vcf-automation-service
198
- ```
199
-
200
- ## Entity Integration
201
-
202
- The plugin integrates with different entity types:
203
-
204
- ### VSphere VM Component
205
- ```yaml
206
- apiVersion: backstage.io/v1alpha1
207
- kind: Component
208
- metadata:
209
- name: my-vm
210
- spec:
211
- type: Cloud.vSphere.Machine
212
- system: my-deployment # References parent deployment
213
- ```
214
-
215
- ### VCF Deployment
216
- ```yaml
217
- apiVersion: backstage.io/v1alpha1
218
- kind: System
219
- metadata:
220
- name: my-deployment
221
- annotations:
222
- terasky.backstage.io/vcf-automation-deployment-status: 'true'
223
- ```
224
-
225
- ### Generic Resource
226
- ```yaml
227
- apiVersion: backstage.io/v1alpha1
228
- kind: Resource
229
- metadata:
230
- name: my-resource
231
- annotations:
232
- terasky.backstage.io/vcf-automation-resource-type: 'network'
233
- ```
234
-
235
- ### Project (Domain)
236
- ```yaml
237
- apiVersion: backstage.io/v1alpha1
238
- kind: Domain
239
- metadata:
240
- name: my-project
241
- ```
242
-
243
- ## Features
244
-
245
- - **VSphere VM Management**: Detailed view of VM configurations and status
246
- - **Deployment Operations**: Track deployment status and history
247
- - **Resource Management**: Monitor various VCF resource types
248
- - **Project Administration**: Manage VCF project settings and resources
249
- - **Permission Integration**: Built-in support for Backstage's permission framework
250
-
251
- ## Usage
252
-
253
- Once installed and configured, the VCF Automation plugin provides comprehensive views for different VCF entity types:
254
-
255
- ### Project (Domain) Views
256
- The project overview provides a high-level summary of your VCF project:
257
- ![Project Overview](../../images/vcf-proj-overview.png)
258
-
259
- Detailed project information is available as well:
260
- ![Project Details 1](../../images/vcf-proj-details-1.png)
261
- ![Project Details 2](../../images/vcf-proj-details-2.png)
262
- ![Project Details 3](../../images/vcf-proj-details-3.png)
263
-
264
- ### Deployment Views
265
- Get a quick overview of your VCF deployments:
266
- ![Deployment Overview](../../images/vcf-deploy-overview.png)
267
-
268
- Access detailed deployment information:
269
- ![Deployment Details 1](../../images/vcf-deploy-details-1.png)
270
- ![Deployment Details 2](../../images/vcf-deploy-details-2.png)
271
-
272
- ### VSphere VM Views
273
- Monitor your VSphere VMs with the overview card:
274
- ![VM Overview](../../images/vcf-vm-overview.png)
275
-
276
- Dive deep into VM configurations and status:
277
- ![VM Details 1](../../images/vcf-vm-details-1.png)
278
- ![VM Details 2](../../images/vcf-vm-details-2.png)
279
-
280
- ### Generic Resource Views
281
- View resource summaries in the overview:
282
- ![Resource Overview](../../images/vcf-resource-overview.png)
283
-
284
- Access detailed resource information:
285
- ![Resource Details](../../images/vcf-resource-details.png)
9
+ For detailed docs go to https://terasky-oss.github.io/backstage-plugins/plugins/vcf-automation/overview
286
10
 
287
11
  ## Contributing
288
-
289
12
  Contributions are welcome! Please open an issue or submit a pull request on GitHub.
290
13
 
291
14
  ## License
292
-
293
- This project is licensed under the Apache-2.0 License.
15
+ This project is licensed under the Apache-2.0 License.
@@ -17,10 +17,11 @@ class VcfAutomationClient {
17
17
  ...token?.token ? { Authorization: `Bearer ${token.token}` } : {}
18
18
  };
19
19
  }
20
- async getDeploymentEvents(deploymentId) {
20
+ async getDeploymentEvents(deploymentId, instanceName) {
21
21
  const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
22
22
  const headers = await this.getAuthHeaders();
23
- const response = await fetch(`${baseUrl}/deployments/${deploymentId}/events`, {
23
+ const url = instanceName ? `${baseUrl}/deployments/${deploymentId}/events?instance=${encodeURIComponent(instanceName)}` : `${baseUrl}/deployments/${deploymentId}/events`;
24
+ const response = await fetch(url, {
24
25
  headers
25
26
  });
26
27
  if (!response.ok) {
@@ -28,10 +29,11 @@ class VcfAutomationClient {
28
29
  }
29
30
  return await response.json();
30
31
  }
31
- async getVSphereVMDetails(deploymentId, resourceId) {
32
+ async getVSphereVMDetails(deploymentId, resourceId, instanceName) {
32
33
  const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
33
34
  const headers = await this.getAuthHeaders();
34
- const response = await fetch(`${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`, {
35
+ const url = instanceName ? `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}?instance=${encodeURIComponent(instanceName)}` : `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`;
36
+ const response = await fetch(url, {
35
37
  headers
36
38
  });
37
39
  if (!response.ok) {
@@ -39,44 +41,41 @@ class VcfAutomationClient {
39
41
  }
40
42
  return await response.json();
41
43
  }
42
- async getGenericResourceDetails(deploymentId, resourceId) {
44
+ async getGenericResourceDetails(deploymentId, resourceId, instanceName) {
43
45
  const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
44
46
  const headers = await this.getAuthHeaders();
45
- const response = await fetch(
46
- `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`,
47
- {
48
- headers: {
49
- "Content-Type": "application/json",
50
- ...headers
51
- }
47
+ const url = instanceName ? `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}?instance=${encodeURIComponent(instanceName)}` : `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`;
48
+ const response = await fetch(url, {
49
+ headers: {
50
+ "Content-Type": "application/json",
51
+ ...headers
52
52
  }
53
- );
53
+ });
54
54
  if (!response.ok) {
55
55
  throw new Error(`Failed to fetch resource details: ${response.statusText}`);
56
56
  }
57
57
  return await response.json();
58
58
  }
59
- async getDeploymentDetails(deploymentId) {
59
+ async getDeploymentDetails(deploymentId, instanceName) {
60
60
  const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
61
61
  const headers = await this.getAuthHeaders();
62
- const response = await fetch(
63
- `${baseUrl}/deployments/${deploymentId}`,
64
- {
65
- headers: {
66
- "Content-Type": "application/json",
67
- ...headers
68
- }
62
+ const url = instanceName ? `${baseUrl}/deployments/${deploymentId}?instance=${encodeURIComponent(instanceName)}` : `${baseUrl}/deployments/${deploymentId}`;
63
+ const response = await fetch(url, {
64
+ headers: {
65
+ "Content-Type": "application/json",
66
+ ...headers
69
67
  }
70
- );
68
+ });
71
69
  if (!response.ok) {
72
70
  throw new Error(`Failed to fetch deployment details: ${response.statusText}`);
73
71
  }
74
72
  return await response.json();
75
73
  }
76
- async getProjectDetails(projectId) {
74
+ async getProjectDetails(projectId, instanceName) {
77
75
  const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
78
76
  const headers = await this.getAuthHeaders();
79
- const response = await fetch(`${baseUrl}/projects/${projectId}`, {
77
+ const url = instanceName ? `${baseUrl}/projects/${projectId}?instance=${encodeURIComponent(instanceName)}` : `${baseUrl}/projects/${projectId}`;
78
+ const response = await fetch(url, {
80
79
  headers
81
80
  });
82
81
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"VcfAutomationClient.esm.js","sources":["../../src/api/VcfAutomationClient.ts"],"sourcesContent":["import { createApiRef, DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { VcfProject as VcfProjectType } from '../types';\n\nexport interface VcfDeploymentEvent {\n timestamp: string;\n status: string;\n operation: string;\n user: string;\n details: string;\n}\n\nexport interface VcfDeploymentConfig {\n key: string;\n value: string;\n}\n\nexport interface VcfDeploymentResponse {\n content: any;\n pageable: any;\n config: VcfDeploymentConfig[];\n history: VcfDeploymentEvent[];\n}\n\nexport interface VcfVSphereVM {\n id: string;\n name: string;\n type: string;\n properties: {\n resourceId: string;\n moref: string;\n resourceDescLink: string;\n powerState: string;\n zone: string;\n environmentName: string;\n hasSnapshots: string;\n computeHostType: string;\n id: string;\n memoryGB: string;\n cpuCount: number;\n image: string;\n totalMemoryMB: number;\n endpointType: string;\n resourceName: string;\n tags: string[];\n softwareName: string;\n name: string;\n resourceLink: string;\n region: string;\n hostName: string;\n storage: {\n disks: Array<{\n vm: string;\n name: string;\n type: string;\n shares?: string;\n vcUuid: string;\n diskFile?: string;\n bootOrder?: number;\n encrypted: boolean;\n limitIops?: string;\n capacityGb: number;\n persistent: boolean;\n independent?: string;\n sharesLevel?: string;\n endpointType: string;\n resourceLink: string;\n vmFolderPath?: string;\n controllerKey: string;\n diskPlacementRef?: string;\n existingResource: string;\n provisioningType?: string;\n controllerUnitNumber: string;\n }>;\n };\n networks: Array<{\n id: string;\n name: string;\n address: string;\n network: string;\n assignment: string;\n deviceIndex: number;\n external_id: string;\n mac_address: string;\n resourceName: string;\n ipv6Addresses?: string[];\n }>;\n areVMActionsDisabled: string;\n providerId: string;\n osType: string;\n instanceUUID: string;\n componentType: string;\n address: string;\n endpointId: string;\n externalId: string;\n datacenter: string;\n datastoreName: string;\n coreCount: string;\n primaryMAC: string;\n computeHostRef: string;\n snapshotCount: string;\n accounts: string[];\n vmFolderPath: string;\n account: string;\n vcUuid: string;\n };\n createdAt: string;\n syncStatus: string;\n expense: {\n totalExpense: number;\n computeExpense: number;\n storageExpense: number;\n additionalExpense: number;\n unit: string;\n lastUpdatedTime: string;\n };\n origin: string;\n dependsOn: string[];\n state: string;\n}\n\nexport type VcfProject = VcfProjectType;\n\nexport interface VcfAutomationApi {\n getDeploymentEvents(deploymentId: string): Promise<VcfDeploymentResponse>;\n getVSphereVMDetails(deploymentId: string, resourceId: string): Promise<VcfVSphereVM>;\n getProjectDetails(projectId: string): Promise<VcfProject>;\n getGenericResourceDetails(deploymentId: string, resourceId: string): Promise<any>;\n getDeploymentDetails(deploymentId: string): Promise<any>;\n}\n\nexport const vcfAutomationApiRef = createApiRef<VcfAutomationApi>({\n id: 'plugin.vcf-automation.service',\n});\n\nexport class VcfAutomationClient implements VcfAutomationApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n }\n\n private async getAuthHeaders(): Promise<HeadersInit> {\n const token = await this.identityApi.getCredentials();\n return {\n 'Content-Type': 'application/json',\n ...(token?.token ? { Authorization: `Bearer ${token.token}` } : {}),\n };\n }\n\n async getDeploymentEvents(deploymentId: string): Promise<VcfDeploymentResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const response = await fetch(`${baseUrl}/deployments/${deploymentId}/events`, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch deployment events: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getVSphereVMDetails(deploymentId: string, resourceId: string): Promise<VcfVSphereVM> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const response = await fetch(`${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch resource details: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getGenericResourceDetails(deploymentId: string, resourceId: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n \n const response = await fetch(`${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch resource details: ${response.statusText}`);\n }\n\n return await response.json();\n }\n\n async getDeploymentDetails(deploymentId: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n \n const response = await fetch(`${baseUrl}/deployments/${deploymentId}`,\n {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch deployment details: ${response.statusText}`);\n }\n\n return await response.json();\n }\n\n async getProjectDetails(projectId: string): Promise<VcfProject> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const response = await fetch(`${baseUrl}/projects/${projectId}`, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch project details: ${response.statusText}`);\n }\n return await response.json();\n }\n} "],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VcfAutomationClient.esm.js","sources":["../../src/api/VcfAutomationClient.ts"],"sourcesContent":["import { createApiRef, DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { VcfProject as VcfProjectType } from '../types';\n\nexport interface VcfDeploymentEvent {\n timestamp: string;\n status: string;\n operation: string;\n user: string;\n details: string;\n}\n\nexport interface VcfDeploymentConfig {\n key: string;\n value: string;\n}\n\nexport interface VcfDeploymentResponse {\n content: any;\n pageable: any;\n config: VcfDeploymentConfig[];\n history: VcfDeploymentEvent[];\n}\n\nexport interface VcfVSphereVM {\n id: string;\n name: string;\n type: string;\n properties: {\n resourceId: string;\n moref: string;\n resourceDescLink: string;\n powerState: string;\n zone: string;\n environmentName: string;\n hasSnapshots: string;\n computeHostType: string;\n id: string;\n memoryGB: string;\n cpuCount: number;\n image: string;\n totalMemoryMB: number;\n endpointType: string;\n resourceName: string;\n tags: string[];\n softwareName: string;\n name: string;\n resourceLink: string;\n region: string;\n hostName: string;\n storage: {\n disks: Array<{\n vm: string;\n name: string;\n type: string;\n shares?: string;\n vcUuid: string;\n diskFile?: string;\n bootOrder?: number;\n encrypted: boolean;\n limitIops?: string;\n capacityGb: number;\n persistent: boolean;\n independent?: string;\n sharesLevel?: string;\n endpointType: string;\n resourceLink: string;\n vmFolderPath?: string;\n controllerKey: string;\n diskPlacementRef?: string;\n existingResource: string;\n provisioningType?: string;\n controllerUnitNumber: string;\n }>;\n };\n networks: Array<{\n id: string;\n name: string;\n address: string;\n network: string;\n assignment: string;\n deviceIndex: number;\n external_id: string;\n mac_address: string;\n resourceName: string;\n ipv6Addresses?: string[];\n }>;\n areVMActionsDisabled: string;\n providerId: string;\n osType: string;\n instanceUUID: string;\n componentType: string;\n address: string;\n endpointId: string;\n externalId: string;\n datacenter: string;\n datastoreName: string;\n coreCount: string;\n primaryMAC: string;\n computeHostRef: string;\n snapshotCount: string;\n accounts: string[];\n vmFolderPath: string;\n account: string;\n vcUuid: string;\n };\n createdAt: string;\n syncStatus: string;\n expense: {\n totalExpense: number;\n computeExpense: number;\n storageExpense: number;\n additionalExpense: number;\n unit: string;\n lastUpdatedTime: string;\n };\n origin: string;\n dependsOn: string[];\n state: string;\n}\n\nexport type VcfProject = VcfProjectType;\n\nexport interface VcfAutomationApi {\n getDeploymentEvents(deploymentId: string, instanceName?: string): Promise<VcfDeploymentResponse>;\n getVSphereVMDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<VcfVSphereVM>;\n getProjectDetails(projectId: string, instanceName?: string): Promise<VcfProject>;\n getGenericResourceDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<any>;\n getDeploymentDetails(deploymentId: string, instanceName?: string): Promise<any>;\n}\n\nexport const vcfAutomationApiRef = createApiRef<VcfAutomationApi>({\n id: 'plugin.vcf-automation.service',\n});\n\nexport class VcfAutomationClient implements VcfAutomationApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n }\n\n private async getAuthHeaders(): Promise<HeadersInit> {\n const token = await this.identityApi.getCredentials();\n return {\n 'Content-Type': 'application/json',\n ...(token?.token ? { Authorization: `Bearer ${token.token}` } : {}),\n };\n }\n\n async getDeploymentEvents(deploymentId: string, instanceName?: string): Promise<VcfDeploymentResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/deployments/${deploymentId}/events?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments/${deploymentId}/events`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch deployment events: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getVSphereVMDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<VcfVSphereVM> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch resource details: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getGenericResourceDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n \n const url = instanceName \n ? `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments/${deploymentId}/resources/${resourceId}`;\n \n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch resource details: ${response.statusText}`);\n }\n\n return await response.json();\n }\n\n async getDeploymentDetails(deploymentId: string, instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n \n const url = instanceName \n ? `${baseUrl}/deployments/${deploymentId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments/${deploymentId}`;\n \n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch deployment details: ${response.statusText}`);\n }\n\n return await response.json();\n }\n\n async getProjectDetails(projectId: string, instanceName?: string): Promise<VcfProject> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/projects/${projectId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/projects/${projectId}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch project details: ${response.statusText}`);\n }\n return await response.json();\n }\n} "],"names":[],"mappings":"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"}
@@ -62,6 +62,7 @@ const VCFAutomationDeploymentDetails = () => {
62
62
  const api = useApi(vcfAutomationApiRef);
63
63
  const catalogApi = useApi(catalogApiRef);
64
64
  const deploymentId = entity.metadata.name;
65
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
65
66
  const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({
66
67
  permission: viewDeploymentHistoryPermission
67
68
  });
@@ -69,15 +70,15 @@ const VCFAutomationDeploymentDetails = () => {
69
70
  if (!deploymentId || !hasViewPermission) {
70
71
  return void 0;
71
72
  }
72
- return await api.getDeploymentDetails(deploymentId);
73
- }, [deploymentId, hasViewPermission]);
73
+ return await api.getDeploymentDetails(deploymentId, instanceName);
74
+ }, [deploymentId, hasViewPermission, instanceName]);
74
75
  const { value: eventsResponse, loading: eventsLoading, error: eventsError } = useAsync(async () => {
75
76
  if (!deploymentId || !hasViewPermission) {
76
77
  return void 0;
77
78
  }
78
- const response = await api.getDeploymentEvents(deploymentId);
79
+ const response = await api.getDeploymentEvents(deploymentId, instanceName);
79
80
  return response;
80
- }, [deploymentId, hasViewPermission]);
81
+ }, [deploymentId, hasViewPermission, instanceName]);
81
82
  const { value: resources, loading: resourcesLoading, error: resourcesError } = useAsync(async () => {
82
83
  if (!deploymentId) {
83
84
  return void 0;
@@ -143,12 +144,12 @@ const VCFAutomationDeploymentDetails = () => {
143
144
  "Lease Grace Period (Days)": deploymentDetails?.leaseGracePeriodDays
144
145
  },
145
146
  "Expense Information": deploymentDetails?.expense ? {
146
- "Total Expense": `${deploymentDetails.expense.totalExpense} ${deploymentDetails.expense.unit}`,
147
- "Compute Expense": `${deploymentDetails.expense.computeExpense} ${deploymentDetails.expense.unit}`,
148
- "Storage Expense": `${deploymentDetails.expense.storageExpense} ${deploymentDetails.expense.unit}`,
149
- "Additional Expense": `${deploymentDetails.expense.additionalExpense} ${deploymentDetails.expense.unit}`,
150
- "Last Updated": new Date(deploymentDetails.expense.lastUpdatedTime).toLocaleString()
151
- } : {},
147
+ "Total Expense": deploymentDetails.expense.totalExpense !== void 0 ? `${deploymentDetails.expense.totalExpense} ${deploymentDetails.expense.unit || ""}` : "N/A",
148
+ "Compute Expense": deploymentDetails.expense.computeExpense !== void 0 ? `${deploymentDetails.expense.computeExpense} ${deploymentDetails.expense.unit || ""}` : "N/A",
149
+ "Storage Expense": deploymentDetails.expense.storageExpense !== void 0 ? `${deploymentDetails.expense.storageExpense} ${deploymentDetails.expense.unit || ""}` : "N/A",
150
+ "Additional Expense": deploymentDetails.expense.additionalExpense !== void 0 ? `${deploymentDetails.expense.additionalExpense} ${deploymentDetails.expense.unit || ""}` : "N/A",
151
+ "Last Updated": deploymentDetails.expense.lastUpdatedTime ? new Date(deploymentDetails.expense.lastUpdatedTime).toLocaleString() : "N/A"
152
+ } : "No expense information available",
152
153
  "Input Parameters": deploymentDetails?.inputs || {}
153
154
  };
154
155
  return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
@@ -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\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);\n }, [deploymentId, hasViewPermission]);\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);\n return response;\n }, [deploymentId, hasViewPermission]);\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} ${deploymentDetails.expense.unit}`,\n 'Compute Expense': `${deploymentDetails.expense.computeExpense} ${deploymentDetails.expense.unit}`,\n 'Storage Expense': `${deploymentDetails.expense.storageExpense} ${deploymentDetails.expense.unit}`,\n 'Additional Expense': `${deploymentDetails.expense.additionalExpense} ${deploymentDetails.expense.unit}`,\n 'Last Updated': new Date(deploymentDetails.expense.lastUpdatedTime).toLocaleString(),\n } : {},\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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"}
@@ -12,6 +12,7 @@ const VCFAutomationDeploymentOverview = () => {
12
12
  const { entity } = useEntity();
13
13
  const api = useApi(vcfAutomationApiRef);
14
14
  const deploymentId = entity.metadata.name;
15
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
15
16
  const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({
16
17
  permission: viewDeploymentHistoryPermission
17
18
  });
@@ -19,8 +20,8 @@ const VCFAutomationDeploymentOverview = () => {
19
20
  if (!deploymentId || !hasViewPermission) {
20
21
  return void 0;
21
22
  }
22
- return await api.getDeploymentDetails(deploymentId);
23
- }, [deploymentId, hasViewPermission]);
23
+ return await api.getDeploymentDetails(deploymentId, instanceName);
24
+ }, [deploymentId, hasViewPermission, instanceName]);
24
25
  if (!deploymentId) {
25
26
  return /* @__PURE__ */ jsx(InfoCard, { title: "VCF Automation Deployment", children: /* @__PURE__ */ jsx(Typography, { children: "No deployment ID found for this entity." }) });
26
27
  }
@@ -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\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);\n }, [deploymentId, hasViewPermission]);\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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"}
@@ -28,10 +28,11 @@ const VCFAutomationGenericResourceDetails = () => {
28
28
  const vcfAutomationApi = useApi(vcfAutomationApiRef);
29
29
  const deploymentId = entity.spec?.system || "";
30
30
  const resourceId = entity.metadata.name;
31
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
31
32
  const { value: resourceData, loading, error } = useAsync(async () => {
32
33
  if (!deploymentId || !resourceId) return void 0;
33
- return await vcfAutomationApi.getGenericResourceDetails(deploymentId, resourceId);
34
- }, [deploymentId, resourceId]);
34
+ return await vcfAutomationApi.getGenericResourceDetails(deploymentId, resourceId, instanceName);
35
+ }, [deploymentId, resourceId, instanceName]);
35
36
  if (error) {
36
37
  return /* @__PURE__ */ jsx(ResponseErrorPanel, { error });
37
38
  }
@@ -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\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);\n }, [deploymentId, resourceId]);\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;AAEnC,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,UAAoB,CAAA;AAAA,GACnG,EAAA,CAAC,YAAc,EAAA,UAAU,CAAC,CAAA;AAE7B,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,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;;;;"}
@@ -10,10 +10,11 @@ const VCFAutomationGenericResourceOverview = () => {
10
10
  const vcfAutomationApi = useApi(vcfAutomationApiRef);
11
11
  const deploymentId = entity.spec?.system || "";
12
12
  const resourceId = entity.metadata.name;
13
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
13
14
  const { value: resourceData, loading, error } = useAsync(async () => {
14
15
  if (!deploymentId || !resourceId) return void 0;
15
- return await vcfAutomationApi.getGenericResourceDetails(deploymentId, resourceId);
16
- }, [deploymentId, resourceId]);
16
+ return await vcfAutomationApi.getGenericResourceDetails(deploymentId, resourceId, instanceName);
17
+ }, [deploymentId, resourceId, instanceName]);
17
18
  if (error) {
18
19
  return /* @__PURE__ */ jsx(ResponseErrorPanel, { error });
19
20
  }
@@ -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\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);\n }, [deploymentId, resourceId]);\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;AAEnC,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,UAAoB,CAAA;AAAA,GACnG,EAAA,CAAC,YAAc,EAAA,UAAU,CAAC,CAAA;AAE7B,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,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;;;;"}
@@ -13,13 +13,14 @@ const VCFAutomationProjectDetails = () => {
13
13
  const vcfAutomationApi = useApi(vcfAutomationApiRef);
14
14
  const catalogApi = useApi(catalogApiRef);
15
15
  const projectId = entity.metadata.name;
16
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
16
17
  const { allowed } = usePermission({
17
18
  permission: viewProjectDetailsPermission
18
19
  });
19
20
  const { value: projectData, loading: projectLoading, error: projectError } = useAsync(async () => {
20
21
  if (!projectId || !allowed) return void 0;
21
- return await vcfAutomationApi.getProjectDetails(projectId);
22
- }, [projectId, allowed]);
22
+ return await vcfAutomationApi.getProjectDetails(projectId, instanceName);
23
+ }, [projectId, allowed, instanceName]);
23
24
  const { value: systemsData, loading: systemsLoading } = useAsync(async () => {
24
25
  if (!projectId || !allowed) return void 0;
25
26
  const systems = await catalogApi.getEntities({
@@ -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\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);\n }, [projectId, allowed]);\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,\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 </Grid>\n </InfoCard>\n </Grid>\n\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 {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 {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 </Grid>\n );\n}; "],"names":[],"mappings":"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"}
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,\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 </Grid>\n </InfoCard>\n </Grid>\n\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 {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 {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 </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,mBAAmB,WAAY,CAAA,cAAA;AAAA,UAC/B,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,MAAkB,iBAAA,CAAA,WAAA,CAAY,gBAAgB,gBAAgB,CAAA;AAAA,MAC9D,iBAAA,CAAkB,WAAY,CAAA,OAAA,EAAS,SAAS,CAAA;AAAA,MAChD,iBAAA,CAAkB,WAAY,CAAA,OAAA,EAAS,SAAS,CAAA;AAAA,MAChD,iBAAA,CAAkB,WAAY,CAAA,WAAA,EAAa,aAAa;AAAA,KAAA,EAC3D,GACF,CACF,EAAA,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAM,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,IAEC,OAAO,IAAK,CAAA,WAAA,CAAY,WAAW,CAAA,CAAE,SAAS,CAC7C,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EACb,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,OAAO,IAAK,CAAA,WAAA,CAAY,gBAAgB,CAAA,CAAE,SAAS,CAClD,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EACb,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;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -12,13 +12,14 @@ const VCFAutomationProjectOverview = () => {
12
12
  const { entity } = useEntity();
13
13
  const api = useApi(vcfAutomationApiRef);
14
14
  const projectId = entity.metadata.name;
15
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
15
16
  const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({
16
17
  permission: viewProjectDetailsPermission
17
18
  });
18
19
  const { value: project, loading, error } = useAsync(async () => {
19
20
  if (!projectId || !hasViewPermission) return void 0;
20
- return await api.getProjectDetails(projectId);
21
- }, [projectId, hasViewPermission]);
21
+ return await api.getProjectDetails(projectId, instanceName);
22
+ }, [projectId, hasViewPermission, instanceName]);
22
23
  if (!projectId) {
23
24
  return /* @__PURE__ */ jsx(InfoCard, { title: "VCF Automation Project", children: /* @__PURE__ */ jsx(Typography, { children: "No project ID found for this entity." }) });
24
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationProjectOverview.esm.js","sources":["../../src/components/VCFAutomationProjectOverview.tsx"],"sourcesContent":["import { Key, JSXElementConstructor, ReactElement, ReactNode, ReactPortal } 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 Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { Grid, Typography, Chip } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { viewProjectDetailsPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nexport const VCFAutomationProjectOverview = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const projectId = entity.metadata.name;\n\n const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: viewProjectDetailsPermission,\n });\n\n const { value: project, loading, error } = useAsync(async () => {\n if (!projectId || !hasViewPermission) return undefined;\n return await api.getProjectDetails(projectId);\n }, [projectId, hasViewPermission]);\n\n if (!projectId) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Typography>No project ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permissionLoading) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Typography>You don't have permission to view project details.</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!project) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Typography>No project details available.</Typography>\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Name</Typography>\n <Typography>{project.name}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Description</Typography>\n <Typography>{project.description || 'No description'}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Administrators</Typography>\n <Grid container spacing={1}>\n {project.administrators.map((admin: { email: any; type: any; }) => (\n <Grid item key={`${admin.email}-${admin.type}`}>\n <Chip\n label={`${admin.email} (${admin.type})`}\n size=\"small\"\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Resource Allocation</Typography>\n {project.zones.map((zone: { id: Key | null | undefined; zoneId: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; allocatedInstancesCount: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; maxNumberInstances: any; allocatedMemoryMB: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; memoryLimitMB: any; allocatedCpu: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; cpuLimit: any; allocatedStorageGB: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; storageLimitGB: any; }) => (\n <Grid container spacing={2} key={zone.id}>\n <Grid item xs={12}>\n <Typography variant=\"body2\">Zone: {zone.zoneId}</Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">Instances</Typography>\n <Typography>\n {zone.allocatedInstancesCount} / {zone.maxNumberInstances || 'Unlimited'}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">Memory (MB)</Typography>\n <Typography>\n {zone.allocatedMemoryMB} / {zone.memoryLimitMB || 'Unlimited'}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">CPU</Typography>\n <Typography>\n {zone.allocatedCpu} / {zone.cpuLimit || 'Unlimited'}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">Storage (GB)</Typography>\n <Typography>\n {zone.allocatedStorageGB} / {zone.storageLimitGB || 'Unlimited'}\n </Typography>\n </Grid>\n </Grid>\n ))}\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Shared Resources</Typography>\n <Typography>{project.sharedResources ? 'Yes' : 'No'}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Placement Policy</Typography>\n <Typography>{project.placementPolicy}</Typography>\n </Grid>\n </Grid>\n </InfoCard>\n );\n}; "],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VCFAutomationProjectOverview.esm.js","sources":["../../src/components/VCFAutomationProjectOverview.tsx"],"sourcesContent":["import { Key, JSXElementConstructor, ReactElement, ReactNode, ReactPortal } 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 Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { Grid, Typography, Chip } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { viewProjectDetailsPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nexport const VCFAutomationProjectOverview = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const projectId = 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: viewProjectDetailsPermission,\n });\n\n const { value: project, loading, error } = useAsync(async () => {\n if (!projectId || !hasViewPermission) return undefined;\n return await api.getProjectDetails(projectId, instanceName);\n }, [projectId, hasViewPermission, instanceName]);\n\n if (!projectId) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Typography>No project ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permissionLoading) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Typography>You don't have permission to view project details.</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!project) {\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Typography>No project details available.</Typography>\n </InfoCard>\n );\n }\n\n return (\n <InfoCard title=\"VCF Automation Project\">\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Name</Typography>\n <Typography>{project.name}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Description</Typography>\n <Typography>{project.description || 'No description'}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Administrators</Typography>\n <Grid container spacing={1}>\n {project.administrators.map((admin: { email: any; type: any; }) => (\n <Grid item key={`${admin.email}-${admin.type}`}>\n <Chip\n label={`${admin.email} (${admin.type})`}\n size=\"small\"\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Resource Allocation</Typography>\n {project.zones.map((zone: { id: Key | null | undefined; zoneId: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; allocatedInstancesCount: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; maxNumberInstances: any; allocatedMemoryMB: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; memoryLimitMB: any; allocatedCpu: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; cpuLimit: any; allocatedStorageGB: string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined; storageLimitGB: any; }) => (\n <Grid container spacing={2} key={zone.id}>\n <Grid item xs={12}>\n <Typography variant=\"body2\">Zone: {zone.zoneId}</Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">Instances</Typography>\n <Typography>\n {zone.allocatedInstancesCount} / {zone.maxNumberInstances || 'Unlimited'}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">Memory (MB)</Typography>\n <Typography>\n {zone.allocatedMemoryMB} / {zone.memoryLimitMB || 'Unlimited'}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">CPU</Typography>\n <Typography>\n {zone.allocatedCpu} / {zone.cpuLimit || 'Unlimited'}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <Typography variant=\"caption\">Storage (GB)</Typography>\n <Typography>\n {zone.allocatedStorageGB} / {zone.storageLimitGB || 'Unlimited'}\n </Typography>\n </Grid>\n </Grid>\n ))}\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Shared Resources</Typography>\n <Typography>{project.sharedResources ? 'Yes' : 'No'}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Placement Policy</Typography>\n <Typography>{project.placementPolicy}</Typography>\n </Grid>\n </Grid>\n </InfoCard>\n );\n}; "],"names":[],"mappings":"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"}
@@ -13,13 +13,14 @@ const VCFAutomationVSphereVMDetails = () => {
13
13
  const vcfAutomationApi = useApi(vcfAutomationApiRef);
14
14
  const deploymentId = entity.spec?.system || "";
15
15
  const resourceId = entity.metadata.name;
16
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
16
17
  const { allowed } = usePermission({
17
18
  permission: showDeploymentResourcesDataPermission
18
19
  });
19
20
  const { value, loading, error } = useAsync(async () => {
20
21
  if (!resourceId || !deploymentId || !allowed) return void 0;
21
- return await vcfAutomationApi.getVSphereVMDetails(deploymentId, resourceId);
22
- }, [resourceId, deploymentId, allowed]);
22
+ return await vcfAutomationApi.getVSphereVMDetails(deploymentId, resourceId, instanceName);
23
+ }, [resourceId, deploymentId, allowed, instanceName]);
23
24
  if (error) {
24
25
  return /* @__PURE__ */ jsx(ResponseErrorPanel, { error });
25
26
  }
@@ -100,12 +101,12 @@ const VCFAutomationVSphereVMDetails = () => {
100
101
  StructuredMetadataTable,
101
102
  {
102
103
  metadata: {
103
- "Total Expense": `$${value.expense.totalExpense.toFixed(2)}`,
104
- "Compute Expense": `$${value.expense.computeExpense.toFixed(2)}`,
105
- "Storage Expense": `$${value.expense.storageExpense.toFixed(2)}`,
106
- "Additional Expense": `$${value.expense.additionalExpense.toFixed(2)}`,
107
- "Currency": value.expense.unit,
108
- "Last Updated": new Date(value.expense.lastUpdatedTime).toLocaleString()
104
+ "Total Expense": value.expense?.totalExpense !== void 0 ? `$${value.expense.totalExpense.toFixed(2)}` : "N/A",
105
+ "Compute Expense": value.expense?.computeExpense !== void 0 ? `$${value.expense.computeExpense.toFixed(2)}` : "N/A",
106
+ "Storage Expense": value.expense?.storageExpense !== void 0 ? `$${value.expense.storageExpense.toFixed(2)}` : "N/A",
107
+ "Additional Expense": value.expense?.additionalExpense !== void 0 ? `$${value.expense.additionalExpense.toFixed(2)}` : "N/A",
108
+ "Currency": value.expense?.unit || "N/A",
109
+ "Last Updated": value.expense?.lastUpdatedTime ? new Date(value.expense.lastUpdatedTime).toLocaleString() : "N/A"
109
110
  }
110
111
  }
111
112
  ) }) })
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationVSphereVMDetails.esm.js","sources":["../../src/components/VCFAutomationVSphereVMDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\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 { showDeploymentResourcesDataPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nexport const VCFAutomationVSphereVMDetails = () => {\n const { entity } = useEntity();\n const vcfAutomationApi = useApi(vcfAutomationApiRef);\n const deploymentId = entity.spec?.system || '';\n const resourceId = entity.metadata.name;\n\n const { allowed } = usePermission({\n permission: showDeploymentResourcesDataPermission,\n });\n\n const { value, loading, error } = useAsync(async () => {\n if (!resourceId || !deploymentId || !allowed) return undefined;\n return await vcfAutomationApi.getVSphereVMDetails(deploymentId as string, resourceId);\n }, [resourceId, deploymentId, allowed]);\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!resourceId || !deploymentId) {\n return <InfoCard title=\"No resource ID found\">This entity is not associated with a VCF resource or deployment.</InfoCard>;\n }\n\n if (!allowed) {\n return <InfoCard title=\"Permission Denied\">You don't have permission to view resource details.</InfoCard>;\n }\n\n if (!value) {\n return <InfoCard title=\"No Data\">No resource details available.</InfoCard>;\n }\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Resource Status\">\n <StructuredMetadataTable\n metadata={{\n Name: value.name,\n Type: value.type,\n State: value.state,\n 'Sync Status': value.syncStatus,\n 'Created At': new Date(value.createdAt).toLocaleString(),\n Origin: value.origin,\n 'Depends On': value.dependsOn,\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"VM Properties\">\n <StructuredMetadataTable\n metadata={{\n 'Power State': value.properties.powerState,\n Zone: value.properties.zone,\n Environment: value.properties.environmentName,\n 'Host Type': value.properties.computeHostType,\n 'Memory (GB)': value.properties.memoryGB,\n 'CPU Count': value.properties.cpuCount,\n 'Total Memory (MB)': value.properties.totalMemoryMB,\n 'OS Type': value.properties.osType,\n Region: value.properties.region,\n 'Host Name': value.properties.hostName,\n 'Data Center': value.properties.datacenter,\n 'Datastore': value.properties.datastoreName,\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Storage Configuration\">\n <StructuredMetadataTable\n metadata={{\n 'Primary Disk': {\n Name: value.properties.storage?.disks[0]?.name || 'N/A',\n 'Capacity (GB)': value.properties.storage?.disks[0]?.capacityGb || 'N/A',\n Type: value.properties.storage?.disks[0]?.type || 'N/A',\n 'Provisioning': value.properties.storage?.disks[0]?.provisioningType || 'N/A',\n },\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Network Configuration\">\n <StructuredMetadataTable\n metadata={{\n 'Primary Network': value.properties.networks?.[0] ? {\n Name: value.properties.networks[0].name,\n Address: value.properties.networks[0].address,\n 'MAC Address': value.properties.networks[0].mac_address,\n Assignment: value.properties.networks[0].assignment,\n 'IPv6 Addresses': value.properties.networks[0].ipv6Addresses || [],\n } : 'No network configuration available',\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Expense Information\">\n <StructuredMetadataTable\n metadata={{\n 'Total Expense': `$${value.expense.totalExpense.toFixed(2)}`,\n 'Compute Expense': `$${value.expense.computeExpense.toFixed(2)}`,\n 'Storage Expense': `$${value.expense.storageExpense.toFixed(2)}`,\n 'Additional Expense': `$${value.expense.additionalExpense.toFixed(2)}`,\n 'Currency': value.expense.unit,\n 'Last Updated': new Date(value.expense.lastUpdatedTime).toLocaleString(),\n }}\n />\n </InfoCard>\n </Grid>\n </Grid>\n );\n}; "],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VCFAutomationVSphereVMDetails.esm.js","sources":["../../src/components/VCFAutomationVSphereVMDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n Progress,\n ResponseErrorPanel,\n StructuredMetadataTable,\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 { showDeploymentResourcesDataPermission } from '@terasky/backstage-plugin-vcf-automation-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nexport const VCFAutomationVSphereVMDetails = () => {\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 { allowed } = usePermission({\n permission: showDeploymentResourcesDataPermission,\n });\n\n const { value, loading, error } = useAsync(async () => {\n if (!resourceId || !deploymentId || !allowed) return undefined;\n return await vcfAutomationApi.getVSphereVMDetails(deploymentId as string, resourceId, instanceName);\n }, [resourceId, deploymentId, allowed, instanceName]);\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!resourceId || !deploymentId) {\n return <InfoCard title=\"No resource ID found\">This entity is not associated with a VCF resource or deployment.</InfoCard>;\n }\n\n if (!allowed) {\n return <InfoCard title=\"Permission Denied\">You don't have permission to view resource details.</InfoCard>;\n }\n\n if (!value) {\n return <InfoCard title=\"No Data\">No resource details available.</InfoCard>;\n }\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Resource Status\">\n <StructuredMetadataTable\n metadata={{\n Name: value.name,\n Type: value.type,\n State: value.state,\n 'Sync Status': value.syncStatus,\n 'Created At': new Date(value.createdAt).toLocaleString(),\n Origin: value.origin,\n 'Depends On': value.dependsOn,\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"VM Properties\">\n <StructuredMetadataTable\n metadata={{\n 'Power State': value.properties.powerState,\n Zone: value.properties.zone,\n Environment: value.properties.environmentName,\n 'Host Type': value.properties.computeHostType,\n 'Memory (GB)': value.properties.memoryGB,\n 'CPU Count': value.properties.cpuCount,\n 'Total Memory (MB)': value.properties.totalMemoryMB,\n 'OS Type': value.properties.osType,\n Region: value.properties.region,\n 'Host Name': value.properties.hostName,\n 'Data Center': value.properties.datacenter,\n 'Datastore': value.properties.datastoreName,\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Storage Configuration\">\n <StructuredMetadataTable\n metadata={{\n 'Primary Disk': {\n Name: value.properties.storage?.disks[0]?.name || 'N/A',\n 'Capacity (GB)': value.properties.storage?.disks[0]?.capacityGb || 'N/A',\n Type: value.properties.storage?.disks[0]?.type || 'N/A',\n 'Provisioning': value.properties.storage?.disks[0]?.provisioningType || 'N/A',\n },\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Network Configuration\">\n <StructuredMetadataTable\n metadata={{\n 'Primary Network': value.properties.networks?.[0] ? {\n Name: value.properties.networks[0].name,\n Address: value.properties.networks[0].address,\n 'MAC Address': value.properties.networks[0].mac_address,\n Assignment: value.properties.networks[0].assignment,\n 'IPv6 Addresses': value.properties.networks[0].ipv6Addresses || [],\n } : 'No network configuration available',\n }}\n />\n </InfoCard>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <InfoCard title=\"Expense Information\">\n <StructuredMetadataTable\n metadata={{\n 'Total Expense': value.expense?.totalExpense !== undefined ? `$${value.expense.totalExpense.toFixed(2)}` : 'N/A',\n 'Compute Expense': value.expense?.computeExpense !== undefined ? `$${value.expense.computeExpense.toFixed(2)}` : 'N/A',\n 'Storage Expense': value.expense?.storageExpense !== undefined ? `$${value.expense.storageExpense.toFixed(2)}` : 'N/A',\n 'Additional Expense': value.expense?.additionalExpense !== undefined ? `$${value.expense.additionalExpense.toFixed(2)}` : 'N/A',\n 'Currency': value.expense?.unit || 'N/A',\n 'Last Updated': value.expense?.lastUpdatedTime ? new Date(value.expense.lastUpdatedTime).toLocaleString() : 'N/A',\n }}\n />\n </InfoCard>\n </Grid>\n </Grid>\n );\n}; "],"names":[],"mappings":"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"}
@@ -28,13 +28,14 @@ const VCFAutomationVSphereVMOverview = () => {
28
28
  const classes = useStyles();
29
29
  const deploymentId = entity.spec?.system || "";
30
30
  const resourceId = entity.metadata.name;
31
+ const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
31
32
  const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({
32
33
  permission: showDeploymentResourcesDataPermission
33
34
  });
34
35
  const { value: resource, loading, error } = useAsync(async () => {
35
36
  if (!resourceId || !deploymentId || !hasViewPermission) return void 0;
36
- return await api.getVSphereVMDetails(deploymentId, resourceId);
37
- }, [resourceId, deploymentId, hasViewPermission]);
37
+ return await api.getVSphereVMDetails(deploymentId, resourceId, instanceName);
38
+ }, [resourceId, deploymentId, hasViewPermission, instanceName]);
38
39
  if (!resourceId || !deploymentId) {
39
40
  return /* @__PURE__ */ jsx(InfoCard, { title: "VCF Automation Resource", children: /* @__PURE__ */ jsx(Typography, { children: "No resource ID or deployment ID found for this entity." }) });
40
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VCFAutomationVSphereVMOverview.esm.js","sources":["../../src/components/VCFAutomationVSphereVMOverview.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 StatusOK,\n StatusError,\n StatusPending,\n} from '@backstage/core-components';\nimport { Grid, Typography, makeStyles } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { showDeploymentResourcesDataPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nconst useStyles = makeStyles(theme => ({\n statusText: {\n fontWeight: 'bold',\n '&.success': {\n color: theme.palette.success.main,\n },\n '&.error': {\n color: theme.palette.error.main,\n },\n '&.pending': {\n color: theme.palette.warning.main,\n },\n },\n}));\n\nexport const VCFAutomationVSphereVMOverview = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const classes = useStyles();\n const deploymentId = entity.spec?.system || '';\n const resourceId = entity.metadata.name;\n\n const { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: showDeploymentResourcesDataPermission,\n });\n\n const { value: resource, loading, error } = useAsync(async () => {\n if (!resourceId || !deploymentId || !hasViewPermission) return undefined;\n return await api.getVSphereVMDetails(deploymentId as string, resourceId);\n }, [resourceId, deploymentId, hasViewPermission]);\n\n if (!resourceId || !deploymentId) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Typography>No resource ID or deployment ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permissionLoading) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Typography>You don't have permission to view resource details.</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!resource) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Typography>No resource details available.</Typography>\n </InfoCard>\n );\n }\n\n const getStatusComponent = (state: string) => {\n switch (state.toUpperCase()) {\n case 'SUCCESS':\n case 'OK':\n return <StatusOK />;\n case 'ERROR':\n case 'FAILED':\n return <StatusError />;\n default:\n return <StatusPending />;\n }\n };\n\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Name</Typography>\n <Typography>{resource.name}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Type</Typography>\n <Typography>{resource.type}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">State</Typography>\n <Grid container spacing={1} alignItems=\"center\">\n {getStatusComponent(resource.state)}\n <Typography className={`${classes.statusText} ${resource.state.toLowerCase()}`}>\n {resource.state}\n </Typography>\n </Grid>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Sync Status</Typography>\n <Grid container spacing={1} alignItems=\"center\">\n {getStatusComponent(resource.syncStatus)}\n <Typography className={`${classes.statusText} ${resource.syncStatus.toLowerCase()}`}>\n {resource.syncStatus}\n </Typography>\n </Grid>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Created At</Typography>\n <Typography>{new Date(resource.createdAt).toLocaleString()}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Region</Typography>\n <Typography>{resource.properties?.region || 'N/A'}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Resource Metrics</Typography>\n <Typography>\n {`CPU: ${resource.properties?.cpuCount || 'N/A'} cores, `}\n {`Memory: ${resource.properties?.memoryGB || 'N/A'} GB, `}\n {`Storage: ${resource.properties?.storage?.disks?.[0]?.capacityGb || 'N/A'} GB`}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Expense Information</Typography>\n <Typography>\n {`Total: $${resource.expense?.totalExpense?.toFixed(2) || 'N/A'}, `}\n {`Compute: $${resource.expense?.computeExpense?.toFixed(2) || 'N/A'}, `}\n {`Storage: $${resource.expense?.storageExpense?.toFixed(2) || 'N/A'}`}\n </Typography>\n </Grid>\n </Grid>\n </InfoCard>\n );\n}; "],"names":[],"mappings":";;;;;;;;;;AAgBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,UAAY,EAAA;AAAA,IACV,UAAY,EAAA,MAAA;AAAA,IACZ,WAAa,EAAA;AAAA,MACX,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA;AAAA,KAC/B;AAAA,IACA,SAAW,EAAA;AAAA,MACT,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,KAAM,CAAA;AAAA,KAC7B;AAAA,IACA,WAAa,EAAA;AAAA,MACX,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA;AAAA;AAC/B;AAEJ,CAAE,CAAA,CAAA;AAEK,MAAM,iCAAiC,MAAM;AAClD,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,GAAA,GAAM,OAAO,mBAAmB,CAAA;AACtC,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,YAAA,GAAe,MAAO,CAAA,IAAA,EAAM,MAAU,IAAA,EAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,OAAO,QAAS,CAAA,IAAA;AAEnC,EAAA,MAAM,EAAE,OAAS,EAAA,iBAAA,EAAmB,OAAS,EAAA,iBAAA,KAAsB,aAAc,CAAA;AAAA,IAC/E,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAA,MAAM,EAAE,KAAO,EAAA,QAAA,EAAU,SAAS,KAAM,EAAA,GAAI,SAAS,YAAY;AAC/D,IAAA,IAAI,CAAC,UAAc,IAAA,CAAC,YAAgB,IAAA,CAAC,mBAA0B,OAAA,KAAA,CAAA;AAC/D,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAoB,CAAA,YAAA,EAAwB,UAAU,CAAA;AAAA,GACtE,EAAA,CAAC,UAAY,EAAA,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAEhD,EAAI,IAAA,CAAC,UAAc,IAAA,CAAC,YAAc,EAAA;AAChC,IAAA,2BACG,QAAS,EAAA,EAAA,KAAA,EAAM,2BACd,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,oEAAsD,CACpE,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,WAAW,iBAAmB,EAAA;AAChC,IAAA,2BACG,QAAS,EAAA,EAAA,KAAA,EAAM,yBACd,EAAA,QAAA,kBAAA,GAAA,CAAC,YAAS,CACZ,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,IAAA,2BACG,QAAS,EAAA,EAAA,KAAA,EAAM,2BACd,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,iEAAmD,CACjE,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAA,GAAA,CAAC,sBAAmB,KAAc,EAAA,CAAA;AAAA;AAG3C,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,2BACG,QAAS,EAAA,EAAA,KAAA,EAAM,2BACd,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,4CAA8B,CAC5C,EAAA,CAAA;AAAA;AAIJ,EAAM,MAAA,kBAAA,GAAqB,CAAC,KAAkB,KAAA;AAC5C,IAAQ,QAAA,KAAA,CAAM,aAAe;AAAA,MAC3B,KAAK,SAAA;AAAA,MACL,KAAK,IAAA;AACH,QAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,MACnB,KAAK,OAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,2BAAQ,WAAY,EAAA,EAAA,CAAA;AAAA,MACtB;AACE,QAAA,2BAAQ,aAAc,EAAA,EAAA,CAAA;AAAA;AAC1B,GACF;AAEA,EACE,uBAAA,GAAA,CAAC,YAAS,KAAM,EAAA,yBAAA,EACd,+BAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACvB,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAI,EAAA,MAAA,EAAA,CAAA;AAAA,sBACpC,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,QAAA,CAAS,IAAK,EAAA;AAAA,KAC7B,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAI,EAAA,MAAA,EAAA,CAAA;AAAA,sBACpC,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,QAAA,CAAS,IAAK,EAAA;AAAA,KAC7B,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAK,EAAA,OAAA,EAAA,CAAA;AAAA,2BACpC,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,OAAS,EAAA,CAAA,EAAG,YAAW,QACpC,EAAA,QAAA,EAAA;AAAA,QAAA,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,wBACjC,GAAA,CAAA,UAAA,EAAA,EAAW,SAAW,EAAA,CAAA,EAAG,OAAQ,CAAA,UAAU,CAAI,CAAA,EAAA,QAAA,CAAS,KAAM,CAAA,WAAA,EAAa,CAAA,CAAA,EACzE,mBAAS,KACZ,EAAA;AAAA,OACF,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAW,EAAA,aAAA,EAAA,CAAA;AAAA,2BAC1C,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,OAAS,EAAA,CAAA,EAAG,YAAW,QACpC,EAAA,QAAA,EAAA;AAAA,QAAA,kBAAA,CAAmB,SAAS,UAAU,CAAA;AAAA,wBACtC,GAAA,CAAA,UAAA,EAAA,EAAW,SAAW,EAAA,CAAA,EAAG,OAAQ,CAAA,UAAU,CAAI,CAAA,EAAA,QAAA,CAAS,UAAW,CAAA,WAAA,EAAa,CAAA,CAAA,EAC9E,mBAAS,UACZ,EAAA;AAAA,OACF,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAU,EAAA,YAAA,EAAA,CAAA;AAAA,sBAC1C,GAAA,CAAC,cAAY,QAAI,EAAA,IAAA,IAAA,CAAK,SAAS,SAAS,CAAA,CAAE,gBAAiB,EAAA;AAAA,KAC7D,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,sBACrC,GAAA,CAAA,UAAA,EAAA,EAAY,QAAS,EAAA,QAAA,CAAA,UAAA,EAAY,UAAU,KAAM,EAAA;AAAA,KACpD,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAgB,EAAA,kBAAA,EAAA,CAAA;AAAA,2BAC/C,UACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAQ,CAAA,KAAA,EAAA,QAAA,CAAS,UAAY,EAAA,QAAA,IAAY,KAAK,CAAA,QAAA,CAAA;AAAA,QAC9C,CAAW,QAAA,EAAA,QAAA,CAAS,UAAY,EAAA,QAAA,IAAY,KAAK,CAAA,KAAA,CAAA;AAAA,QACjD,CAAA,SAAA,EAAY,SAAS,UAAY,EAAA,OAAA,EAAS,QAAQ,CAAC,CAAA,EAAG,cAAc,KAAK,CAAA,GAAA;AAAA,OAC5E,EAAA;AAAA,KACF,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,WAAA,EAAY,QAAmB,EAAA,qBAAA,EAAA,CAAA;AAAA,2BAClD,UACE,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,CAAA,QAAA,EAAW,SAAS,OAAS,EAAA,YAAA,EAAc,OAAQ,CAAA,CAAC,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,QAC9D,aAAa,QAAS,CAAA,OAAA,EAAS,gBAAgB,OAAQ,CAAA,CAAC,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,QAClE,aAAa,QAAS,CAAA,OAAA,EAAS,gBAAgB,OAAQ,CAAA,CAAC,KAAK,KAAK,CAAA;AAAA,OACrE,EAAA;AAAA,KACF,EAAA;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"VCFAutomationVSphereVMOverview.esm.js","sources":["../../src/components/VCFAutomationVSphereVMOverview.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 StatusOK,\n StatusError,\n StatusPending,\n} from '@backstage/core-components';\nimport { Grid, Typography, makeStyles } from '@material-ui/core';\nimport useAsync from 'react-use/lib/useAsync';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { showDeploymentResourcesDataPermission } from '@terasky/backstage-plugin-vcf-automation-common';\n\nconst useStyles = makeStyles(theme => ({\n statusText: {\n fontWeight: 'bold',\n '&.success': {\n color: theme.palette.success.main,\n },\n '&.error': {\n color: theme.palette.error.main,\n },\n '&.pending': {\n color: theme.palette.warning.main,\n },\n },\n}));\n\nexport const VCFAutomationVSphereVMOverview = () => {\n const { entity } = useEntity();\n const api = useApi(vcfAutomationApiRef);\n const classes = useStyles();\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 { allowed: hasViewPermission, loading: permissionLoading } = usePermission({\n permission: showDeploymentResourcesDataPermission,\n });\n\n const { value: resource, loading, error } = useAsync(async () => {\n if (!resourceId || !deploymentId || !hasViewPermission) return undefined;\n return await api.getVSphereVMDetails(deploymentId as string, resourceId, instanceName);\n }, [resourceId, deploymentId, hasViewPermission, instanceName]);\n\n if (!resourceId || !deploymentId) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Typography>No resource ID or deployment ID found for this entity.</Typography>\n </InfoCard>\n );\n }\n\n if (loading || permissionLoading) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Progress />\n </InfoCard>\n );\n }\n\n if (!hasViewPermission) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Typography>You don't have permission to view resource details.</Typography>\n </InfoCard>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (!resource) {\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Typography>No resource details available.</Typography>\n </InfoCard>\n );\n }\n\n const getStatusComponent = (state: string) => {\n switch (state.toUpperCase()) {\n case 'SUCCESS':\n case 'OK':\n return <StatusOK />;\n case 'ERROR':\n case 'FAILED':\n return <StatusError />;\n default:\n return <StatusPending />;\n }\n };\n\n return (\n <InfoCard title=\"VCF Automation Resource\">\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Name</Typography>\n <Typography>{resource.name}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Type</Typography>\n <Typography>{resource.type}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">State</Typography>\n <Grid container spacing={1} alignItems=\"center\">\n {getStatusComponent(resource.state)}\n <Typography className={`${classes.statusText} ${resource.state.toLowerCase()}`}>\n {resource.state}\n </Typography>\n </Grid>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Sync Status</Typography>\n <Grid container spacing={1} alignItems=\"center\">\n {getStatusComponent(resource.syncStatus)}\n <Typography className={`${classes.statusText} ${resource.syncStatus.toLowerCase()}`}>\n {resource.syncStatus}\n </Typography>\n </Grid>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Created At</Typography>\n <Typography>{new Date(resource.createdAt).toLocaleString()}</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"subtitle2\">Region</Typography>\n <Typography>{resource.properties?.region || 'N/A'}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Resource Metrics</Typography>\n <Typography>\n {`CPU: ${resource.properties?.cpuCount || 'N/A'} cores, `}\n {`Memory: ${resource.properties?.memoryGB || 'N/A'} GB, `}\n {`Storage: ${resource.properties?.storage?.disks?.[0]?.capacityGb || 'N/A'} GB`}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Expense Information</Typography>\n <Typography>\n {`Total: $${resource.expense?.totalExpense?.toFixed(2) || 'N/A'}, `}\n {`Compute: $${resource.expense?.computeExpense?.toFixed(2) || 'N/A'}, `}\n {`Storage: $${resource.expense?.storageExpense?.toFixed(2) || 'N/A'}`}\n </Typography>\n </Grid>\n </Grid>\n </InfoCard>\n );\n}; "],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -303,11 +303,11 @@ interface VcfVSphereVM {
303
303
  }
304
304
  type VcfProject = VcfProject$1;
305
305
  interface VcfAutomationApi {
306
- getDeploymentEvents(deploymentId: string): Promise<VcfDeploymentResponse>;
307
- getVSphereVMDetails(deploymentId: string, resourceId: string): Promise<VcfVSphereVM>;
308
- getProjectDetails(projectId: string): Promise<VcfProject>;
309
- getGenericResourceDetails(deploymentId: string, resourceId: string): Promise<any>;
310
- getDeploymentDetails(deploymentId: string): Promise<any>;
306
+ getDeploymentEvents(deploymentId: string, instanceName?: string): Promise<VcfDeploymentResponse>;
307
+ getVSphereVMDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<VcfVSphereVM>;
308
+ getProjectDetails(projectId: string, instanceName?: string): Promise<VcfProject>;
309
+ getGenericResourceDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<any>;
310
+ getDeploymentDetails(deploymentId: string, instanceName?: string): Promise<any>;
311
311
  }
312
312
  declare const vcfAutomationApiRef: _backstage_core_plugin_api.ApiRef<VcfAutomationApi>;
313
313
  declare class VcfAutomationClient implements VcfAutomationApi {
@@ -318,11 +318,11 @@ declare class VcfAutomationClient implements VcfAutomationApi {
318
318
  identityApi: IdentityApi;
319
319
  });
320
320
  private getAuthHeaders;
321
- getDeploymentEvents(deploymentId: string): Promise<VcfDeploymentResponse>;
322
- getVSphereVMDetails(deploymentId: string, resourceId: string): Promise<VcfVSphereVM>;
323
- getGenericResourceDetails(deploymentId: string, resourceId: string): Promise<any>;
324
- getDeploymentDetails(deploymentId: string): Promise<any>;
325
- getProjectDetails(projectId: string): Promise<VcfProject>;
321
+ getDeploymentEvents(deploymentId: string, instanceName?: string): Promise<VcfDeploymentResponse>;
322
+ getVSphereVMDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<VcfVSphereVM>;
323
+ getGenericResourceDetails(deploymentId: string, resourceId: string, instanceName?: string): Promise<any>;
324
+ getDeploymentDetails(deploymentId: string, instanceName?: string): Promise<any>;
325
+ getProjectDetails(projectId: string, instanceName?: string): Promise<VcfProject>;
326
326
  }
327
327
 
328
328
  declare const rootRouteRef: _backstage_core_plugin_api.RouteRef<undefined>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@terasky/backstage-plugin-vcf-automation",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -35,15 +35,15 @@
35
35
  "postpack": "backstage-cli package postpack"
36
36
  },
37
37
  "dependencies": {
38
- "@backstage/core-components": "^0.17.3",
39
- "@backstage/core-plugin-api": "^1.10.8",
40
- "@backstage/plugin-catalog-react": "^1.19.0",
41
- "@backstage/plugin-permission-react": "^0.4.35",
42
- "@backstage/theme": "^0.6.6",
38
+ "@backstage/core-components": "^0.17.4",
39
+ "@backstage/core-plugin-api": "^1.10.9",
40
+ "@backstage/plugin-catalog-react": "^1.19.1",
41
+ "@backstage/plugin-permission-react": "^0.4.36",
42
+ "@backstage/theme": "^0.6.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.0",
46
+ "@terasky/backstage-plugin-vcf-automation-common": "^1.0.1",
47
47
  "react-use": "^17.6.0"
48
48
  },
49
49
  "peerDependencies": {
@@ -52,10 +52,10 @@
52
52
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
53
53
  },
54
54
  "devDependencies": {
55
- "@backstage/cli": "^0.33.0",
56
- "@backstage/core-app-api": "^1.17.1",
57
- "@backstage/dev-utils": "^1.1.11",
58
- "@backstage/test-utils": "^1.7.9",
55
+ "@backstage/cli": "^0.33.1",
56
+ "@backstage/core-app-api": "^1.18.0",
57
+ "@backstage/dev-utils": "^1.1.12",
58
+ "@backstage/test-utils": "^1.7.10",
59
59
  "@testing-library/jest-dom": "^5.10.1",
60
60
  "@testing-library/react": "^12.1.3",
61
61
  "@testing-library/user-event": "^14.0.0",