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