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.header.core.workflow.Flow;
import org.zstack.header.core.workflow.FlowRollback;
import org.zstack.header.core.workflow.FlowTrigger;
import org.zstack.header.core.Completion;
import org.zstack.header.errorcode.ErrorCode;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.Map;
/**
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class AttachPortFowardingFlow implements Flow {
private static final CLogger logger = Utils.getLogger(AttachPortFowardingFlow.class);
@Autowired
private PortForwardingManager pfMgr;
private static final String SUCCESS = AttachPortFowardingFlow.class.getName();
public void run(final FlowTrigger trigger, final Map data) {
String providerType = (String) data.get(PortForwardingConstant.Params.PORTFORWARDING_SERVICE_PROVIDER_TYPE.toString());
final PortForwardingStruct struct = (PortForwardingStruct) data.get(PortForwardingConstant.Params.PORTFORWARDING_STRUCT.toString());
PortForwardingBackend bkd = pfMgr.getPortForwardingBackend(providerType);
bkd.applyPortForwardingRule(struct, new Completion(trigger) {
@Override
public void success() {
logger.debug(String.format("successfully attached %s", struct.toString()));
data.put(SUCCESS, true);
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;
}
String providerType = (String) data.get(PortForwardingConstant.Params.PORTFORWARDING_SERVICE_PROVIDER_TYPE.toString());
final PortForwardingStruct struct = (PortForwardingStruct) data.get(PortForwardingConstant.Params.PORTFORWARDING_STRUCT.toString());
PortForwardingBackend bkd = pfMgr.getPortForwardingBackend(providerType);
bkd.revokePortForwardingRule(struct, new Completion(trigger) {
@Override
public void success() {
logger.debug(String.format("successfully revoked %s", struct.toString()));
trigger.rollback();
}
@Override
public void fail(ErrorCode errorCode) {
logger.warn(String.format("successfully revoked %s, service provider should clean up", struct.toString()));
trigger.rollback();
}
});
}
}