获取 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_token
和 host_ip
构建直连集群的 noVnc 链接:
[wss/ws]://${cluster_ip}/websockify/?uuid=${vm_uuid}&token=${raw_token}&host=${host_ip}
或者可以选择使用 token
, vm_uuid
和 host_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