117 nested refs intermediate

This commit is contained in:
msyu
2025-07-01 11:54:58 +03:00
parent 48b9fcf890
commit a0bc1476d6
3 changed files with 87 additions and 3 deletions
+73 -1
View File
@@ -42,6 +42,8 @@
<m:field formatter=#request.castToBool#>sop.is_sensitive</m:field>
<m:field>sop.man</m:field>
<m:field>sop.func</m:field>
<m:field>sop.nested_ref</m:field>
<m:field>sop.config</m:field>
</m:field_set>
from instance_operation_cfs_param iop
join svc_operation_cfs_param sop on (iop.svc_operation_cfs_param_id=sop.svc_operation_cfs_param_id)
@@ -67,7 +69,10 @@
<!--- <cfdump var=#local.qCfsParam#/><cfabort/> --->
<cfif len(trim(local.qCfsParam.value_list)) AND listLen(local.qCfsParam.value_list) EQ 1>
<cfset local.qCfsParam.default_value=local.qCfsParam.value_list/>
</cfif>
</cfif>
<cfelseif len(local.qCfsParam.nested_ref)>
<cfset var fNestedRef = generateClosure(local.qCfsParam.nested_ref, local.qCfsParam.config)/>
<cfset local.qCfsParam.nested_ref_data = fNestedRef() />
</cfif>
<cfif local.qCfsParam.data_type EQ "map">
@@ -294,5 +299,72 @@
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
<cfreturn valueList(local.qAvailableResourceRealm.resource_realm)/>
</cffunction>
<!--- для вложенных справочников --->
<!--- дублировано: deck-tool/instance_operation.cfm --->
<cffunction name="getSelectedResourceRealm" returnType="string">
<cfset var local={}/>
<cfquery name="local.qSelectedResourceRealm">
select iop.param_value
from instance_operation_cfs_param iop
join svc_operation_cfs_param sop on (iop.svc_operation_cfs_param_id=sop.svc_operation_cfs_param_id)
where iop.instance_operation_uid=<cfqueryparam cfsqltype="CF_SQL_OTHER" value=#d.instance_operation_uid# null=#!isValid("guid", d.instance_operation_uid)#/>
AND sop.svc_operation_cfs_param='resourceRealm'
order by 1
</cfquery> <!--- <cfdump var=#arguments#/> cfdump здесь провоцирует NPE --->
<cfreturn local.qSelectedResourceRealm.param_value/>
</cffunction>
<cffunction name="generateClosure" returntype="function">
<cfargument name="functionName" type="string" required="true"/>
<cfargument name="config" type="string" required="true"/>
<!--- остальные атрибуты необязательные, в argumentCollection --->
<cfswitch expression=#arguments.functionName#>
<cfcase value="">
<cfreturn function(){}/>
</cfcase>
<cfcase value="getRefFromRRealmConfig">
<cfreturn function(){return getRefFromRRealmConfig(getSelectedResourceRealm(),config)}/>
<!--- тут нам внезапно нужен контекст ресурсной платформы. При первичной отрисовке он может быть неизвестен (кроме специальных случаев, когда есть дефолтная платформа, или она вообще одна --->
<!--- теперь даже не знаю, хорошая ли практика - explicitly scope variables: с closures, похоже, так не принято --->
</cfcase>
<cfcase value="getSampleConfig"><!--- for debug --->
<cfreturn function(){return deserializeJson('{"providerVdc": [ { "hystax-pvdc": { "storageVdcProfile": [ ] } }, { "v1cl1-vsan-pvdc": { "albSegroup": [ "SEGROUP-V1CL1-VSAN-SHARED-01", "SEGROUP-V1CL1-VSAN-SHARED-02" ], "storageVdcProfile": [ "v1-backup-itprotect" ] } }, { "v1cl2-pvdc": { "albSegroup": [ "SEGROUP-V1CL2-SHARED-01", "SEGROUP-V1CL2-SHARED-02" ], "storageVdcProfile": [ "V1-SATA", "V1CL1-F1R1-SSD", "V1CL1-F2R6-SSD", "V1CL1-SAS" ] } }, { "v1cl3-vsan-pvdc": { "albSegroup": [ "SEGROUP-V1CL3-VSAN-SHARED-01", "SEGROUP-V1CL3-VSAN-SHARED-02" ], "storageVdcProfile": [ "V1-SATA", "v1-sata-cl3", "v1-sata-migr", "V1CL1-SAS", "V1CL3-F1R5-SSD", "V1CL3-F1R6-SSD_new", "V1CL3-F2R1-SSD", "V1CL3-F2R6-SSD" ] } }, { "v1cl4-vsan-pvdc": { "albSegroup": [ "SEGROUP-V1CL4-VSAN-SHARED-01" ], "storageVdcProfile": [ "V1-SATA", "v1-sata-migr", "V1CL3-F1R6-SSD_new", "V1CL4-F1R1-SSD", "V1CL4-F1R5-SSD", "V1CL4-F2R1-SSD" ] } }, { "v2cl2-1c-pvdc": { "storageVdcProfile": [ "V1CL1-F2R1-SSD", "V1CL1-F2R6-SSD" ] } } ]}')} />
</cfcase>
<cfdefaultcase>
<cfreturn "function not found"/>
</cfdefaultcase>
</cfswitch>
</cffunction>
<cffunction name="getRefFromRRealmConfig" returntype="any">
<cfargument name="resourceRealm" type="string" required="true"/>
<cfargument name="config" type="string" required="true"/>
<cfquery name="qResourceRealmConfig">
select properties::text
from resource_realm
where resource_realm='ngcloud.ru'
<!--- <cfqueryparam cfsqltype="cf_sql_varchar" value=#arguments.resourceRealm#/> --->
</cfquery>
<!--- <cfset var local={}/> ---> <!--- паранойя... и есть шансы, что я неправильно понимаю эту химию скоупов--->
<cfset var props = deserializeJson(qResourceRealmConfig.properties)/>
<cfset var cfg = deserializeJson(arguments.config)/> <!--- удобнее было бы передавать сразу структуру впр --->
<cfset cfg={"path":"vcd.providerVdc"}/><!--- *** временный пример для отладки --->
<!--- засада на ровном месте: у нас в конфиге оказался массив вместо структуры --->
<!--- вернуть нам нужно не просто содержимое по пути, а вместе с контейнером --->
<cfset var path=cfg.path/><!--- *** обработать исключение --->
<cfset var containerName = listLast(path,".")/>
<cfset var result = structNew()/>
<cfset structInsert(result, containerName, structGet("props.#path#"))/>
<cfreturn result/>
</cffunction>
</cfcomponent>