GetVNCProxyWithWebSocket creates a VNC proxy for a VM with WebSocket support and one-time password.
(vm *VM)
| 85 | |
| 86 | // GetVNCProxyWithWebSocket creates a VNC proxy for a VM with WebSocket support and one-time password. |
| 87 | func (c *Client) GetVNCProxyWithWebSocket(vm *VM) (*VNCProxyResponse, error) { |
| 88 | c.logger.Info("Creating VNC proxy with WebSocket for VM: %s (ID: %d, Type: %s, Node: %s)", vm.Name, vm.ID, vm.Type, vm.Node) |
| 89 | |
| 90 | if vm.Type != VMTypeQemu && vm.Type != VMTypeLXC { |
| 91 | c.logger.Error("VNC proxy with WebSocket not supported for VM type: %s", vm.Type) |
| 92 | |
| 93 | return nil, fmt.Errorf("VNC proxy only available for QEMU VMs and LXC containers") |
| 94 | } |
| 95 | |
| 96 | var res map[string]interface{} |
| 97 | |
| 98 | path := fmt.Sprintf("/nodes/%s/%s/%d/vncproxy", vm.Node, vm.Type, vm.ID) |
| 99 | |
| 100 | c.logger.Debug("VNC proxy WebSocket API path for VM %s: %s", vm.Name, path) |
| 101 | |
| 102 | // Different parameters based on VM type |
| 103 | // LXC containers don't support generate-password parameter |
| 104 | var data map[string]interface{} |
| 105 | if vm.Type == VMTypeLXC { |
| 106 | // LXC containers only support websocket parameter |
| 107 | data = map[string]interface{}{ |
| 108 | "websocket": 1, |
| 109 | } |
| 110 | |
| 111 | c.logger.Debug("Using LXC-compatible parameters for VM %s (no generate-password)", vm.Name) |
| 112 | } else { |
| 113 | // QEMU VMs support both websocket and generate-password |
| 114 | data = map[string]interface{}{ |
| 115 | "websocket": 1, |
| 116 | "generate-password": 1, |
| 117 | } |
| 118 | |
| 119 | c.logger.Debug("Using QEMU parameters for VM %s (with generate-password)", vm.Name) |
| 120 | } |
| 121 | |
| 122 | c.logger.Debug("VNC proxy WebSocket request data for VM %s: %+v", vm.Name, data) |
| 123 | |
| 124 | if err := c.PostWithResponse(path, data, &res); err != nil { |
| 125 | c.logger.Error("Failed to create VNC proxy with WebSocket for VM %s: %v", vm.Name, err) |
| 126 | |
| 127 | return nil, fmt.Errorf("failed to create VNC proxy with WebSocket: %w", err) |
| 128 | } |
| 129 | |
| 130 | c.logger.Debug("VNC proxy WebSocket API response for VM %s: %+v", vm.Name, res) |
| 131 | |
| 132 | responseData, ok := res["data"].(map[string]interface{}) |
| 133 | if !ok { |
| 134 | c.logger.Error("Unexpected VNC proxy WebSocket response format for VM %s", vm.Name) |
| 135 | |
| 136 | return nil, fmt.Errorf("unexpected VNC proxy response format") |
| 137 | } |
| 138 | |
| 139 | response := &VNCProxyResponse{} |
| 140 | |
| 141 | if ticket, ok := responseData["ticket"].(string); ok { |
| 142 | response.Ticket = ticket |
| 143 | c.logger.Debug("VNC proxy WebSocket ticket obtained for VM %s (length: %d)", vm.Name, len(ticket)) |
| 144 | } |
no test coverage detected