package org.ovirt.engine.core.bll.network;
import org.ovirt.engine.core.bll.network.cluster.NetworkHelper;
import org.ovirt.engine.core.bll.provider.ProviderProxyFactory;
import org.ovirt.engine.core.bll.provider.network.NetworkProviderProxy;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.VmNic;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
import org.ovirt.engine.core.dao.provider.ProviderDao;
import org.ovirt.engine.core.di.Injector;
/**
* Utility class to help manage external networks, such as deallocate NICs.
*/
public class ExternalNetworkManager {
private VmNic nic;
private Network network;
/**
* Create a manager for the specific vNIC.
*
* @param nic
* The vNIC to create a manager for.
*/
public ExternalNetworkManager(VmNic nic) {
this.nic = nic;
}
/**
* Create a manager for the specific vNIC with the given network.
*
* @param nic
* The vNIC to create a manager for.
* @param network
* The network to manage.
*/
public ExternalNetworkManager(VmNic nic, Network network) {
this.nic = nic;
this.network = network;
}
private Network getNetwork() {
if (network == null) {
network = NetworkHelper.getNetworkByVnicProfileId(nic.getVnicProfileId());
}
return network;
}
/**
* Deallocate the vNIC from the external network, if it's attached to a network and the network is indeed an
* external network (otherwise, nothing is done).
*/
public void deallocateIfExternal() {
if (getNetwork() != null && getNetwork().isExternal()) {
Provider<?> provider = getProviderDao().get(getNetwork().getProvidedBy().getProviderId());
NetworkProviderProxy providerProxy = getProviderProxyFactory().create(provider);
try {
providerProxy.deallocate(nic);
} catch (EngineException e) {
AuditLogableBase removePortFailureEvent = new AuditLogableBase();
removePortFailureEvent.addCustomValue("NicName", nic.getName());
removePortFailureEvent.addCustomValue("NicId", nic.getId().toString());
removePortFailureEvent.addCustomValue("ProviderName", provider.getName());
getAuditLogDirector().log(removePortFailureEvent, AuditLogType.REMOVE_PORT_FROM_EXTERNAL_PROVIDER_FAILED);
}
}
}
ProviderProxyFactory getProviderProxyFactory() {
return ProviderProxyFactory.getInstance();
}
private ProviderDao getProviderDao() {
return Injector.get(ProviderDao.class);
}
private AuditLogDirector getAuditLogDirector() {
return Injector.get(AuditLogDirector.class);
}
}