@terasky/backstage-plugin-vcf-automation 1.3.0 → 1.3.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.
@@ -223,6 +223,50 @@ class VcfAutomationClient {
223
223
  }
224
224
  return await response.json();
225
225
  }
226
+ // Supervisor Resource Manifest Management
227
+ async getSupervisorResourceManifest(namespaceUrnId, namespaceName, resourceName, apiVersion, kind, instanceName) {
228
+ const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
229
+ const headers = await this.getAuthHeaders();
230
+ const params = new URLSearchParams({
231
+ apiVersion,
232
+ kind
233
+ });
234
+ if (instanceName) {
235
+ params.append("instance", instanceName);
236
+ }
237
+ const url = `${baseUrl}/supervisor-resource-manifest/${namespaceUrnId}/${namespaceName}/${resourceName}?${params.toString()}`;
238
+ const response = await fetch(url, {
239
+ headers
240
+ });
241
+ if (!response.ok) {
242
+ throw new Error(`Failed to get supervisor resource manifest: ${response.statusText}`);
243
+ }
244
+ return await response.json();
245
+ }
246
+ async updateSupervisorResourceManifest(namespaceUrnId, namespaceName, resourceName, apiVersion, kind, manifest, instanceName) {
247
+ const baseUrl = await this.discoveryApi.getBaseUrl("vcf-automation");
248
+ const headers = await this.getAuthHeaders();
249
+ const params = new URLSearchParams({
250
+ apiVersion,
251
+ kind
252
+ });
253
+ if (instanceName) {
254
+ params.append("instance", instanceName);
255
+ }
256
+ const url = `${baseUrl}/supervisor-resource-manifest/${namespaceUrnId}/${namespaceName}/${resourceName}?${params.toString()}`;
257
+ const response = await fetch(url, {
258
+ method: "PUT",
259
+ headers: {
260
+ ...headers,
261
+ "Content-Type": "application/json"
262
+ },
263
+ body: JSON.stringify({ manifest })
264
+ });
265
+ if (!response.ok) {
266
+ throw new Error(`Failed to update supervisor resource manifest: ${response.statusText}`);
267
+ }
268
+ return await response.json();
269
+ }
226
270
  }
227
271
 
228
272
  export { VcfAutomationClient, vcfAutomationApiRef };
