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]> 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] 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]")
>>                 .enabled(true);
>>
>>         User user = userAdminApi.create(aInUserName, "abc123",
>> userOptions);
>>
>>         CreateUserOptions userOptions = CreateUserOptions.Builder
>>                 .tenant(aInTenant.getId())
>>                                <------- aInTenant is a "
>>                 .email("[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":"
>> [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]", "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":"
>> [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]", "tenantId":
>> "3eafa84a23bf4c50b3683b53ab27045d"}}"
>>
>> New Horizon data for new user object:
>>
>> USER OVERVIEW
>>
>> INFORMATION
>>
>> -------------------------
>>  User Name testU1 ID bf6831041ced4b16aa25103012690962 Email
>> [email protected] Enabled True Project ID
>> 3eafa84a23bf4c50b3683b53ab27045d
>>
>> Thanks
>> Guy
>>
>

Reply via email to