Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update method in Resource::Group cannot update resouces. #92

Open
yuta1024 opened this issue Jun 15, 2020 · 0 comments
Open

update method in Resource::Group cannot update resouces. #92

yuta1024 opened this issue Jun 15, 2020 · 0 comments

Comments

@yuta1024
Copy link
Contributor

Description

update method in Resource::Group cannot update resouces.

ChefDK Version

I don't use chefdk when I reproduce this issue.
I use chef-api gem version 0.10.7.

Platform Version

  • macOS High Sierra(10.13.6/17G11023)
  • chef-api 0.10.7

Replication Case

This issue seems like that difference schema between GET and PUT is caused.
GET /organizations/NAME/groups/GROUP_NAME: https://docs.chef.io/api_chef_server/#get-36
PUT /organizations/NAME/groups/GROUP_NAME: https://docs.chef.io/api_chef_server/#put-9

GET endpoint returns actors, users, clients and groups on root. However PUT endpoint require actors nested users, clients and groups.

I wrote the following verification code.

require 'chef-api'

con = ChefAPI::Connection.new(
    client: 'pivotal',
    endpoint: 'https://<my_chef_server>/organizations/<my_org>',
    flavor: :enterprise,
    key: './pivotal.pem'
)

# Match schema of `GET` endpoint
p con.groups.update('admins', groups: ['test_group'])
p con.groups.fetch('admins')

# Match schema of `PUT` endpoint
p con.groups.update('admins', {actors: {groups: ['test_group']}})
p con.groups.fetch('admins')

The output of this code is following. But, test_groups does not belong to admins group after updating.

#<Resource::Group groupname: "admins", name: "admins", orgname: "<my_org>", actors: ["pivotal", "<my_account>"], users: ["pivotal", "<my_account>"], clients: [], groups: ["test_group"]>
#<Resource::Group groupname: "admins", name: "admins", orgname: "<my_org>", actors: ["pivotal", "<my_account>"], users: ["pivotal", "<my_account>"], clients: [], groups: []>
#<Resource::Group groupname: "admins", name: "admins", orgname: "<my_org>", actors: {:groups=>["test_group"]}, users: ["pivotal", "<my_account>"], clients: [], groups: []>
#<Resource::Group groupname: "admins", name: "admins", orgname: "<my_org>", actors: ["pivotal", "<my_account>"], users: ["pivotal", "<my_account>"], clients: [], groups: []>

Stacktrace

Validation is fixed as #89. So I patched that resources/base.rb#L709 replace false to raise and ran above the verification code.

con.groups.update('admins', {actors: {groups: ['test_group']}}) is correct request, but it was failed validation.

#<Resource::Group groupname: "admins", name: "admins", orgname: "<my_org>", actors: ["pivotal", "<my_account>"], users: ["pivotal", "<my_account>"], clients: [], groups: ["test_group"]>
#<Resource::Group groupname: "admins", name: "admins", orgname: "<my_org>", actors: ["pivotal", "<my_account>"], users: ["pivotal", "<my_account>"], clients: [], groups: []>
Traceback (most recent call last):
	4: from test.rb:15:in `<main>'
	3: from /Users/<my_account>/Workspace/chef-api-test/vendor/bundle/ruby/2.5.0/gems/chef-api-0.10.7/lib/chef-api/resources/base.rb:343:in `update'
	2: from /Users/<my_account>/Workspace/chef-api-test/vendor/bundle/ruby/2.5.0/gems/chef-api-0.10.7/lib/chef-api/resources/base.rb:707:in `save'
	1: from /Users/<my_account>/Workspace/chef-api-test/vendor/bundle/ruby/2.5.0/gems/chef-api-0.10.7/lib/chef-api/resources/base.rb:680:in `save!'
/Users/<my_account>/Workspace/chef-api-test/vendor/bundle/ruby/2.5.0/gems/chef-api-0.10.7/lib/chef-api/resources/base.rb:779:in `validate!': There were errors saving your resource: `actors' must be a kind of [Array] (ChefAPI::Error::InvalidResource)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

1 participant