diff --git a/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.ts b/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.ts index fcb7223..2928831 100644 --- a/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.ts +++ b/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.ts @@ -62,6 +62,11 @@ export class DeployImageComponent implements OnInit { selectedClients: any[] = []; selectedModelClient: any = null; filteredPartitions: any[] = []; + + postDeployAction: string = 'none'; + selectedPxeTemplate: any = null; + pxePermanent: boolean = false; + pxeTemplates: any[] = []; allImageRepositories: any[] = []; loadingAllRepositories: boolean = false; @@ -147,7 +152,37 @@ export class DeployImageComponent implements OnInit { this.route.queryParams.subscribe(params => { this.runScriptContext = params['runScriptContext'] ? JSON.parse(params['runScriptContext']) : null; }); + + const savedAction = localStorage.getItem('deploy_postDeployAction'); + if (savedAction) { + this.postDeployAction = savedAction; + } + const savedPxePermanent = localStorage.getItem('deploy_pxePermanent'); + if (savedPxePermanent !== null) { + this.pxePermanent = savedPxePermanent === 'true'; + } + this.loadAllRepositories(); + this.loadPxeTemplates(); + } + + loadPxeTemplates() { + this.http.get(`${this.baseUrl}/pxe-templates?page=1&itemsPerPage=10000`).subscribe( + (response: any) => { + this.pxeTemplates = response?.['hydra:member'] || []; + + const savedTemplateUuid = localStorage.getItem('deploy_selectedPxeTemplateUuid'); + if (savedTemplateUuid && this.postDeployAction === 'pxeTemplate') { + const match = this.pxeTemplates.find(t => t.uuid === savedTemplateUuid); + if (match) { + this.selectedPxeTemplate = match; + } + } + }, + (error) => { + console.error('Error loading PXE templates:', error); + } + ); } loadAllRepositories() { @@ -486,12 +521,10 @@ export class DeployImageComponent implements OnInit { this.http.post(url, payload) .subscribe({ next: (response) => { - this.toastService.success(this.translate.instant('deployRequestSentCorrectly')); - this.loading = false; - this.router.navigate(['/commands-logs']); + this.enqueuePostDeployActions(); }, error: (error) => { - this.toastService.error(error.error['hydra:description'], 'Se ha detectado un error en el despliegue de imágenes.', { + this.toastService.error(error.error['hydra:description'] || error.message, 'Se ha detectado un error en el despliegue de imágenes.', { "closeButton": true, "newestOnTop": false, "progressBar": false, @@ -507,12 +540,76 @@ export class DeployImageComponent implements OnInit { }); } + private enqueuePostDeployActions() { + localStorage.setItem('deploy_postDeployAction', this.postDeployAction); + localStorage.setItem('deploy_pxePermanent', String(this.pxePermanent)); + if (this.selectedPxeTemplate?.uuid) { + localStorage.setItem('deploy_selectedPxeTemplateUuid', this.selectedPxeTemplate.uuid); + } + + if (this.postDeployAction === 'none') { + this.toastService.success(this.translate.instant('deployRequestSentCorrectly')); + this.loading = false; + this.router.navigate(['/commands-logs']); + return; + } + + const clientIds = this.selectedClients.map((c: any) => c.uuid); + + if (this.postDeployAction === 'bootOs') { + const disk = this.selectedPartition?.diskNumber || 1; + const part = this.selectedPartition?.partitionNumber || 1; + const payload = { + clients: clientIds, + script: `bootOs ${disk} ${part}`, + queue: true, + runAsAdmin: true + }; + this.http.post(`${this.baseUrl}/commands/run-script`, payload).subscribe({ + next: () => this.finishPostDeploy(), + error: () => this.finishPostDeployWithError() + }); + } else if (this.postDeployAction === 'pxeTemplate' && this.selectedPxeTemplate) { + const mode = this.pxePermanent ? 1 : 0; + const combinedScript = `setBootMode ${this.selectedPxeTemplate.name} ${mode}\nreboot`; + const setBootModePayload = { + clients: clientIds, + script: combinedScript, + queue: true, + runAsAdmin: true + }; + + this.http.post(`${this.baseUrl}/commands/run-script`, setBootModePayload).subscribe({ + next: () => this.finishPostDeploy(), + error: () => this.finishPostDeployWithError() + }); + } else { + this.finishPostDeploy(); + } + } + + private finishPostDeploy() { + this.toastService.success(this.translate.instant('deployRequestSentCorrectly') + ' y post-acciones encoladas.'); + this.loading = false; + this.router.navigate(['/commands-logs']); + } + + private finishPostDeployWithError() { + this.toastService.error('Se programó el despliegue pero falló al encolar las acciones post-despliegue.'); + this.loading = false; + this.router.navigate(['/commands-logs']); + } + isFormValid(): boolean { const needsPartition = this.deployMode !== 'update-cache'; if (!this.allSelected || !this.selectedModelClient || (needsPartition && !this.selectedPartition)) { return false; } + if (this.postDeployAction === 'pxeTemplate' && !this.selectedPxeTemplate) { + return false; + } + if (this.imageType === 'git') { if (!this.selectedCommit || this.filteredCommits.length === 0) { return false;