package io.cattle.platform.process.nic;
import static io.cattle.platform.core.model.tables.IpAddressTable.*;
import static io.cattle.platform.core.model.tables.NicTable.*;
import io.cattle.platform.core.constants.IpAddressConstants;
import io.cattle.platform.core.dao.GenericMapDao;
import io.cattle.platform.core.dao.IpAddressDao;
import io.cattle.platform.core.model.IpAddress;
import io.cattle.platform.core.model.IpAddressNicMap;
import io.cattle.platform.core.model.Network;
import io.cattle.platform.core.model.Nic;
import io.cattle.platform.engine.handler.HandlerResult;
import io.cattle.platform.engine.process.ProcessInstance;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.network.NetworkService;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.process.base.AbstractDefaultProcessHandler;
import io.cattle.platform.resource.pool.PooledResource;
import io.cattle.platform.resource.pool.PooledResourceOptions;
import io.cattle.platform.resource.pool.ResourcePoolManager;
import io.cattle.platform.resource.pool.util.ResourcePoolConstants;
import io.cattle.platform.util.exception.ExecutionException;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class NicActivate extends AbstractDefaultProcessHandler {
@Inject
GenericMapDao mapDao;
@Inject
IpAddressDao ipAddressDao;
@Inject
ResourcePoolManager poolManager;
@Inject
NetworkService networkService;
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Nic nic = (Nic) state.getResource();
Network network = getObjectManager().loadResource(Network.class, nic.getNetworkId());
if (network == null) {
return null;
}
IpAddress ipAddress = getIpAddress(nic, network);
if (ipAddress != null) {
activate(ipAddress, state.getData());
}
String mac = assignMacAddress(network, nic);
return new HandlerResult(NIC.MAC_ADDRESS, mac);
}
protected String assignMacAddress(Network network, Nic nic) {
String mac = nic.getMacAddress();
if (mac != null) {
return mac;
}
PooledResource resource = poolManager.allocateOneResource(network, nic, new PooledResourceOptions().withQualifier(ResourcePoolConstants.MAC));
if (resource == null) {
throw new ExecutionException("MAC allocation error", "Failed to allocate MAC from network", nic);
}
return resource.getName();
}
protected IpAddress getIpAddress(Nic nic, Network network) {
IpAddress ipAddress = ipAddressDao.getPrimaryIpAddress(nic);
if (ipAddress == null && networkService.shouldAssignIpAddress(network)) {
ipAddress = ipAddressDao.mapNewIpAddress(nic,
IP_ADDRESS.ROLE, IpAddressConstants.ROLE_PRIMARY,
IP_ADDRESS.NETWORK_ID, nic.getNetworkId());
}
for (IpAddressNicMap map : mapDao.findNonRemoved(IpAddressNicMap.class, Nic.class, nic.getId())) {
getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, map, null);
}
if (ipAddress != null) {
getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, ipAddress, null);
}
return ipAddress;
}
}