Обновление хоста через api foreman

Problem:
Я использую API Foreman для обновления хоста. Мне нужно обновить Environments и Hostgroups хоста. Обновить нужно так, чтобы существующая информация о хосте не стиралась.

Для достижения цели, я использую информацию по этой ссылке:
https://apidocs.theforeman.org/foreman/2.0/apidoc/v2/hosts/update.html
Я использую python для отправки PUT запросов, и он идеально отрабатывает.
ss.put("/api/hosts/1299", params={‘host[hostgroup_id]’: 1, ‘host[environment_id]’: 1}, headers={‘Content-Type’: ‘application/json’})

Поясню. Все отлично работает и обновляется. Но я не могу понять, почему запрос PUT не затирает информацию о хосте 1299(/api/hosts/1299), оставляя только Environments и Hostgroups?
Насколько я знаю методу PUT нужно передавать все параметры для обновления хоста, но почему-то работает и так.
Когда я переношу в другую Hostgroups, то у меня даже автоматически классы переносятся для хоста. Хотя я не указывал этого в параметрах запроса PUT.

Прошу объяснить данное поведение. И безопасно ли использовать подход описанный выше?

** Информация о API Foreman:**
{‘result’: ‘ok’, ‘status’: 200, ‘version’: ‘1.20.3’, ‘api_version’: 2}

** Остальная информация о Foreman:**
ii foreman 1.20.3-2
ii foreman-cli 1.20.3-2
ii foreman-debug 1.20.3-2
ii foreman-installer 1.20.3-2
ii foreman-postgresql 1.20.3-2
ii foreman-proxy 1.20.3-2
ii ruby-foreman-default-hostgroup 5.0.0-1
ii ruby-hammer-cli-foreman 0.15.1-1

Hi friend,

Could you write in English. Sadly, my Russian classes got cancelled because of covid :wink:

1 Like

Luckily, my Russian classes never got cancelled.

So our API handles PUT more like PATCH, anything you don’t specify, isn’t updated. That’s by design. If you want to remove other parameters, you will have to explicitly call them out, and set them to None (or null, or whatever).

Женя

2 Likes

Я вас понял. Это очень хорошо, что API сохраняет данные о хосте, которые я не хочу изменять.
Также я обратил внимание, что API самостоятельно меняет в параметрах хоста environment_name и hostgroup_name. И еще API самостоятельно формирует параметр all_puppetclasses в соответствии с классами включенными в Hostgroups.

И вы хотите сказать что это правильная работа API?
Я просто глазам не верю, что он взял на себя все сложные задачи. Если это действительно так , то респект разработчикам.

(Can you please post in English, so that others can both help and benefit from your questions?)

And yes, the API does return a few things you didn’t explicitly set. Like all_puppetclasses, which is an computed attribute from the Puppeclasses set on the Host plus the ones of the Hostgroup (and possible parent Hostgroups). Or hostgroup_name, while you only set hostgroup_id in your create/update request.

1 Like