045 online status check for operation restart
This commit is contained in:
+2
-1
@@ -51,7 +51,7 @@
|
||||
|
||||
//variables.framework.docs={};
|
||||
variables.framework.docs.APIName="Deck API";
|
||||
variables.framework.docs.APIVersion="0.044";
|
||||
variables.framework.docs.APIVersion="0.045";
|
||||
|
||||
variables.framework.globalHeaders = structNew();
|
||||
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
|
||||
@@ -156,6 +156,7 @@
|
||||
//if (UCase(arguments.verb) EQ 'OPTIONS') return newRepresentation().noData().withStatus("204","No Data").withHeaders({"Content-Type":"application/json;charset=utf-8"});
|
||||
if (uCase(arguments.verb) EQ 'OPTIONS') return true;
|
||||
if (lCase(arguments.cfc) EQ 'err') return true;
|
||||
if (lCase(arguments.cfc) EQ 'throw') return true;
|
||||
|
||||
var auth="";
|
||||
if (structKeyExists(headers,"Authorization")) {
|
||||
|
||||
@@ -33,17 +33,27 @@
|
||||
|
||||
<!--- Check operation status, do not start already started (*** consider timeout and cancelling timed out operations here) --->
|
||||
<cfquery name="local.qCheckStarted" result="local.result">
|
||||
select io.dt_submit, io.dt_finish, io.submit_result
|
||||
select io.dt_submit, io.dt_finish, io.dt_start, io.submit_result, io.status_url
|
||||
from instance_operation io
|
||||
where io.instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationUid#" null=#!isValid('guid',arguments.instanceOperationUid)#/>
|
||||
</cfquery> <!--- <cfdump var=#local.qCheckStarted.dt_finish#/><cfabort/> --->
|
||||
<cfif local.qCheckStarted.recordCount EQ 0>
|
||||
</cfquery> <!--- <cfdump var=#local.qCheckStarted.dt_finish#/><cfabort/> --->
|
||||
|
||||
<!---
|
||||
попытаемся проверить, не упала ли операция раньше времени
|
||||
при этом стараемся исключить эффект дребезга - если мы пошлем две команды на выполнение одну за другой, вторая не должна запуститься
|
||||
перезапуск операции разрешен, если она зафейлилась либо явно (оркестратор ее пометил таковой) или неявно (джоб упал, не успев отметить операцию стартовавшей)
|
||||
Возможно, эту логику нужно воспроизвести на фронте
|
||||
--->
|
||||
<cfif local.qCheckStarted.recordCount EQ 0>
|
||||
<cfreturn representationOf(this.helper.formatMessage("There is no configured instance operation with uid #arguments.instanceOperationUid#","Instance operation not found")).withStatus(404)/>
|
||||
<cfelseif left(local.qCheckStarted.submit_result,1) EQ "2" AND len(local.qCheckStarted.dt_finish) EQ 0><!--- 201 etc --->
|
||||
<cfreturn representationOf(this.helper.formatMessage("Operation already started", "Parameter creation disabled for started operation")).withStatus(422)/>
|
||||
<cfelseif left(local.qCheckStarted.submit_result,1) EQ "2" AND len(local.qCheckStarted.dt_finish) EQ 0><!--- 201 etc --->
|
||||
<cfif getJobStatus(local.qCheckStarted.status_url) NEQ 'FAILED'>
|
||||
<cfreturn representationOf(this.helper.formatMessage("Operation already started", "Parameter creation disabled for started operation")).withStatus(422)/>
|
||||
</cfif>
|
||||
</cfif>
|
||||
<!--- Check CFS parameters at least for existence
|
||||
(*** would be better to check RFS but now CFS params are primary, RFS even mostly do not have is_required flag set) --->
|
||||
|
||||
<!--- *** !!! тут возможна ошибка из-за нечеткого понимания: даже в отсутствие обязательного CFS параметра RFS параметр может быть сгенерирован, например, из дефолта. То есть данный вариант проверки - неполный и ущербный, впоследствии может неожиданно перестать работать --->
|
||||
|
||||
<cfquery name="local.qCheckCfsParams" result="local.result">
|
||||
@@ -262,5 +272,33 @@
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#ARGUMENTS#/> --->
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="getJobStatus">
|
||||
<cfargument name="status_url">
|
||||
|
||||
<cftry>
|
||||
<cfhttp method="get"
|
||||
url="#arguments.status_url#"
|
||||
timeout="3"
|
||||
charset="utf-8"
|
||||
result="local.jobStatus"
|
||||
>
|
||||
<cfhttpparam type="HEADER" name="Authorization" value="#request.ORCHESTRATOR_AUTH#">
|
||||
<cfhttpparam type="HEADER" name="Accept" value="application/json">
|
||||
</cfhttp>
|
||||
|
||||
<cftry>
|
||||
<cfset var jobStatusData=#deserializeJson(local.jobStatus.filecontent)#/>
|
||||
<cfreturn jobStatusData.result/>
|
||||
<cfcatch type="any">
|
||||
<cfreturn "cannot obtain job result"/><!--- можно было бы и поаккуратнее - проверить код ответа, потом проверить наличие поля --->
|
||||
<!--- <cfthrow message="ERROR #cfcatch.message#" detail="#cfcatch.detail#"/> --->
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
<cfcatch type="any">
|
||||
<cfthrow message="Cannot connect to the orchestrator. #cfcatch.message#" detail="#cfcatch.detail#"/>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
</cffunction>
|
||||
|
||||
</cfcomponent>
|
||||
Reference in New Issue
Block a user