curl --request POST \
--url https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"controller_id": "44444444-4444-4444-8444-444444444444",
"node_id": "33333333-3333-4333-8333-333333333333",
"state": "cleaning"
}Add a physical worker
Adds one host to an owned cluster that is not failed or being torn down. The host must be in bare-metal status, not in another cluster, and on an active reservation your organization owns; it can come from a different reservation than the one the cluster launched on. A VM and its host cannot both be cluster workers.
A new host normally returns state cleaning. Ornn first prepares the host - running processes are stopped, the tenant home directory is wiped, and any VM on that host is removed - and the host then appears in the cluster’s nodes in listClusters with state joining, then ready. Repeating the request is safe. It returns cleaning while preparation is pending, or the current membership state once the host is a member.
For Kubernetes, adding a worker does not raise the GPU quota of the namespace Ornn configured, which is sized when the cluster first becomes active. A host from another reservation is labeled and tainted with its own reservation, while pods in that namespace are pinned to the reservation the cluster launched on. Verify Node readiness, allocatable GPUs, and the namespace quota through the Kubernetes API before scheduling more work.
curl --request POST \
--url https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/controllers/{controller_id}/nodes/{node_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"controller_id": "44444444-4444-4444-8444-444444444444",
"node_id": "33333333-3333-4333-8333-333333333333",
"state": "cleaning"
}ornn login:
ornn clusters add-node CLUSTER_ID NODE_ID
Authorizations
Create an organization API key in Account Settings > Developer. Do not send this key to the Kubernetes API server.
Path Parameters
Cluster id returned by create or list; not a reservation ID.
An existing owned physical worker ID.
Response
Addition accepted, or the host is already a member. Preparation and joining continue asynchronously.
On a new addition, cleaning while Ornn prepares the host or joining when it attaches directly. On a repeated addition, the current membership state, such as joining or ready, or cleaning while preparation is still pending. On removal, draining.
Was this page helpful?