Skip to content

Commit f5ab87c

Browse files
ustcweizhouDaanHoogland
authored andcommitted
bugfix #3 apply ip dessociation before unplugging a nic so ip is marked as add:false in ips.json
1 parent 6491a69 commit f5ab87c

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

server/src/main/java/com/cloud/network/rules/NicPlugInOutRules.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import com.cloud.agent.api.Command;
3030
import com.cloud.agent.api.NetworkUsageCommand;
3131
import com.cloud.agent.manager.Commands;
32+
import com.cloud.dc.DataCenterVO;
33+
import com.cloud.dc.dao.DataCenterDao;
3234
import com.cloud.exception.ConcurrentOperationException;
3335
import com.cloud.exception.InsufficientCapacityException;
3436
import com.cloud.exception.ResourceUnavailableException;
@@ -53,6 +55,9 @@
5355
import com.cloud.vm.VirtualMachineManager;
5456
import com.cloud.vm.dao.NicDao;
5557

58+
import org.apache.cloudstack.network.topology.NetworkTopology;
59+
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
60+
5661
public class NicPlugInOutRules extends RuleApplier {
5762

5863
private static final Logger s_logger = Logger.getLogger(NicPlugInOutRules.class);
@@ -77,6 +82,28 @@ public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter
7782

7883
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
7984
VirtualMachineManager itMgr = visitor.getVirtualNetworkApplianceFactory().getItMgr();
85+
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
86+
87+
// de-associate IPs before unplugging nics
88+
if (!nicsToUnplug.isEmpty()) {
89+
NetworkTopologyContext networkTopologyContext = visitor.getVirtualNetworkApplianceFactory().getNetworkTopologyContext();
90+
final DataCenterDao dcDao = visitor.getVirtualNetworkApplianceFactory().getDcDao();
91+
final DataCenterVO dcVO = dcDao.findById(router.getDataCenterId());
92+
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
93+
94+
final String typeString = "vpc ip association before unplugging nics";
95+
final boolean isPodLevelException = false;
96+
final boolean failWhenDisconnect = false;
97+
final Long podId = null;
98+
final VpcIpAssociationRules ipAssociationRules = new VpcIpAssociationRules(_network, _ipAddresses);
99+
final boolean result = networkTopology.applyRules(_network, router, typeString, isPodLevelException, podId, failWhenDisconnect,
100+
new RuleApplierWrapper<RuleApplier>(ipAssociationRules));
101+
if (!result) {
102+
s_logger.warn("Failed to de-associate IPs before unplugging nics");
103+
return false;
104+
}
105+
}
106+
80107
// 1) Unplug the nics
81108
for (Entry<String, PublicIpAddress> entry : nicsToUnplug.entrySet()) {
82109
Network publicNtwk = null;

server/src/main/java/com/cloud/network/rules/VirtualNetworkApplianceFactory.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import com.cloud.vm.dao.NicIpAliasDao;
4444
import com.cloud.vm.dao.UserVmDao;
4545

46+
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
47+
4648
public class VirtualNetworkApplianceFactory {
4749

4850
@Inject
@@ -91,6 +93,9 @@ public class VirtualNetworkApplianceFactory {
9193
@Inject
9294
private NicProfileHelper _nicProfileHelper;
9395

96+
@Inject
97+
private NetworkTopologyContext _networkTopologyContext;
98+
9499
public NetworkModel getNetworkModel() {
95100
return _networkModel;
96101
}
@@ -174,4 +179,8 @@ public NetworkHelper getNetworkHelper() {
174179
public NicProfileHelper getNicProfileHelper() {
175180
return _nicProfileHelper;
176181
}
177-
}
182+
183+
public NetworkTopologyContext getNetworkTopologyContext() {
184+
return _networkTopologyContext;
185+
}
186+
}

0 commit comments

Comments
 (0)