4040import javax .inject .Inject ;
4141import javax .naming .ConfigurationException ;
4242
43+ import com .cloud .api .query .dao .UserVmJoinDao ;
44+ import com .cloud .api .query .vo .UserVmJoinVO ;
4345import com .cloud .deployasis .dao .UserVmDeployAsIsDetailsDao ;
4446import org .apache .cloudstack .affinity .dao .AffinityGroupVMMapDao ;
4547import org .apache .cloudstack .api .ApiConstants ;
166168import com .cloud .hypervisor .HypervisorGuruManager ;
167169import com .cloud .network .Network ;
168170import com .cloud .network .NetworkModel ;
171+ import com .cloud .network .Networks ;
169172import com .cloud .network .dao .NetworkDao ;
170173import com .cloud .network .dao .NetworkDetailVO ;
171174import com .cloud .network .dao .NetworkDetailsDao ;
176179import com .cloud .offering .DiskOfferingInfo ;
177180import com .cloud .offering .NetworkOffering ;
178181import com .cloud .offering .ServiceOffering ;
182+ import com .cloud .offerings .NetworkOfferingVO ;
183+ import com .cloud .offerings .dao .NetworkOfferingDao ;
179184import com .cloud .offerings .dao .NetworkOfferingDetailsDao ;
180185import com .cloud .org .Cluster ;
181186import com .cloud .resource .ResourceManager ;
@@ -347,6 +352,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
347352 private SecurityGroupManager _securityGroupManager ;
348353 @ Inject
349354 private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao ;
355+ @ Inject
356+ private UserVmJoinDao userVmJoinDao ;
357+ @ Inject
358+ private NetworkOfferingDao networkOfferingDao ;
350359
351360 VmWorkJobHandlerProxy _jobHandlerProxy = new VmWorkJobHandlerProxy (this );
352361
@@ -1244,6 +1253,10 @@ public void orchestrateStart(final String vmUuid, final Map<VirtualMachineProfil
12441253 }
12451254 StopCommand stopCmd = new StopCommand (vm , getExecuteInSequence (vm .getHypervisorType ()), false );
12461255 stopCmd .setControlIp (getControlNicIpForVM (vm ));
1256+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
1257+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
1258+ stopCmd .setVlanToPersistenceMap (vlanToPersistenceMap );
1259+ }
12471260 final StopCommand cmd = stopCmd ;
12481261 final Answer answer = _agentMgr .easySend (destHostId , cmd );
12491262 if (answer != null && answer instanceof StopAnswer ) {
@@ -1640,7 +1653,11 @@ private List<Map<String, String>> getVolumesToDisconnect(VirtualMachine vm) {
16401653
16411654 protected boolean sendStop (final VirtualMachineGuru guru , final VirtualMachineProfile profile , final boolean force , final boolean checkBeforeCleanup ) {
16421655 final VirtualMachine vm = profile .getVirtualMachine ();
1656+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
16431657 StopCommand stpCmd = new StopCommand (vm , getExecuteInSequence (vm .getHypervisorType ()), checkBeforeCleanup );
1658+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
1659+ stpCmd .setVlanToPersistenceMap (vlanToPersistenceMap );
1660+ }
16441661 stpCmd .setControlIp (getControlNicIpForVM (vm ));
16451662 stpCmd .setVolumesToDisconnect (getVolumesToDisconnect (vm ));
16461663 final StopCommand stop = stpCmd ;
@@ -1827,6 +1844,26 @@ private void orchestrateStop(final String vmUuid, final boolean cleanUpEvenIfUna
18271844 advanceStop (vm , cleanUpEvenIfUnableToStop );
18281845 }
18291846
1847+ private Map <String , Boolean > getVlanToPersistenceMapForVM (long vmId ) {
1848+ List <UserVmJoinVO > userVmJoinVOS = userVmJoinDao .searchByIds (vmId );
1849+ Map <String , Boolean > vlanToPersistenceMap = new HashMap <>();
1850+ for (UserVmJoinVO userVmJoinVO : userVmJoinVOS ) {
1851+ NetworkVO networkVO = _networkDao .findById (userVmJoinVO .getNetworkId ());
1852+ NetworkOfferingVO offeringVO = networkOfferingDao .findById (networkVO .getNetworkOfferingId ());
1853+ Pair <String , Boolean > data = getVMNetworkDetails (networkVO , offeringVO .isPersistent ());
1854+ vlanToPersistenceMap .put (data .first (), data .second ());
1855+ }
1856+ return vlanToPersistenceMap ;
1857+ }
1858+
1859+ private Pair <String , Boolean > getVMNetworkDetails (NetworkVO networkVO , boolean isPersistent ) {
1860+ URI broadcastUri = networkVO .getBroadcastUri ();
1861+ String scheme = broadcastUri .getScheme ();
1862+ String vlanId = Networks .BroadcastDomainType .getValue (broadcastUri );
1863+ Boolean shouldDelete = !((networkVO .getGuestType () == Network .GuestType .L2 || networkVO .getGuestType () == Network .GuestType .Isolated ) && scheme .equalsIgnoreCase ("vlan" ) && isPersistent );
1864+ return new Pair <>(vlanId , shouldDelete );
1865+ }
1866+
18301867 private void advanceStop (final VMInstanceVO vm , final boolean cleanUpEvenIfUnableToStop ) throws AgentUnavailableException , OperationTimedoutException ,
18311868 ConcurrentOperationException {
18321869 final State state = vm .getState ();
@@ -1925,8 +1962,13 @@ private void advanceStop(final VMInstanceVO vm, final boolean cleanUpEvenIfUnabl
19251962
19261963 vmGuru .prepareStop (profile );
19271964
1965+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
1966+
19281967 final StopCommand stop = new StopCommand (vm , getExecuteInSequence (vm .getHypervisorType ()), false , cleanUpEvenIfUnableToStop );
19291968 stop .setControlIp (getControlNicIpForVM (vm ));
1969+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
1970+ stop .setVlanToPersistenceMap (vlanToPersistenceMap );
1971+ }
19301972
19311973 boolean stopped = false ;
19321974 Answer answer = null ;
@@ -2582,7 +2624,11 @@ protected void migrate(final VMInstanceVO vm, final long srcHostId, final Deploy
25822624 Map <String , DpdkTO > dpdkInterfaceMapping = null ;
25832625 try {
25842626 final boolean isWindows = _guestOsCategoryDao .findById (_guestOsDao .findById (vm .getGuestOSId ()).getCategoryId ()).getName ().equalsIgnoreCase ("Windows" );
2627+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
25852628 final MigrateCommand mc = new MigrateCommand (vm .getInstanceName (), dest .getHost ().getPrivateIpAddress (), isWindows , to , getExecuteInSequence (vm .getHypervisorType ()));
2629+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
2630+ mc .setVlanToPersistenceMap (vlanToPersistenceMap );
2631+ }
25862632
25872633 boolean kvmAutoConvergence = StorageManager .KvmAutoConvergence .value ();
25882634 mc .setAutoConvergence (kvmAutoConvergence );
@@ -3388,6 +3434,10 @@ public Command cleanup(final VirtualMachine vm, Map<String, DpdkTO> dpdkInterfac
33883434 if (MapUtils .isNotEmpty (dpdkInterfaceMapping )) {
33893435 cmd .setDpdkInterfaceMapping (dpdkInterfaceMapping );
33903436 }
3437+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
3438+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
3439+ cmd .setVlanToPersistenceMap (vlanToPersistenceMap );
3440+ }
33913441 return cmd ;
33923442 }
33933443
@@ -3406,6 +3456,10 @@ public Command cleanup(final String vmName) {
34063456
34073457 StopCommand cmd = new StopCommand (vmName , getExecuteInSequence (null ), false );
34083458 cmd .setControlIp (getControlNicIpForVM (vm ));
3459+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
3460+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
3461+ cmd .setVlanToPersistenceMap (vlanToPersistenceMap );
3462+ }
34093463 return cmd ;
34103464 }
34113465
@@ -4192,8 +4246,12 @@ private void orchestrateMigrateForScale(final String vmUuid, final long srcHostI
41924246
41934247 boolean migrated = false ;
41944248 try {
4249+ Map <String , Boolean > vlanToPersistenceMap = getVlanToPersistenceMapForVM (vm .getId ());
41954250 final boolean isWindows = _guestOsCategoryDao .findById (_guestOsDao .findById (vm .getGuestOSId ()).getCategoryId ()).getName ().equalsIgnoreCase ("Windows" );
41964251 final MigrateCommand mc = new MigrateCommand (vm .getInstanceName (), dest .getHost ().getPrivateIpAddress (), isWindows , to , getExecuteInSequence (vm .getHypervisorType ()));
4252+ if (MapUtils .isNotEmpty (vlanToPersistenceMap )) {
4253+ mc .setVlanToPersistenceMap (vlanToPersistenceMap );
4254+ }
41974255
41984256 boolean kvmAutoConvergence = StorageManager .KvmAutoConvergence .value ();
41994257 mc .setAutoConvergence (kvmAutoConvergence );
0 commit comments