package io.cattle.platform.process.port; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.dao.InstanceDao; import io.cattle.platform.core.model.Instance; 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.lock.LockCallbackNoReturn; import io.cattle.platform.lock.LockManager; import io.cattle.platform.process.base.AbstractDefaultProcessHandler; import io.cattle.platform.process.lock.InstancePortsLock; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import javax.inject.Inject; import javax.inject.Named; @Named public class PortUpdate extends AbstractDefaultProcessHandler { @Inject LockManager lockManager; @Inject InstanceDao instanceDao; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Port port = (Port)state.getResource(); final Instance instance = getObjectManager().loadResource(Instance.class, port.getInstanceId()); if (instance == null) { return null; } lockManager.lock(new InstancePortsLock(instance), new LockCallbackNoReturn() { @Override public void doWithLockNoResult() { processPorts(instance); } }); return null; } protected void processPorts(Instance instance) { Set<String> portSpecs = new HashSet<>(); for (Port port : objectManager.children(instance, Port.class)) { if (port.getRemoved() != null) { continue; } portSpecs.add(new PortSpec(port).toSpec()); } objectManager.setFields(instance, InstanceConstants.FIELD_PORTS, new ArrayList<>(portSpecs)); instanceDao.clearCacheInstanceData(instance.getId()); } }