package io.cattle.platform.process.link; import static io.cattle.platform.core.model.tables.InstanceLinkTable.*; import io.cattle.platform.core.constants.InstanceConstants; 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.engine.handler.HandlerResult; import io.cattle.platform.engine.handler.ProcessPostListener; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic; import io.cattle.platform.util.type.Priority; import java.util.HashMap; import java.util.Map; import javax.inject.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Named public class InstanceInstanceLinkCreate extends AbstractObjectProcessLogic implements ProcessPostListener, Priority { private static final Logger log = LoggerFactory.getLogger(InstanceInstanceLinkCreate.class); @Override public String[] getProcessNames() { return new String[] { "instance.create" }; } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Instance instance = (Instance) state.getResource(); ObjectManager objectManager = getObjectManager(); Object linkObjs = DataAccessor.fields(instance).withKey(InstanceConstants.FIELD_INSTANCE_LINKS).withDefault(new HashMap<String, Object>()).get(); if (!(linkObjs instanceof Map<?, ?>)) { return null; } Map<String, InstanceLink> links = new HashMap<String, InstanceLink>(); for (InstanceLink link : objectManager.children(instance, InstanceLink.class, InstanceLinkConstants.FIELD_INSTANCE_ID)) { links.put(link.getLinkName(), link); } for (Map.Entry<?, ?> entry : ((Map<?, ?>) linkObjs).entrySet()) { String name = entry.getKey().toString(); Long targetInstanceId = null; try { if (entry.getValue() != null) { targetInstanceId = Long.parseLong(entry.getValue().toString()); } } catch (NumberFormatException nfe) { log.error("Invalid instance [{}] for link [{}], skipping", entry.getValue(), entry.getKey()); continue; } if (links.containsKey(name)) { continue; } InstanceLink linkObj = objectManager.create(InstanceLink.class, INSTANCE_LINK.ACCOUNT_ID, instance.getAccountId(), INSTANCE_LINK.LINK_NAME, name, INSTANCE_LINK.INSTANCE_ID, instance.getId(), INSTANCE_LINK.TARGET_INSTANCE_ID, targetInstanceId); links.put(name, linkObj); } for (InstanceLink link : links.values()) { getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, link, state.getData()); } return null; } @Override public int getPriority() { return Priority.DEFAULT; } }