Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -130,4 +130,6 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri, Network.PVlanType pVlanType);

List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri);

List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,16 @@ public int getOtherPersistentNetworksCount(long id, String broadcastURI, boolean
return persistentNetworks.size();
}

@Override
public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
Object[] guestTypes = {"Isolated", "L2"};
final SearchCriteria<NetworkVO> sc = PersistentNetworkSearch.create();
sc.setParameters("guestType", guestTypes);
sc.setParameters("dc", dataCenterId);
sc.setJoinParameters("persistent", "persistent", true);
return search(sc, null);
}

@Override
public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) {
final SequenceFetcher fetch = SequenceFetcher.getInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,21 @@

import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CleanupPersistentNetworkResourceCommand;
import com.cloud.agent.api.ModifyStoragePoolAnswer;
import com.cloud.agent.api.ModifyStoragePoolCommand;
import com.cloud.agent.api.SetupPersistentNetworkCommand;
import com.cloud.agent.api.to.NicTO;
import com.cloud.alert.AlertManager;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.exception.StorageConflictException;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.Storage;
import com.cloud.storage.StorageManager;
Expand Down Expand Up @@ -62,12 +73,68 @@ public class DefaultHostListener implements HypervisorHostListener {
StorageManager storageManager;
@Inject
StorageService storageService;
@Inject
NetworkOfferingDao networkOfferingDao;
@Inject
HostDao hostDao;
@Inject
NetworkModel networkModel;
@Inject
ConfigurationManager configManager;
@Inject
NetworkDao networkDao;


@Override
public boolean hostAdded(long hostId) {
return true;
}

private boolean createPersistentNetworkResourcesOnHost(long hostId) {
HostVO host = hostDao.findById(hostId);
if (host == null) {
s_logger.warn(String.format("Host with id %ld can't be found", hostId));
return false;
}

List<NetworkVO> allPersistentNetworks = networkDao.getAllPersistentNetworksFromZone(host.getDataCenterId());

for (NetworkVO networkVO : allPersistentNetworks) {
NetworkOfferingVO networkOfferingVO = networkOfferingDao.findById(networkVO.getNetworkOfferingId());

SetupPersistentNetworkCommand persistentNetworkCommand =
new SetupPersistentNetworkCommand(createNicTOFromNetworkAndOffering(networkVO, networkOfferingVO, host));
Answer answer = agentMgr.easySend(hostId, persistentNetworkCommand);
if (answer == null) {
throw new CloudRuntimeException("Unable to get answer to the setup persistent network command " + networkVO.getId());
}
if (!answer.getResult()) {
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());
alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, networkVO.getDataCenterId(), host.getPodId(), msg, msg);
throw new CloudRuntimeException("Unable to create persistent network resources from network " + networkVO.getId() +
" on " + hostId + " due to " + answer.getDetails());
}
}
return true;
}

/**
* Creates a dummy NicTO object which is used by the respective hypervisors to setup network elements / resources
* - bridges(KVM), VLANs(Xen) and portgroups(VMWare) for L2 network
*/
private NicTO createNicTOFromNetworkAndOffering(NetworkVO networkVO, NetworkOfferingVO networkOfferingVO, HostVO hostVO) {
NicTO to = new NicTO();
to.setName(networkModel.getNetworkTag(hostVO.getHypervisorType(), networkVO));
to.setBroadcastType(networkVO.getBroadcastDomainType());
to.setType(networkVO.getTrafficType());
to.setBroadcastUri(networkVO.getBroadcastUri());
to.setIsolationuri(networkVO.getBroadcastUri());
to.setNetworkRateMbps(configManager.getNetworkOfferingNetworkRate(networkOfferingVO.getId(), networkVO.getDataCenterId()));
to.setSecurityGroupEnabled(networkModel.isSecurityGroupSupportedInNetwork(networkVO));
return to;
}


@Override
public boolean hostConnect(long hostId, long poolId) throws StorageConflictException {
StoragePool pool = (StoragePool) this.dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
Expand Down Expand Up @@ -109,7 +176,8 @@ public boolean hostConnect(long hostId, long poolId) throws StorageConflictExcep
storageService.updateStorageCapabilities(poolId, false);

s_logger.info("Connection established between storage pool " + pool + " and host " + hostId);
return true;

return createPersistentNetworkResourcesOnHost(hostId);
}

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

@Override
public boolean hostAboutToBeRemoved(long hostId) {
// send host the cleanup persistent network resources
HostVO host = hostDao.findById(hostId);
if (host == null) {
s_logger.warn("Host with id " + hostId + " can't be found");
return false;
}

List<NetworkVO> allPersistentNetworks = networkDao.getAllPersistentNetworksFromZone(host.getDataCenterId()); // find zoneId of host
for (NetworkVO persistentNetworkVO : allPersistentNetworks) {
NetworkOfferingVO networkOfferingVO = networkOfferingDao.findById(persistentNetworkVO.getNetworkOfferingId());
CleanupPersistentNetworkResourceCommand cleanupCmd =
new CleanupPersistentNetworkResourceCommand(createNicTOFromNetworkAndOffering(persistentNetworkVO, networkOfferingVO, host));
Answer answer = agentMgr.easySend(hostId, cleanupCmd);
if (answer == null) {
throw new CloudRuntimeException("Unable to get answer to the cleanup persistent network command " + persistentNetworkVO.getId());
}
if (!answer.getResult()) {
String msg = String.format("Unable to cleanup L2 persistent network resources from network %ld on the host %ld", persistentNetworkVO.getId(), hostId);

alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, persistentNetworkVO.getDataCenterId(), host.getPodId(), msg, msg);
}
}
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,4 +260,9 @@ public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String
public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri) {
return null;
}

@Override
public List<NetworkVO> getAllPersistentNetworksFromZone(long dataCenterId) {
return null;
}
}
Loading