package io.cattle.platform.process.port;
import static io.cattle.platform.core.model.tables.PortTable.*;
import io.cattle.platform.core.constants.PortConstants;
import io.cattle.platform.core.dao.IpAddressDao;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.IpAddress;
import io.cattle.platform.core.model.Nic;
import io.cattle.platform.core.model.Port;
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.object.util.DataAccessor;
import io.cattle.platform.process.base.AbstractDefaultProcessHandler;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
@Named
public class PortActivate extends AbstractDefaultProcessHandler {
IpAddressDao ipAddressDao;
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Port port = (Port)state.getResource();
Instance instance = getObjectManager().loadResource(Instance.class, port.getInstanceId());
if (instance == null) {
return null;
}
Long privateIpAddress = port.getPrivateIpAddressId();
Long publicIpAddress = port.getPublicIpAddressId();
for (Nic nic : getObjectManager().children(instance, Nic.class)) {
Integer device = nic.getDeviceNumber();
if (device != null && device == 0) {
IpAddress ipAddress = ipAddressDao.getPrimaryIpAddress(nic);
if (ipAddress != null) {
privateIpAddress = ipAddress.getId();
}
}
}
String bindAddress = DataAccessor.fieldString(port, PortConstants.FIELD_BIND_ADDR);
if (StringUtils.isBlank(bindAddress)) {
if (publicIpAddress == null) {
outer: for (Host host : getObjectManager().mappedChildren(instance, Host.class)) {
for (IpAddress ipAddress : getObjectManager().mappedChildren(host, IpAddress.class)) {
publicIpAddress = ipAddress.getId();
break outer;
}
}
}
}
return new HandlerResult(PORT.PUBLIC_IP_ADDRESS_ID, publicIpAddress, PORT.PRIVATE_IP_ADDRESS_ID, privateIpAddress).withShouldContinue(true);
}
public IpAddressDao getIpAddressDao() {
return ipAddressDao;
}
@Inject
public void setIpAddressDao(IpAddressDao ipAddressDao) {
this.ipAddressDao = ipAddressDao;
}
}