7171import com .cloud .utils .db .Filter ;
7272import com .cloud .utils .db .SearchBuilder ;
7373import com .cloud .utils .db .SearchCriteria ;
74+ import com .cloud .utils .db .Transaction ;
75+ import com .cloud .utils .db .TransactionCallback ;
7476import com .cloud .vm .InstanceGroupVMMapVO ;
7577import com .cloud .vm .InstanceGroupVO ;
7678import com .cloud .vm .UserVmVO ;
@@ -200,9 +202,11 @@ public InstanceBootGroup createInstanceBootGroup(CreateInstanceBootGroupCmd cmd)
200202 @ ActionEvent (eventType = EventTypes .EVENT_INSTANCE_BOOT_GROUP_DELETE , eventDescription = "deleting Instance Boot Group" )
201203 public boolean deleteInstanceBootGroup (DeleteInstanceBootGroupCmd cmd ) {
202204 InstanceBootGroupVO group = getGroupAndCheckAccess (cmd .getId ());
203- instanceBootGroupMemberDao .deleteByBootGroupId (group .getId ());
204- instanceBootGroupDao .remove (group .getId ());
205- return true ;
205+ return Transaction .execute ((TransactionCallback <Boolean >) status -> {
206+ instanceBootGroupMemberDao .deleteByBootGroupId (group .getId ());
207+ instanceBootGroupDao .remove (group .getId ());
208+ return true ;
209+ });
206210 }
207211
208212 @ Override
@@ -301,29 +305,14 @@ public InstanceBootGroupMember addMemberToInstanceBootGroup(AddMemberToInstanceB
301305 InstanceBootGroupMember .MemberType memberType ;
302306 long memberId ;
303307
304- if (cmd .getVirtualMachineId () != null && cmd .getInstanceGroupId () != null ) {
305- throw new InvalidParameterValueException ("Only one of virtualmachineid or instancegroupid may be specified" );
306- }
307- if (cmd .getVirtualMachineId () == null && cmd .getInstanceGroupId () == null ) {
308- throw new InvalidParameterValueException ("Either virtualmachineid or instancegroupid must be specified" );
309- }
308+ validateEitherVirtualMachineIdOrInstanceGroupIdParam (cmd .getVirtualMachineId (), cmd .getInstanceGroupId ());
310309
311310 if (cmd .getVirtualMachineId () != null ) {
312- UserVm vm = userVmDao .findById (cmd .getVirtualMachineId ());
313- if (vm == null ) {
314- throw new InvalidParameterValueException ("Unable to find virtual machine with ID: " + cmd .getVirtualMachineId ());
315- }
316- validateMemberAccount (vm .getAccountId (), group .getAccountId ());
317- instanceBootGroupMembershipGuard .validateVmEligibleForGroupMembership (vm .getId ());
311+ UserVm vm = getValidatedVmForAddMember (group , cmd .getVirtualMachineId ());
318312 memberType = InstanceBootGroupMember .MemberType .VirtualMachine ;
319313 memberId = vm .getId ();
320314 } else {
321- InstanceGroupVO instanceGroup = instanceGroupDao .findById (cmd .getInstanceGroupId ());
322- if (instanceGroup == null || instanceGroup .getRemoved () != null ) {
323- throw new InvalidParameterValueException ("Unable to find instance group with ID: " + cmd .getInstanceGroupId ());
324- }
325- validateMemberAccount (instanceGroup .getAccountId (), group .getAccountId ());
326- instanceBootGroupMembershipGuard .validateInstanceGroupEligibleForBootGroupMembership (instanceGroup .getId ());
315+ InstanceGroupVO instanceGroup = getValidatedInstanceGroupAddMember (group , cmd .getInstanceGroupId ());
327316 memberType = InstanceBootGroupMember .MemberType .InstanceGroup ;
328317 memberId = instanceGroup .getId ();
329318 }
@@ -336,6 +325,37 @@ public InstanceBootGroupMember addMemberToInstanceBootGroup(AddMemberToInstanceB
336325 return instanceBootGroupMemberDao .persist (member );
337326 }
338327
328+ @ NotNull
329+ private UserVm getValidatedVmForAddMember (InstanceBootGroupVO group , long virtualMachineId ) {
330+ UserVm vm = userVmDao .findById (virtualMachineId );
331+ if (vm == null ) {
332+ throw new InvalidParameterValueException ("Unable to find virtual machine with ID: " + virtualMachineId );
333+ }
334+ validateMemberAccount (vm .getAccountId (), group .getAccountId ());
335+ instanceBootGroupMembershipGuard .validateVmEligibleForGroupMembership (vm .getId ());
336+ return vm ;
337+ }
338+
339+ @ NotNull
340+ private InstanceGroupVO getValidatedInstanceGroupAddMember (InstanceBootGroupVO group , long instanceGroupId ) {
341+ InstanceGroupVO instanceGroup = instanceGroupDao .findById (instanceGroupId );
342+ if (instanceGroup == null || instanceGroup .getRemoved () != null ) {
343+ throw new InvalidParameterValueException ("Unable to find instance group with ID: " + instanceGroupId );
344+ }
345+ validateMemberAccount (instanceGroup .getAccountId (), group .getAccountId ());
346+ instanceBootGroupMembershipGuard .validateInstanceGroupEligibleForBootGroupMembership (instanceGroup .getId ());
347+ return instanceGroup ;
348+ }
349+
350+ protected static void validateEitherVirtualMachineIdOrInstanceGroupIdParam (Long virtualMachineId , Long instanceGroupId ) {
351+ if (virtualMachineId != null && instanceGroupId != null ) {
352+ throw new InvalidParameterValueException ("Only one of virtualmachineid or instancegroupid may be specified" );
353+ }
354+ if (virtualMachineId == null && instanceGroupId == null ) {
355+ throw new InvalidParameterValueException ("Either virtualmachineid or instancegroupid must be specified" );
356+ }
357+ }
358+
339359 @ Override
340360 @ ActionEvent (eventType = EventTypes .EVENT_INSTANCE_BOOT_GROUP_MEMBER_REMOVE , eventDescription = "removing Instance Boot Group member" )
341361 public boolean removeInstanceBootGroupMember (RemoveInstanceBootGroupMemberCmd cmd ) {
@@ -458,7 +478,7 @@ private InstanceBootGroupMemberResponse createInstanceBootGroupMemberResponse(In
458478 response .setOrder (member .getOrder ());
459479 response .setCreated (member .getCreated ());
460480
461- List <Long > childVmIds = null ;
481+ List <Long > childVmIds = new ArrayList <>() ;
462482 if (member .getMemberType () == InstanceBootGroupMember .MemberType .VirtualMachine ) {
463483 UserVmVO vm = userVmDao .findById (member .getMemberId ());
464484 if (vm != null ) {
@@ -659,12 +679,7 @@ private void validateMemberAccount(long memberAccountId, long groupAccountId) {
659679 * on the resolved item (in addition to the boot group, already checked via getGroupAndCheckAccess).
660680 */
661681 private Pair <InstanceBootGroupMember .MemberType , Long > resolveAndCheckAccessToItem (Long virtualMachineId , Long instanceGroupId ) {
662- if (virtualMachineId != null && instanceGroupId != null ) {
663- throw new InvalidParameterValueException ("Only one of virtualmachineid or instancegroupid may be specified" );
664- }
665- if (virtualMachineId == null && instanceGroupId == null ) {
666- throw new InvalidParameterValueException ("Either virtualmachineid or instancegroupid must be specified" );
667- }
682+ validateEitherVirtualMachineIdOrInstanceGroupIdParam (virtualMachineId , instanceGroupId );
668683
669684 Account caller = CallContext .current ().getCallingAccount ();
670685 if (virtualMachineId != null ) {
@@ -730,44 +745,35 @@ public boolean deleteInstanceBootGroupReadinessRule(DeleteInstanceBootGroupReadi
730745 public ListResponse <InstanceBootGroupReadinessRuleResponse > listInstanceBootGroupReadinessRules (ListInstanceBootGroupReadinessRulesCmd cmd ) {
731746 getGroupAndCheckAccess (cmd .getBootGroupId ());
732747
733- SearchBuilder <InstanceBootGroupReadinessRuleVO > sb = instanceBootGroupReadinessRuleDao .createSearchBuilder ();
734- sb .and ("bootGroupId" , sb .entity ().getBootGroupId (), SearchCriteria .Op .EQ );
735- sb .and ("id" , sb .entity ().getId (), SearchCriteria .Op .EQ );
736- sb .and ("itemType" , sb .entity ().getItemType (), SearchCriteria .Op .EQ );
737- sb .and ("itemId" , sb .entity ().getItemId (), SearchCriteria .Op .EQ );
738- sb .and ("ruleType" , sb .entity ().getRuleType (), SearchCriteria .Op .EQ );
739- sb .and ("keyword" , sb .entity ().getName (), SearchCriteria .Op .LIKE );
740- sb .done ();
741-
742- SearchCriteria <InstanceBootGroupReadinessRuleVO > sc = sb .create ();
743- sc .setParameters ("bootGroupId" , cmd .getBootGroupId ());
744- if (cmd .getId () != null ) {
745- sc .setParameters ("id" , cmd .getId ());
746- }
747748 if (cmd .getVirtualMachineId () != null && cmd .getInstanceGroupId () != null ) {
748749 throw new InvalidParameterValueException ("Only one of virtualmachineid or instancegroupid may be specified" );
749750 }
750- if (cmd .getVirtualMachineId () != null ) {
751- sc .setParameters ("itemType" , InstanceBootGroupMember .MemberType .VirtualMachine );
752- sc .setParameters ("itemId" , cmd .getVirtualMachineId ());
753- } else if (cmd .getInstanceGroupId () != null ) {
754- sc .setParameters ("itemType" , InstanceBootGroupMember .MemberType .InstanceGroup );
755- sc .setParameters ("itemId" , cmd .getInstanceGroupId ());
756- }
757- InstanceBootGroupReadinessRule .RuleType ruleTypeFilter = null ;
751+ InstanceBootGroupReadinessRule .RuleType ruleType = null ;
758752 if (cmd .getRuleType () != null ) {
759- ruleTypeFilter = EnumUtils .getEnumIgnoreCase (InstanceBootGroupReadinessRule .RuleType .class , cmd .getRuleType ());
760- if (ruleTypeFilter == null ) {
753+ ruleType = EnumUtils .getEnumIgnoreCase (InstanceBootGroupReadinessRule .RuleType .class , cmd .getRuleType ());
754+ if (ruleType == null ) {
761755 throw new InvalidParameterValueException ("Invalid rule type: " + cmd .getRuleType ());
762756 }
763- sc .setParameters ("ruleType" , ruleTypeFilter );
764- }
765- if (cmd .getKeyword () != null ) {
766- sc .setParameters ("keyword" , "%" + cmd .getKeyword () + "%" );
767757 }
768758
769- Filter searchFilter = new Filter (InstanceBootGroupReadinessRuleVO .class , "id" , true , cmd .getStartIndex (), cmd .getPageSizeVal ());
770- Pair <List <InstanceBootGroupReadinessRuleVO >, Integer > rulesAndCount = instanceBootGroupReadinessRuleDao .searchAndCount (sc , searchFilter );
759+ InstanceBootGroupMember .MemberType memberType = null ;
760+ Long memberId = null ;
761+ if (cmd .getVirtualMachineId () != null ) {
762+ memberType = InstanceBootGroupMember .MemberType .VirtualMachine ;
763+ memberId = cmd .getVirtualMachineId ();
764+ } else if (cmd .getInstanceGroupId () != null ) {
765+ memberType = InstanceBootGroupMember .MemberType .InstanceGroup ;
766+ memberId = cmd .getInstanceGroupId ();
767+ }
768+ Pair <List <InstanceBootGroupReadinessRuleVO >, Integer > rulesAndCount = instanceBootGroupReadinessRuleDao .searchAndCountByBootGroupId (
769+ cmd .getBootGroupId (),
770+ cmd .getId (),
771+ memberType ,
772+ memberId ,
773+ ruleType ,
774+ cmd .getKeyword (),
775+ cmd .getStartIndex (),
776+ cmd .getPageSizeVal ());
771777
772778 List <InstanceBootGroupReadinessRuleResponse > responsesList = rulesAndCount .first ().stream ()
773779 .map (rule -> createInstanceBootGroupReadinessRuleResponse (rule , false , 0 ))
@@ -776,7 +782,7 @@ public ListResponse<InstanceBootGroupReadinessRuleResponse> listInstanceBootGrou
776782
777783 if (cmd .getId () == null && cmd .getVirtualMachineId () != null ) {
778784 for (InstanceBootGroupReadinessRule rule : instanceBootGroupReadinessRuleService .findInheritedGroupRules (cmd .getBootGroupId (), cmd .getVirtualMachineId ())) {
779- if (ruleTypeFilter != null && rule .getRuleType () != ruleTypeFilter ) {
785+ if (ruleType != null && rule .getRuleType () != ruleType ) {
780786 continue ;
781787 }
782788 if (cmd .getKeyword () != null && (rule .getName () == null || !rule .getName ().toLowerCase ().contains (cmd .getKeyword ().toLowerCase ()))) {
0 commit comments