for windows vm, use localtime

This commit is contained in:
Edison Su 2012-01-19 15:04:36 -08:00
parent 03cce245cf
commit 5fcaa5a659
2 changed files with 77 additions and 7 deletions

View File

@ -59,10 +59,7 @@ import org.libvirt.DomainInterfaceStats;
import org.libvirt.DomainSnapshot;
import org.libvirt.LibvirtException;
import org.libvirt.NodeInfo;
import org.libvirt.StoragePool;
import org.libvirt.StoragePoolInfo;
import org.libvirt.StorageVol;
import org.libvirt.StorageVolInfo;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.AttachIsoCommand;
@ -155,7 +152,6 @@ import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.resource.computing.KVMHABase.NfsStoragePool;
import com.cloud.agent.resource.computing.LibvirtStorageVolumeDef.volFormat;
import com.cloud.agent.resource.computing.LibvirtVMDef.ConsoleDef;
import com.cloud.agent.resource.computing.LibvirtVMDef.DevicesDef;
import com.cloud.agent.resource.computing.LibvirtVMDef.DiskDef;
@ -168,12 +164,12 @@ import com.cloud.agent.resource.computing.LibvirtVMDef.InterfaceDef;
import com.cloud.agent.resource.computing.LibvirtVMDef.InterfaceDef.hostNicType;
import com.cloud.agent.resource.computing.LibvirtVMDef.SerialDef;
import com.cloud.agent.resource.computing.LibvirtVMDef.TermPolicy;
import com.cloud.agent.resource.computing.LibvirtVMDef.ClockDef;
import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
import com.cloud.agent.storage.KVMPhysicalDisk;
import com.cloud.agent.storage.KVMPhysicalDisk.PhysicalDiskFormat;
import com.cloud.agent.storage.KVMStoragePool;
import com.cloud.agent.storage.KVMStoragePoolManager;
import com.cloud.agent.storage.LibvirtStorageAdaptor;
import com.cloud.dc.Vlan;
import com.cloud.exception.InternalErrorException;
import com.cloud.host.Host.Type;
@ -207,7 +203,7 @@ import com.cloud.vm.DiskProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.VirtualMachineName;
import com.xensource.xenapi.Connection;
/**
@ -2272,6 +2268,14 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
term.setPowerOffPolicy("destroy");
term.setRebootPolicy("restart");
vm.addComp(term);
ClockDef clock = new ClockDef();
if (vmTO.getOs().startsWith("Windows")) {
clock.setClockOffset(ClockDef.ClockOffset.LOCALTIME);
clock.setTimer("rtc", "catchup", null);
}
vm.addComp(clock);
DevicesDef devices = new DevicesDef();
devices.setEmulatorPath(_hypervisorPath);

View File

@ -183,6 +183,72 @@ public class LibvirtVMDef {
}
}
public static class ClockDef {
public enum ClockOffset {
UTC("utc"),
LOCALTIME("localtime"),
TIMEZONE("timezone"),
VARIABLE("variable");
private String _offset;
private ClockOffset(String offset) {
_offset = offset;
}
@Override
public String toString() {
return _offset;
}
}
private ClockOffset _offset;
private String _timerName;
private String _tickPolicy;
private String _track;
public ClockDef() {
_offset = ClockOffset.UTC;
}
public void setClockOffset(ClockOffset offset) {
_offset = offset;
}
public void setTimer(String timerName, String tickPolicy, String track) {
_timerName = timerName;
_tickPolicy = tickPolicy;
_track = track;
}
@Override
public String toString() {
StringBuilder clockBuilder = new StringBuilder();
clockBuilder.append("<clock offset='");
clockBuilder.append(_offset.toString());
clockBuilder.append("'>\n");
if (_timerName != null) {
clockBuilder.append("<timer name='");
clockBuilder.append(_timerName);
clockBuilder.append("' ");
if (_tickPolicy != null) {
clockBuilder.append("tickpolicy='");
clockBuilder.append(_tickPolicy);
clockBuilder.append("' ");
}
if (_track != null) {
clockBuilder.append("track='");
clockBuilder.append(_track);
clockBuilder.append("' ");
}
clockBuilder.append(">\n");
clockBuilder.append("</timer>\n");
}
clockBuilder.append("</clock>\n");
return clockBuilder.toString();
}
}
public static class DevicesDef {
private String _emulator;
private final Map<String, List<?>> devices = new HashMap<String, List<?>>();