package io.cattle.platform.agent.instance.link.process;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.async.utils.TimeoutException;
import io.cattle.platform.core.constants.InstanceLinkConstants;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.InstanceLink;
import io.cattle.platform.core.model.Port;
import io.cattle.platform.core.util.PortSpec;
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.resource.ResourceMonitor;
import io.cattle.platform.object.resource.ResourcePredicate;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.process.common.handler.AbstractObjectProcessHandler;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import com.netflix.config.DynamicLongProperty;
public class AgentInstanceLinkActivate extends AbstractObjectProcessHandler {
private static final DynamicLongProperty WAIT_TIME = ArchaiusUtil.getLong("instance.link.target.wait.time.millis");
@Inject
ResourceMonitor resourceMonitor;
@Override
public String[] getProcessNames() {
return new String[] { "instancelink.activate" };
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
InstanceLink link = (InstanceLink) state.getResource();
Instance instance = loadResource(Instance.class, link.getInstanceId());
Instance targetInstance = loadResource(Instance.class, link.getTargetInstanceId());
if (instance == null) {
return null;
}
long timeout = DataAccessor.fromDataFieldOf(instance).withKey(InstanceLinkConstants.DATA_LINK_WAIT_TIME).withDefault(WAIT_TIME.get()).as(Long.class);
try {
targetInstance = resourceMonitor.waitFor(targetInstance, timeout, new ResourcePredicate<Instance>() {
@Override
public boolean evaluate(Instance obj) {
return obj.getFirstRunning() != null;
}
@Override
public String getMessage() {
return "running";
}
});
} catch (TimeoutException e) {
/* We are going to ignore this now and just continue forward with no ports. This is really only needed for the
* env vars which are not commonly used
*/
}
List<Port> ports = children(targetInstance, Port.class);
if (ports.size() == 0) {
return null;
}
List<PortSpec> result = new ArrayList<PortSpec>();
for (Port port : ports) {
result.add(new PortSpec(port));
}
return new HandlerResult(InstanceLinkConstants.FIELD_PORTS, result).withShouldContinue(true);
}
}