package org.zstack.network.service.portforwarding; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.header.core.Completion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.workflow.Flow; import org.zstack.header.core.workflow.FlowRollback; import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.message.MessageReply; import org.zstack.header.network.l3.L3NetworkInventory; import org.zstack.network.service.portforwarding.PortForwardingConstant.Params; import org.zstack.network.service.vip.*; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.Map; /** */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class PortForwardingPrepareVipFlow implements Flow { private static final CLogger logger = Utils.getLogger(PortForwardingPrepareVipFlow.class); private static final String SUCCESS = PortForwardingPrepareVipFlow.class.getName(); public void run(final FlowTrigger trigger, final Map data) { final VipInventory v = (VipInventory) data.get(VipConstant.Params.VIP.toString()); final String serviceProviderType = (String) data.get(VipConstant.Params.VIP_SERVICE_PROVIDER_TYPE.toString()); final L3NetworkInventory peerL3 = (L3NetworkInventory) data.get(VipConstant.Params.GUEST_L3NETWORK_VIP_FOR.toString()); boolean needLockVip = data.containsKey(Params.NEED_LOCK_VIP.toString()); Vip vip = new Vip(v.getUuid()); vip.setPeerL3NetworkUuid(peerL3.getUuid()); vip.setServiceProvider(serviceProviderType); vip.setUseFor(needLockVip ? PortForwardingConstant.PORTFORWARDING_NETWORK_SERVICE_TYPE : null); vip.acquire(new Completion(trigger) { @Override public void success() { trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } @Override public void rollback(final FlowRollback trigger, Map data) { if (!data.containsKey(SUCCESS)) { trigger.rollback(); return; } VipInventory v = (VipInventory) data.get(VipConstant.Params.VIP.toString()); new Vip(v.getUuid()).release(new Completion(trigger) { @Override public void success() { trigger.rollback(); } @Override public void fail(ErrorCode errorCode) { //TODO add GC logger.warn(errorCode.toString()); trigger.rollback(); } }); } }