curl --request POST \
--url https://api.example.com/api/v1/device-conditions/apply/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"conditions": [
{
"observed_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
]
}
'import requests
url = "https://api.example.com/api/v1/device-conditions/apply/"
payload = {
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"conditions": [
{
"observed_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
device: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
conditions: [{observed_at: '2023-11-07T05:31:56Z', reason: '', message: ''}]
})
};
fetch('https://api.example.com/api/v1/device-conditions/apply/', 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.example.com/api/v1/device-conditions/apply/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'device' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'conditions' => [
[
'observed_at' => '2023-11-07T05:31:56Z',
'reason' => '',
'message' => ''
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/device-conditions/apply/"
payload := strings.NewReader("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"conditions\": [\n {\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.example.com/api/v1/device-conditions/apply/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"conditions\": [\n {\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/device-conditions/apply/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"conditions\": [\n {\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "ProvisioningHealthy",
"status": "True",
"source": "ironic",
"condition_of": "operational_status",
"decisive": true,
"observed_at": "2023-11-07T05:31:56Z",
"last_transitioned_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
]{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}Apply a device condition snapshot (internal)
Apply one source’s full condition snapshot for a device. Every condition is upserted in a single transaction and the device’s status is derived exactly once, so a multi-condition observation is never derived from a half-applied snapshot and a mid-batch failure rolls the batch back. The declared source must own every condition type. Returns the device’s full current condition set.
curl --request POST \
--url https://api.example.com/api/v1/device-conditions/apply/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"conditions": [
{
"observed_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
]
}
'import requests
url = "https://api.example.com/api/v1/device-conditions/apply/"
payload = {
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"conditions": [
{
"observed_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
device: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
conditions: [{observed_at: '2023-11-07T05:31:56Z', reason: '', message: ''}]
})
};
fetch('https://api.example.com/api/v1/device-conditions/apply/', 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.example.com/api/v1/device-conditions/apply/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'device' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'conditions' => [
[
'observed_at' => '2023-11-07T05:31:56Z',
'reason' => '',
'message' => ''
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/device-conditions/apply/"
payload := strings.NewReader("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"conditions\": [\n {\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.example.com/api/v1/device-conditions/apply/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"conditions\": [\n {\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/device-conditions/apply/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"conditions\": [\n {\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "ProvisioningHealthy",
"status": "True",
"source": "ironic",
"condition_of": "operational_status",
"decisive": true,
"observed_at": "2023-11-07T05:31:56Z",
"last_transitioned_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
]{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Body
Bulk per-device, per-source condition snapshot (ADR-0024).
A source publishes its whole observation for one device in a single request;
every condition is upserted in one transaction and the status is derived once.
The declared source must own every condition type in the batch.
ironic- Ironicslurm- Slurmhealth-status- Health statusgoogle-custody- Google custodynvlink-fabric- NVLink fabricbackend-fabric- Back-end fabric
ironic, slurm, health-status, google-custody, nvlink-fabric, backend-fabric Show child attributes
Show child attributes
Response
The device this observation belongs to.
ProvisioningHealthy- Provisioning healthyMaintenanceClear- Maintenance clearEnrolled- EnrolledInValidationPool- In validation poolInstanceAllocated- Instance allocatedCustomerAllocated- Customer allocatedCustomerReady- Customer readySlurmMember- Slurm memberSlurmSchedulable- Slurm schedulableTelemetryHealthy- Telemetry healthySystemHealthy- System healthyChassisHealthy- Chassis healthyProcessorHealthy- Processor healthyMemoryHealthy- Memory healthyStorageHealthy- Storage healthyDiskHealthy- Disk healthyPowerSupplyHealthy- Power supply healthyGpuHealthy- GPU healthyFpgaHealthy- FPGA healthyCustodyIntent- Custody intentFrontendPortsInCustomerVrf- Front-end ports in customer VRFNvLinkGpusInRepairPartition- GPUs in NVLink repair partitionBackendPortsInMaintenanceVrf- Back-end ports in maintenance VRF
ProvisioningHealthy, MaintenanceClear, Enrolled, InValidationPool, InstanceAllocated, CustomerAllocated, CustomerReady, SlurmMember, SlurmSchedulable, TelemetryHealthy, SystemHealthy, ChassisHealthy, ProcessorHealthy, MemoryHealthy, StorageHealthy, DiskHealthy, PowerSupplyHealthy, GpuHealthy, FpgaHealthy, CustodyIntent, FrontendPortsInCustomerVrf, NvLinkGpusInRepairPartition, BackendPortsInMaintenanceVrf True- TrueFalse- FalseUnknown- Unknown
True, False, Unknown ironic- Ironicslurm- Slurmhealth-status- Health statusgoogle-custody- Google custodynvlink-fabric- NVLink fabricbackend-fabric- Back-end fabric
ironic, slurm, health-status, google-custody, nvlink-fabric, backend-fabric The derived top-level device status this condition contributes to, or none when it is eligibility-only. Stamped by the hub from the code-owned type registry, not the reporting source.
operational_status- Operational statushealth_status- Health statusnone- None
operational_status, health_status, none Whether this condition is decisive in the current derivation of its condition_of domain's status from conditions. Maintained by the hub-owned derivation on every materialise; independent of out-of-band status overrides; always false for condition_of=none; never client-set.
When the source made an observation.
When 'status' last changed value. The upsert path bumps this only on a real status transition, so it survives no-op re-reports of the same status and stays the 'when did this actually flip' signal.
Opaque, source-owned CamelCase cause code scoped to the condition type. Fleet Manager does not interpret it; blank when no cause is reported.
128Human-readable detail for operators. Optional.
4096