Skip to content

Commit ff478a4

Browse files
author
shatoboar
committed
Persistent Network feature & Marvin component tests
1 parent 1d17d7c commit ff478a4

File tree

6 files changed

+459
-149
lines changed

6 files changed

+459
-149
lines changed

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 123 additions & 119 deletions
Large diffs are not rendered by default.

engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,6 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
130130
List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri, Network.PVlanType pVlanType);
131131

132132
List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri);
133+
134+
List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId);
133135
}

engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,16 @@ public int getOtherPersistentNetworksCount(long id, String broadcastURI, boolean
419419
return persistentNetworks.size();
420420
}
421421

422+
@Override
423+
public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
424+
Object[] guestTypes = {"Isolated", "L2"};
425+
final SearchCriteria<NetworkVO> sc = PersistentNetworkSearch.create();
426+
sc.setParameters("guestType", guestTypes);
427+
sc.setParameters("dc", dataCenterId);
428+
sc.setJoinParameters("persistent", "persistent", true);
429+
return search(sc, null);
430+
}
431+
422432
@Override
423433
public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) {
424434
final SequenceFetcher fetch = SequenceFetcher.getInstance();

engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,21 @@
2020

2121
import com.cloud.agent.AgentManager;
2222
import com.cloud.agent.api.Answer;
23+
import com.cloud.agent.api.CleanupPersistentNetworkResourceCommand;
2324
import com.cloud.agent.api.ModifyStoragePoolAnswer;
2425
import com.cloud.agent.api.ModifyStoragePoolCommand;
26+
import com.cloud.agent.api.SetupPersistentNetworkCommand;
27+
import com.cloud.agent.api.to.NicTO;
2528
import com.cloud.alert.AlertManager;
29+
import com.cloud.configuration.ConfigurationManager;
2630
import com.cloud.exception.StorageConflictException;
31+
import com.cloud.host.HostVO;
32+
import com.cloud.host.dao.HostDao;
33+
import com.cloud.network.NetworkModel;
34+
import com.cloud.network.dao.NetworkDao;
35+
import com.cloud.network.dao.NetworkVO;
36+
import com.cloud.offerings.NetworkOfferingVO;
37+
import com.cloud.offerings.dao.NetworkOfferingDao;
2738
import com.cloud.storage.DataStoreRole;
2839
import com.cloud.storage.Storage;
2940
import com.cloud.storage.StorageManager;
@@ -62,12 +73,68 @@ public class DefaultHostListener implements HypervisorHostListener {
6273
StorageManager storageManager;
6374
@Inject
6475
StorageService storageService;
76+
@Inject
77+
NetworkOfferingDao networkOfferingDao;
78+
@Inject
79+
HostDao hostDao;
80+
@Inject
81+
NetworkModel networkModel;
82+
@Inject
83+
ConfigurationManager configManager;
84+
@Inject
85+
NetworkDao networkDao;
86+
6587

6688
@Override
6789
public boolean hostAdded(long hostId) {
6890
return true;
6991
}
7092

93+
private boolean createPersistentNetworkResourcesOnHost(long hostId) {
94+
HostVO host = hostDao.findById(hostId);
95+
if (host == null) {
96+
s_logger.warn(String.format("Host with id %ld can't be found", hostId));
97+
return false;
98+
}
99+
100+
List<NetworkVO> allPersistentNetworks = networkDao.getAllPersistentNetworksFromZone(host.getDataCenterId());
101+
102+
for (NetworkVO networkVO : allPersistentNetworks) {
103+
NetworkOfferingVO networkOfferingVO = networkOfferingDao.findById(networkVO.getNetworkOfferingId());
104+
105+
SetupPersistentNetworkCommand persistentNetworkCommand =
106+
new SetupPersistentNetworkCommand(createNicTOFromNetworkAndOffering(networkVO, networkOfferingVO, host));
107+
Answer answer = agentMgr.easySend(hostId, persistentNetworkCommand);
108+
if (answer == null) {
109+
throw new CloudRuntimeException("Unable to get answer to the setup persistent network command " + networkVO.getId());
110+
}
111+
if (!answer.getResult()) {
112+
String msg = String.format("Unable to create L2 persistent network resources from network %ld on the host %ld in zone %ld", networkVO.getId(), hostId, networkVO.getDataCenterId());
113+
alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, networkVO.getDataCenterId(), host.getPodId(), msg, msg);
114+
throw new CloudRuntimeException("Unable to create persistent network resources from network " + networkVO.getId() +
115+
" on " + hostId + " due to " + answer.getDetails());
116+
}
117+
}
118+
return true;
119+
}
120+
121+
/**
122+
* Creates a dummy NicTO object which is used by the respective hypervisors to setup network elements / resources
123+
* - bridges(KVM), VLANs(Xen) and portgroups(VMWare) for L2 network
124+
*/
125+
private NicTO createNicTOFromNetworkAndOffering(NetworkVO networkVO, NetworkOfferingVO networkOfferingVO, HostVO hostVO) {
126+
NicTO to = new NicTO();
127+
to.setName(networkModel.getNetworkTag(hostVO.getHypervisorType(), networkVO));
128+
to.setBroadcastType(networkVO.getBroadcastDomainType());
129+
to.setType(networkVO.getTrafficType());
130+
to.setBroadcastUri(networkVO.getBroadcastUri());
131+
to.setIsolationuri(networkVO.getBroadcastUri());
132+
to.setNetworkRateMbps(configManager.getNetworkOfferingNetworkRate(networkOfferingVO.getId(), networkVO.getDataCenterId()));
133+
to.setSecurityGroupEnabled(networkModel.isSecurityGroupSupportedInNetwork(networkVO));
134+
return to;
135+
}
136+
137+
71138
@Override
72139
public boolean hostConnect(long hostId, long poolId) throws StorageConflictException {
73140
StoragePool pool = (StoragePool) this.dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
@@ -109,7 +176,8 @@ public boolean hostConnect(long hostId, long poolId) throws StorageConflictExcep
109176
storageService.updateStorageCapabilities(poolId, false);
110177

111178
s_logger.info("Connection established between storage pool " + pool + " and host " + hostId);
112-
return true;
179+
180+
return createPersistentNetworkResourcesOnHost(hostId);
113181
}
114182

115183
private void updateStoragePoolHostVOAndDetails(StoragePool pool, long hostId, ModifyStoragePoolAnswer mspAnswer) {
@@ -124,7 +192,7 @@ private void updateStoragePoolHostVOAndDetails(StoragePool pool, long hostId, Mo
124192
StoragePoolVO poolVO = this.primaryStoreDao.findById(pool.getId());
125193
poolVO.setUsedBytes(mspAnswer.getPoolInfo().getCapacityBytes() - mspAnswer.getPoolInfo().getAvailableBytes());
126194
poolVO.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes());
127-
if(StringUtils.isNotEmpty(mspAnswer.getPoolType())) {
195+
if (StringUtils.isNotEmpty(mspAnswer.getPoolType())) {
128196
StoragePoolDetailVO poolType = storagePoolDetailsDao.findDetail(pool.getId(), "pool_type");
129197
if (poolType == null) {
130198
StoragePoolDetailVO storagePoolDetailVO = new StoragePoolDetailVO(pool.getId(), "pool_type", mspAnswer.getPoolType(), false);
@@ -142,6 +210,28 @@ public boolean hostDisconnected(long hostId, long poolId) {
142210

143211
@Override
144212
public boolean hostAboutToBeRemoved(long hostId) {
213+
// send host the cleanup persistent network resources
214+
HostVO host = hostDao.findById(hostId);
215+
if (host == null) {
216+
s_logger.warn("Host with id " + hostId + " can't be found");
217+
return false;
218+
}
219+
220+
List<NetworkVO> allPersistentNetworks = networkDao.getAllPersistentNetworksFromZone(host.getDataCenterId()); // find zoneId of host
221+
for (NetworkVO persistentNetworkVO : allPersistentNetworks) {
222+
NetworkOfferingVO networkOfferingVO = networkOfferingDao.findById(persistentNetworkVO.getNetworkOfferingId());
223+
CleanupPersistentNetworkResourceCommand cleanupCmd =
224+
new CleanupPersistentNetworkResourceCommand(createNicTOFromNetworkAndOffering(persistentNetworkVO, networkOfferingVO, host));
225+
Answer answer = agentMgr.easySend(hostId, cleanupCmd);
226+
if (answer == null) {
227+
throw new CloudRuntimeException("Unable to get answer to the cleanup persistent network command " + persistentNetworkVO.getId());
228+
}
229+
if (!answer.getResult()) {
230+
String msg = String.format("Unable to cleanup L2 persistent network resources from network %ld on the host %ld", persistentNetworkVO.getId(), hostId);
231+
232+
alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, persistentNetworkVO.getDataCenterId(), host.getPodId(), msg, msg);
233+
}
234+
}
145235
return true;
146236
}
147237

server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,4 +260,9 @@ public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String
260260
public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri) {
261261
return null;
262262
}
263+
264+
@Override
265+
public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
266+
return null;
267+
}
263268
}

0 commit comments

Comments
 (0)