​I can try to add it this week.

________________________________
From: Guy Dumouchel <[email protected]>
Sent: Wednesday, November 18, 2015 7:26 AM
To: Ignasi Barrera; [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://<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://<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

Reply via email to