func readLibvirtVM(HostIpAddress string, UUIDString string) (VirtualMachine, error) { var conn libvirt.VirConnection var err error ok := ipaddressConnectionCache.Check(HostIpAddress) if ok == false { conn, err = libvirt.NewVirConnection("qemu+ssh://root@" + HostIpAddress + "/system") if err != nil { return VirtualMachine{}, err } ipaddressConnectionCache.Set(HostIpAddress, conn) } else { //?How to deal with connection's not alive conn = ipaddressConnectionCache.Get(HostIpAddress).(libvirt.VirConnection) if ok, _ := conn.IsAlive(); !ok { log.Printf("remote %s is not alive", HostIpAddress) conn, err = libvirt.NewVirConnection("qemu+ssh://root@" + HostIpAddress + "/system") if err != nil { ipaddressConnectionCache.Delete(HostIpAddress) return VirtualMachine{}, err } /*TODO Write Lock*/ ipaddressConnectionCache.Set(HostIpAddress, conn) } } domain, err := conn.LookupByUUIDString(UUIDString) if err != nil { return VirtualMachine{}, err } vm := fillVmData(domain, conn) return vm, nil }