111 instance.uptime (detail) fix

This commit is contained in:
msyu
2025-05-20 21:23:04 +03:00
parent ce91993b92
commit e99c2af2a3
6 changed files with 315 additions and 25 deletions
+30 -22
View File
@@ -37,27 +37,24 @@
<m:field>e.updater_id</m:field>
<m:field>u.login as updater_login</m:field>
<m:field>u.shortname as updater_shortname</m:field>
<m:field>(select cast(st.instance_data->>'params' as json)->>'resourceRealm' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as resourceRealm</m:field>
<m:field formatter=#request.castToBool#>(select coalesce((io.dt_start IS NOT NULL AND io.dt_finish IS NULL AND io.submit_result='201'),false) from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as operation_is_in_progress</m:field>
<m:field formatter=#request.castToBool#>(select coalesce((io.dt_start IS NULL AND io.submit_result='201'),false) from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as operation_is_pending</m:field>
<m:field>
(case
when
not exists (select * from instance_state st where st.instance_uid=e.instance_uid) then 'not created'
when
(select st.instance_data->>'isDeleted' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) = 'true' then 'deleted'
when
(select st.instance_data->>'isSuspended' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) = 'true' then 'suspended'
when
(select coalesce(st.instance_data->>'isDeleted','false') from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) = 'false' AND (select coalesce(st.instance_data->>'isSuspended','false') from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) = 'false' then 'running'
when
not exists (select * from instance_operation o where o.instance_uid=e.instance_uid) then 'not configured'
else null end
) as explained_status
</m:field>
<m:field>cast(st.instance_data->>'params' as json)->>'resourceRealm' as resource_realm</m:field>
<m:field formatter=#request.castToBool#>coalesce((io.dt_start IS NOT NULL AND io.dt_finish IS NULL AND io.submit_result='201'),false) as operation_is_in_progress</m:field>
<m:field formatter=#request.castToBool#>coalesce((io.dt_start IS NULL AND io.submit_result='201'),false) as operation_is_pending</m:field>
<m:field>case
when io.operation IN ('delete', 'suspend') AND io.is_successful then 0 /*null*/
when io.is_successful then extract('epoch' from CURRENT_TIMESTAMP - coalesce(io.dt_finish,CURRENT_TIMESTAMP))
else 0 end
as uptime</m:field>
<m:field>(case
when st.instance_uid IS NULL then 'not created'
when st.is_deleted = 'true' then 'deleted'
when st.is_suspended = 'true' then 'suspended'
/*when coalesce(st.is_deleted,'false') = 'false' AND coalesce(st.is_suspended, 'false') = 'false' then 'running'*/
when coalesce(st.is_deleted,'false') = 'false' AND coalesce(st.is_suspended, 'false') = 'false' then 'running'
when io.instance_uid IS NULL then 'not configured'
else null end
) as explained_status</m:field>
<!--- <m:field>st.version</m:field> --->
</m:field_set>
from instance e
left outer join specification_item i on (e.specification_item_id=i.specification_item_id)
@@ -66,6 +63,17 @@
left outer join contragent k on (d.contragent_id=k.contragent_id)
left outer join svc v on (e.service_id=v.svc_id)
left outer join usr u on (e.updater_id=u.usr_id)
left outer join (select ist.instance_state_uid, ist.instance_uid, ist.version, ist.dt_state, ist.is_test
,(ist.instance_data->>'isSuspended') as is_suspended
,(ist.instance_data->>'isDeleted') as is_deleted
,ist.instance_data
from instance_state ist join (select instance_uid, max(version) as version from instance_state group by 1) lastv
on (ist.instance_uid=lastv.instance_uid AND ist.version=lastv.version) ) st
on (e.instance_uid=st.instance_uid)
left outer join (select o.instance_operation_uid, o.instance_uid, o.operation, o.dt_submit, o.submit_result, o.dt_start, o.dt_finish, o.is_successful
from instance_operation o join (select instance_uid, max(dt_submit) as dt_submit from instance_operation group by 1) lastv
on (o.instance_uid=lastv.instance_uid AND o.dt_submit=lastv.dt_submit) ) io
on (e.instance_uid=io.instance_uid)
where e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceUid#" null=#!isValid('guid',arguments.instanceUid)#/>
AND s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/><!--- access protection --->
</cfquery> <!--- *** правильнее при попытке доступа к чужому инстансу (НСД) выбрасывать 403, а тут будет 404, но так тоже делают, например, в gitea --->
@@ -257,7 +265,7 @@
<cfset "out.instance" = this.helper.appendRecord(
structNew("linked"), "", local.titleMap, local.qInstance, this.helper.snake2camel
)/>
<cfset "out.instance.uptime"=(local.qOperation.is_successful GT 0) ? local.qOperation.seconds_passed : 0/>
<!--- <cfset "out.instance.uptime"=(local.qOperation.is_successful GT 0) ? local.qOperation.seconds_passed : 0/> --->
<cfset "out.instance.isCreated"=local.isCreated/>
<cfset "out.instance.isDeleted"=qCurrentState.is_deleted GT 0/>
<cfset "out.instance.vaultData"=local.vaultData/>