tstest/natlab/vmtest: add macOS VM screenshot streaming to web UI
When --vmtest-web is set, Host.app is launched with --screenshot-port 0
to start a localhost HTTP server that captures the VZVirtualMachineView
display. The Go test harness parses the SCREENSHOT_PORT=<port> line from
stdout, then polls every 2 seconds for JPEG thumbnails and pushes them
over WebSocket to the web dashboard.
Clicking a screenshot thumbnail opens a full-resolution image proxied
through the web UI's /screenshot/{node} endpoint.
Screenshot events are excluded from the EventBus history (they're large
and only the latest matters, stored in NodeStatus.Screenshot).
Updates #13038
Change-Id: I9bc67ddd1cc72948b33c555d4be3d8db06a41f6d
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
78627c132f
commit
4cec06b8f2
@@ -1198,6 +1198,34 @@ func (e *Env) HTTPGet(from *Node, targetURL string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
// setNodeScreenshot stores the latest screenshot data URI for a node.
|
||||
func (e *Env) setNodeScreenshot(name, dataURI string) {
|
||||
e.nodeStatusMu.Lock()
|
||||
if ns := e.nodeStatus[name]; ns != nil {
|
||||
ns.Screenshot = dataURI
|
||||
}
|
||||
e.nodeStatusMu.Unlock()
|
||||
}
|
||||
|
||||
// setNodeScreenshotPort stores the Host.app screenshot server port for a node.
|
||||
func (e *Env) setNodeScreenshotPort(name string, port int) {
|
||||
e.nodeStatusMu.Lock()
|
||||
if ns := e.nodeStatus[name]; ns != nil {
|
||||
ns.ScreenshotPort = port
|
||||
}
|
||||
e.nodeStatusMu.Unlock()
|
||||
}
|
||||
|
||||
// nodeScreenshotPort returns the Host.app screenshot server port for a node, or 0.
|
||||
func (e *Env) nodeScreenshotPort(name string) int {
|
||||
e.nodeStatusMu.Lock()
|
||||
defer e.nodeStatusMu.Unlock()
|
||||
if ns := e.nodeStatus[name]; ns != nil {
|
||||
return ns.ScreenshotPort
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// Agent returns the node's TTA agent client, or nil if NoAgent is set.
|
||||
func (n *Node) Agent() *vnet.NodeAgentClient {
|
||||
return n.agent
|
||||
|
||||
Reference in New Issue
Block a user