@@ -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, 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 getProjects(instanceName?: string): Promise<any>;\n getDeployments(instanceName?: string): Promise<any>;\n getDeploymentResources(deploymentId: string, instanceName?: string): Promise<any>;\n getSupervisorResources(instanceName?: string): Promise<any>;\n getSupervisorResource(resourceId: string, instanceName?: string): Promise<any>;\n getSupervisorNamespaces(instanceName?: string): Promise<any>;\n getSupervisorNamespace(namespaceId: string, instanceName?: string): Promise<any>;\n // VM Power Management\n checkVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;\n executeVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;\n getStandaloneVmStatus(namespaceUrnId: string, namespaceName: string, vmName: string, instanceName?: string): Promise<any>;\n executeStandaloneVmPowerAction(namespaceUrnId: string, namespaceName: string, vmName: string, powerState: 'PoweredOn' | 'PoweredOff', vmData: any, 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\n async getProjects(instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/projects?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/projects`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getDeployments(instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/deployments?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch deployments: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getDeploymentResources(deploymentId: string, instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName\n ? `${baseUrl}/deployments/${deploymentId}/resources?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments/${deploymentId}/resources`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch deployment resources: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorResources(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}/supervisor-resources?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-resources`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor resources: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorResource(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}/supervisor-resources/${resourceId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-resources/${resourceId}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor resource: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorNamespaces(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}/supervisor-namespaces?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-namespaces`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor namespaces: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorNamespace(namespaceId: 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}/supervisor-namespaces/${namespaceId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-namespaces/${namespaceId}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor namespace: ${response.statusText}`);\n }\n return await response.json();\n }\n\n // VM Power Management for deployment-managed VMs\n async checkVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', 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}/resources/${resourceId}/power-actions/${action}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/resources/${resourceId}/power-actions/${action}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to check VM power action: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async executeVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', 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}/resources/${resourceId}/power-actions/${action}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/resources/${resourceId}/power-actions/${action}`;\n const response = await fetch(url, {\n method: 'POST',\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to execute VM power action: ${response.statusText}`);\n }\n return await response.json();\n }\n\n // VM Power Management for standalone VMs\n async getStandaloneVmStatus(namespaceUrnId: string, namespaceName: string, vmName: 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}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/status?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/status`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to get standalone VM status: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async executeStandaloneVmPowerAction(namespaceUrnId: string, namespaceName: string, vmName: string, powerState: 'PoweredOn' | 'PoweredOff', vmData: any, 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}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/power-state?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/power-state`;\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ powerState, vmData }),\n });\n if (!response.ok) {\n throw new Error(`Failed to execute standalone VM power action: ${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 getProjects(instanceName?: string): Promise<any>;\n getDeployments(instanceName?: string): Promise<any>;\n getDeploymentResources(deploymentId: string, instanceName?: string): Promise<any>;\n getSupervisorResources(instanceName?: string): Promise<any>;\n getSupervisorResource(resourceId: string, instanceName?: string): Promise<any>;\n getSupervisorNamespaces(instanceName?: string): Promise<any>;\n getSupervisorNamespace(namespaceId: string, instanceName?: string): Promise<any>;\n // VM Power Management\n checkVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;\n executeVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', instanceName?: string): Promise<any>;\n getStandaloneVmStatus(namespaceUrnId: string, namespaceName: string, vmName: string, instanceName?: string): Promise<any>;\n executeStandaloneVmPowerAction(namespaceUrnId: string, namespaceName: string, vmName: string, powerState: 'PoweredOn' | 'PoweredOff', vmData: any, instanceName?: string): Promise<any>;\n // Supervisor Resource Manifest Management\n getSupervisorResourceManifest(namespaceUrnId: string, namespaceName: string, resourceName: string, apiVersion: string, kind: string, instanceName?: string): Promise<any>;\n updateSupervisorResourceManifest(namespaceUrnId: string, namespaceName: string, resourceName: string, apiVersion: string, kind: string, manifest: any, 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\n async getProjects(instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/projects?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/projects`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getDeployments(instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName \n ? `${baseUrl}/deployments?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch deployments: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getDeploymentResources(deploymentId: string, instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n const url = instanceName\n ? `${baseUrl}/deployments/${deploymentId}/resources?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/deployments/${deploymentId}/resources`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch deployment resources: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorResources(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}/supervisor-resources?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-resources`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor resources: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorResource(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}/supervisor-resources/${resourceId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-resources/${resourceId}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor resource: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorNamespaces(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}/supervisor-namespaces?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-namespaces`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor namespaces: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async getSupervisorNamespace(namespaceId: 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}/supervisor-namespaces/${namespaceId}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/supervisor-namespaces/${namespaceId}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch supervisor namespace: ${response.statusText}`);\n }\n return await response.json();\n }\n\n // VM Power Management for deployment-managed VMs\n async checkVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', 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}/resources/${resourceId}/power-actions/${action}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/resources/${resourceId}/power-actions/${action}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to check VM power action: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async executeVmPowerAction(resourceId: string, action: 'PowerOn' | 'PowerOff', 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}/resources/${resourceId}/power-actions/${action}?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/resources/${resourceId}/power-actions/${action}`;\n const response = await fetch(url, {\n method: 'POST',\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to execute VM power action: ${response.statusText}`);\n }\n return await response.json();\n }\n\n // VM Power Management for standalone VMs\n async getStandaloneVmStatus(namespaceUrnId: string, namespaceName: string, vmName: 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}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/status?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/status`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to get standalone VM status: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async executeStandaloneVmPowerAction(namespaceUrnId: string, namespaceName: string, vmName: string, powerState: 'PoweredOn' | 'PoweredOff', vmData: any, 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}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/power-state?instance=${encodeURIComponent(instanceName)}`\n : `${baseUrl}/standalone-vms/${namespaceUrnId}/${namespaceName}/${vmName}/power-state`;\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ powerState, vmData }),\n });\n if (!response.ok) {\n throw new Error(`Failed to execute standalone VM power action: ${response.statusText}`);\n }\n return await response.json();\n }\n\n // Supervisor Resource Manifest Management\n async getSupervisorResourceManifest(namespaceUrnId: string, namespaceName: string, resourceName: string, apiVersion: string, kind: string, instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n \n const params = new URLSearchParams({\n apiVersion,\n kind,\n });\n if (instanceName) {\n params.append('instance', instanceName);\n }\n \n const url = `${baseUrl}/supervisor-resource-manifest/${namespaceUrnId}/${namespaceName}/${resourceName}?${params.toString()}`;\n const response = await fetch(url, {\n headers,\n });\n if (!response.ok) {\n throw new Error(`Failed to get supervisor resource manifest: ${response.statusText}`);\n }\n return await response.json();\n }\n\n async updateSupervisorResourceManifest(namespaceUrnId: string, namespaceName: string, resourceName: string, apiVersion: string, kind: string, manifest: any, instanceName?: string): Promise<any> {\n const baseUrl = await this.discoveryApi.getBaseUrl('vcf-automation');\n const headers = await this.getAuthHeaders();\n \n const params = new URLSearchParams({\n apiVersion,\n kind,\n });\n if (instanceName) {\n params.append('instance', instanceName);\n }\n \n const url = `${baseUrl}/supervisor-resource-manifest/${namespaceUrnId}/${namespaceName}/${resourceName}?${params.toString()}`;\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ manifest }),\n });\n if (!response.ok) {\n throw new Error(`Failed to update supervisor resource manifest: ${response.statusText}`);\n }\n return await response.json();\n }\n} "],"names":[],"mappings":";;AAiJO,MAAM,sBAAsB,YAA+B,CAAA;AAAA,EAChE,EAAI,EAAA;AACN,CAAC;AAEM,MAAM,mBAAgD,CAAA;AAAA,EAC1C,YAAA;AAAA,EACA,WAAA;AAAA,EAEjB,YAAY,OAAmE,EAAA;AAC7E,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,YAAA;AAC5B,IAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,WAAA;AAAA;AAC7B,EAEA,MAAc,cAAuC,GAAA;AACnD,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,cAAe,EAAA;AACpD,IAAO,OAAA;AAAA,MACL,cAAgB,EAAA,kBAAA;AAAA,MAChB,GAAI,KAAO,EAAA,KAAA,GAAQ,EAAE,aAAA,EAAe,UAAU,KAAM,CAAA,KAAK,CAAG,CAAA,EAAA,GAAI;AAAC,KACnE;AAAA;AACF,EAEA,MAAM,mBAAoB,CAAA,YAAA,EAAsB,YAAuD,EAAA;AACrG,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAC1C,IAAA,MAAM,GAAM,GAAA,YAAA,GACR,CAAG,EAAA,OAAO,gBAAgB,YAAY,CAAA,iBAAA,EAAoB,kBAAmB,CAAA,YAAY,CAAC,CAAA,CAAA,GAC1F,CAAG,EAAA,OAAO,gBAAgB,YAAY,CAAA,OAAA,CAAA;AAC1C,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAsC,mCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE7E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,mBAAA,CAAoB,YAAsB,EAAA,UAAA,EAAoB,YAA8C,EAAA;AAChH,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAC1C,IAAA,MAAM,MAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAgB,aAAA,EAAA,YAAY,cAAc,UAAU,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CAC3G,CAAA,GAAA,CAAA,EAAG,OAAO,CAAgB,aAAA,EAAA,YAAY,cAAc,UAAU,CAAA,CAAA;AAClE,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAqC,kCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE5E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,yBAAA,CAA0B,YAAsB,EAAA,UAAA,EAAoB,YAAqC,EAAA;AAC7G,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAA,MAAM,MAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAgB,aAAA,EAAA,YAAY,cAAc,UAAU,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CAC3G,CAAA,GAAA,CAAA,EAAG,OAAO,CAAgB,aAAA,EAAA,YAAY,cAAc,UAAU,CAAA,CAAA;AAElE,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAG;AAAA;AACL,KACD,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAqC,kCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAG5E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,oBAAqB,CAAA,YAAA,EAAsB,YAAqC,EAAA;AACpF,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAA,MAAM,GAAM,GAAA,YAAA,GACR,CAAG,EAAA,OAAO,gBAAgB,YAAY,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CAAA,CAAA,GACnF,CAAG,EAAA,OAAO,gBAAgB,YAAY,CAAA,CAAA;AAE1C,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAG;AAAA;AACL,KACD,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAuC,oCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAG9E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,iBAAkB,CAAA,SAAA,EAAmB,YAA4C,EAAA;AACrF,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAC1C,IAAA,MAAM,GAAM,GAAA,YAAA,GACR,CAAG,EAAA,OAAO,aAAa,SAAS,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CAAA,CAAA,GAC7E,CAAG,EAAA,OAAO,aAAa,SAAS,CAAA,CAAA;AACpC,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAoC,iCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE3E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,YAAY,YAAqC,EAAA;AACrD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAC1C,IAAM,MAAA,GAAA,GAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAA,mBAAA,EAAsB,mBAAmB,YAAY,CAAC,CAChE,CAAA,GAAA,CAAA,EAAG,OAAO,CAAA,SAAA,CAAA;AACd,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEpE,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,eAAe,YAAqC,EAAA;AACxD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAC1C,IAAM,MAAA,GAAA,GAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAA,sBAAA,EAAyB,mBAAmB,YAAY,CAAC,CACnE,CAAA,GAAA,CAAA,EAAG,OAAO,CAAA,YAAA,CAAA;AACd,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAgC,6BAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEvE,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,sBAAuB,CAAA,YAAA,EAAsB,YAAqC,EAAA;AACtF,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AACtC,IAAA,MAAM,GAAM,GAAA,YAAA,GACZ,CAAG,EAAA,OAAO,gBAAgB,YAAY,CAAA,oBAAA,EAAuB,kBAAmB,CAAA,YAAY,CAAC,CAAA,CAAA,GAC7F,CAAG,EAAA,OAAO,gBAAgB,YAAY,CAAA,UAAA,CAAA;AAC1C,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAyC,sCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEhF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,uBAAuB,YAAqC,EAAA;AAChE,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAM,MAAA,GAAA,GAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAA,+BAAA,EAAkC,mBAAmB,YAAY,CAAC,CAC5E,CAAA,GAAA,CAAA,EAAG,OAAO,CAAA,qBAAA,CAAA;AACd,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAyC,sCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEhF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,qBAAsB,CAAA,UAAA,EAAoB,YAAqC,EAAA;AACnF,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAA,MAAM,GAAM,GAAA,YAAA,GACR,CAAG,EAAA,OAAO,yBAAyB,UAAU,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CAAA,CAAA,GAC1F,CAAG,EAAA,OAAO,yBAAyB,UAAU,CAAA,CAAA;AACjD,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAwC,qCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE/E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,wBAAwB,YAAqC,EAAA;AACjE,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAM,MAAA,GAAA,GAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAA,gCAAA,EAAmC,mBAAmB,YAAY,CAAC,CAC7E,CAAA,GAAA,CAAA,EAAG,OAAO,CAAA,sBAAA,CAAA;AACd,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAA0C,uCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEjF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,sBAAuB,CAAA,WAAA,EAAqB,YAAqC,EAAA;AACrF,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAA,MAAM,GAAM,GAAA,YAAA,GACR,CAAG,EAAA,OAAO,0BAA0B,WAAW,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CAAA,CAAA,GAC5F,CAAG,EAAA,OAAO,0BAA0B,WAAW,CAAA,CAAA;AACnD,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAyC,sCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEhF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B;AAAA,EAGA,MAAM,kBAAA,CAAmB,UAAoB,EAAA,MAAA,EAAgC,YAAqC,EAAA;AAChH,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAA,MAAM,MAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAc,WAAA,EAAA,UAAU,kBAAkB,MAAM,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CACvG,CAAA,GAAA,CAAA,EAAG,OAAO,CAAc,WAAA,EAAA,UAAU,kBAAkB,MAAM,CAAA,CAAA;AAC9D,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAoC,iCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE3E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,oBAAA,CAAqB,UAAoB,EAAA,MAAA,EAAgC,YAAqC,EAAA;AAClH,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAA,MAAM,MAAM,YACR,GAAA,CAAA,EAAG,OAAO,CAAc,WAAA,EAAA,UAAU,kBAAkB,MAAM,CAAA,UAAA,EAAa,kBAAmB,CAAA,YAAY,CAAC,CACvG,CAAA,GAAA,CAAA,EAAG,OAAO,CAAc,WAAA,EAAA,UAAU,kBAAkB,MAAM,CAAA,CAAA;AAC9D,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,MAAQ,EAAA,MAAA;AAAA,MACR;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAsC,mCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE7E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B;AAAA,EAGA,MAAM,qBAAA,CAAsB,cAAwB,EAAA,aAAA,EAAuB,QAAgB,YAAqC,EAAA;AAC9H,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAM,MAAA,GAAA,GAAM,eACR,CAAG,EAAA,OAAO,mBAAmB,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,iBAAA,EAAoB,mBAAmB,YAAY,CAAC,KAC1H,CAAG,EAAA,OAAO,mBAAmB,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,OAAA,CAAA;AAC1E,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAuC,oCAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE9E,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,8BAA+B,CAAA,cAAA,EAAwB,eAAuB,MAAgB,EAAA,UAAA,EAAwC,QAAa,YAAqC,EAAA;AAC5L,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAM,MAAA,GAAA,GAAM,eACR,CAAG,EAAA,OAAO,mBAAmB,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,sBAAA,EAAyB,mBAAmB,YAAY,CAAC,KAC/H,CAAG,EAAA,OAAO,mBAAmB,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,YAAA,CAAA;AAC1E,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,MAAQ,EAAA,KAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,GAAG,OAAA;AAAA,QACH,cAAgB,EAAA;AAAA,OAClB;AAAA,MACA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,UAAA,EAAY,QAAQ;AAAA,KAC5C,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAiD,8CAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAExF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B;AAAA,EAGA,MAAM,6BAA8B,CAAA,cAAA,EAAwB,eAAuB,YAAsB,EAAA,UAAA,EAAoB,MAAc,YAAqC,EAAA;AAC9K,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,MACjC,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,YAAc,EAAA;AAChB,MAAO,MAAA,CAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAAA;AAGxC,IAAA,MAAM,GAAM,GAAA,CAAA,EAAG,OAAO,CAAA,8BAAA,EAAiC,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA;AAC3H,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAA+C,4CAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEtF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAC7B,EAEA,MAAM,iCAAiC,cAAwB,EAAA,aAAA,EAAuB,cAAsB,UAAoB,EAAA,IAAA,EAAc,UAAe,YAAqC,EAAA;AAChM,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,YAAA,CAAa,WAAW,gBAAgB,CAAA;AACnE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAe,EAAA;AAE1C,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,MACjC,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,YAAc,EAAA;AAChB,MAAO,MAAA,CAAA,MAAA,CAAO,YAAY,YAAY,CAAA;AAAA;AAGxC,IAAA,MAAM,GAAM,GAAA,CAAA,EAAG,OAAO,CAAA,8BAAA,EAAiC,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA;AAC3H,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAChC,MAAQ,EAAA,KAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,GAAG,OAAA;AAAA,QACH,cAAgB,EAAA;AAAA,OAClB;AAAA,MACA,IAAM,EAAA,IAAA,CAAK,SAAU,CAAA,EAAE,UAAU;AAAA,KAClC,CAAA;AACD,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAkD,+CAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEzF,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAE/B;;;;"}
@@ -1,14 +1,18 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useState, useMemo } from 'react';
3
- import { useEntity } from '@backstage/plugin-catalog-react';
2
+ import { useState, useMemo, useCallback } from 'react';
3
+ import { useEntity, catalogApiRef } from '@backstage/plugin-catalog-react';
4
4
  import { useApi } from '@backstage/core-plugin-api';
