From 4e7f4128d8ef5ab225dd04857f5d26596ffaeb89 Mon Sep 17 00:00:00 2001 From: Cole Blanchard Date: Tue, 1 Aug 2023 16:06:53 -0400 Subject: [PATCH 01/12] task: init draft commit --- .../src/components/workflow/tera-calibration-node-ciemss.vue | 4 +++- packages/client/hmi-client/src/types/Types.ts | 1 + .../terarium/hmiserver/models/dataservice/Simulation.java | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue index cd659327d1..fad47edec8 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue @@ -98,7 +98,7 @@ />
-
loading...
+
loading... {{ '(' + progress + '%)' }}
@@ -153,6 +153,7 @@ const simulationIds: ComputedRef = computed( const mapping = ref(props.node.state.mapping); const csvAsset = shallowRef(undefined); const showSpinner = ref(false); +const progress = ref(0); // EXTRA section const numSamples = ref(100); @@ -239,6 +240,7 @@ const getStatus = async () => { } else if (currentSimulation && ongoingStatusList.includes(currentSimulation.status)) { // recursively call until all runs retrieved setTimeout(getStatus, 3000); + progress.value = progress.value! + 5; } else { // throw if there are any failed runs for now console.error('Failed', startedRunId.value); diff --git a/packages/client/hmi-client/src/types/Types.ts b/packages/client/hmi-client/src/types/Types.ts index 1bd23bea70..cfd48362f7 100644 --- a/packages/client/hmi-client/src/types/Types.ts +++ b/packages/client/hmi-client/src/types/Types.ts @@ -115,6 +115,7 @@ export interface Simulation { workflowId: string; userId?: number; projectId?: number; + progress?: number; } export interface Dataset { diff --git a/packages/services/hmi-server/src/main/java/software/uncharted/terarium/hmiserver/models/dataservice/Simulation.java b/packages/services/hmi-server/src/main/java/software/uncharted/terarium/hmiserver/models/dataservice/Simulation.java index 2e83f24a6d..fae6671ffe 100644 --- a/packages/services/hmi-server/src/main/java/software/uncharted/terarium/hmiserver/models/dataservice/Simulation.java +++ b/packages/services/hmi-server/src/main/java/software/uncharted/terarium/hmiserver/models/dataservice/Simulation.java @@ -49,4 +49,8 @@ public class Simulation { @TSOptional private Integer projectId; + @JsonAlias("progress") + @TSOptional + private Number progress; + } From c9ad812cb3c646b5c93b2cfe40bcdf21d8cfd993 Mon Sep 17 00:00:00 2001 From: Cole Blanchard Date: Wed, 2 Aug 2023 14:50:28 -0400 Subject: [PATCH 02/12] task: use poller when getting status --- .../tera-calibrate-ensemble-node-ciemss.vue | 38 +++++++++------- .../workflow/tera-calibration-node-ciemss.vue | 44 ++++++++++++------- .../workflow/tera-calibration-node-julia.vue | 44 ++++++++++--------- .../workflow/tera-simulate-ciemss-node.vue | 43 +++++++++++------- .../tera-simulate-ensemble-node-ciemss.vue | 41 +++++++++-------- .../workflow/tera-simulate-julia-node.vue | 44 ++++++++++++------- 6 files changed, 148 insertions(+), 106 deletions(-) diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue index 5eaaeab94e..489c1c38ee 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue @@ -48,12 +48,7 @@ import { ref, watch, computed, ComputedRef } from 'vue'; import { WorkflowNode, WorkflowStatus } from '@/types/workflow'; // import { getModelConfigurationById } from '@/services/model-configurations'; import { workflowEventBus } from '@/services/workflow'; -import { - EnsembleCalibrationCiemssRequest, - Simulation, - TimeSpan, - EnsembleModelConfigs -} from '@/types/Types'; +import { EnsembleCalibrationCiemssRequest, TimeSpan, EnsembleModelConfigs } from '@/types/Types'; import { getSimulation, makeEnsembleCiemssCalibration, @@ -62,6 +57,7 @@ import { import Button from 'primevue/button'; import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { setupDatasetInput } from '@/services/calibrate-workflow'; +import { Poller } from '@/api/api'; import { CalibrateEnsembleCiemssOperationState, CalibrateEnsembleCiemssOperation, @@ -121,21 +117,31 @@ const runEnsemble = async () => { const getStatus = async () => { if (!startedRunId.value) return; - const currentSimulation: Simulation | null = await getSimulation(startedRunId.value); // get TDS's simulation object - const ongoingStatusList = ['running', 'queued']; + const poller = new Poller() + .setInterval(3000) + .setThreshold(300) + .setPollAction(async () => { + const response = await getSimulation(startedRunId.value!); + if (response?.status === 'complete') { + return { + data: response, + progress: null, + error: null + }; + } + return { + data: null, + progress: null, + error: null + }; + }); + const pollerResults = await poller.start(); - if (currentSimulation && currentSimulation.status === 'complete') { + if (pollerResults.data) { completedRunId.value = startedRunId.value; updateOutputPorts(completedRunId); addChart(); showSpinner.value = false; - } else if (currentSimulation && ongoingStatusList.includes(currentSimulation.status)) { - // recursively call until all runs retrieved - setTimeout(getStatus, 3000); - } else { - // throw if there are any failed runs for now - console.error('Failed', startedRunId.value); - throw Error('Failed Runs'); } }; diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue index fad47edec8..49ccd7628b 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue @@ -98,7 +98,7 @@ />
-
loading... {{ '(' + progress + '%)' }}
+
loading...
@@ -112,7 +112,7 @@ import Column from 'primevue/column'; import Accordion from 'primevue/accordion'; import AccordionTab from 'primevue/accordiontab'; import InputNumber from 'primevue/inputnumber'; -import { CalibrationRequestCiemss, CsvAsset, Simulation, ModelConfiguration } from '@/types/Types'; +import { CalibrationRequestCiemss, CsvAsset, ModelConfiguration } from '@/types/Types'; import { makeCalibrateJobCiemss, getSimulation, @@ -122,6 +122,7 @@ import { setupModelInput, setupDatasetInput } from '@/services/calibrate-workflo import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { workflowEventBus } from '@/services/workflow'; import _ from 'lodash'; +import { Poller } from '@/api/api'; import { CalibrationOperationCiemss, CalibrationOperationStateCiemss, @@ -153,7 +154,6 @@ const simulationIds: ComputedRef = computed( const mapping = ref(props.node.state.mapping); const csvAsset = shallowRef(undefined); const showSpinner = ref(false); -const progress = ref(0); // EXTRA section const numSamples = ref(100); @@ -225,27 +225,37 @@ const runCalibrate = async () => { getStatus(); showSpinner.value = true; }; -// Retrieve run ids -// FIXME: Replace with API.poller + const getStatus = async () => { if (!startedRunId.value) return; - const currentSimulation: Simulation | null = await getSimulation(startedRunId.value); // get TDS's simulation object - const ongoingStatusList = ['running', 'queued']; + const poller = new Poller() + .setInterval(3000) + .setThreshold(300) + .setPollAction(async () => { + const response = await getSimulation(startedRunId.value!); + if (response?.status === 'complete') { + return { + data: response, + progress: null, + error: null + }; + } + if (response?.status === 'running') { + // handle intermediate data here + } + return { + data: null, + progress: null, + error: null + }; + }); + const pollerResults = await poller.start(); - if (currentSimulation && currentSimulation.status === 'complete') { + if (pollerResults.data) { completedRunId.value = startedRunId.value; updateOutputPorts(completedRunId); showSpinner.value = false; - } else if (currentSimulation && ongoingStatusList.includes(currentSimulation.status)) { - // recursively call until all runs retrieved - setTimeout(getStatus, 3000); - progress.value = progress.value! + 5; - } else { - // throw if there are any failed runs for now - console.error('Failed', startedRunId.value); - showSpinner.value = false; - throw Error('Failed Runs'); } }; diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue index 30c3317b2a..cf5266bce9 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue @@ -113,13 +113,7 @@ import Button from 'primevue/button'; import Column from 'primevue/column'; import Accordion from 'primevue/accordion'; import AccordionTab from 'primevue/accordiontab'; -import { - CalibrationRequestJulia, - CsvAsset, - Simulation, - ModelConfiguration, - TimeSpan -} from '@/types/Types'; +import { CalibrationRequestJulia, CsvAsset, ModelConfiguration, TimeSpan } from '@/types/Types'; import { makeCalibrateJobJulia, getSimulation, @@ -133,6 +127,7 @@ import _ from 'lodash'; import InputNumber from 'primevue/inputnumber'; import InputText from 'primevue/inputtext'; import Dropdown from 'primevue/dropdown'; +import { Poller } from '@/api/api'; import TeraSimulateChart from './tera-simulate-chart.vue'; import { CalibrationOperationJulia, @@ -225,26 +220,33 @@ const runCalibrate = async () => { getStatus(); showSpinner.value = true; }; -// Retrieve run ids -// FIXME: Replace with API.poller + const getStatus = async () => { if (!startedRunId.value) return; + const poller = new Poller() + .setInterval(3000) + .setThreshold(300) + .setPollAction(async () => { + const response = await getSimulation(startedRunId.value!); + if (response?.status === 'complete') { + return { + data: response, + progress: null, + error: null + }; + } + return { + data: null, + progress: null, + error: null + }; + }); + const pollerResults = await poller.start(); - const currentSimulation: Simulation | null = await getSimulation(startedRunId.value); // get TDS's simulation object - const ongoingStatusList = ['running', 'queued']; - - if (currentSimulation && currentSimulation.status === 'complete') { + if (pollerResults.data) { completedRunId.value = startedRunId.value; updateOutputPorts(completedRunId); showSpinner.value = false; - } else if (currentSimulation && ongoingStatusList.includes(currentSimulation.status)) { - // recursively call until all runs retrieved - setTimeout(getStatus, 3000); - } else { - // throw if there are any failed runs for now - console.error('Failed', startedRunId.value); - showSpinner.value = false; - throw Error('Failed Runs'); } }; diff --git a/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue b/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue index 5915589f7a..f7b3e6e204 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue @@ -53,6 +53,8 @@ import InputNumber from 'primevue/inputnumber'; import { WorkflowNode } from '@/types/workflow'; import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { workflowEventBus } from '@/services/workflow'; +import { Simulation } from '@/types/Types'; +import { Poller } from '@/api/api'; import TeraSimulateChart from './tera-simulate-chart.vue'; import { SimulateCiemssOperation, SimulateCiemssOperationState } from './simulate-ciemss-operation'; @@ -101,27 +103,34 @@ const runSimulate = async () => { showSpinner.value = true; }; -// Retrieve run ids -// FIXME: Replace with API.poller const getStatus = async () => { - const requestList: any[] = []; - startedRunIdList.value.forEach((id) => { - requestList.push(getSimulation(id)); - }); - - const currentSimulations = await Promise.all(requestList); - const ongoingStatusList = ['running', 'queued']; + const poller = new Poller() + .setInterval(3000) + .setThreshold(300) + .setPollAction(async () => { + const requestList: Promise[] = []; + startedRunIdList.value.forEach((id) => { + requestList.push(getSimulation(id)); + }); + const response = await Promise.all(requestList); + if (response.every((simulation) => simulation!.status === 'complete')) { + return { + data: response, + progress: null, + error: null + }; + } + return { + data: null, + progress: null, + error: null + }; + }); + const pollerResults = await poller.start(); - if (currentSimulations.every(({ status }) => status === 'complete')) { + if (pollerResults.data) { completedRunIdList.value = startedRunIdList.value; showSpinner.value = false; - } else if (currentSimulations.some(({ status }) => ongoingStatusList.includes(status))) { - // recursively call until all runs retrieved - setTimeout(getStatus, 3000); - } else { - // throw if there are any failed runs for now - console.error('Failed', startedRunIdList.value); - throw Error('Failed Runs'); } }; diff --git a/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue index 62a2d68df7..7a9f0de1c2 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue @@ -48,12 +48,7 @@ import { ref, watch, computed, ComputedRef } from 'vue'; import { WorkflowNode, WorkflowStatus } from '@/types/workflow'; // import { getModelConfigurationById } from '@/services/model-configurations'; import { workflowEventBus } from '@/services/workflow'; -import { - EnsembleSimulationCiemssRequest, - Simulation, - TimeSpan, - EnsembleModelConfigs -} from '@/types/Types'; +import { EnsembleSimulationCiemssRequest, TimeSpan, EnsembleModelConfigs } from '@/types/Types'; import { getSimulation, makeEnsembleCiemssSimulation, @@ -61,6 +56,7 @@ import { } from '@/services/models/simulation-service'; import Button from 'primevue/button'; import { ChartConfig, RunResults } from '@/types/SimulateConfig'; +import { Poller } from '@/api/api'; import { SimulateEnsembleCiemssOperationState, SimulateEnsembleCiemssOperation @@ -125,22 +121,31 @@ const addChart = () => { const getStatus = async () => { if (!startedRunId.value) return; - - const currentSimulation: Simulation | null = await getSimulation(startedRunId.value); // get TDS's simulation object - const ongoingStatusList = ['running', 'queued']; - - if (currentSimulation && currentSimulation.status === 'complete') { + const poller = new Poller() + .setInterval(3000) + .setThreshold(300) + .setPollAction(async () => { + const response = await getSimulation(startedRunId.value!); + if (response?.status === 'complete') { + return { + data: response, + progress: null, + error: null + }; + } + return { + data: null, + progress: null, + error: null + }; + }); + const pollerResults = await poller.start(); + + if (pollerResults.data) { completedRunId.value = startedRunId.value; updateOutputPorts(completedRunId); addChart(); showSpinner.value = false; - } else if (currentSimulation && ongoingStatusList.includes(currentSimulation.status)) { - // recursively call until all runs retrieved - setTimeout(getStatus, 3000); - } else { - // throw if there are any failed runs for now - console.error('Failed', startedRunId.value); - throw Error('Failed Runs'); } }; diff --git a/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue b/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue index ddd61d9adf..97c599fac6 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue @@ -23,7 +23,7 @@ import _ from 'lodash'; import { ref, watch, computed, onMounted } from 'vue'; import Button from 'primevue/button'; import { csvParse } from 'd3'; -import { ModelConfiguration } from '@/types/Types'; +import { ModelConfiguration, Simulation } from '@/types/Types'; import { makeForecastJob, getSimulation, getRunResult } from '@/services/models/simulation-service'; import { WorkflowNode } from '@/types/workflow'; @@ -31,6 +31,7 @@ import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { getModelConfigurationById } from '@/services/model-configurations'; import { workflowEventBus } from '@/services/workflow'; +import { Poller } from '@/api/api'; import TeraSimulateChart from './tera-simulate-chart.vue'; import { SimulateJuliaOperation, SimulateJuliaOperationState } from './simulate-julia-operation'; @@ -76,24 +77,33 @@ const runSimulate = async () => { // Retrieve run ids // FIXME: Replace with API.poller const getStatus = async () => { - const requestList: any[] = []; - startedRunIdList.value.forEach((id) => { - requestList.push(getSimulation(id)); - }); - - const currentSimulations = await Promise.all(requestList); - const ongoingStatusList = ['running', 'queued']; - - if (currentSimulations.every(({ status }) => status === 'complete')) { + const poller = new Poller() + .setInterval(3000) + .setThreshold(300) + .setPollAction(async () => { + const requestList: Promise[] = []; + startedRunIdList.value.forEach((id) => { + requestList.push(getSimulation(id)); + }); + const response = await Promise.all(requestList); + if (response.every((simulation) => simulation!.status === 'complete')) { + return { + data: response, + progress: null, + error: null + }; + } + return { + data: null, + progress: null, + error: null + }; + }); + const pollerResults = await poller.start(); + + if (pollerResults.data) { completedRunIdList.value = startedRunIdList.value; showSpinner.value = false; - } else if (currentSimulations.some(({ status }) => ongoingStatusList.includes(status))) { - // recursively call until all runs retrieved - setTimeout(getStatus, 3000); - } else { - // throw if there are any failed runs for now - console.error('Failed', startedRunIdList.value); - throw Error('Failed Runs'); } }; From 0bf452f671f88f10340a1c1127dac8606b1f9819 Mon Sep 17 00:00:00 2001 From: Cole Blanchard Date: Wed, 2 Aug 2023 15:11:11 -0400 Subject: [PATCH 03/12] task: handle errors on polling --- .../tera-calibrate-ensemble-node-ciemss.vue | 15 ++++++++++----- .../workflow/tera-calibration-node-ciemss.vue | 12 ++++++++---- .../workflow/tera-calibration-node-julia.vue | 12 ++++++++---- .../workflow/tera-simulate-ciemss-node.vue | 10 +++++++--- .../tera-simulate-ensemble-node-ciemss.vue | 14 +++++++++----- .../workflow/tera-simulate-julia-node.vue | 10 +++++++--- 6 files changed, 49 insertions(+), 24 deletions(-) diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue index 489c1c38ee..490b074f08 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibrate-ensemble-node-ciemss.vue @@ -57,7 +57,7 @@ import { import Button from 'primevue/button'; import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { setupDatasetInput } from '@/services/calibrate-workflow'; -import { Poller } from '@/api/api'; +import { Poller, PollerState } from '@/api/api'; import { CalibrateEnsembleCiemssOperationState, CalibrateEnsembleCiemssOperation, @@ -137,12 +137,17 @@ const getStatus = async () => { }); const pollerResults = await poller.start(); - if (pollerResults.data) { - completedRunId.value = startedRunId.value; - updateOutputPorts(completedRunId); - addChart(); + if (pollerResults.state !== PollerState.Done || !pollerResults.data) { + // handle error + // throw if there are any failed runs for now + console.error('Failed', startedRunId.value); showSpinner.value = false; + throw Error('Failed Runs'); } + completedRunId.value = startedRunId.value; + updateOutputPorts(completedRunId); + addChart(); + showSpinner.value = false; }; const updateOutputPorts = async (runId) => { diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue index 49ccd7628b..b36f157eb5 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue @@ -122,7 +122,7 @@ import { setupModelInput, setupDatasetInput } from '@/services/calibrate-workflo import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { workflowEventBus } from '@/services/workflow'; import _ from 'lodash'; -import { Poller } from '@/api/api'; +import { Poller, PollerState } from '@/api/api'; import { CalibrationOperationCiemss, CalibrationOperationStateCiemss, @@ -252,11 +252,15 @@ const getStatus = async () => { }); const pollerResults = await poller.start(); - if (pollerResults.data) { - completedRunId.value = startedRunId.value; - updateOutputPorts(completedRunId); + if (pollerResults.state !== PollerState.Done || !pollerResults.data) { + // throw if there are any failed runs for now + console.error('Failed', startedRunId.value); showSpinner.value = false; + throw Error('Failed Runs'); } + completedRunId.value = startedRunId.value; + updateOutputPorts(completedRunId); + showSpinner.value = false; }; const updateOutputPorts = async (runId) => { diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue index cf5266bce9..3159c87c9c 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-julia.vue @@ -127,7 +127,7 @@ import _ from 'lodash'; import InputNumber from 'primevue/inputnumber'; import InputText from 'primevue/inputtext'; import Dropdown from 'primevue/dropdown'; -import { Poller } from '@/api/api'; +import { Poller, PollerState } from '@/api/api'; import TeraSimulateChart from './tera-simulate-chart.vue'; import { CalibrationOperationJulia, @@ -243,11 +243,15 @@ const getStatus = async () => { }); const pollerResults = await poller.start(); - if (pollerResults.data) { - completedRunId.value = startedRunId.value; - updateOutputPorts(completedRunId); + if (pollerResults.state !== PollerState.Done || !pollerResults.data) { + // throw if there are any failed runs for now + console.error('Failed', startedRunId.value); showSpinner.value = false; + throw Error('Failed Runs'); } + completedRunId.value = startedRunId.value; + updateOutputPorts(completedRunId); + showSpinner.value = false; }; const updateOutputPorts = async (runId) => { diff --git a/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue b/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue index f7b3e6e204..0dc22e6c8c 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-simulate-ciemss-node.vue @@ -54,7 +54,7 @@ import { WorkflowNode } from '@/types/workflow'; import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { workflowEventBus } from '@/services/workflow'; import { Simulation } from '@/types/Types'; -import { Poller } from '@/api/api'; +import { Poller, PollerState } from '@/api/api'; import TeraSimulateChart from './tera-simulate-chart.vue'; import { SimulateCiemssOperation, SimulateCiemssOperationState } from './simulate-ciemss-operation'; @@ -128,10 +128,14 @@ const getStatus = async () => { }); const pollerResults = await poller.start(); - if (pollerResults.data) { - completedRunIdList.value = startedRunIdList.value; + if (pollerResults.state !== PollerState.Done || !pollerResults.data) { + // throw if there are any failed runs for now + console.error('Failed', startedRunIdList.value); showSpinner.value = false; + throw Error('Failed Runs'); } + completedRunIdList.value = startedRunIdList.value; + showSpinner.value = false; }; // assume only one run for now diff --git a/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue index 7a9f0de1c2..6f51e9503e 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-simulate-ensemble-node-ciemss.vue @@ -56,7 +56,7 @@ import { } from '@/services/models/simulation-service'; import Button from 'primevue/button'; import { ChartConfig, RunResults } from '@/types/SimulateConfig'; -import { Poller } from '@/api/api'; +import { Poller, PollerState } from '@/api/api'; import { SimulateEnsembleCiemssOperationState, SimulateEnsembleCiemssOperation @@ -141,12 +141,16 @@ const getStatus = async () => { }); const pollerResults = await poller.start(); - if (pollerResults.data) { - completedRunId.value = startedRunId.value; - updateOutputPorts(completedRunId); - addChart(); + if (pollerResults.state !== PollerState.Done || !pollerResults.data) { + // throw if there are any failed runs for now + console.error('Failed', startedRunId.value); showSpinner.value = false; + throw Error('Failed Runs'); } + completedRunId.value = startedRunId.value; + updateOutputPorts(completedRunId); + addChart(); + showSpinner.value = false; }; const updateOutputPorts = async (runId) => { diff --git a/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue b/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue index 97c599fac6..0f7552c461 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-simulate-julia-node.vue @@ -31,7 +31,7 @@ import { ChartConfig, RunResults } from '@/types/SimulateConfig'; import { getModelConfigurationById } from '@/services/model-configurations'; import { workflowEventBus } from '@/services/workflow'; -import { Poller } from '@/api/api'; +import { Poller, PollerState } from '@/api/api'; import TeraSimulateChart from './tera-simulate-chart.vue'; import { SimulateJuliaOperation, SimulateJuliaOperationState } from './simulate-julia-operation'; @@ -101,10 +101,14 @@ const getStatus = async () => { }); const pollerResults = await poller.start(); - if (pollerResults.data) { - completedRunIdList.value = startedRunIdList.value; + if (pollerResults.state !== PollerState.Done || !pollerResults.data) { + // throw if there are any failed runs for now + console.error('Failed', startedRunIdList.value); showSpinner.value = false; + throw Error('Failed Runs'); } + completedRunIdList.value = startedRunIdList.value; + showSpinner.value = false; }; const watchCompletedRunList = async (runIdList: string[]) => { From 7fe48e5ec3f0138b9d2006a5ef03bcf1de36efe3 Mon Sep 17 00:00:00 2001 From: Cole Blanchard Date: Thu, 3 Aug 2023 20:06:09 -0400 Subject: [PATCH 04/12] task: add progress bar --- .../components/widgets/tera-progress-bar.vue | 23 +++++++++++++++++++ .../workflow/tera-calibration-node-ciemss.vue | 19 ++++++++++++--- .../client/hmi-client/src/types/workflow.ts | 6 +++++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 packages/client/hmi-client/src/components/widgets/tera-progress-bar.vue diff --git a/packages/client/hmi-client/src/components/widgets/tera-progress-bar.vue b/packages/client/hmi-client/src/components/widgets/tera-progress-bar.vue new file mode 100644 index 0000000000..fba642c858 --- /dev/null +++ b/packages/client/hmi-client/src/components/widgets/tera-progress-bar.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue index b36f157eb5..763d234b0a 100644 --- a/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue +++ b/packages/client/hmi-client/src/components/workflow/tera-calibration-node-ciemss.vue @@ -98,13 +98,13 @@ />
-
loading...
+