diff --git a/src/app/VMClaim.ts b/src/app/VMClaim.ts index 2659ea85..fd91d735 100644 --- a/src/app/VMClaim.ts +++ b/src/app/VMClaim.ts @@ -14,4 +14,5 @@ export class VMClaim { static_bind_attempts: number; dynamic_bind_request_id: string; tainted: boolean; + error: boolean; } diff --git a/src/app/scenario/scenario.component.html b/src/app/scenario/scenario.component.html index dd139472..fe7925dc 100644 --- a/src/app/scenario/scenario.component.html +++ b/src/app/scenario/scenario.component.html @@ -54,7 +54,11 @@
@for (vmc of vmclaims; track vmc) { - + } } diff --git a/src/app/scenario/scenario.component.ts b/src/app/scenario/scenario.component.ts index 4a82b88d..08dd00cc 100644 --- a/src/app/scenario/scenario.component.ts +++ b/src/app/scenario/scenario.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core'; import { Scenario } from './Scenario'; -import { catchError, concatMap, delay } from 'rxjs/operators'; +import { catchError, concatMap, delay, take } from 'rxjs/operators'; import { Session } from '../Session'; import { from, of } from 'rxjs'; import { ScenarioService } from '../services/scenario.service'; @@ -46,13 +46,18 @@ export class ScenarioComponent implements OnInit { vmc.ready = true; } + onError() { + this.error = true; + this.ssService.finish(this.session.id).pipe(take(1)).subscribe(); + } + get isReady() { return this.vmclaims.length > 0 && this.vmclaims.every((v) => v.ready); } get isDynamicallyBinding() { const dynVmcs = this.vmclaims.filter((v) => v.bind_mode === 'dynamic'); - return dynVmcs.length > 0 && dynVmcs.every((v) => !v.ready); + return dynVmcs.length > 0 && dynVmcs.every((v) => !v.ready) && !this.error; } close() { diff --git a/src/app/scenario/vmclaim.component.ts b/src/app/scenario/vmclaim.component.ts index bd1611ea..8741b91c 100644 --- a/src/app/scenario/vmclaim.component.ts +++ b/src/app/scenario/vmclaim.component.ts @@ -26,6 +26,9 @@ export class VMClaimComponent implements OnChanges { @Output() ready: EventEmitter = new EventEmitter(false); + @Output() + provisioningError: EventEmitter = new EventEmitter(false); + private vms: Map = new Map(); constructor( @@ -48,10 +51,11 @@ export class VMClaimComponent implements OnChanges { // On every tick of the timer, call vmClaimService.get() switchMap(() => this.vmClaimService.get(this.vmclaim.id)), // Continue the Observable chain if vmclaim is not ready - takeWhile((s: VMClaim) => !s.ready, true), + takeWhile((s: VMClaim) => !s.ready && !s.error, true), // Convert object to Map and emit the VMs if vmclaim is ready concatMap((s: VMClaim) => { this.vmclaim = s; + if (s.error) this.provisioningError.emit(true); if (!s.ready) return []; this.ready.emit(s.id); return s.vm.values();