@@ -5618,41 +5618,76 @@ public Outcome<VirtualMachine> addVmToNetworkThroughJobQueue(
56185618
56195619 final List <VmWorkJobVO > pendingWorkJobs = _workJobDao .listPendingWorkJobs (
56205620 VirtualMachine .Type .Instance , vm .getId (),
5621- VmWorkAddVmToNetwork .class .getName (), String . valueOf ( network .getId () ));
5621+ VmWorkAddVmToNetwork .class .getName (), network .getUuid ( ));
56225622
56235623 VmWorkJobVO workJob = null ;
56245624 if (pendingWorkJobs != null && pendingWorkJobs .size () > 0 ) {
56255625 if (s_logger .isTraceEnabled ()) {
56265626 s_logger .trace (String .format ("number of add nic jobs for vm %s are %d" , vm , pendingWorkJobs .size ()));
56275627 }
5628- assert pendingWorkJobs .size () == 1 ;
5629- workJob = pendingWorkJobs .get (0 );
5628+ workJob = fetchOrCreateVmWorkJobToAddNetwokr (vm , network , requested , context , user , account , pendingWorkJobs );
56305629 } else {
56315630 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 ));
56335632 }
56345633
5635- workJob = new VmWorkJobVO (context .getContextId ());
5634+ workJob = createVmWorkJobToAddNetwork (vm , network , requested , context , user , account );
5635+ }
5636+ AsyncJobExecutionContext .getCurrentExecutionContext ().joinJob (workJob .getId ());
56365637
5637- workJob . setDispatcher ( VmWorkConstants . VM_WORK_JOB_DISPATCHER );
5638- workJob . setCmd ( VmWorkAddVmToNetwork . class . getName ());
5638+ return new VmJobVirtualMachineOutcome ( workJob , vm . getId () );
5639+ }
56395640
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+ }
56455663
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 ());
56505673
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 ());
56545676
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 ;
56565691 }
56575692
56585693 public Outcome <VirtualMachine > removeNicFromVmThroughJobQueue (
0 commit comments