package io.cattle.platform.docker.process.instance; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.model.Image; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.Network; import io.cattle.platform.core.util.SystemLabels; import io.cattle.platform.docker.constants.DockerInstanceConstants; import io.cattle.platform.docker.storage.dao.DockerStorageDao; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.handler.ProcessPreListener; 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.ObjectManager; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.object.util.DataUtils; import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic; import io.cattle.platform.util.exception.ExecutionException; import io.cattle.platform.util.type.Priority; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; public class DockerInstancePreCreate extends AbstractObjectProcessLogic implements ProcessPreListener, Priority { @Inject ObjectManager objectManager; @Inject DockerStorageDao dockerStorageDao; @Inject NetworkService networkService; @Override public String[] getProcessNames() { return new String[]{"instance.create"}; } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Instance instance = (Instance)state.getResource(); if (!InstanceConstants.CONTAINER_LIKE.contains(instance.getKind())) { return null; } Image image = objectManager.loadResource(Image.class, instance.getImageId()); if (image == null) { dockerStorageDao.createImageForInstance(instance); } Map<Object, Object> data = new HashMap<>(); String mode = networkService.getNetworkMode(DataUtils.getFields(instance)); data.put(DockerInstanceConstants.FIELD_NETWORK_MODE, mode); Network network = networkService.resolveNetwork(instance.getAccountId(), mode); if (network == null && StringUtils.isNotBlank(mode) && !instance.getNativeContainer()) { objectProcessManager.scheduleProcessInstance(InstanceConstants.PROCESS_REMOVE, instance, null); throw new ExecutionException(String.format("Failed to find network for networkMode %s", mode), null, state.getResource()); } if (network != null) { data.put(InstanceConstants.FIELD_NETWORK_IDS, Arrays.asList(network.getId())); } Map<String, Object> labels = DataAccessor.fieldMap(instance, InstanceConstants.FIELD_LABELS); Object ip = labels.get(SystemLabels.LABEL_REQUESTED_IP); if (ip != null) { data.put(InstanceConstants.FIELD_REQUESTED_IP_ADDRESS, ip.toString()); } return new HandlerResult(data).withShouldContinue(true); } @Override public int getPriority() { return Priority.PRE - 1; } }