I will after it's merged to master.
https://github.com/jclouds/jclouds/pull/880 ________________________________ From: Guy Dumouchel <[email protected]> Sent: Wednesday, November 18, 2015 8:05 AM To: [email protected] Subject: Re: [COMMERCIAL] Re: UserAdminApi.create() method does not pass the tenantId toKeystone of OpenStack Thanks Zack. Can you also backport the commit to the 1.9.x release branches. Thanks Guy On 11/18/2015 08:55 AM, Zack Shoylev wrote: I can try to add it this week. ________________________________ From: Guy Dumouchel <[email protected]><mailto:[email protected]> Sent: Wednesday, November 18, 2015 7:26 AM To: Ignasi Barrera; [email protected]<mailto:[email protected]> Subject: Re: UserAdminApi.create() method does not pass the tenantId to Keystone of OpenStack Ignasi, I'm not too familiar with the Git environment and creating a pull request, therefore I would like to pass on creating a pull request for the fix; can someone else do this based on my problem description/solution described below? Thanks Guy On 11/17/2015 02:45 PM, Ignasi Barrera wrote: Thanks for the details Guy, and great job! Wanna send a pull request with the fix? Further comments can be made there and that will also be the fastest way to get the fix in. Thanks! El 17/11/2015 20:11, "Andrew Phillips" <[email protected]<mailto:[email protected]>> escribió: Hi Guy Thanks for the detailed report! Definitely sounds like a fix that we'd want to have in the code. Hopefully, one of the devs that work more on the OpenStack providers can add some thoughts on how best to get this included, or whether there are some other aspects that need to be considered. Regards ap On 2015-11-17 14:04, Guy Dumouchel wrote: Hi, jclouds version: v1.9.1 Cloud and API version: OpenStack Kilo 2015.1.0, Keystone API v2.0 Operating System version: Red Hat Enterprise Linux Server release 6.5 (Santiago) Java version: v1.8.0.45 Problem description: When I use jclouds client code "UserAdminApi.create()" method with the "CreateUserOptions" object and supply a valid tenantId, the new user gets created but the project ID is blank in OpenStack as seen in Horizon: USER OVERVIEW INFORMATION ------------------------- User Name testU1 ID d4a18274e9c94ba0b30a14e56d9f2ca0 Email [email protected]<mailto:[email protected]> Enabled True Project ID None Code details: 1) setup a "org.jclouds.openstack.keystone.v2_0.options.CreateUserOptions" object and call the UserAdminApi.create() method as follows: import org.jclouds.openstack.keystone.v2_0.extensions.UserAdminApi; import org.jclouds.openstack.keystone.v2_0.options.CreateUserOptions; ... private void createUser(Tenant aInTenant, String aInUserName) { CreateUserOptions userOptions = CreateUserOptions.Builder .tenant(aInTenant.getId()) .email("[email protected]<mailto:[email protected]>") .enabled(true); User user = userAdminApi.create(aInUserName, "abc123", userOptions); CreateUserOptions userOptions = CreateUserOptions.Builder .tenant(aInTenant.getId()) <------- aInTenant is a " .email("[email protected]<mailto:[email protected]>") .enabled(true); User user = userAdminApi.create(aInUserName, "abc123", userOptions); ... 2) I see the following in the console: [main] DEBUG o.j.rest.internal.InvokeHttpMethod - >> invoking user:create 13:12:48.092 [main] DEBUG o.j.h.i.JavaUrlHttpCommandExecutorService - Sending request 907780534: POST <http://> http://<ourIdentityURL>/v2.0/users HTTP/1.1 13:12:48.092 [main] DEBUG jclouds.wire - >> "{"user":{"name":"testU1","tenant":"2062a44f6ef64cbd89688a8a0feb2c18","password":"abc123","email":"<mailto:[email protected]>[email protected]<mailto:[email protected]>","enabled":true}}" 13:12:48.093 [main] DEBUG jclouds.headers - >> POST http://<ourIdentityURL>/v2.0/users HTTP/1.1 13:12:48.093 [main] DEBUG jclouds.headers - >> Accept: application/json 13:12:48.093 [main] DEBUG jclouds.headers - >> X-Auth-Token: <myToken> 13:12:48.093 [main] DEBUG jclouds.headers - >> Content-Type: application/json 13:12:48.093 [main] DEBUG jclouds.headers - >> Content-Length: 137 Nov 17, 2015 1:12:48 PM com.SomeClassManager main INFO: SomeClassManager User Management terminated successfully 13:12:48.180 [main] DEBUG o.j.h.i.JavaUrlHttpCommandExecutorService - Receiving response 907780534: HTTP/1.1 200 OK 13:12:48.181 [main] DEBUG jclouds.headers - << HTTP/1.1 200 OK 13:12:48.181 [main] DEBUG jclouds.headers - << Connection: keep-alive 13:12:48.181 [main] DEBUG jclouds.headers - << X-Openstack-Request-Id: req-0162d808-632a-408e-a5f6-5d073ee9d551 13:12:48.181 [main] DEBUG jclouds.headers - << Vary: X-Auth-Token 13:12:48.181 [main] DEBUG jclouds.headers - << Date: Tue, 17 Nov 2015 18:12:48 GMT 13:12:48.181 [main] DEBUG jclouds.headers - << Content-Type: application/json 13:12:48.181 [main] DEBUG jclouds.headers - << Content-Length: 189 13:12:48.181 [main] DEBUG jclouds.wire - << "{"user": {"username": "testU1", "name": "testU1", "enabled": true, "email": "[email protected]<mailto:[email protected]>", "tenant": "2062a44f6ef64cbd89688a8a0feb2c18", "id": "d4a18274e9c94ba0b30a14e56d9f2ca0"}}" In the above you see that the JSON data passed on the wire has provided "tenant":"2062a44f6ef64cbd89688a8a0feb2c18" for the tenantId portion but according to the OpenStack Identity Admin API v2 API (http://developer.openstack.org/api-ref-identity-admin-v2.html), the POST /v2.0/users API request parameters for the optional tenantId should be called "tenantId" not "tenant". 3) To fix this I modified the "org.jclouds.openstack.keystone.v2_0.options.CreateUserOptions.java" file to change the class' private data member "private String tenant;" to "private String tenantId;" as follows: public class CreateUserOptions implements MapBinder{ @Inject private BindToJsonPayload jsonBinder; private String tenantId; private String password; private String email; private boolean enabled; And then run my test again and this time the new user has it ProjectId set properly: Debug traces seen with fix: 13:58:44.963 [main] DEBUG o.j.rest.internal.InvokeHttpMethod - >> invoking user:create 13:58:44.963 [main] DEBUG o.j.h.i.JavaUrlHttpCommandExecutorService - Sending request 2007647985: POST <http://> http://<ourIdentityUrl>/v2.0/users HTTP/1.1 13:58:44.963 [main] DEBUG jclouds.wire - >> "{"user":{"name":"testU1","tenantId":"3eafa84a23bf4c50b3683b53ab27045d","password":"abc123","email":"<mailto:[email protected]>[email protected]<mailto:[email protected]>","enabled":true}}" 13:58:44.963 [main] DEBUG jclouds.headers - >> POST http://<ourIdentityUrl>/v2.0/users HTTP/1.1 13:58:44.963 [main] DEBUG jclouds.headers - >> Accept: application/json 13:58:44.963 [main] DEBUG jclouds.headers - >> X-Auth-Token: <mytoken> 13:58:44.963 [main] DEBUG jclouds.headers - >> Content-Type: application/json 13:58:44.963 [main] DEBUG jclouds.headers - >> Content-Length: 139 13:58:45.021 [main] DEBUG o.j.h.i.JavaUrlHttpCommandExecutorService - Receiving response 2007647985: HTTP/1.1 200 OK 13:58:45.021 [main] DEBUG jclouds.headers - << HTTP/1.1 200 OK 13:58:45.021 [main] DEBUG jclouds.headers - << Connection: keep-alive 13:58:45.021 [main] DEBUG jclouds.headers - << X-Openstack-Request-Id: req-42d5d719-4e99-44b3-81b1-ef9b9d4b5135 13:58:45.021 [main] DEBUG jclouds.headers - << Vary: X-Auth-Token 13:58:45.021 [main] DEBUG jclouds.headers - << Date: Tue, 17 Nov 2015 18:58:44 GMT 13:58:45.021 [main] DEBUG jclouds.headers - << Content-Type: application/json 13:58:45.021 [main] DEBUG jclouds.headers - << Content-Length: 191 13:58:45.021 [main] DEBUG jclouds.wire - << "{"user": {"username": "testU1", "name": "testU1", "id": "bf6831041ced4b16aa25103012690962", "enabled": true, "email": "[email protected]<mailto:[email protected]>", "tenantId": "3eafa84a23bf4c50b3683b53ab27045d"}}" New Horizon data for new user object: USER OVERVIEW INFORMATION ------------------------- User Name testU1 ID bf6831041ced4b16aa25103012690962 Email [email protected]<mailto:[email protected]> Enabled True Project ID 3eafa84a23bf4c50b3683b53ab27045d Thanks Guy
