@@ -42,6 +42,8 @@ class AdapterRpc extends Adapter
4242
4343 public const TYPE_MAP = 'java.util.LinkedHashMap ' ;
4444
45+ private const DEBUG_PREFIX = 'perun:AdapterRpc - ' ;
46+
4547 protected $ connector ;
4648
4749 private $ rpcUrl ;
@@ -649,69 +651,134 @@ public function getMemberStatusByUserAndVo($user, $vo)
649651 return $ member ->getStatus ();
650652 }
651653
652- public function getResourceCapabilities ($ entityId , $ userGroups , $ entityIdAttr = ' perunFacilityAttr_entityID ' )
654+ public function getResourceCapabilities (string $ spEntityId , array $ userGroups , string $ entityIdAttr): array
653655 {
654- $ facility = $ this ->getFacilityByEntityId ($ entityId , $ entityIdAttr );
656+ if (empty ($ spEntityId )) {
657+ Logger::warning (
658+ self ::DEBUG_PREFIX . 'getResourceCapabilities - empty spEntityId provided, returning empty list of resource capabilities. '
659+ );
660+ return [];
661+ } elseif (empty ($ userGroups )) {
662+ Logger::warning (
663+ self ::DEBUG_PREFIX . 'getResourceCapabilities - empty userGroups provided, returning empty list of resource capabilities. '
664+ );
665+ return [];
666+ }
655667
656- if ($ facility === null ) {
668+ $ facility = $ this ->getFacilityByEntityId ($ spEntityId , $ entityIdAttr );
669+ if ($ facility === null || $ facility ->getId () === null ) {
670+ Logger::warning (
671+ self ::DEBUG_PREFIX . sprintf (
672+ 'getResourceCapabilities - no facility (or facility with null ID) found four EntityID \'%s \', returning empty list of resource capabilities. ' ,
673+ $ spEntityId
674+ )
675+ );
657676 return [];
658677 }
659678
660- $ resources = $ this ->connector ->get ('facilitiesManager ' , 'getAssignedResources ' , [
661- 'facility ' => $ facility ->getId (),
662- ]);
679+ $ resources = $ this ->getAssignedResources ($ facility ->getId ());
680+ if (empty ($ resources )) {
681+ Logger::debug (
682+ self ::DEBUG_PREFIX . sprintf (
683+ 'getResourceCapabilities - no resources found for SP with EntityID \'%s \', returning empty list of resource capabilities. ' ,
684+ $ spEntityId
685+ )
686+ );
687+ return [];
688+ }
663689
664690 $ userGroupsIds = [];
665691 foreach ($ userGroups as $ userGroup ) {
666- array_push ($ userGroupsIds , $ userGroup ->getId ());
692+ if ($ userGroup === null || $ userGroup ->getId () === null ) {
693+ Logger::debug (
694+ self ::DEBUG_PREFIX . 'getResourceCapabilities - skipping user group due to null group or null group ID. '
695+ );
696+ continue ;
697+ }
698+ $ userGroupsIds [] = $ userGroup ->getId ();
667699 }
668700
669701 $ capabilities = [];
670702 foreach ($ resources as $ resource ) {
671- $ resourceGroups = $ this ->connector ->get ('resourcesManager ' , 'getAssignedGroups ' , [
703+ if ($ resource === null || $ resource ->getId () === null ) {
704+ Logger::debug (
705+ self ::DEBUG_PREFIX . 'getResourceCapabilities - skipping resource due to null resource or null resource ID. '
706+ );
707+ continue ;
708+ }
709+ $ resourceCapabilities = $ this ->connector ->get ('attributesManager ' , 'getAttribute ' , [
672710 'resource ' => $ resource ['id ' ],
711+ 'attributeName ' => 'urn:perun:resource:attribute-def:def:capabilities ' ,
673712 ]);
674713
675- $ resourceCapabilities = $ this ->connector ->get ('attributesManager ' , 'getAttribute ' , [
714+ if (empty ($ resourceCapabilities ['value ' ])) {
715+ Logger::debug (
716+ self ::DEBUG_PREFIX . 'getResourceCapabilities - skipping resource due to empty capabilities. '
717+ );
718+ continue ;
719+ }
720+ $ resourceCapabilities = $ resourceCapabilities ['value ' ];
721+
722+ $ resourceGroups = $ this ->connector ->get ('resourcesManager ' , 'getAssignedGroups ' , [
676723 'resource ' => $ resource ['id ' ],
677- 'attributeName ' => 'urn:perun:resource:attribute-def:def:capabilities ' ,
678- ])['value ' ];
724+ ]);
679725
680- if ($ resourceCapabilities === null ) {
726+ if (empty ( $ resourceGroups ) ) {
681727 continue ;
682728 }
683729
684730 foreach ($ resourceGroups as $ resourceGroup ) {
731+ if (($ resourceGroup ['id ' ] ?? null ) === null ) {
732+ Logger::debug (
733+ self ::DEBUG_PREFIX . 'getResourceCapabilities - skipping resource group due to missing group ID. '
734+ );
735+ continue ;
736+ }
685737 if (in_array ($ resourceGroup ['id ' ], $ userGroupsIds , true )) {
686- foreach ($ resourceCapabilities as $ capability ) {
687- array_push ($ capabilities , $ capability );
688- }
738+ $ capabilities = array_merge ($ capabilities , $ resourceCapabilities );
689739 break ;
690740 }
691741 }
692742 }
693743
694- return $ capabilities ;
744+ return array_values ( array_unique ( $ capabilities)) ;
695745 }
696746
697- public function getFacilityCapabilities ($ entityId , $ entityIdAttr = ' perunFacilityAttr_entityID ' )
747+ public function getFacilityCapabilities (string $ spEntityId , string $ entityIdAttr): array
698748 {
699- $ facility = $ this ->getFacilityByEntityId ($ entityId , $ entityIdAttr );
749+ if (empty ($ spEntityId )) {
750+ Logger::warning (
751+ self ::DEBUG_PREFIX . 'getFacilityCapabilities - empty spEntityId provided, returning empty list of facility capabilities. '
752+ );
753+ return [];
754+ }
755+ $ facility = $ this ->getFacilityByEntityId ($ spEntityId , $ entityIdAttr );
700756
701757 if ($ facility === null ) {
758+ Logger::warning (
759+ self ::DEBUG_PREFIX . sprintf (
760+ 'getFacilityCapabilities - no facility found four EntityID \'%s \', returning empty list of facility capabilities. ' ,
761+ $ spEntityId
762+ )
763+ );
702764 return [];
703765 }
704766
705767 $ facilityCapabilities = $ this ->connector ->get ('attributesManager ' , 'getAttribute ' , [
706768 'facility ' => $ facility ->getId (),
707769 'attributeName ' => 'urn:perun:facility:attribute-def:def:capabilities ' ,
708- ])[ ' value ' ] ;
770+ ]);
709771
710- if (empty ($ facilityCapabilities )) {
711- $ facilityCapabilities = [];
772+ if (empty ($ facilityCapabilities ['value ' ])) {
773+ Logger::debug (
774+ self ::DEBUG_PREFIX . 'getFacilityCapabilities - empty or missing value of facility capabilities attribute detected, returning empty list of facility capabilities. '
775+ );
776+ return [];
712777 }
713-
714- return $ facilityCapabilities ;
778+ if (!is_array ($ facilityCapabilities ['value ' ])) {
779+ $ facilityCapabilities ['value ' ] = [$ facilityCapabilities ['value ' ]];
780+ }
781+ return array_values (array_unique ($ facilityCapabilities ['value ' ]));
715782 }
716783
717784 public function getAttributesDefinition ()
@@ -749,4 +816,15 @@ private function getAttributes($perunAttrs, $attrNamesMap)
749816
750817 return $ attributes ;
751818 }
819+
820+ private function getAssignedResources (int $ facilityId ): array
821+ {
822+ $ perunResources = $ this ->connector ->get ('facilitiesManager ' , 'getAssignedResources ' , [
823+ 'facility ' => $ facilityId ,
824+ ]);
825+
826+ return empty ($ perunResources ) ? [] : array_map (function ($ resource ) {
827+ return new Resource ($ resource ['id ' ], $ resource ['voId ' ], $ resource ['facilityId ' ], $ resource ['name ' ]);
828+ }, array_filter ($ perunResources ));
829+ }
752830}
0 commit comments