5
+ import { usePermission } from '@backstage/plugin-permission-react';
5
6
  import { useAsync } from 'react-use';
7
+ import Editor from '@monaco-editor/react';
6
8
  import { InfoCard, StructuredMetadataTable, Table, CodeSnippet, StatusPending, StatusError, StatusOK } from '@backstage/core-components';
7
- import { Typography, Grid, Card, CardContent, Tabs, Tab, Box, Chip, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';
9
+ import { Typography, Grid, Card, CardContent, Tabs, Tab, Box, Chip, Accordion, AccordionSummary, AccordionDetails, Button, Dialog, DialogTitle, DialogContent, DialogActions, Snackbar } from '@material-ui/core';
10
+ import { Alert } from '@material-ui/lab';
8
11
  import { makeStyles } from '@material-ui/core/styles';
9
12
  import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
10
13
  import * as yaml from 'js-yaml';
11
14
  import { vcfAutomationApiRef } from '../api/VcfAutomationClient.esm.js';
15
+ import { supervisorResourceEditPermission } from '@terasky/backstage-plugin-vcf-automation-common';
12
16
 
13
17
  const useStyles = makeStyles((theme) => ({
14
18
  statusChip: {
@@ -38,6 +42,33 @@ const useStyles = makeStyles((theme) => ({
38
42
  },
39
43
  tabPanel: {
40
44
  paddingTop: theme.spacing(2)
45
+ },
46
+ yamlEditorContainer: {
47
+ height: "70vh",
48
+ minHeight: "500px",
49
+ display: "flex",
50
+ flexDirection: "column"
51
+ },
52
+ monacoEditor: {
53
+ flex: 1,
54
+ border: `1px solid ${theme.palette.divider}`,
55
+ borderRadius: theme.shape.borderRadius
56
+ },
57
+ validationStatus: {
58
+ padding: theme.spacing(1),
59
+ borderTop: `1px solid ${theme.palette.divider}`,
60
+ backgroundColor: theme.palette.background.paper,
61
+ flexShrink: 0
62
+ },
63
+ yamlValidationError: {
64
+ color: theme.palette.error.main,
65
+ fontSize: "0.875rem"
66
+ },
67
+ editorActions: {
68
+ display: "flex",
69
+ gap: theme.spacing(1),
70
+ marginTop: theme.spacing(2),
71
+ justifyContent: "flex-end"
41
72
  }
42
73
  }));
43
74
  function TabPanel(props) {
@@ -59,6 +90,21 @@ const VCFAutomationCCIResourceDetails = () => {
59
90
  const { entity } = useEntity();
60
91
  const [tabValue, setTabValue] = useState(0);
61
92
  const api = useApi(vcfAutomationApiRef);
93
+ const catalogApi = useApi(catalogApiRef);
94
+ const { allowed: canEditResource } = usePermission({
95
+ permission: supervisorResourceEditPermission
96
+ });
97
+ const [editingYaml, setEditingYaml] = useState("");
98
+ const [originalManifest, setOriginalManifest] = useState(null);
99
+ const [isLoadingManifest, setIsLoadingManifest] = useState(false);
100
+ const [isSaving, setIsSaving] = useState(false);
101
+ const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
102
+ const [yamlValidationError, setYamlValidationError] = useState("");
103
+ const [snackbar, setSnackbar] = useState({
104
+ open: false,
105
+ message: "",
106
+ severity: "success"
107
+ });
62
108
  const deploymentId = entity.spec?.system;
63
109
  const resourceId = entity.metadata.name;
64
110
  const instanceName = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-instance"];
@@ -157,8 +203,148 @@ const VCFAutomationCCIResourceDetails = () => {
157
203
  const syncStatus = annotationData.syncStatus;
158
204
  const createdAt = annotationData.createdAt;
159
205
  const origin = annotationData.origin;
206
+ const resourceKind = manifest?.kind || objectData?.kind;
207
+ const resourceName = manifest?.metadata?.name || objectData?.metadata?.name;
208
+ const namespaceName = manifest?.metadata?.namespace || objectData?.metadata?.namespace;
209
+ const apiVersion = manifest?.apiVersion || objectData?.apiVersion;
210
+ const extractNamespaceUrnId = useCallback((endpoint) => {
211
+ const match = endpoint.match(/\/namespaces\/(urn:vcloud:namespace:[^\/]+)/);
212
+ return match ? match[1] : void 0;
213
+ }, []);
214
+ const findCCINamespaceParent = useCallback(async (currentEntity, depth = 0) => {
215
+ if (depth >= 3) return void 0;
216
+ if (currentEntity.spec?.type === "CCI.Supervisor.Namespace") {
217
+ const endpoint = currentEntity.metadata?.annotations?.["terasky.backstage.io/vcf-automation-cci-namespace-endpoint"];
218
+ if (endpoint) {
219
+ return extractNamespaceUrnId(endpoint);
220
+ }
221
+ }
222
+ const parentRef = currentEntity.spec?.subcomponentOf;
223
+ if (!parentRef) return void 0;
224
+ try {
225
+ const parentEntity = await catalogApi.getEntityByRef(parentRef);
226
+ if (parentEntity) {
227
+ return await findCCINamespaceParent(parentEntity, depth + 1);
228
+ }
229
+ } catch (error2) {
230
+ console.warn("Failed to fetch parent entity:", parentRef, error2);
231
+ }
232
+ return void 0;
233
+ }, [catalogApi, extractNamespaceUrnId]);
234
+ const { value: namespaceUrnId } = useAsync(async () => {
235
+ if (!namespaceName) return void 0;
236
+ if (isStandalone) {
237
+ let contextData = null;
238
+ try {
239
+ contextData = typeof resourceContext === "string" ? JSON.parse(resourceContext || "{}") : resourceContext;
240
+ } catch (error2) {
241
+ console.log("Debug - Resource context is not JSON, treating as string:", resourceContext);
242
+ contextData = null;
243
+ }
244
+ return contextData?.namespaceUrnId || namespaceName;
245
+ } else {
246
+ const urnId = await findCCINamespaceParent(entity);
247
+ return urnId || namespaceName;
248
+ }
249
+ }, [namespaceName, resourceContext, isStandalone, entity, findCCINamespaceParent]);
250
+ const loadManifestForEditing = useCallback(async () => {
251
+ if (!canEditResource || !namespaceName || !resourceName || !namespaceUrnId || !apiVersion || !resourceKind) {
252
+ return;
253
+ }
254
+ setIsLoadingManifest(true);
255
+ try {
256
+ const manifestResponse = await api.getSupervisorResourceManifest(
257
+ namespaceUrnId,
258
+ namespaceName,
259
+ resourceName,
260
+ apiVersion,
261
+ resourceKind,
262
+ instanceName
263
+ );
264
+ setOriginalManifest(manifestResponse);
265
+ const yamlContent = yaml.dump(manifestResponse, {
266
+ indent: 2,
267
+ lineWidth: -1,
268
+ noRefs: true,
269
+ sortKeys: false
270
+ });
271
+ setEditingYaml(yamlContent);
272
+ setYamlValidationError("");
273
+ } catch (error2) {
274
+ setSnackbar({
275
+ open: true,
276
+ message: `Failed to fetch resource manifest: ${error2 instanceof Error ? error2.message : "Unknown error"}`,
277
+ severity: "error"
278
+ });
279
+ } finally {
280
+ setIsLoadingManifest(false);
281
+ }
282
+ }, [canEditResource, namespaceName, resourceName, namespaceUrnId, apiVersion, resourceKind, instanceName, api]);
283
+ const validateYaml = useCallback((yamlString) => {
284
+ try {
285
+ yaml.load(yamlString);
286
+ setYamlValidationError("");
287
+ return true;
288
+ } catch (error2) {
289
+ const errorMessage = error2 instanceof Error ? error2.message : "Invalid YAML syntax";
290
+ setYamlValidationError(errorMessage);
291
+ return false;
292
+ }
293
+ }, []);
294
+ const handleYamlChange = useCallback((value) => {
295
+ setEditingYaml(value);
296
+ if (value.trim()) {
297
+ validateYaml(value);
298
+ } else {
299
+ setYamlValidationError("");
300
+ }
301
+ }, [validateYaml]);
302
+ const handleSaveResource = useCallback(async () => {
303
+ if (!originalManifest || !namespaceName || !resourceName || !namespaceUrnId || !apiVersion || !resourceKind) {
304
+ return;
305
+ }
306
+ setIsSaving(true);
307
+ setConfirmDialogOpen(false);
308
+ try {
309
+ const updatedManifest = yaml.load(editingYaml);
310
+ await api.updateSupervisorResourceManifest(
311
+ namespaceUrnId,
312
+ namespaceName,
313
+ resourceName,
314
+ apiVersion,
315
+ resourceKind,
316
+ updatedManifest,
317
+ instanceName
318
+ );
319
+ setSnackbar({
320
+ open: true,
321
+ message: "Resource manifest updated successfully",
322
+ severity: "success"
323
+ });
324
+ setTimeout(() => window.location.reload(), 1e3);
325
+ } catch (error2) {
326
+ setSnackbar({
327
+ open: true,
328
+ message: `Failed to update resource manifest: ${error2 instanceof Error ? error2.message : "Unknown error"}`,
329
+ severity: "error"
330
+ });
331
+ } finally {
332
+ setIsSaving(false);
333
+ }
334
+ }, [originalManifest, namespaceName, resourceName, namespaceUrnId, apiVersion, resourceKind, editingYaml, instanceName, api]);
335
+ const handleCancelEditing = useCallback(() => {
336
+ setEditingYaml("");
337
+ setOriginalManifest(null);
338
+ setYamlValidationError("");
339
+ }, []);
340
+ const handleCloseSnackbar = useCallback(() => {
341
+ setSnackbar((prev) => ({ ...prev, open: false }));
342
+ }, []);
160
343
  const handleTabChange = (_event, newValue) => {
161
344
  setTabValue(newValue);
345
+ if (newValue === 5 && canEditResource && !editingYaml && !isLoadingManifest) {
346
+ loadManifestForEditing();
347
+ }
162
348
  };
163
349
  if (loading) {
164
350
  return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource Details", children: /* @__PURE__ */ jsx(Typography, { children: "Loading resource details..." }) });
@@ -329,7 +515,8 @@ const VCFAutomationCCIResourceDetails = () => {
329
515
  /* @__PURE__ */ jsx(Tab, { label: "Manifest Details" }),
330
516
  /* @__PURE__ */ jsx(Tab, { label: "Object Status" }),
331
517
  /* @__PURE__ */ jsx(Tab, { label: "Conditions" }),
332
- /* @__PURE__ */ jsx(Tab, { label: "YAML Views" })
518
+ /* @__PURE__ */ jsx(Tab, { label: "YAML Views" }),
519
+ canEditResource && resourceName && namespaceName && namespaceUrnId && apiVersion && /* @__PURE__ */ jsx(Tab, { label: "Edit Manifest" })
333
520
  ] }),
334
521
  /* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 0, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
335
522
  /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: basicInfo }) }),
@@ -450,7 +637,101 @@ const VCFAutomationCCIResourceDetails = () => {
450
637
  }
451
638
  ) }) })
452
639
  ] }) })
453
- ] }) })
640
+ ] }) }),
641
+ canEditResource && resourceName && namespaceName && namespaceUrnId && apiVersion && /* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 5, children: /* @__PURE__ */ jsx(Grid, { container: true, spacing: 3, children: /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
642
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Edit Resource Manifest" }),
643
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", gutterBottom: true, children: [
644
+ resourceName,
645
+ " (",
646
+ resourceKind,
647
+ ")"
648
+ ] }),
649
+ isLoadingManifest ? /* @__PURE__ */ jsx(Box, { display: "flex", justifyContent: "center", alignItems: "center", minHeight: "400px", children: /* @__PURE__ */ jsx(Typography, { children: "Loading manifest..." }) }) : /* @__PURE__ */ jsxs(Box, { className: classes.yamlEditorContainer, children: [
650
+ /* @__PURE__ */ jsx(Box, { className: classes.monacoEditor, children: /* @__PURE__ */ jsx(
651
+ Editor,
652
+ {
653
+ height: "100%",
654
+ defaultLanguage: "yaml",
655
+ value: editingYaml,
656
+ onChange: (value) => handleYamlChange(value || ""),
657
+ theme: "vs-dark",
658
+ options: {
659
+ minimap: { enabled: false },
660
+ scrollBeyondLastLine: false,
661
+ fontSize: 14,
662
+ lineNumbers: "on",
663
+ wordWrap: "off",
664
+ automaticLayout: true,
665
+ tabSize: 2,
666
+ insertSpaces: true,
667
+ folding: true,
668
+ renderWhitespace: "selection"
669
+ }
670
+ }
671
+ ) }),
672
+ /* @__PURE__ */ jsx(Box, { className: classes.validationStatus, children: yamlValidationError ? /* @__PURE__ */ jsxs(Typography, { className: classes.yamlValidationError, children: [
673
+ "\u26A0\uFE0F YAML Validation Error: ",
674
+ yamlValidationError
675
+ ] }) : editingYaml.trim() ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: "\u2705 YAML syntax is valid" }) : /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: "Enter YAML content above" }) }),
676
+ /* @__PURE__ */ jsxs(Box, { className: classes.editorActions, children: [
677
+ /* @__PURE__ */ jsx(
678
+ Button,
679
+ {
680
+ variant: "outlined",
681
+ onClick: handleCancelEditing,
682
+ disabled: isSaving,
683
+ children: "Cancel"
684
+ }
685
+ ),
686
+ /* @__PURE__ */ jsx(
687
+ Button,
688
+ {
689
+ variant: "contained",
690
+ color: "primary",
691
+ onClick: () => setConfirmDialogOpen(true),
692
+ disabled: !editingYaml.trim() || !!yamlValidationError || isSaving,
693
+ children: isSaving ? "Saving..." : "Save Changes"
694
+ }
695
+ )
696
+ ] })
697
+ ] })
698
+ ] }) }) }),
699
+ /* @__PURE__ */ jsxs(
700
+ Dialog,
701
+ {
702
+ open: confirmDialogOpen,
703
+ onClose: () => setConfirmDialogOpen(false),
704
+ maxWidth: "sm",
705
+ fullWidth: true,
706
+ children: [
707
+ /* @__PURE__ */ jsx(DialogTitle, { children: "Confirm Changes" }),
708
+ /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(Typography, { children: "Are you sure you want to apply these changes to the resource? This action will update the Kubernetes resource based on your modifications." }) }),
709
+ /* @__PURE__ */ jsxs(DialogActions, { children: [
710
+ /* @__PURE__ */ jsx(Button, { onClick: () => setConfirmDialogOpen(false), color: "primary", children: "Cancel" }),
711
+ /* @__PURE__ */ jsx(
712
+ Button,
713
+ {
714
+ onClick: handleSaveResource,
715
+ color: "primary",
716
+ variant: "contained",
717
+ disabled: isSaving,
718
+ children: isSaving ? "Applying..." : "Apply Changes"
719
+ }
720
+ )
721
+ ] })
722
+ ]
723
+ }
724
+ ),
725
+ /* @__PURE__ */ jsx(
726
+ Snackbar,
727
+ {
728
+ open: snackbar.open,
729
+ autoHideDuration: 6e3,
730
+ onClose: handleCloseSnackbar,
731
+ anchorOrigin: { vertical: "bottom", horizontal: "left" },
732
+ children: /* @__PURE__ */ jsx(Alert, { onClose: handleCloseSnackbar, severity: snackbar.severity, children: snackbar.message })
733
+ }
734
+ )
454
735
  ] }) })
455
736
  ] });
456
737
  };