curl --request POST \
--url https://api.example.com/api/v1/device-conditions/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"observed_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
'import requests
url = "https://api.example.com/api/v1/device-conditions/"
payload = {
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"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',
observed_at: '2023-11-07T05:31:56Z',
reason: '',
message: ''
})
};
fetch('https://api.example.com/api/v1/device-conditions/', 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/",
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',
'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/"
payload := strings.NewReader("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\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/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/device-conditions/")
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 \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\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": ""
}{
"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>"
]
}
]
}Upsert a device condition
Upsert one device condition, keyed by (device, type). The declared source must own the condition type. Source-observed conditions require observed_at and ignore older observations.
curl --request POST \
--url https://api.example.com/api/v1/device-conditions/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"observed_at": "2023-11-07T05:31:56Z",
"reason": "",
"message": ""
}
'import requests
url = "https://api.example.com/api/v1/device-conditions/"
payload = {
"device": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"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',
observed_at: '2023-11-07T05:31:56Z',
reason: '',
message: ''
})
};
fetch('https://api.example.com/api/v1/device-conditions/', 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/",
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',
'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/"
payload := strings.NewReader("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\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/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"device\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/device-conditions/")
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 \"observed_at\": \"2023-11-07T05:31:56Z\",\n \"reason\": \"\",\n \"message\": \"\"\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": ""
}{
"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
Write contract for one source observation.
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 When the source made the observation.
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.
4096Response
Returned when an existing (device, type) condition row was updated, left unchanged by an idempotent re-report, or ignored because the submitted observed_at is older than the stored row.
A device condition: the latest observation about one aspect of a device.
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