package org.zstack.simulator; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.compute.host.HostSystemTags; import org.zstack.core.CoreGlobalProperty; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.host.*; import org.zstack.header.simulator.APIAddSimulatorHostMsg; import org.zstack.header.simulator.SimulatorConstant; import org.zstack.header.simulator.SimulatorHostVO; import org.zstack.header.vm.*; import org.zstack.header.volume.VolumeFormat; import org.zstack.tag.SystemTagCreator; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import static java.util.Arrays.asList; import static org.zstack.utils.CollectionDSL.e; import static org.zstack.utils.CollectionDSL.map; public class SimulatorFactory implements HypervisorFactory, HostBaseExtensionFactory { private static final HypervisorType hypervisorType = new HypervisorType(SimulatorConstant.SIMULATOR_HYPERVISOR_TYPE, CoreGlobalProperty.EXPOSE_SIMULATOR_TYPE); public static final VolumeFormat SIMULATOR_VOLUME_FORMAT = new VolumeFormat(SimulatorConstant.SIMULATOR_VOLUME_FORMAT_STRING, hypervisorType, CoreGlobalProperty.EXPOSE_SIMULATOR_TYPE); private Map<String, Host> hosts = Collections.synchronizedMap(new HashMap<String, Host>()); @Autowired private DatabaseFacade dbf; @Override public HostVO createHost(HostVO vo, AddHostMessage msg) { APIAddSimulatorHostMsg smsg = (APIAddSimulatorHostMsg) msg; SimulatorHostVO svo = new SimulatorHostVO(vo); svo.setMemoryCapacity(smsg.getMemoryCapacity()); svo.setCpuCapacity(smsg.getCpuCapacity()); svo.setUuid(vo.getUuid()); SystemTagCreator creator = HostSystemTags.OS_DISTRIBUTION.newSystemTagCreator(vo.getUuid()); creator.setTagByTokens(map(e(HostSystemTags.OS_DISTRIBUTION_TOKEN, "zstack"))); creator.inherent = true; creator.create(); creator = HostSystemTags.OS_RELEASE.newSystemTagCreator(vo.getUuid()); creator.setTagByTokens(map(e(HostSystemTags.OS_RELEASE_TOKEN, "simulator"))); creator.inherent = true; creator.create(); creator = HostSystemTags.OS_VERSION.newSystemTagCreator(vo.getUuid()); creator.setTagByTokens(map(e(HostSystemTags.OS_VERSION_TOKEN, "0.1"))); creator.inherent = true; creator.create(); svo = dbf.persistAndRefresh(svo); return svo; } @Override public HypervisorType getHypervisorType() { return hypervisorType; } @Override public HostInventory getHostInventory(HostVO vo) { return HostInventory.valueOf(vo); } @Override public HostInventory getHostInventory(String uuid) { HostVO vo = dbf.findByUuid(uuid, HostVO.class); return HostInventory.valueOf(vo); } @Override public Host getHost(HostVO vo) { Host host = hosts.get(vo.getUuid()); if (host == null) { SimulatorHostVO svo = dbf.findByUuid(vo.getUuid(), SimulatorHostVO.class); host = new SimulatorHost(svo); hosts.put(vo.getUuid(), host); } return host; } @Override public List<Class> getMessageClasses() { return asList(CreateVmOnHypervisorMsg.class, StopVmOnHypervisorMsg.class, RebootVmOnHypervisorMsg.class, StartVmOnHypervisorMsg.class, MigrateVmOnHypervisorMsg.class, AttachVolumeToVmOnHypervisorMsg.class, DetachVolumeFromVmOnHypervisorMsg.class, DestroyVmOnHypervisorMsg.class); } }