package org.zstack.network.service.virtualrouter.lifecycle;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.zstack.appliancevm.ApplianceVmConstant;
import org.zstack.appliancevm.ApplianceVmPostLifeCycleInfo;
import org.zstack.appliancevm.ApplianceVmSpec;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.header.core.workflow.FlowTrigger;
import org.zstack.header.core.workflow.NoRollbackFlow;
import org.zstack.header.vm.VmInstanceConstant;
import org.zstack.header.vm.VmInstanceConstant.VmOperation;
import org.zstack.header.vm.VmInstanceSpec;
import org.zstack.header.vm.VmNicInventory;
import org.zstack.network.service.virtualrouter.VirtualRouterConstant;
import org.zstack.network.service.virtualrouter.VirtualRouterConstant.Param;
import org.zstack.network.service.virtualrouter.VirtualRouterVmInventory;
import org.zstack.network.service.virtualrouter.VirtualRouterVmVO;
import org.zstack.utils.CollectionUtils;
import org.zstack.utils.function.Function;
import java.util.Map;
/**
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class VirtualRouterAssembleDecoratorFlow extends NoRollbackFlow {
@Autowired
private DatabaseFacade dbf;
@Override
public void run(FlowTrigger trigger, Map data) {
VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
ApplianceVmPostLifeCycleInfo info;
if (spec.getCurrentVmOperation() == VmOperation.NewCreate) {
final ApplianceVmSpec aspec = spec.getExtensionData(ApplianceVmConstant.Params.applianceVmSpec.toString(), ApplianceVmSpec.class);
info = new ApplianceVmPostLifeCycleInfo();
info.setDefaultRouteL3Network(aspec.getDefaultRouteL3Network());
VmNicInventory mgmtNic = CollectionUtils.find(spec.getDestNics(), new Function<VmNicInventory, VmNicInventory>() {
@Override
public VmNicInventory call(VmNicInventory arg) {
return arg.getL3NetworkUuid().equals(aspec.getManagementNic().getL3NetworkUuid()) ? arg : null;
}
});
info.setManagementNic(mgmtNic);
data.put(Param.IS_NEW_CREATED.toString(), true);
} else {
info = (ApplianceVmPostLifeCycleInfo) data.get(ApplianceVmConstant.Params.applianceVmInfoForPostLifeCycle.toString());
}
if (spec.getCurrentVmOperation() == VmOperation.Destroy) {
// for destroy, the VR information may not be complete(e.g mgmt node crash when VR is starting)
// only need uuid for cleanup
data.put(Param.VR_UUID.toString(), spec.getVmInventory().getUuid());
} else {
data.put(VirtualRouterConstant.Param.VR.toString(), VirtualRouterVmInventory.valueOf(dbf.findByUuid(spec.getVmInventory().getUuid(), VirtualRouterVmVO.class)));
}
trigger.next();
}
}