089 resource_realms isolation next
This commit is contained in:
+1
-1
@@ -51,7 +51,7 @@
|
||||
|
||||
//variables.framework.docs={};
|
||||
variables.framework.docs.APIName="Deck API";
|
||||
variables.framework.docs.APIVersion="0.088";
|
||||
variables.framework.docs.APIVersion="0.089";
|
||||
|
||||
variables.framework.globalHeaders = structNew();
|
||||
variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location";
|
||||
|
||||
@@ -163,24 +163,6 @@
|
||||
order by so.svc_operation_id
|
||||
</cfquery>
|
||||
|
||||
<!--- <cfquery name="local.qAvailableResourceRealm" result="local.result">
|
||||
select
|
||||
<m:field_set titleMapOut="local.realmTitleMap" lengthOut="local.realmFieldCount">
|
||||
<m:field>r.resource_realm_id</m:field>
|
||||
<m:field>r.resource_realm_type_id</m:field>
|
||||
<m:field>r.resource_realm</m:field>
|
||||
</m:field_set>
|
||||
from resource_realm r
|
||||
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
|
||||
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
|
||||
join resource_realm_access a on
|
||||
(r.resource_realm_id=a.resource_realm_id
|
||||
AND a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
AND a.is_enabled)
|
||||
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
|
||||
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#qInstance.service_id#/>
|
||||
order by 1
|
||||
</cfquery> --->
|
||||
|
||||
<cfset var out=structNew("linked")/>
|
||||
<cfset var local.vaultData=structNew("linked")/>
|
||||
|
||||
@@ -29,31 +29,6 @@
|
||||
order by 1
|
||||
</cfquery>
|
||||
|
||||
<!--- <cfquery name="local.qAvailableResourceRealm" result="local.result">
|
||||
select
|
||||
<m:field_set titleMapOut="local.realmTitleMap" lengthOut="local.realmFieldCount">
|
||||
<m:field>r.resource_realm_id</m:field>
|
||||
<m:field>r.resource_realm_type_id</m:field>
|
||||
<m:field>r.resource_realm</m:field>
|
||||
</m:field_set>
|
||||
from resource_realm r
|
||||
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
|
||||
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
|
||||
join resource_realm_access a on
|
||||
(r.resource_realm_id=a.resource_realm_id
|
||||
AND a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
AND a.is_enabled)
|
||||
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
|
||||
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.svcId#/>
|
||||
order by 1
|
||||
</cfquery> --->
|
||||
|
||||
<!--- <cfset var instance = {
|
||||
"svcId":"#arguments.svcId*1#",
|
||||
"displayName":"#generateDefaultName(arguments.svcId,arguments.usrId)#",
|
||||
"descr":""
|
||||
}/> --->
|
||||
|
||||
|
||||
<cfset var out = structNew("linked")/>
|
||||
<cfset "out.instance.svcId"="#arguments.svcId*1#"/>
|
||||
|
||||
@@ -143,7 +143,8 @@
|
||||
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
|
||||
join resource_realm_access a on
|
||||
(r.resource_realm_id=a.resource_realm_id
|
||||
AND a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
OR a.contract_id=0) /*0 means access to any contract*/
|
||||
AND a.is_enabled)
|
||||
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
|
||||
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qInstanceOperation.service_id#/>
|
||||
|
||||
@@ -85,7 +85,8 @@
|
||||
/*left outer join resource_realm p on (r.parent_id=p.resource_realm_id)*/
|
||||
join resource_realm_access a on
|
||||
(r.resource_realm_id=a.resource_realm_id
|
||||
AND a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
OR a.contract_id=0) /*0 means access to any contract*/
|
||||
AND a.is_enabled)
|
||||
join svc s on r.resource_realm_type_id=s.resource_realm_type_id
|
||||
where s.svc_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qSvcOperation.svc_id#/>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
|
||||
<!--- <cffunction name="post" hint="Создание новой операции с параметрами. Принимаются CFS параметры, генерируются RFS параметры. Запускается операция отдельным вызовом. До запуска CFS параметры могут корректироваться (а надо?). Запущенная операция навсегда становится Read Only (при желании можем реализовать ее клонирование). Можем реализовать корректировку параметров, но непонятно, зачем. Когда мы конфигурируем инстанс, на самом деле мы задаем CFS параметры операции create. Можно править параметры, а можно пересоздать операцию с новыми параметрами. Предусмотреть удаление (метод DELETE) незапущенной операции?"> --->
|
||||
|
||||
<cffunction name="post" hint="Создание новой операции. Отдельно загружаются CFS параметры, генерируются RFS параметры. Запускается операция отдельным вызовом. До запуска CFS параметры могут корректироваться (а надо?). Запущенная операция вместе с параметрами навсегда становится Read Only (при желании можем реализовать ее клонирование). Можем реализовать корректировку параметров, но непонятно, зачем. Когда мы конфигурируем инстанс, на самом деле мы задаем CFS параметры операции create. Можно править параметры, а можно пересоздать операцию с новыми параметрами. Предусмотреть удаление (метод DELETE) незапущенной операции?">
|
||||
<cfargument name="instanceUid" type="string" required=true hint="type:guid"/>
|
||||
<cfargument name="operation" type="string" required=true hint="type:string decsiption: operation name, e.g. create"/>
|
||||
@@ -30,7 +31,9 @@
|
||||
<!--- *** Добавить проверку разрешенных переходов, например, create нельзя сделать на развернутом экземпляре
|
||||
*** Вероятно, допустимые переходы нужно либо специфицировать в документации, либо явно опубликовать (инстанс может публиковать список допустимых операций) --->
|
||||
|
||||
<cfset checkResourceRealmId(arguments.resourceRealmId, arguments.usrId, arguments.instanceUid)/>
|
||||
<cfif listFind("create,redeploy",arguments.operation)>
|
||||
<cfset checkResourceRealmId(arguments.resourceRealmId, arguments.instanceUid)/>
|
||||
</cfif>
|
||||
|
||||
<cfcatch type="invalidParamValue">
|
||||
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
|
||||
@@ -68,21 +71,60 @@
|
||||
/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="checkResourceRealmId">
|
||||
<cffunction name="checkResourceRealmId" returntype="void">
|
||||
<!--- В данном случае мы проверяем соответствие платформы сервису, а не операции, поэтому вопрос, нужен ли для данной операции параметр resourceRealm, надо решать вне этой функции --->
|
||||
<cfargument name="resourceRealmId" type="numeric" required=true/>
|
||||
<cfargument name="usrId" type="numeric" required=true/>
|
||||
<cfargument name="instanceUid" type="guid" required=true/>
|
||||
<cfargument name="instanceUid" type="guid" required=true/>
|
||||
|
||||
<cfset var local={}/>
|
||||
<cfreturn/> <!--- *************** --->
|
||||
|
||||
<cfif NOT resourceRealmId GT 0>
|
||||
<cfthrow type="InvalidParamValue" message="resource realm undefined" detail="Не выбрана ресурсная платформа"/>
|
||||
<cfthrow type="InvalidParamValue" message="Resource realm undefined" detail="Не выбрана ресурсная платформа"/><!--- *** для многих операций она и не нужна --->
|
||||
</cfif>
|
||||
|
||||
Проверить соответствие сервису
|
||||
Проверить доступ (это предварительная проверка! настоящая проверка перед запуском операции)
|
||||
<cfquery name="local.qContract">
|
||||
select c.contract_id
|
||||
from instance e
|
||||
join specification_item si on (e.specification_item_id=si.specification_item_id)
|
||||
join specification s on (si.specification_id=s.specification_id)
|
||||
join contract c on (s.contract_id=c.contract_id)
|
||||
where e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceUid#" null=#!isValid("guid",arguments.instanceUid)#/>
|
||||
</cfquery>
|
||||
|
||||
<cfquery name="local.qCheckResourceRealmType">
|
||||
select r.resource_realm_type_id
|
||||
from resource_realm r
|
||||
join resource_realm_type t on (r.resource_realm_type_id=t.resource_realm_type_id)
|
||||
join svc s on (t.resource_realm_type_id=s.resource_realm_type_id)
|
||||
join instance e on (s.svc_id=e.service_id)
|
||||
where r.resource_realm_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.resourceRealmId# null=#!isValid("integer",arguments.resourceRealmId)#/>
|
||||
AND e.instance_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#arguments.instanceUid# null=#!isValid("guid", arguments.instanceUid)#/>
|
||||
</cfquery>
|
||||
<cfif local.qCheckResourceRealmType.recordCount EQ 0>
|
||||
<cfthrow type="InvalidParamValue" message="Resource realm does not match service" detail="Ресурсная платформа не соответствует сервису"/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="local.qCheckResourceRealmAccess">
|
||||
select r.resource_realm_id
|
||||
from resource_realm r
|
||||
join resource_realm_access a on (r.resource_realm_id=a.resource_realm_id)
|
||||
where r.resource_realm_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.resourceRealmId# null=#!isValid("integer",arguments.resourceRealmId)#/>
|
||||
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qContract.contract_id#/>
|
||||
OR a.contract_id=0)
|
||||
AND a.is_enabled
|
||||
</cfquery>
|
||||
|
||||
<cfif local.qCheckResourceRealmAccess.recordCount EQ 0>
|
||||
<cfthrow type="InvalidParamValue" message="Access to the resource realm denied for current contract" detail="У текущего договора id=#local.qContract.contract_id# нет доступа к выбранной ресурсной платформе"/>
|
||||
</cfif>
|
||||
<!---
|
||||
Проверить доступ (это предварительная проверка! настоящая проверка перед запуском операции)
|
||||
Итого: фильтрация выпадающего списка
|
||||
Проверка атрибута операции (из которого получается RFS параметр)
|
||||
Проверка RFS параметров перед запуском операции
|
||||
(Можно еще вставить параноидальную проверку при сабмите, когда мы формируем параметры запроса)
|
||||
(Можно еще вставить параноидальную проверку в cmdb-api, чтобы застраховаться от дефектов админки)
|
||||
--->
|
||||
<cfreturn/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<cffunction name="post" hint="Запуск выполнения операции">
|
||||
<cfargument name="instanceOperationUid" type="string" required=true hint="type:guid"/>
|
||||
|
||||
<cfset local={}/>
|
||||
<cfset var local={}/>
|
||||
<!--- <cfset local.instanceUid=#createGUID()#/> --->
|
||||
|
||||
<!--- *** Проверить наличие обязательных CFS параметров
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
<!---
|
||||
попытаемся проверить, не упала ли операция раньше времени
|
||||
при этом стараемся исключить эффект дребезга - если мы пошлем две команды на выполнение одну за другой, вторая не должна запуститься
|
||||
при этом стараемся исключить эффект дребезга или гонок - если мы пошлем две команды на выполнение одну за другой, вторая не должна запуститься
|
||||
перезапуск операции разрешен, если она зафейлилась либо явно (оркестратор ее пометил таковой) или неявно (джоб упал, не успев отметить операцию стартовавшей)
|
||||
Возможно, эту логику нужно воспроизвести на фронте
|
||||
--->
|
||||
@@ -78,7 +78,9 @@
|
||||
|
||||
<!--- ***** тут должен быть контроль доступа на уровне параметров. Желательно по максимуму параноидальный --->
|
||||
<!--- ***** или при сабмите. Может быть, и на уровне RFS параметров тоже --->
|
||||
<cfset generateRfsParams(arguments.instanceOperationUid, arguments.usrId, arguments.contragentId, arguments.contractId)/>
|
||||
<cfset generateRfsParams(arguments.instanceOperationUid, arguments.usrId, arguments.contragentId, arguments.contractId)/><!--- *** кроме usr_id остальные параметры избыточны - информация есть у инстанса --->
|
||||
|
||||
<cfset checkRfsResourceRealmAccess(arguments.instanceOperationUid)/>
|
||||
|
||||
<!--- **************************** --->
|
||||
<cfset submitJob(arguments.instanceOperationUid)/>
|
||||
@@ -107,7 +109,7 @@
|
||||
<cfargument name="contractId" type="numeric"/>
|
||||
|
||||
<cfquery name="qSvcOperation">
|
||||
select so.svc_operation_id, io.instance_uid, so.operation, r.resource_realm
|
||||
select so.svc_operation_id, io.instance_uid, so.operation, r.resource_realm, io.resource_realm_id
|
||||
from instance_operation io
|
||||
join instance e on (io.instance_uid=e.instance_uid)
|
||||
join svc_operation so on (e.service_id=so.svc_id AND io.operation=so.operation)
|
||||
@@ -118,12 +120,17 @@
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "instanceUid", qSvcOperation.instance_uid)/>
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "operationUid", arguments.instanceOperationUid)/>
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "modifierId", arguments.usrId)/>
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "resourceRealm", qSvcOperation.resource_realm)/>
|
||||
|
||||
|
||||
<cfif qSvcOperation.operation EQ "create"><!--- несколько костыльно --->
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "billingObject", "underconstruction")/>
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "contragentCode", getContragentCode(arguments.contragentId))/>
|
||||
</cfif>
|
||||
|
||||
<cfif listFind("create,redeploy",qSvcOperation.operation)>
|
||||
<cfset CreateObject("component", "instance_operation_ls").checkResourceRealmId(qSvcOperation.resource_realm_id, qSvcOperation.instance_uid)/>
|
||||
<cfset setInstanceOperationRfsParam(arguments.instanceOperationUid, "resourceRealm", qSvcOperation.resource_realm)/><!--- *** для остальных операций не передаем? --->
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qWriteRfsFromCfsParams">
|
||||
insert into instance_operation_param (instance_operation_uid,param,param_value)
|
||||
@@ -269,9 +276,10 @@
|
||||
|
||||
<!--- *** судя по всему, RFS параметр не обязан быть специфицирован на сервисе (никак не проверяется) --->
|
||||
<cffunction name="setInstanceOperationRfsParam">
|
||||
<cfargument name="instanceOperationUid" type="guid">
|
||||
<cfargument name="param"><!--- значение не должно содержать лишних пробелов, чувствительность к регистру определяется БД --->
|
||||
<cfargument name="val">
|
||||
<cfargument name="instanceOperationUid" type="guid"/>
|
||||
<cfargument name="param"/><!--- значение не должно содержать лишних пробелов, чувствительность к регистру определяется БД --->
|
||||
<cfargument name="val"/>
|
||||
|
||||
<cfquery name="qSaveRfsParam">
|
||||
insert into instance_operation_param (instance_operation_uid,param,param_value)
|
||||
values (
|
||||
@@ -325,5 +333,50 @@
|
||||
|
||||
<cfreturn #qContragentCode.external_code#/>
|
||||
</cffunction>
|
||||
|
||||
|
||||
<cffunction name="checkRfsResourceRealmAccess">
|
||||
<cfargument name="instanceOperationUid" type="guid">
|
||||
|
||||
<cfset var local={}/>
|
||||
|
||||
<cfquery name="local.qOperation">
|
||||
select io.operation
|
||||
from instance_operation io
|
||||
where io.instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationUid#" null=#!isValid("guid",arguments.instanceOperationUid)#/>
|
||||
</cfquery>
|
||||
|
||||
<cfif !listFind("create,redeploy", local.qOperation.operation)>
|
||||
<cfreturn/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="local.qContract">
|
||||
select c.contract_id
|
||||
from instance_operation io
|
||||
join instance e on (io.instance_uid=e.instance_uid)
|
||||
join specification_item si on (e.specification_item_id=si.specification_item_id)
|
||||
join specification s on (si.specification_id=s.specification_id)
|
||||
join contract c on (s.contract_id=c.contract_id)
|
||||
where io.instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationUid#" null=#!isValid("guid",arguments.instanceOperationUid)#/>
|
||||
</cfquery>
|
||||
|
||||
<!--- пробегаемся по RFS параметрам данной операции--->
|
||||
<cfquery name="local.qCheckResourceRealmAccess">
|
||||
select r.resource_realm_id, r.resource_realm, iop.param, iop.param_value, a.contract_id, a.is_enabled
|
||||
from resource_realm r
|
||||
join resource_realm_access a on (r.resource_realm_id=a.resource_realm_id)
|
||||
join instance_operation_param iop on (r.resource_realm=iop.param_value AND iop.param='resourceRealm')
|
||||
where iop.instance_operation_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#arguments.instanceOperationUid#" null=#!isValid("guid",arguments.instanceOperationUid)#/>
|
||||
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#local.qContract.contract_id# null=#!isValid("integer",local.qContract.contract_id)#/> OR a.contract_id=0)
|
||||
AND a.is_enabled
|
||||
</cfquery>
|
||||
|
||||
<cfif local.qCheckResourceRealmAccess.recordCount EQ 0>
|
||||
<cfthrow message="resource realm specified in RFS params is not available for current contract" detail="resource realm unawailable. Instance operation UID #arguments.instanceOperationUid#. Contract ID #arguments.contractId#"/>
|
||||
<cfelse>
|
||||
<!--- <cfdump var=#local.qCheckResourceRealmAccess#/><cfabort/> --->
|
||||
<!--- <cfthrow detail="wefwewewewewewer2r24"/> --->
|
||||
</cfif>
|
||||
</cffunction>
|
||||
|
||||
</cfcomponent>
|
||||
@@ -16,7 +16,7 @@
|
||||
}
|
||||
/>
|
||||
|
||||
<cffunction name="get" hint="Список ресурсных платформ (пока без разделения доступа)">
|
||||
<cffunction name="get" hint="Список ресурсных платформ">
|
||||
<cfargument name="pageSize" type="string" hint="type:integer" default=100/>
|
||||
<cfargument name="page" type="string" hint="type:integer" default="1"/>
|
||||
<cfargument name="orderBy" type="string" hint="type:string, description:comma-separated list of fields to sort by, example:fld1.ASC,fld2.DESC,fld3.ASC" default=""/>
|
||||
@@ -67,7 +67,8 @@
|
||||
left outer join resource_realm p on (r.parent_id=p.resource_realm_id)
|
||||
join resource_realm_access a on
|
||||
(r.resource_realm_id=a.resource_realm_id
|
||||
AND a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
AND (a.contract_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#arguments.contractId#/>
|
||||
OR a.contract_id=0)
|
||||
AND a.is_enabled)
|
||||
where 1=1 <m:filter_build filter=#filter#/>
|
||||
order by <m:order_build sortCollection=#this.helper.parseNumericOrder(local.titleMap, arguments.orderBy)# fieldCount=0/><!---no sort length limit--->
|
||||
|
||||
Reference in New Issue
Block a user