Chicken and egg issue: 'Endpoint' does not exist


I have an issue with with dynamically adding host via API.

I have several service applies like this:
apply Service “load” {
import “load-service”
check_command = “load”
command_endpoint = host.vars.client_endpoint
assign where “linux-servers” in host.groups

And I tried to add host via API:
curl -k -s -u apiuser:apipass -H 'Accept: application/json' -X PUT '' -d '{ "templates": [ "generic-host" ], "attrs": { "address": "", "check_command": "hostalive", "vars.os" : "Linux", "vars.client_endpoint": "test-node01", "vars.location": "loc1", "vars.role": "lb" , "zone": "ams1" }, "pretty": true }'

But I get the error:

“results”: [
“code”: 500.0,
“errors”: [
“Error: Validation failed for object ‘test-node01!load’ of type ‘Service’; Attribute ‘command_endpoint’: Object ‘test-node01’ of type ‘Endpoint’ does not exist.\nLocation: in /etc/icinga2/zones.d/global-templates/services.conf: 81:3-81:46\n/etc/icinga2/zones.d/global-templates/services.conf(79): import “load-service”\n/etc/icinga2/zones.d/global-templates/services.conf(80): check_command = “load”\n/etc/icinga2/zones.d/global-templates/services.conf(81): command_endpoint = host.vars.client_endpoint\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n/etc/icinga2/zones.d/global-templates/services.conf(82): assign where “linux-servers” in host.groups\n/etc/icinga2/zones.d/global-templates/services.conf(83): }\n”,
“status”: “Object could not be created.”

So I can’t add a host since it doesn’t pass the validation and it doesn’t pass the validation because the host doesn’t exist.

As a workaround i see adding a host in two steps:

  1. Adding host without Endpoint variable.
  2. Modifying previously added hosts to adding endpoint variable.

Nevertheless, I belive there is smarter way to resolve the issue.

I would really appreciate a for your advices.

You only define a host object, but Icinga wants an endpoint and zone object too.
For your example you also need to add via api this

object Endpoint "test-node01" {

object Zone "test-node01" {
  endpoints = [ "test-node01" ]
  parent = "ams1"
1 Like

Keep in mind that Endpoint/Zone objects need to managed via config packages, direct object PUTs won’t work - there’s a known issue on GitHub.


1 Like