package org.zstack.compute.vm;
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.componentloader.PluginRegistry;
import org.zstack.header.core.Completion;
import org.zstack.header.core.NoErrorCompletion;
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.network.l3.L3NetworkInventory;
import org.zstack.header.vm.InstantiateResourceOnAttachingNicExtensionPoint;
import org.zstack.header.vm.VmInstanceConstant;
import org.zstack.header.vm.VmInstanceSpec;
import java.util.Iterator;
import java.util.Map;
/**
* Created by frank on 7/18/2015.
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class VmInstantiateResourceOnAttachingNicFlow implements Flow {
@Autowired
private PluginRegistry pluginRgty;
@Override
public void run(FlowTrigger trigger, Map data) {
Iterator<InstantiateResourceOnAttachingNicExtensionPoint> it = pluginRgty.getExtensionList(InstantiateResourceOnAttachingNicExtensionPoint.class).iterator();
VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
L3NetworkInventory l3 = spec.getL3Networks().get(0);
instantiateResource(it, spec, l3, trigger);
}
private void instantiateResource(final Iterator<InstantiateResourceOnAttachingNicExtensionPoint> it, final VmInstanceSpec spec, final L3NetworkInventory l3, final FlowTrigger trigger) {
if (!it.hasNext()) {
trigger.next();
return;
}
InstantiateResourceOnAttachingNicExtensionPoint ext = it.next();
ext.instantiateResourceOnAttachingNic(spec, l3, new Completion(trigger) {
@Override
public void success() {
instantiateResource(it, spec, l3, trigger);
}
@Override
public void fail(ErrorCode errorCode) {
trigger.fail(errorCode);
}
});
}
@Override
public void rollback(FlowRollback trigger, Map data) {
Iterator<InstantiateResourceOnAttachingNicExtensionPoint> it = pluginRgty.getExtensionList(InstantiateResourceOnAttachingNicExtensionPoint.class).iterator();
VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
L3NetworkInventory l3 = spec.getL3Networks().get(0);
releaseResource(it, spec, l3, trigger);
}
private void releaseResource(final Iterator<InstantiateResourceOnAttachingNicExtensionPoint> it, final VmInstanceSpec spec, final L3NetworkInventory l3, final FlowRollback trigger) {
if (!it.hasNext()) {
trigger.rollback();
return;
}
InstantiateResourceOnAttachingNicExtensionPoint ext = it.next();
ext.releaseResourceOnAttachingNic(spec, l3, new NoErrorCompletion(trigger) {
@Override
public void done() {
releaseResource(it, spec, l3, trigger);
}
});
}
}