package org.zstack.appliancevm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.zstack.core.componentloader.PluginRegistry;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.header.Component;
import org.zstack.header.exception.CloudRuntimeException;
import org.zstack.header.vm.*;
import org.zstack.utils.DebugUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: frank
* Time: 12:19 AM
* To change this template use File | Settings | File Templates.
*/
public class ApplianceVmFactory implements VmInstanceFactory, Component {
public static VmInstanceType type = new VmInstanceType(ApplianceVmConstant.APPLIANCE_VM_TYPE);
@Autowired
private DatabaseFacade dbf;
@Autowired
private PluginRegistry pluginRgty;
private Map<String, ApplianceVmSubTypeFactory> subTypeFactories = new HashMap<String, ApplianceVmSubTypeFactory>();
@Override
public VmInstanceType getType() {
return type;
}
@Override
@Transactional
public VmInstanceVO createVmInstance(VmInstanceVO vo, CreateVmInstanceMsg msg) {
dbf.getEntityManager().persist(vo);
return vo;
}
@Override
public VmInstance getVmInstance(VmInstanceVO vo) {
ApplianceVmVO self = dbf.findByUuid(vo.getUuid(), ApplianceVmVO.class);
ApplianceVmSubTypeFactory subTypeFactory = getApplianceVmSubTypeFactory(self.getApplianceVmType());
return subTypeFactory.getSubApplianceVm(self);
}
@Override
public boolean start() {
for (ApplianceVmSubTypeFactory ext : pluginRgty.getExtensionList(ApplianceVmSubTypeFactory.class)) {
ApplianceVmSubTypeFactory old = subTypeFactories.get(ext.getApplianceVmType().toString());
if (old != null) {
throw new CloudRuntimeException(String.format("duplicate ApplianceVmSubTypeFactory[%s, %s] for type[%s]",
old.getClass(), ext.getClass(), ext.getApplianceVmType()));
}
subTypeFactories.put(ext.getApplianceVmType().toString(), ext);
}
return true;
}
public ApplianceVmSubTypeFactory getApplianceVmSubTypeFactory(String subtype) {
ApplianceVmSubTypeFactory subTypeFactory = subTypeFactories.get(subtype);
DebugUtils.Assert(subTypeFactory!=null, String.format("cannot find ApplianceVmSubTypeFactory for type[%s]", subtype));
return subTypeFactory;
}
@Override
public boolean stop() {
return true;
}
}