@@ -5618,41 +5618,76 @@ public Outcome<VirtualMachine> addVmToNetworkThroughJobQueue(
5618
5618
5619
5619
final List <VmWorkJobVO > pendingWorkJobs = _workJobDao .listPendingWorkJobs (
5620
5620
VirtualMachine .Type .Instance , vm .getId (),
5621
- VmWorkAddVmToNetwork .class .getName (), String . valueOf ( network .getId () ));
5621
+ VmWorkAddVmToNetwork .class .getName (), network .getUuid ( ));
5622
5622
5623
5623
VmWorkJobVO workJob = null ;
5624
5624
if (pendingWorkJobs != null && pendingWorkJobs .size () > 0 ) {
5625
5625
if (s_logger .isTraceEnabled ()) {
5626
5626
s_logger .trace (String .format ("number of add nic jobs for vm %s are %d" , vm , pendingWorkJobs .size ()));
5627
5627
}
5628
- assert pendingWorkJobs .size () == 1 ;
5629
- workJob = pendingWorkJobs .get (0 );
5628
+ workJob = fetchOrCreateVmWorkJobToAddNetwokr (vm , network , requested , context , user , account , pendingWorkJobs );
5630
5629
} else {
5631
5630
if (s_logger .isTraceEnabled ()) {
5632
- s_logger .trace (String .format ("no add nic jobs for vm %s yet" , vm ));
5631
+ s_logger .trace (String .format ("no add- nic jobs for vm %s yet" , vm ));
5633
5632
}
5634
5633
5635
- workJob = new VmWorkJobVO (context .getContextId ());
5634
+ workJob = createVmWorkJobToAddNetwork (vm , network , requested , context , user , account );
5635
+ }
5636
+ AsyncJobExecutionContext .getCurrentExecutionContext ().joinJob (workJob .getId ());
5636
5637
5637
- workJob . setDispatcher ( VmWorkConstants . VM_WORK_JOB_DISPATCHER );
5638
- workJob . setCmd ( VmWorkAddVmToNetwork . class . getName ());
5638
+ return new VmJobVirtualMachineOutcome ( workJob , vm . getId () );
5639
+ }
5639
5640
5640
- workJob .setAccountId (account .getId ());
5641
- workJob .setUserId (user .getId ());
5642
- workJob .setVmType (VirtualMachine .Type .Instance );
5643
- workJob .setVmInstanceId (vm .getId ());
5644
- workJob .setRelated (AsyncJobExecutionContext .getOriginJobId ());
5641
+ private VmWorkJobVO fetchOrCreateVmWorkJobToAddNetwokr (
5642
+ VirtualMachine vm ,
5643
+ Network network ,
5644
+ NicProfile requested ,
5645
+ CallContext context ,
5646
+ User user ,
5647
+ Account account ,
5648
+ List <VmWorkJobVO > pendingWorkJobs ) {
5649
+ VmWorkJobVO workJob = null ;
5650
+ for (VmWorkJobVO job : pendingWorkJobs ) {
5651
+ if (network .getUuid ().equals (job .getSecondaryKey ())) {
5652
+ if (s_logger .isTraceEnabled ()) {
5653
+ s_logger .trace (String .format ("a similar job found for vm %s" , vm ));
5654
+ }
5655
+ workJob = job ;
5656
+ }
5657
+ }
5658
+ if (workJob == null ) {
5659
+ workJob = createVmWorkJobToAddNetwork (vm , network , requested , context , user , account );
5660
+ }
5661
+ return workJob ;
5662
+ }
5645
5663
5646
- // save work context info (there are some duplications)
5647
- final VmWorkAddVmToNetwork workInfo = new VmWorkAddVmToNetwork (user .getId (), account .getId (), vm .getId (),
5648
- VirtualMachineManagerImpl .VM_WORK_JOB_HANDLER , network .getId (), requested );
5649
- workJob .setCmdInfo (VmWorkSerializer .serialize (workInfo ));
5664
+ private VmWorkJobVO createVmWorkJobToAddNetwork (
5665
+ VirtualMachine vm ,
5666
+ Network network ,
5667
+ NicProfile requested ,
5668
+ CallContext context ,
5669
+ User user ,
5670
+ Account account ) {
5671
+ VmWorkJobVO workJob ;
5672
+ workJob = new VmWorkJobVO (context .getContextId ());
5650
5673
5651
- _jobMgr .submitAsyncJob (workJob , VmWorkConstants .VM_WORK_QUEUE , vm .getId ());
5652
- }
5653
- AsyncJobExecutionContext .getCurrentExecutionContext ().joinJob (workJob .getId ());
5674
+ workJob .setDispatcher (VmWorkConstants .VM_WORK_JOB_DISPATCHER );
5675
+ workJob .setCmd (VmWorkAddVmToNetwork .class .getName ());
5654
5676
5655
- return new VmJobVirtualMachineOutcome (workJob , vm .getId ());
5677
+ workJob .setAccountId (account .getId ());
5678
+ workJob .setUserId (user .getId ());
5679
+ workJob .setVmType (VirtualMachine .Type .Instance );
5680
+ workJob .setVmInstanceId (vm .getId ());
5681
+ workJob .setRelated (AsyncJobExecutionContext .getOriginJobId ());
5682
+ workJob .setSecondaryKey (network .getUuid ());
5683
+
5684
+ // save work context info (there are some duplications)
5685
+ final VmWorkAddVmToNetwork workInfo = new VmWorkAddVmToNetwork (user .getId (), account .getId (), vm .getId (),
5686
+ VirtualMachineManagerImpl .VM_WORK_JOB_HANDLER , network .getId (), requested );
5687
+ workJob .setCmdInfo (VmWorkSerializer .serialize (workInfo ));
5688
+
5689
+ _jobMgr .submitAsyncJob (workJob , VmWorkConstants .VM_WORK_QUEUE , vm .getId ());
5690
+ return workJob ;
5656
5691
}
5657
5692
5658
5693
public Outcome <VirtualMachine > removeNicFromVmThroughJobQueue (
0 commit comments