Project

General

Profile

Bug #13775

Not able to change an HG for a host using API call

Added by Konstantin Orekhov over 2 years ago. Updated 3 months ago.

Status:
Closed
Priority:
Normal
Assignee:
Category:
API
Target version:
Difficulty:
Triaged:
Bugzilla link:
Team Backlog:
Fixed in Releases:
Found in Releases:

Description

I have a host that is in common/puppet-master (id: 5) HG currently:

[root@spc01 ~]# curl -kSs -H "Content-type:application/json" -u admin:$FOREMAN_PASSWORD https://localhost/api/hosts/`hostname -f` | jq '.' | egrep "name|id" | grep -v null
"environment_id": 1,
"environment_name": "production",
"domain_id": 1,
"domain_name": "test.domain.com",
"architecture_id": 1,
"architecture_name": "x86_64",
"operatingsystem_id": 1,
"operatingsystem_name": "CentOS 7.2",
"model_id": 1,
"model_name": "Standard PC (i440FX + PIIX, 1996)",
"hostgroup_id": 5,
"hostgroup_name": "common",
"owner_id": 3,
<snip>
[root@spc01 ~]#

If I try to change its HG into some other one, I get this error:

[root@spc01 ~]# curl -kSs -H "Content-type:application/json" -u admin:$FOREMAN_PASSWORD -X PUT https://localhost/api/hosts/`hostname -f` -d '{ "hostgroup_id": 3 }' | jq '.' {
"error": {
"message": "Resource host not found by id 'spc01.test.domain.com'"
}
}

production log shows me this:

| Started PUT "/api/hosts/spc01.test.domain.com" for 127.0.0.1 at 2016-02-17 01:21:45 +0000
2016-02-17 01:21:45 [app] [I] Processing by Api::V2::HostsController#update as JSON
2016-02-17 01:21:45 [app] [I] Parameters: {"hostgroup_id"=>3, "apiv"=>"v2", "id"=>"spc01.test.domain.com", :host=>{"hostgroup_id"=>3}}
2016-02-17 01:21:45 [app] [I] Authorized user admin(Admin User)
2016-02-17 01:21:45 [app] [I] Couldn't find Host::Managed with id=spc01.test.domain.com [WHERE `hosts`.`type` IN ('Host::Managed') AND ((`hostgroups`.`id` = 3 OR `hostgroups`.`title` = 3))] (ActiveRecord::RecordNotFound)
2016-02-17 01:21:45 [app] [I] Rendered api/v2/errors/not_found.json.rabl within api/v2/layouts/error_layout (1.2ms)
2016-02-17 01:21:45 [app] [I] Completed 404 Not Found in 32ms (Views: 2.2ms | ActiveRecord: 5.3ms)

As you can see, the reason things fail is that API tries to find my host AS if it is already in a new HG, which is obviously can't be true unless a new HG is the same as a current one.

update_host.png View update_host.png 103 KB Amit Karsale, 11/11/2016 02:10 AM
Update host

Related issues

Related to Foreman - Bug #11266: Unnested *_id parameters treated as parent resources in APINew2015-07-31
Related to Foreman - Bug #8343: API resource_scope ignores optionsClosed2014-11-11
Related to Foreman - Bug #16403: Updating hostgroups via API with environment_id set fails to find host groupDuplicate2016-09-01
Related to Foreman - Bug #20204: GET /hostgroup/:hostgroup_id/hosts returns all hosts when id of empty hostgroup is usedClosed2017-07-04

Associated revisions

Revision 8e81effc (diff)
Added by Amit Karsale almost 2 years ago

Fixes #13775 - merge if data set is present

Revision ed7e5184 (diff)
Added by Amit Karsale over 1 year ago

Fixes #13775 - merge if data set is present

(cherry picked from commit 8e81effcedafc539cbe3477b5565d9239f1f2f51)

History

#1 Updated by Dominic Cleal over 2 years ago

  • Related to Bug #11266: Unnested *_id parameters treated as parent resources in API added

#2 Updated by Dominic Cleal over 2 years ago

  • Related to Bug #8343: API resource_scope ignores options added

#3 Updated by Dominic Cleal over 2 years ago

  • Legacy Backlogs Release (now unused) set to 123

#4 Updated by Dominic Cleal over 2 years ago

  • Legacy Backlogs Release (now unused) changed from 123 to 145

#5 Updated by Dominic Cleal over 2 years ago

  • Legacy Backlogs Release (now unused) deleted (145)

#6 Updated by Konstantin Orekhov over 2 years ago

Dominic, what release the fix for this is targeted now?

#7 Updated by Dominic Cleal over 2 years ago

There is no release target, I'll decide a release if/when a patch is merged.

#8 Updated by Amit Karsale about 2 years ago

Hello Konstantine,

the request format for the API is wrong, you are triggering it as below:

curl -kSs -H "Content-type:application/json" -u admin:$FOREMAN_PASSWORD -X PUT https://localhost/api/hosts/`hostname -f` -d '{ "hostgroup_id": 3 }'

instead it should be triggered as :

curl -kSs -H "Content-type:application/json" -u admin:$FOREMAN_PASSWORD -X PUT https://localhost/api/hosts/`hostname -f` -d '{ "host":{"hostgroup_id": 3 }}'

I have verified it with the mentioned request parameter format and it works absolutely fine. Do let know if you find any problem further.

If it works for you we can close the issue.

#9 Updated by Dominic Cleal about 2 years ago

It's not wrong, the nested hash is not required per the API documentation, it's optional. This is a regression as the hostgroup_id top-level parameter is being misinterpreted.

#10 Updated by Amit Karsale about 2 years ago

okay, in that case the `parent_scope` in the code is forming this misinterpreted query, will look for it and post a fix.

#11 Updated by Dominic Cleal about 2 years ago

  • Related to Bug #16403: Updating hostgroups via API with environment_id set fails to find host group added

#12 Updated by Amit Karsale almost 2 years ago

Hello Dominic, I have viewed the Documentation and the documentation states "host" hash param is "required", Doc url: '/apidoc/v2/hosts/update.html'

PFA

#13 Updated by Dominic Cleal almost 2 years ago

See https://theforeman.org/manuals/1.13/index.html#5.1API, and the support for unwrapped parameters in both Foreman and Rails. The inline API docs only show the wrapped equivalent, not both.

#14 Updated by The Foreman Bot almost 2 years ago

  • Status changed from New to Ready For Testing
  • Pull request https://github.com/theforeman/foreman/pull/4052 added

#15 Updated by Amit Karsale almost 2 years ago

  • Assignee set to Amit Karsale
  • Target version set to 1.15.6

#16 Updated by Amit Karsale almost 2 years ago

  • Status changed from Ready For Testing to Closed
  • % Done changed from 0 to 100

#17 Updated by Dominic Cleal almost 2 years ago

  • Legacy Backlogs Release (now unused) set to 210

#18 Updated by Daniel Lobato Garcia almost 2 years ago

  • Bugzilla link set to 1405992

#19 Updated by Tomáš Strachota about 1 year ago

  • Related to Bug #20204: GET /hostgroup/:hostgroup_id/hosts returns all hosts when id of empty hostgroup is used added

Also available in: Atom PDF