QBO stands out as the exclusive AsyncAPI leveraging Docker-in-Docker (DinD) technology, dedicated to deploying and managing AI workloads in Kubernetes with unmatched metal performance.
Public server api endpoint Once the websocket is established you can send commands to the qbo API to manage cloud infrastucture components.
QBO can authenticate access to the API using a web interface or a CLI interface. The web interface uses oauth2 Google authentication and the CLI uses either a temporary universally unique token (via OAuth2 authentication) or a service account. Both methods as described below:
Note that when you login to the Web console @ https://console.cloud.qbo.io the web console is already configured and there is no further configuration needed for authentication. See Configuration priority for more info. It can be retrieved by logging in to the web console @ https://console.cloud.qbo.io and getting user's CLI local configuration
qbo get user -l | jq .cli[]?
{
"qbo_port": 443,
"qbo_host": "172.17.0.1",
"qbo_uid": "33820cc1-d513-4fa8-88ac-1adb008c3864"
}
Authentication Cookie:
cookie: qbo_uid=33820cc1-d513-4fa8-88ac-1adb008c3864; qbo_aux=
QBO service accounts use Elliptical curve cryptography (ECC) P-521 for encryption. A public key in json compact format qbo_uid`` is shared as well as an auxiliary token
qbo_aux`` for authentication.
Before we can obtain and configure a service account a temporary web token is needed (as described in Temporary Web Token
section above) to retrieve the service account.
qbo get user -c alex@qbo.io | jq .users[]?.cli > ~/.qbo/cli.json
{
"qbo_uid": {
"crv": "P-521",
"kty": "EC",
"x": "AMu-cWn4gmkQiCAJMeW4BfZUAhPwAA3rROnw6nGUk8hl3bvV7gKKng2Eov6oxTvg70kulH6Nbq2wvJbAzyAjnPlT",
"y": "Ab7VgSfOzG-7IgRF6ffUn5E0J43eDL8_vFtFtP7RihVgNBMUeZzo0yaskfx59SdqnL8q24wEHSTp4dDUxNal3kQ1"
},
"qbo_aux": "66fac858-a271-49cf-bad0-fdd9ff0b4787",
"qbo_port": 443,
"qbo_host": "nemo.cloud.qbo.io",
"qbo_user": "alex@qbo.io"
}
Authentication Cookie:
cookie: qbo_uid=${compact}; qbo_aux=66fac858-a271-49cf-bad0-fdd9ff0b4787
Example code in go
showing how compact
can be generated:
plaintext := []byte("66fac858-a271-49cf-bad0-fdd9ff0b4787")
xEnc := "AMu-cWn4gmkQiCAJMeW4BfZUAhPwAA3rROnw6nGUk8hl3bvV7gKKng2Eov6oxTvg70kulH6Nbq2wvJbAzyAjnPlT"
yEnc := "Ab7VgSfOzG-7IgRF6ffUn5E0J43eDL8_vFtFtP7RihVgNBMUeZzo0yaskfx59SdqnL8q24wEHSTp4dDUxNal3kQ1"
dEnc := "AVuTcFe_AJetnzt2xYQu2M505A3YNoAiHgh7JlkbFJq7H3UNjmaEhawPiK0AU8IoimyfoN4cCSlF087u1_Cytqw7"
x := new(big.Int)
temp, _ := b64.URLEncoding.DecodeString(xEnc)
x = x.SetBytes(temp)
y := new(big.Int)
temp, _ = b64.URLEncoding.DecodeString(yEnc)
y = y.SetBytes(temp)
d := new(big.Int)
temp, _ = b64.URLEncoding.DecodeString(dEnc)
d = d.SetBytes(temp)
privkey := new(ecdsa.PrivateKey)
privkey.PublicKey.Curve = elliptic.P521()
privkey.D = d
privkey.PublicKey.X = x
privkey.PublicKey.Y = y
fmt.Printf("X: %d\nY: %d\nD: %d\n", privkey.X, privkey.Y, privkey.D)
encrypter, err := gojose.NewEncrypter(gojose.A256CBC_HS512, gojose.Recipient{Algorithm: gojose.ECDH_ES, Key: privkey.Public()}, nil)
if err != nil {
panic(err)
}
encrypted, err := encrypter.Encrypt(plaintext)
if err != nil {
panic(err)
}
fmt.Printf("encrypted = %v\n", encrypted.Header)
compact, err := encrypted.CompactSerialize()
if err != nil {
panic(err)
}
fmt.Printf("Compact Encrypted: %v\n", compact)
Send command input to the qbo API
Accepts one of the following messages:
Get qbo API version.
Get qbo CLoud API version by host.
{
"cmd": "version",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"qbo_uid": "string",
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906"
}
Get qbo clusters, nodes, pods, services, networks, load balancers or users.
Gets Kubernetes clusters, nodes, pods, services, network, load balancers and users by name or IDs.
Example of a command getting "dev" and "prod" Kubernetes clusters
{
"cmd": "get nodes dev prod",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting all Kubernetes nodes by user
{
"cmd": "get nodes -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting all Kubernetes pods by user
{
"cmd": "get pods -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting all Kubernetes services by user
{
"cmd": "get services -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting Kubernetes networks for 'dev' and 'prod' clusters
{
"cmd": "get net dev prod",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting all load balancer attached to Kubernetes clusters
{
"cmd": "get ipvs -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting user information
{
"cmd": "get users -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command getting all Kubernetes images by version
{
"cmd": "get images -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"qbo_uid": "string",
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906"
}
Start qbo clusters or nodes.
Starts Kubernetes cluster or nodes by name or id in qbo Cloud.
Example of a command starting "dev" and "prod" clusters
{
"cmd": "start clusters dev prod",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
Example of a command starting all cluster owned by the user
{
"cmd": "start clusters -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"qbo_uid": "string",
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906"
}
Stop qbo clusters or nodes.
Stops Kubernetes clusters or nodes by name or id in qbo Cloud.
{
"cmd": "stop clusters alex",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"cmd": "stop clusters -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"qbo_uid": "string",
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906"
}
Add qbo clusters or nodes.
Adds a Kubernetes cluster or scales up a Kubernetes cluster by name or id in qbo Cloud.
{
"cmd": "add cluster alex -i hub.docker.com/kindest/node:v1.27.3",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"cmd": "add cluster dev prod",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"qbo_uid": "string",
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906"
}
Delete qbo clusters or nodes.
Deletes Kubenetes clusters or nodes by name or id in qbo Cloud.
{
"cmd": "delete cluster dev prod",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"cmd": "delete clusters -A",
"uuid": "66fac858-a271-49cf-bad0-fdd9ff0b4787"
}
{
"qbo_uid": "string",
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906"
}
Receive command output from the qbo API
Accepts one of the following messages:
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"clusters": {
"address": "string",
"control_plane": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"name": "string",
"state": "string",
"user": "user@example.com"
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"nodes": {
"name": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"image": "string",
"cluster": "string",
"state": "string",
"address": "string",
"os": "string",
"kernel": "string",
"user": "user@example.com",
"cluster_id": "d3d1bfdf-67c4-41fa-b065-858242731616"
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"pods": {
"name": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"namespace": "string",
"address": "string",
"status": "string",
"ready": 0,
"started": 0,
"node": "string",
"node_status": "string",
"cluster": "string",
"user": "user@example.com",
"cluster_id": "string"
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"services": {
"name": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"namespace": "string",
"address": "string",
"external_address": "string",
"type": "string",
"port_name": "string",
"port_number": 0,
"target_port": 0,
"node_port": 0,
"protocol": "string",
"cluster": "string",
"user": "user@example.com"
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"networks": {
"name": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"subnet": "string",
"state": "string",
"user": "user@example.com"
}
}
Kubernetes load balancers.
Contains the list of Kubernetes load balancers.
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"ipvs": {
"id": "string",
"vip": "string",
"vip_port": "string",
"rip": "string",
"rip_port": "string",
"aux": "string",
"protocol": "string",
"scheduler": "string",
"forward": "string",
"weight": 0,
"state": "string",
"node": "string",
"cluster": "string",
"user": "user@example.com"
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"users": {
"name": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"self": 0,
"picture": "string",
"email": "user@example.com",
"type": 0,
"status": 0,
"id": "string",
"shell": "string",
"cli": {
"exp": 0,
"conf": {
"qbo_uid": {
"crv": "P-521",
"kty": "EC",
"x": "string",
"y": "string"
},
"qbo_aux": "c1db3812-a3c1-4ff6-a955-d8344bc4a906",
"qbo_port": 0,
"qbo_host": "string",
"qbo_user": "user@example.com"
}
}
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"clients": {
"timestamp": 0,
"user": "user@example.com",
"mirror": "216731d8-a74c-4e5a-9701-8b9f64c49fad",
"control": 0,
"address": "string",
"agent": "string",
"command": "string",
"command_id": "7d510d78-7444-4252-aeac-9e473949661e",
"process_id": 0,
"thread_id": 0,
"wsi": "string",
"wss_over_h2": 0,
"host": "string"
}
}
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"output": [
{
"message": "string"
}
]
}
QBO API input command log message.
QBO API input command log message.
{
"timestamp": "string",
"status": "string",
"code": 0,
"command_id": "string",
"command_line": "e175c04f-d13e-4534-b576-50cdacb97aff",
"command": "string",
"subcommand": "string",
"apicommand": "string",
"callback": "string",
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"user": "user@example.com",
"agent": "string",
"peer": "string",
"host": "string",
"source": "string",
"wsi": "string",
"thread_id": 0,
"vhost": "string",
"input": [
{
"message": "string"
}
]
}
Get qbo API version.
Get qbo CLoud API version by host.
Get qbo clusters, nodes, pods, services, networks, load balancers or users.
Gets Kubernetes clusters, nodes, pods, services, network, load balancers and users by name or IDs.
Start qbo clusters or nodes.
Starts Kubernetes cluster or nodes by name or id in qbo Cloud.
Stop qbo clusters or nodes.
Stops Kubernetes clusters or nodes by name or id in qbo Cloud.
Add qbo clusters or nodes.
Adds a Kubernetes cluster or scales up a Kubernetes cluster by name or id in qbo Cloud.
Delete qbo clusters or nodes.
Deletes Kubenetes clusters or nodes by name or id in qbo Cloud.
Kubernetes load balancers.
Contains the list of Kubernetes load balancers.
QBO API input command log message.
QBO API input command log message.
QBO API unique universal indentifier
QBO auxiliary universal unique indentifier
QBO API key or uuid
QBO API hostname or addres
QBO API port number
QBO user email