跳到主要内容

获取 VNC 信息

目前 CloudTower API 及相关 SDK 暂不提供获取 VNC 信息相关的 API。如果使用者需要获取 VNC 信息,打开虚拟机终端等相关操作的话,可以通过发送以下请求 token 并构建 noVnc 链接

curl -X 'POST' \
'http://CLOUDTOWER_API/api' \
-H 'accept: application/json' \
-H 'content-language: en-US' \
-H 'Authorization: YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"operationName": "vnc",
"variables": { "input": { "vm": { "id": $VM_ID } } },
"query": "query vnc($input: VncInput!) { vnc(input: $input) { vm_uuid host_ip cluster_ip raw_token token}}"
}'

其中 $VM_ID 为虚拟机 id , endpoint 为 /api。 返回结果的示例如下:

{
"data": {
"vnc": {
"raw_token": "a 32-character hexadecimal number",
"token": "a string encrytped by Base64",
"vm_uuid": "vm_uuid",
"cluster_ip": "cluster_ip",
"host_ip": "host_ip"
}
}
}

如果当前环境可以直连集群,可以选择使用 cluster_ip, vm_uuid, raw_tokenhost_ip 构建直连集群的 noVnc 链接:

[wss/ws]://${cluster_ip}/websockify/?uuid=${vm_uuid}&token=${raw_token}&host=${host_ip}

或者可以选择使用 token, vm_uuidhost_ip以构建通过 CloudTower 转发的 noVnc 链接,由于 token 是一个被 base64 处理后的字符串,因此中可能包含一部分不能包含在 URL 的字符,例如 /+= 等,需要转义成十六进制数字:

[wss/ws]://${cloudtower_ip}/websockify/?token=${token}&host=${host_ip}&uuid=${vm_uuid}

链接的使用可以参考 react-vnc 对 noVnc 的使用

具体示例:

假设我们接收到了这样的一个返回:

{
"data": {
"vnc": {
"raw_token": "1a2bc3d4567e89f0a1b2c3d4e5f6a7b8",
"token": "MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo=",
"vm_uuid": "00000000-0000-0000-0000-000000000000",
"cluster_ip": "192.168.5.2",
"host_ip": "192.168.5.4"
}
}
}

如果希望直连,我们最后会构建出这样的一个 URL

wss://192.168.5.2/websockify/?uuid=00000000-0000-0000-0000-000000000000&token=1a2bc3d4567e89f0a1b2c3d4e5f6a7b8&host=192.168.5.4

如果希望通过 CloudTower 转发,我们需要先处理 token,假设我们的 token 是 MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo= (基于 123456789abcdefghijklmnopqrstuvwxyz base64 加密获得),我们需要将 /+= 等字符转义。

token = "MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo="
encodeURIComponent(token) = "MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo%3D"

假设 CloudTower 地址是 192.168.5.1 URL 最后会是:

wss://192.168.5.1/websockify/?token=MTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo%3D&uuid=00000000-0000-0000-0000-000000000000&host=192.168.5.4