From 75e989349cec103dd800bbcb252f4f214defdb62 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Tue, 18 Jun 2013 14:32:09 +0300 Subject: [PATCH 01/12] V3 Trust API support --- .../openstack/v3/keystone/Keystone.java | 72 ++++ .../v3/keystone/api/Authenticate.java | 53 +++ .../v3/keystone/api/EndpointsResource.java | 70 +++ .../v3/keystone/api/ProjectsResource.java | 137 ++++++ .../openstack/v3/keystone/api/Revoke.java | 27 ++ .../v3/keystone/api/RolesResource.java | 57 +++ .../v3/keystone/api/ServicesResource.java | 69 +++ .../v3/keystone/api/TokensResource.java | 93 ++++ .../v3/keystone/api/TrustsResource.java | 88 ++++ .../v3/keystone/api/UsersResource.java | 95 +++++ .../v3/keystone/model/Authentication.java | 43 ++ .../openstack/v3/keystone/model/Project.java | 73 ++++ .../openstack/v3/keystone/model/Projects.java | 41 ++ .../openstack/v3/keystone/model/Token.java | 398 ++++++++++++++++++ .../openstack/v3/keystone/model/Trust.java | 131 ++++++ .../openstack/v3/keystone/model/Trusts.java | 34 ++ .../model/authentication/AccessKey.java | 73 ++++ .../authentication/TokenAuthentication.java | 109 +++++ .../authentication/UsernamePassword.java | 86 ++++ .../model/util/TrustDateDeserializer.java | 30 ++ .../model/util/TrustDateSerializer.java | 30 ++ .../v3/connector/JaxRs20Connector.java | 60 +++ .../v3/connector/JaxRs20Response.java | 43 ++ .../openstack/v3/connector/OpenStack.java | 98 +++++ .../v3/base/client/OpenStackClient.java | 82 ++++ .../base/client/OpenStackClientConnector.java | 8 + .../v3/base/client/OpenStackRequest.java | 138 ++++++ 27 files changed, 2238 insertions(+) create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/Keystone.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/EndpointsResource.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ProjectsResource.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/RolesResource.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ServicesResource.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TokensResource.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java create mode 100644 keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/UsersResource.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Project.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Projects.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Token.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trusts.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/AccessKey.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/TokenAuthentication.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/UsernamePassword.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateDeserializer.java create mode 100644 keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateSerializer.java create mode 100644 openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java create mode 100644 openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java create mode 100644 openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java create mode 100644 openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java create mode 100644 openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java create mode 100644 openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/Keystone.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/Keystone.java new file mode 100644 index 000000000..a9e87007b --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/Keystone.java @@ -0,0 +1,72 @@ +package com.woorea.openstack.v3.keystone; + +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackClientConnector; +import com.woorea.openstack.v3.keystone.api.EndpointsResource; +import com.woorea.openstack.v3.keystone.api.RolesResource; +import com.woorea.openstack.v3.keystone.api.ServicesResource; +import com.woorea.openstack.v3.keystone.api.UsersResource; +import com.woorea.openstack.v3.keystone.api.ProjectsResource; +import com.woorea.openstack.v3.keystone.api.TokensResource; +import com.woorea.openstack.v3.keystone.api.TrustsResource; + +public class Keystone extends OpenStackClient { + + private final TokensResource TOKENS; + + private final ProjectsResource PROJECTS; + + private final UsersResource USERS; + + private final RolesResource ROLES; + + private final ServicesResource SERVICES; + + private final EndpointsResource ENDPOINTS; + + private final TrustsResource TRUSTS; + + public Keystone(String endpoint, OpenStackClientConnector connector) { + super(endpoint, connector); + TOKENS = new TokensResource(this); + PROJECTS = new ProjectsResource(this); + USERS = new UsersResource(this); + ROLES = new RolesResource(this); + SERVICES = new ServicesResource(this); + ENDPOINTS = new EndpointsResource(this); + TRUSTS = new TrustsResource(this); + } + + public Keystone(String endpoint) { + this(endpoint, null); + } + + public TokensResource tokens() { + return TOKENS; + } + + public ProjectsResource projects() { + return PROJECTS; + } + + public UsersResource users() { + return USERS; + } + + public RolesResource roles() { + return ROLES; + } + + public ServicesResource services() { + return SERVICES; + } + + public EndpointsResource endpoints() { + return ENDPOINTS; + } + + public TrustsResource trusts() { + return TRUSTS; + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java new file mode 100644 index 000000000..43b117dc6 --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java @@ -0,0 +1,53 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.keystone.model.Access; +import com.woorea.openstack.v3.keystone.model.Authentication; +import com.woorea.openstack.v3.keystone.model.Token; +import com.woorea.openstack.v3.keystone.model.authentication.*; + +public class Authenticate extends OpenStackRequest { + + private Authentication authentication; + + public Authenticate(Authentication authentication) { + method(HttpMethod.POST); + path("/auth/tokens"); + json(authentication); + header("Accept", "application/json"); + header("x-auth-project-id",authentication.getTenantName()); + //returnType(Access.class); + returnType(Token.class); + } + + public Authenticate withTenantId(String tenantId) { + authentication.setTenantId(tenantId); + return this; + } + + public Authenticate withTenantName(String tenantName) { + authentication.setTenantName(tenantName); + return this; + } + + public class Builder { + + public Authenticate withUsernamePassword(String username, String password) { + authentication = new UsernamePassword(username, password); + return Authenticate.this; + } + + public Authenticate withToken(String token) { + authentication = new TokenAuthentication(token); + return Authenticate.this; + } + + public Authenticate withAccessKey(String accessKey, String secretKey) { + authentication = new AccessKey(accessKey, secretKey); + return Authenticate.this; + } + + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/EndpointsResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/EndpointsResource.java new file mode 100644 index 000000000..146f2bed2 --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/EndpointsResource.java @@ -0,0 +1,70 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.keystone.model.Endpoint; +import com.woorea.openstack.keystone.model.Endpoints; + +public class EndpointsResource { + + private OpenStackClient client; + + public EndpointsResource(OpenStackClient client) { + this.client = client; + } + + public List list() { + return new List(); + } + + public Create create(Endpoint endpoint) { + return new Create(endpoint); + } + + public Show show(String id) { + return new Show(id); + } + + + public Delete delete(String id) { + return new Delete(id); + } + + public class List extends OpenStackRequest { + + public List() { + super(client, HttpMethod.GET, "/endpoints", null, Endpoints.class); + } + + } + + public class Create extends OpenStackRequest { + + private Endpoint endpoint; + + public Create(Endpoint endpoint) { + super(client, HttpMethod.POST, "/endpoints", Entity.json(endpoint), Endpoint.class); + this.endpoint = endpoint; + } + + } + + public class Show extends OpenStackRequest { + + public Show(String id) { + super(client, HttpMethod.GET, new StringBuilder("/endpoints/").append(id).toString(), null, Endpoint.class); + } + + } + + public class Delete extends OpenStackRequest { + + public Delete(String id) { + super(client, HttpMethod.DELETE, new StringBuilder("/endpoints/").append(id).toString(), null, Void.class); + } + + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ProjectsResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ProjectsResource.java new file mode 100644 index 000000000..4099a6d04 --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ProjectsResource.java @@ -0,0 +1,137 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.keystone.model.Roles; +import com.woorea.openstack.keystone.model.Users; +import com.woorea.openstack.v3.keystone.model.Project; +import com.woorea.openstack.v3.keystone.model.Projects; + +public class ProjectsResource { + + // TODO go through all the methods and ensure they are valid - this is just a very straightforward + // conversion from the old TenantsResource class + + private OpenStackClient client; + + public ProjectsResource(OpenStackClient client) { + this.client = client; + } + + public List list() { + return new List(); + } + + public Create create(Project project) { + return new Create(project); + } + + public Show show(String id) { + return new Show(id); + } + + public Update update(String id, Project project) { + return new Update(id, project); + } + + public Delete delete(String id) { + return new Delete(id); + } + + public ListUsers listUsers(String tenantId) { + return new ListUsers(tenantId); + } + + public AddUser addUser(String tenantId, String userId, String roleId) { + return new AddUser(tenantId, userId, roleId); + } + + public RemoveUser removeUser(String tenantId, String userId, String roleId) { + return new RemoveUser(tenantId, userId, roleId); + } + + public ListUserRoles listUserRoles(String tenantId, String userId) { + return new ListUserRoles(tenantId, userId); + } + + public class List extends OpenStackRequest { + + public List() { + super(client, HttpMethod.GET, "/projects", null, Projects.class); + } + + } + + public class Create extends OpenStackRequest { + + private Project project; + + public Create(Project project) { + super(client, HttpMethod.POST, "/projects", Entity.json(project), Project.class); + this.project = project; + } + + } + + public class Show extends OpenStackRequest { + + public Show(String id) { + super(client, HttpMethod.GET, new StringBuilder("/projects/").append(id).toString(), null, Project.class); + } + + } + + public class Update extends OpenStackRequest { + + private Project project; + + public Update(String id, Project project) { + super(client, HttpMethod.PUT, new StringBuilder("/projects/").append(id).toString(), Entity.json(project), Project.class); + this.project = project; + } + + } + + public class Delete extends OpenStackRequest { + + public Delete(String id) { + super(client, HttpMethod.DELETE, new StringBuilder("/projects/").append(id).toString(), null, Void.class); + } + + } + + public class ListUsers extends OpenStackRequest { + + public ListUsers(String projectId) { + super(client, HttpMethod.GET, new StringBuilder("/projects/").append(projectId).append("/users").toString(), null, Users.class); + } + + } + + public class AddUser extends OpenStackRequest { + + public AddUser(String projectId, String userId, String roleId) { + super(client, HttpMethod.PUT, new StringBuilder("/projects/").append(projectId).append("/users").append(userId).append("/roles/OS-KSADM").append(roleId).toString(), null, Void.class); + } + + } + + public class RemoveUser extends OpenStackRequest { + + public RemoveUser(String projectId, String userId, String roleId) { + super(client, HttpMethod.DELETE, new StringBuilder("/projects/").append(projectId).append("/users").append(userId).append("/roles/OS-KSADM").append(roleId).toString(), null, Void.class); + } + + } + + public class ListUserRoles extends OpenStackRequest { + + public ListUserRoles(String projectId, String userId) { + super(client, HttpMethod.GET, new StringBuilder("/projects/").append(projectId).append("/users").append(userId).append("/roles").toString(), null, Roles.class); + } + + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java new file mode 100644 index 000000000..51979f428 --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java @@ -0,0 +1,27 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.v3.keystone.model.Token; + +/** + * Command for validating a token + * @author jhynnine + * + */ +/** + * Command for revoking a token + * @author jhynnine + * + */ +public class Revoke extends OpenStackRequest { + + public Revoke(Token token) { + method(HttpMethod.DELETE); + path("/auth/tokens"); + json(token); + header("Accept", "application/json"); + header("X-Subject-Token",token.getId()); + returnType(Void.class); + } +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/RolesResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/RolesResource.java new file mode 100644 index 000000000..e4e94ed4b --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/RolesResource.java @@ -0,0 +1,57 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.keystone.model.Role; +import com.woorea.openstack.keystone.model.Roles; + +public class RolesResource { + + private OpenStackClient client; + + public RolesResource(OpenStackClient client) { + this.client = client; + } + + public List list() { + return new List(); + } + + public Create create(Role role) { + return new Create(role); + } + + public Delete delete(String id) { + return new Delete(id); + } + + public class List extends OpenStackRequest { + + public List() { + super(client, HttpMethod.GET, "/OS-KSADM/roles", null, Roles.class); + } + + } + + public class Create extends OpenStackRequest { + + private Role role; + + public Create(Role role) { + super(client, HttpMethod.POST, "/OS-KSADM/roles", Entity.json(role), Role.class); + this.role = role; + } + + } + + public class Delete extends OpenStackRequest { + + public Delete(String id) { + super(client, HttpMethod.DELETE, new StringBuilder("/OS-KSADM/roles/").append(id).toString(), null, Void.class); + } + + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ServicesResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ServicesResource.java new file mode 100644 index 000000000..b07511e6a --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/ServicesResource.java @@ -0,0 +1,69 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.keystone.model.Service; +import com.woorea.openstack.keystone.model.Services; + +public class ServicesResource { + + private OpenStackClient client; + + public ServicesResource(OpenStackClient client) { + this.client = client; + } + + public List list() { + return new List(); + } + + public Create create(Service service) { + return new Create(service); + } + + public Show show(String id) { + return new Show(id); + } + + public Delete delete(String id) { + return new Delete(id); + } + + public class List extends OpenStackRequest { + + public List() { + super(client, HttpMethod.GET, "/OS-KSADM/services", null, Services.class); + } + + } + + public class Create extends OpenStackRequest { + + private Service service; + + public Create(Service service) { + super(client, HttpMethod.POST, "/OS-KSADM/services", Entity.json(service), Service.class); + this.service = service; + } + + } + + public class Show extends OpenStackRequest { + + public Show(String id) { + super(client, HttpMethod.GET, new StringBuilder("/OS-KSADM/services/").append(id).toString(), null, Service.class); + } + + } + + public class Delete extends OpenStackRequest { + + public Delete(String id) { + super(client, HttpMethod.DELETE, new StringBuilder("/OS-KSADM/services/").append(id).toString(), null, Void.class); + } + + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TokensResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TokensResource.java new file mode 100644 index 000000000..39cb51b6c --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TokensResource.java @@ -0,0 +1,93 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.v3.keystone.model.Authentication; +import com.woorea.openstack.v3.keystone.model.Token; +import com.woorea.openstack.v3.keystone.model.Trust; +import com.woorea.openstack.v3.keystone.model.authentication.AccessKey; +import com.woorea.openstack.v3.keystone.model.authentication.TokenAuthentication; +import com.woorea.openstack.v3.keystone.model.authentication.UsernamePassword; + +public class TokensResource { + + private final OpenStackClient CLIENT; + + public TokensResource(OpenStackClient client) { + CLIENT = client; + } + + public Authenticate.Builder authenticate() { + return new Authenticate().new Builder(); + } + + public Authenticate authenticate(Authentication authentication) { + return new Authenticate(authentication); + } + + public Validate validate(Token token) { + return new Validate(token); + } + + public class Authenticate extends OpenStackRequest { + + private Authentication authentication; + + public Authenticate() { + + } + + public Authenticate(Authentication authentication) { + super(CLIENT, HttpMethod.POST, "/auth/tokens", Entity.json(authentication), Token.class); + this.authentication = authentication; + } + + public Authenticate withTenantId(String tenantId) { + authentication.setTenantId(tenantId); + return this; + } + + public Authenticate withTenantName(String tenantName) { + authentication.setTenantName(tenantName); + return this; + } + + public class Builder { + + public Authenticate withUsernamePassword(String username, String password) { + Authentication authentication = new UsernamePassword(username, password); + return new Authenticate(authentication); + } + + public Authenticate withToken(String token) { + Authentication authentication = new TokenAuthentication(token); + CLIENT.token(token); + return new Authenticate(authentication); + } + + public Authenticate withTrust(String token, Trust trust) { + TokenAuthentication authentication = new TokenAuthentication(token); + CLIENT.token(token); + authentication.getScope().getTrust().setId(trust.getId()); + return new Authenticate(authentication); + } + + public Authenticate withAccessKey(String accessKey, String secretKey) { + Authentication authentication = new AccessKey(accessKey, secretKey); + return new Authenticate(authentication); + } + + } + + } + + public class Validate extends OpenStackRequest { + + public Validate(Token token) { + super(CLIENT, HttpMethod.GET, "/auth/tokens", null, Token.class); + header("X-Subject-Token",token.getId()); + } + } +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java new file mode 100644 index 000000000..8e9ce8896 --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java @@ -0,0 +1,88 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.v3.keystone.model.Trust; +import com.woorea.openstack.v3.keystone.model.Trusts; + +public class TrustsResource { + + private OpenStackClient client; + + public TrustsResource(OpenStackClient client) { + this.client = client; + } + + public List list() { + return new List(); + } + + public Create create(Trust trust) { + return new Create(trust); + } + + public Show show(String id) { + return new Show(id); + } + + + public Delete delete(String id) { + return new Delete(id); + } + + public class List extends OpenStackRequest { + + public List() { + super(client, HttpMethod.GET, "/OS-TRUST/trusts", null, Trusts.class); + } + + private List(String path) { + super(client, HttpMethod.GET, path, null, Trusts.class); + } + + public List byTrustor(String trustorId) { + List ret = new List(new StringBuilder("/OS-TRUST/trusts").toString()); + ret.addParameter("trustor_user_id", trustorId); + return ret; + } + + + public List byTrustee(String trusteeId) { + List ret = new List(new StringBuilder("/OS-TRUST/trusts").toString()); + ret.addParameter("trustee_user_id", trusteeId); + return ret; + } + + + } + + public class Create extends OpenStackRequest { + + private Trust trust; + + public Create(Trust trust) { + super(client, HttpMethod.POST, "/OS-TRUST/trusts", Entity.json(trust), Trust.class); + this.trust = trust; + } + + } + + public class Show extends OpenStackRequest { + + public Show(String id) { + super(client, HttpMethod.GET, new StringBuilder("/OS-TRUST/trusts/").append(id).toString(), null, Trust.class); + } + + } + + public class Delete extends OpenStackRequest { + + public Delete(String id) { + super(client, HttpMethod.DELETE, new StringBuilder("/OS-TRUST/trusts/").append(id).toString(), null, Void.class); + } + + } + +} diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/UsersResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/UsersResource.java new file mode 100644 index 000000000..b525a5f34 --- /dev/null +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/UsersResource.java @@ -0,0 +1,95 @@ +package com.woorea.openstack.v3.keystone.api; + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.v3.base.client.OpenStackClient; +import com.woorea.openstack.v3.base.client.OpenStackRequest; +import com.woorea.openstack.keystone.model.User; +import com.woorea.openstack.keystone.model.Users; + +public class UsersResource { + + private OpenStackClient client; + + public UsersResource(OpenStackClient client) { + this.client = client; + } + + public List list() { + return new List(); + } + + public Create create(User user) { + return new Create(user); + } + + public Show show(String id) { + return new Show(id); + } + + public Update update(String id, User user) { + return new Update(id, user); + } + + public Delete delete(String id) { + return new Delete(id); + } + + public Projects projects(String id) { + return new Projects(id); + } + + public class List extends OpenStackRequest { + + public List() { + super(client, HttpMethod.GET, "/users", null, Users.class); + } + + } + + public class Create extends OpenStackRequest { + + private User user; + + public Create(User user) { + super(client, HttpMethod.POST, "/users", Entity.json(user), User.class); + this.user = user; + } + + } + + public class Show extends OpenStackRequest { + + public Show(String id) { + super(client, HttpMethod.GET, new StringBuilder("/users/").append(id).toString(), null, User.class); + } + + } + + public class Update extends OpenStackRequest { + + private User user; + + public Update(String id, User user) { + super(client, HttpMethod.PUT, new StringBuilder("/users/").append(id).toString(), Entity.json(user), User.class); + this.user = user; + } + + } + + public class Delete extends OpenStackRequest { + + public Delete(String id) { + super(client, HttpMethod.DELETE, new StringBuilder("/users/").append(id).toString(), null, Void.class); + } + + } + + public class Projects extends OpenStackRequest { + + public Projects(String id) { + super(client, HttpMethod.GET, new StringBuilder("/users/").append(id).append("/projects").toString(), null, com.woorea.openstack.v3.keystone.model.Projects.class); + } + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java new file mode 100644 index 000000000..a61c0d2d5 --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.v3.keystone.model; + +import java.io.Serializable; + +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.map.annotate.JsonRootName; + +public abstract class Authentication implements Serializable { + + @JsonIgnore + private String tenantId; + @JsonIgnore + private String tenantName; + + /** + * @return the tenantId + */ + public String getTenantId() { + return tenantId; + } + + /** + * @param tenantId the tenantId to set + */ + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + /** + * @return the tenantName + */ + public String getTenantName() { + return tenantName; + } + + /** + * @param tenantName the tenantName to set + */ + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Project.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Project.java new file mode 100644 index 000000000..afbd5fc4a --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Project.java @@ -0,0 +1,73 @@ +package com.woorea.openstack.v3.keystone.model; + +import java.io.Serializable; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import com.woorea.openstack.keystone.model.Link; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Project implements Serializable { + + @JsonProperty("domain_id") + private String domainId; + @JsonProperty("enabled") + private Boolean enabled; + @JsonProperty("id") + private String id; + @JsonProperty("links") + private List links; + @JsonProperty("name") + private String name; + + + public Project(String name, String domainId, Boolean enabled) { + this.name = name; + this.domainId = domainId; + this.enabled = enabled; + } + + public Project() { } + + public String getDomainId() { + return domainId; + } + + public void setDomainId(String domainId) { + this.domainId = domainId; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getLinks() { + return links; + } + + public void setLinks(List links) { + this.links = links; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Projects.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Projects.java new file mode 100644 index 000000000..bb0f36847 --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Projects.java @@ -0,0 +1,41 @@ +package com.woorea.openstack.v3.keystone.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Projects implements Iterable, Serializable { + + + private List projects = new ArrayList(); + + public Projects() { + + } + + public void addProject(Project project) { + projects.add(project); + } + + public void deleteProject(Project project) { + projects.remove(project); + } + + public List getProjects() { + return projects; + } + + public void setProjects(List projects) { + this.projects = projects; + } + + @Override + public Iterator iterator() { + return projects.iterator(); + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Token.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Token.java new file mode 100644 index 000000000..66bd87cbf --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Token.java @@ -0,0 +1,398 @@ +package com.woorea.openstack.v3.keystone.model; + +import java.io.Serializable; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonRootName; +import org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer; +import com.woorea.openstack.keystone.model.Link; + +@JsonRootName("token") +public final class Token implements Serializable { + + //TODO Include optional project and catalog attributes + //TODO Implement extras class, now it's just a placeholder + + // Map header X-Subject-Token here + @JsonProperty("id") + private String id; + @JsonProperty("issued_at") + private Calendar issuedAt; + @JsonProperty("expires_at") + private Calendar expiresAt; + @JsonProperty("methods") + private List methods; + @JsonProperty("user") + private User user; + @JsonProperty("extras") + private Extras extras; + @JsonProperty("roles") + private List roles; + @JsonProperty("OS-TRUST:trust") + private OsTrust trust; + @JsonProperty("project") + private Project project; + @JsonProperty("project_id") + private String projectId; + @JsonProperty("name") + private String name; + //TODO Handle catalog properly, not just as generic objects + @JsonProperty("catalog") + @JsonDeserialize(using = UntypedObjectDeserializer.class) + private List catalog; + + public final class User implements Serializable { + + @JsonProperty("domain") + private Domain domain; + @JsonProperty("id") + private String id; + @JsonProperty("name") + private String name; + @JsonProperty("email") + private String email; + @JsonProperty("links") + private List links; + + public final class Domain implements Serializable { + + @JsonProperty("id") + private String id; + @JsonProperty("links") + private List links; + @JsonProperty("name") + private String name; + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public List getLinks() { + return links; + } + public void setLinks(List links) { + this.links = links; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + } + + public Domain getDomain() { + return domain; + } + + public void setDomain(Domain domain) { + this.domain = domain; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public List getLinks() { + return links; + } + + public void setLinks(List links) { + this.links = links; + } + + } + + public class Extras implements Serializable { + public Extras() { + + } + } + + public class Role implements Serializable { + + @JsonProperty("project_id") + private String projectId; + @JsonProperty("id") + private String id; + @JsonProperty("name") + private String name; + + @JsonCreator + public Role() { + + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public class OsTrust implements Serializable { + + private String id; + private boolean impersonation; + private HashMap links; + private TrustUser trustee_user; + private TrustUser trustor_user; + + public OsTrust() { } + + public class TrustUser implements Serializable { + private String id; + private HashMap links; + + public TrustUser() { } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public HashMap getLinks() { + return links; + } + + public void setLinks(HashMap links) { + this.links = links; + } + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isImpersonation() { + return impersonation; + } + + public void setImpersonation(boolean impersonation) { + this.impersonation = impersonation; + } + + public HashMap getLinks() { + return links; + } + + public void setLinks(HashMap links) { + this.links = links; + } + + public TrustUser getTrustee_user() { + return trustee_user; + } + + public void setTrustee_user(TrustUser trustee_user) { + this.trustee_user = trustee_user; + } + + public TrustUser getTrustor_user() { + return trustor_user; + } + + public void setTrustor_user(TrustUser trustor_user) { + this.trustor_user = trustor_user; + } + } + + public class Project implements Serializable { + @JsonProperty("domain") + private Domain domain; + private String id; + private String name; + + public Project() { + + } + + public class Domain implements Serializable { + private String id; + private String name; + + public Domain() { + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public Domain getDomain() { + return domain; + } + + public void setDomain(Domain domain) { + this.domain = domain; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Calendar getIssuedAt() { + return issuedAt; + } + + public void setIssuedAt(Calendar issuedAt) { + this.issuedAt = issuedAt; + } + + public Calendar getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(Calendar expiresAt) { + this.expiresAt = expiresAt; + } + + public List getMethods() { + return methods; + } + + public void setMethods(List methods) { + this.methods = methods; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + + public Extras getExtras() { + return extras; + } + + public void setExtras(Extras extras) { + this.extras = extras; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public OsTrust getTrust() { + return trust; + } + + public void setTrust(OsTrust trust) { + this.trust = trust; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Token [id=" + id + ", Issued_at=" + issuedAt + ", expires=" + expiresAt + "]"; + } + +} \ No newline at end of file diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java new file mode 100644 index 000000000..7433ead1d --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java @@ -0,0 +1,131 @@ +package com.woorea.openstack.v3.keystone.model; + +import java.io.Serializable; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonRootName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.woorea.openstack.keystone.model.Link; +import com.woorea.openstack.v3.keystone.model.util.TrustDateDeserializer; +import com.woorea.openstack.v3.keystone.model.util.TrustDateSerializer; + +@JsonRootName("trust") +public class Trust implements Serializable { + + @JsonProperty("expires_at") + @JsonDeserialize(using = TrustDateDeserializer.class) + @JsonSerialize(using = TrustDateSerializer.class) + private Calendar expiresAt; + private String id; + private boolean impersonation; + //private List links; + private HashMap links; + @JsonProperty("project_id") + private String projectId; + + public static final class Role implements Serializable { + private String id; + //private List links; + private HashMap links; + private String name; + + public String getId() { + return id; + } + //public List getLinks() { + public HashMap getLinks() { + return links; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + } + + private List roles; + @JsonProperty("roles_links") + //private List rolesLinks; + private HashMap rolesLinks; + @JsonProperty("trustee_user_id") + private String trusteeUserId; + @JsonProperty("trustor_user_id") + private String trustorUserId; + + public Calendar getExpiresAt() { + return expiresAt; + } + public String getId() { + return id; + } + public boolean isImpersonation() { + return impersonation; + } + //public List getLinks() { + public HashMap getLinks() { + return links; + } + public String getProjectId() { + return projectId; + } + public List getRoles() { + return roles; + } + //public List getRolesLinks() { + public HashMap getRolesLinks() { + return rolesLinks; + } + public String getTrusteeUserId() { + return trusteeUserId; + } + + public String getTrustorUserId() { + return trustorUserId; + } + public void setExpiresAt(Calendar expiresAt) { + this.expiresAt = expiresAt; + } + public void setImpersonation(boolean impersonation) { + this.impersonation = impersonation; + } + public void setProjectId(String projectId) { + this.projectId = projectId; + } + public void setRoles(List roles) { + this.roles = roles; + } + public void setTrusteeUserId(String trusteeUserId) { + this.trusteeUserId = trusteeUserId; + } + public void setTrustorUserId(String trustorUserId) { + this.trustorUserId = trustorUserId; + } + + public String toString() { + return "Trust [expiresAt=" + expiresAt + + ", id=" + id + + ", impersonation=" + impersonation + + ", links=" + links + + ", projectId=" + projectId + + ", roles=" + roles + + ", rolesLinks=" + rolesLinks + + ", trusteeUserId=" + trusteeUserId + + ", trustorUserId=" + trustorUserId + + "]"; + } + public void setId(String id) { + this.id = id; + } + public void setLinks(HashMap links) { + this.links = links; + } + public void setRolesLinks(HashMap rolesLinks) { + this.rolesLinks = rolesLinks; + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trusts.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trusts.java new file mode 100644 index 000000000..463a25612 --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trusts.java @@ -0,0 +1,34 @@ +package com.woorea.openstack.v3.keystone.model; + +import java.io.Serializable; +import java.util.Iterator; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonProperty; + +public class Trusts implements Iterable, Serializable { + + @JsonProperty("trusts") + private List list; + + /** + * @return the list + */ + public List getList() { + return list; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Trusts [list=" + list + "]"; + } + + @Override + public Iterator iterator() { + return list.iterator(); + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/AccessKey.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/AccessKey.java new file mode 100644 index 000000000..94a7d337b --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/AccessKey.java @@ -0,0 +1,73 @@ +package com.woorea.openstack.v3.keystone.model.authentication; + +import org.codehaus.jackson.map.annotate.JsonRootName; +import com.woorea.openstack.v3.keystone.model.Authentication; + +@JsonRootName("auth") +public class AccessKey extends Authentication { + + //TODO Possibly remove the whole class, seems to be obsolete? + + public static final class ApiAccessKeyCredentials { + + private String accessKey; + + private String secretKey; + + /** + * @return the accessKey + */ + public String getAccessKey() { + return accessKey; + } + + /** + * @param accessKey the accessKey to set + */ + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + /** + * @return the secretKey + */ + public String getSecretKey() { + return secretKey; + } + + /** + * @param secretKey the secretKey to set + */ + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + } + + private ApiAccessKeyCredentials apiAccessKeyCredentials = new ApiAccessKeyCredentials(); + + public AccessKey() { + + } + + public AccessKey(String accessKey, String secretKey) { + apiAccessKeyCredentials.setAccessKey(accessKey); + apiAccessKeyCredentials.setSecretKey(secretKey); + } + + /** + * @return the apiAccessKeyCredentials + */ + public ApiAccessKeyCredentials getApiAccessKeyCredentials() { + return apiAccessKeyCredentials; + } + + /** + * @param apiAccessKeyCredentials the apiAccessKeyCredentials to set + */ + public void setApiAccessKeyCredentials( + ApiAccessKeyCredentials apiAccessKeyCredentials) { + this.apiAccessKeyCredentials = apiAccessKeyCredentials; + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/TokenAuthentication.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/TokenAuthentication.java new file mode 100644 index 000000000..b9bd97a72 --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/TokenAuthentication.java @@ -0,0 +1,109 @@ +package com.woorea.openstack.v3.keystone.model.authentication; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonRootName; +import com.woorea.openstack.v3.keystone.model.Authentication; + +@JsonRootName("auth") +public class TokenAuthentication extends Authentication { + + @JsonProperty("identity") + private Identity identity = new Identity(); + @JsonProperty("scope") + private Scope scope = new Scope(); + + public static final class Identity { + + @JsonProperty("methods") + private List methods = new ArrayList(); + + @JsonProperty("token") + private Token token = new Token(); + + public Identity() { + methods.add(new String("token")); + } + + public static final class Token { + + @JsonProperty("id") + private String id = new String(); + + public Token() { } + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + + } + + public Token getToken() { + return token; + } + + public void setToken(Token token) { + this.token = token; + } + + } + + public class Scope implements Serializable { + + @JsonProperty("OS-TRUST:trust") + private Trust trust = new Trust(); + + public class Trust implements Serializable { + + @JsonProperty("id") + private String id; + + public Trust() { } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + } + + public Trust getTrust() { + return trust; + } + + public void setTrust(Trust trust) { + this.trust = trust; + } + } + + public Identity getIdentity() { + return identity; + } + + public void setIdentity(Identity identity) { + this.identity = identity; + } + + public Scope getScope() { + return scope; + } + + public void setScope(Scope scope) { + this.scope = scope; + } + + public TokenAuthentication(String token) { + identity.getToken().setId(token); + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/UsernamePassword.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/UsernamePassword.java new file mode 100644 index 000000000..902676d72 --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/authentication/UsernamePassword.java @@ -0,0 +1,86 @@ +package com.woorea.openstack.v3.keystone.model.authentication; + +import java.util.ArrayList; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonRootName; +import com.woorea.openstack.v3.keystone.model.Authentication; + +@JsonRootName("auth") +public class UsernamePassword extends Authentication { + + @JsonProperty("identity") + private Identity identity = new Identity(); + + public static final class Identity { + + @JsonProperty("methods") + private List methods = new ArrayList(); + + @JsonProperty("password") + private PasswordCredentials passwordCredentials = new PasswordCredentials(); + + public Identity() { + methods.add(new String("password")); + } + + public static final class PasswordCredentials { + + @JsonProperty("user") + private User user = new User(); + + private static final class User { + + @JsonProperty("id") + private String id; + @JsonProperty("password") + private String password; + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + } + + public PasswordCredentials getPasswordCredentials() { + return this.passwordCredentials; + } + + public void setPasswordCredentials(PasswordCredentials passwordCredentials) { + this.passwordCredentials = passwordCredentials; + } + } + + public Identity getIdentity() { + return identity; + } + + public void setIdentity(Identity identity) { + this.identity = identity; + } + + public UsernamePassword(String username, String password) { + identity.getPasswordCredentials().getUser().setId(username); + identity.getPasswordCredentials().getUser().setPassword(password); + } +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateDeserializer.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateDeserializer.java new file mode 100644 index 000000000..798cf1b2c --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateDeserializer.java @@ -0,0 +1,30 @@ +package com.woorea.openstack.v3.keystone.model.util; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; + +public class TrustDateDeserializer extends JsonDeserializer { + + @Override + public Calendar deserialize(JsonParser arg0, DeserializationContext arg1) + throws IOException, JsonProcessingException { + // TODO Auto-generated method stub + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'"); + String date = arg0.getText(); + Calendar ret = Calendar.getInstance(); + try { + ret.setTime(formatter.parse(date)); + return ret; + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateSerializer.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateSerializer.java new file mode 100644 index 000000000..56b317f19 --- /dev/null +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/util/TrustDateSerializer.java @@ -0,0 +1,30 @@ +package com.woorea.openstack.v3.keystone.model.util; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; + +public class TrustDateSerializer extends JsonSerializer { + + public TrustDateSerializer() { + super(); + } + + @Override + public void serialize(Calendar arg0, JsonGenerator arg1, + SerializerProvider arg2) throws IOException, + JsonProcessingException { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'"); + //try { + String format = formatter.format(arg0.getTime()); + arg1.writeString(format); + //} catch(IllegalArgumentException e) { throw new IllegalArgumentException(arg0.toString(),); } + } + +} + diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java new file mode 100644 index 000000000..47638784f --- /dev/null +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java @@ -0,0 +1,60 @@ +package com.woorea.openstack.connector; + +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import javax.ws.rs.ClientErrorException; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; + +import org.glassfish.jersey.filter.LoggingFilter; + +import com.woorea.openstack.base.client.OpenStackClientConnector; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.base.client.OpenStackResponse; +import com.woorea.openstack.base.client.OpenStackResponseException; + +public class JaxRs20Connector implements OpenStackClientConnector { + + protected Client client = OpenStack.CLIENT; + + @Override + public OpenStackResponse request(OpenStackRequest request) { + WebTarget target = client.target(request.endpoint()).path(request.path()); + + for(Map.Entry > entry : request.queryParams().entrySet()) { + for (Object o : entry.getValue()) { + target = target.queryParam(entry.getKey(), o); + } + } + + target.register(new LoggingFilter(Logger.getLogger("os"), 10000)); + Invocation.Builder invocation = target.request(); + + for(Map.Entry> h : request.headers().entrySet()) { + StringBuilder sb = new StringBuilder(); + for(Object v : h.getValue()) { + sb.append(String.valueOf(v)); + } + invocation.header(h.getKey(), sb); + } + + Entity entity = (request.entity() == null) ? null : + Entity.entity(request.entity().getEntity(), request.entity().getContentType()); + + try { + if (entity != null) { + return new JaxRs20Response(invocation.method(request.method().name(), entity)); + } else { + return new JaxRs20Response(invocation.method(request.method().name())); + } + } catch (ClientErrorException e) { + throw new OpenStackResponseException(e.getResponse() + .getStatusInfo().toString(), e.getResponse().getStatus()); + } + } + +} diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java new file mode 100644 index 000000000..12169042f --- /dev/null +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.connector; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.core.Response; + +import com.woorea.openstack.base.client.OpenStackResponse; + +public class JaxRs20Response implements OpenStackResponse { + + private Response response; + + public JaxRs20Response(Response response) { + this.response = response; + } + + @Override + public T getEntity(Class returnType) { + return response.readEntity(returnType); + } + + @Override + public InputStream getInputStream() { + return (InputStream) response.getEntity(); + } + + @Override + public String header(String name) { + return response.getHeaderString(name); + } + + @Override + public Map headers() { + Map headers = new HashMap(); + for(String k : response.getHeaders().keySet()) { + headers.put(k, response.getHeaderString(k)); + } + return headers; + } + +} diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java new file mode 100644 index 000000000..867ee462c --- /dev/null +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java @@ -0,0 +1,98 @@ +package org.openstack.v3.connector; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.SSLContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.ext.ContextResolver; + +import org.codehaus.jackson.map.DeserializationConfig; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.SerializationConfig; +import org.codehaus.jackson.map.annotate.JsonRootName; +import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; +import org.glassfish.jersey.SslConfigurator; +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.jackson.JacksonFeature; + +public class OpenStack { + + public static Client CLIENT; + + public static ObjectMapper DEFAULT_MAPPER; + + public static ObjectMapper WRAPPED_MAPPER; + + static { + initialize(); + } + + private static void initialize() { + + try { + + SSLContext context = null; + context = SSLContext.getInstance("SSL"); + context.init(null, null, null); + + SslConfigurator sslConfig = SslConfigurator.newInstance(); + + CLIENT = ClientBuilder.newBuilder().sslContext(sslConfig.createSSLContext()).build(); + + DEFAULT_MAPPER = new ObjectMapper(); + + DEFAULT_MAPPER.setSerializationInclusion(Inclusion.NON_NULL); + DEFAULT_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT); + DEFAULT_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + + WRAPPED_MAPPER = new ObjectMapper(); + + WRAPPED_MAPPER.setSerializationInclusion(Inclusion.NON_NULL); + WRAPPED_MAPPER.enable(SerializationConfig.Feature.INDENT_OUTPUT); + WRAPPED_MAPPER.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE); + WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE); + WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + + CLIENT.register(new JacksonFeature()).register(new ContextResolver() { + + public ObjectMapper getContext(Class type) { + return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER; + } + + }); + + CLIENT.register(new ClientRequestFilter() { + + public void filter(ClientRequestContext requestContext) throws IOException { + requestContext.getHeaders().remove("Content-Language"); + requestContext.getHeaders().remove("Content-Encoding"); + } + }); + + CLIENT.register(new ClientResponseFilter(){ + + @Override + public void filter(ClientRequestContext reqContext, + ClientResponseContext respContext) throws IOException { + if(respContext.getHeaderString("X-Subject-Token") != null) { + CLIENT.property("X-Auth-Token",respContext.getHeaderString("X-Subject-Token")); + } + } + + }); + + } catch(Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + + } + +} diff --git a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java new file mode 100644 index 000000000..a3d32abe8 --- /dev/null +++ b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java @@ -0,0 +1,82 @@ +package com.woorea.openstack.base.client; + +import java.util.Properties; +import java.util.ServiceLoader; + +public class OpenStackClient { + + protected String endpoint; + + protected OpenStackTokenProvider tokenProvider; + + protected static int AUTHENTICATION_RETRIES = 1; + + protected OpenStackClientConnector connector; + + protected Properties properties = new Properties(); + + protected static OpenStackClientConnector DEFAULT_CONNECTOR; + + static { + ServiceLoader connectorLoader; + connectorLoader = ServiceLoader.load(OpenStackClientConnector.class); + + for (OpenStackClientConnector clientConnector : connectorLoader) { + DEFAULT_CONNECTOR = clientConnector; + break; + } + } + + public OpenStackClient(String endpoint) { + this.endpoint = endpoint; + this.connector = DEFAULT_CONNECTOR; + } + + public OpenStackClient(String endpoint, OpenStackClientConnector connector) { + this.endpoint = endpoint; + this.connector = (connector == null) ? DEFAULT_CONNECTOR : connector; + } + + public OpenStackResponse request(OpenStackRequest request) { + OpenStackResponseException authException = null; + + for (int i = 0; i <= AUTHENTICATION_RETRIES; i++) { + request.endpoint(endpoint); + + if (tokenProvider != null) { + request.header("X-Auth-Token", tokenProvider.getToken()); + } + + try { + return connector.request(request); + } catch (OpenStackResponseException e) { + if (e.getStatus() != OpenStackResponseStatus.NOT_AUTHORIZED + || tokenProvider == null) { + throw e; + } + authException = e; + tokenProvider.expireToken(); + } + } + + throw authException; + } + + public T execute(OpenStackRequest request) { + OpenStackResponse response = request(request); + return request.returnType() != null ? response.getEntity(request.returnType()) : null; + } + + public void property(String property, String value) { + properties.put(property, value); + } + + public void setTokenProvider(OpenStackTokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + public void token(String token) { + setTokenProvider(new OpenStackSimpleTokenProvider(token)); + } + +} diff --git a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java new file mode 100644 index 000000000..417b84440 --- /dev/null +++ b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java @@ -0,0 +1,8 @@ +package com.woorea.openstack.base.client; + + +public interface OpenStackClientConnector { + + public OpenStackResponse request(OpenStackRequest request); + +} diff --git a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java new file mode 100644 index 000000000..d76f87ad8 --- /dev/null +++ b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java @@ -0,0 +1,138 @@ +package com.woorea.openstack.base.client; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +public class OpenStackRequest { + + private OpenStackClient client; + + public OpenStackRequest() { + + } + + public OpenStackRequest(OpenStackClient client, HttpMethod method, String path, Entity entity, Class returnType) { + this.client = client; + this.method = method; + this.path = new StringBuilder(path); + this.entity = entity; + this.returnType = returnType; + header("Accept", "application/json"); + } + + private String endpoint; + + private HttpMethod method; + + private StringBuilder path = new StringBuilder(); + + private Map> headers = new HashMap>(); + + private Entity entity; + + private Class returnType; + + public OpenStackRequest endpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + + public String endpoint() { + return endpoint; + } + + public OpenStackRequest method(HttpMethod method) { + this.method = method; + return this; + } + + public HttpMethod method() { + return method; + } + + public OpenStackRequest path(String path) { + this.path.append(path); + return this; + } + + public String path() { + return path.toString(); + } + + public OpenStackRequest header(String name, Object value) { + if(value != null) { + headers.put(name, Arrays.asList(value)); + } + return this; + } + + public Map> headers() { + return headers; + } + + public Entity entity(T entity, String contentType) { + return new Entity(entity, contentType); + } + + public Entity entity() { + return entity; + } + + public Entity json(T entity) { + return entity(entity, "application/json"); + } + + public void returnType(Class returnType) { + this.returnType = returnType; + } + + public Class returnType() { + return returnType; + } + + public R execute() { + return client.execute(this); + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "OpenStackRequest [endpoint=" + endpoint + ", method=" + method + + ", path=" + path + ", headers=" + headers + ", entity=" + + entity + ", returnType=" + returnType + "]"; + } + + private Map > queryParams = new LinkedHashMap >(); + + public Map > queryParams() { + return queryParams; + } + + public OpenStackRequest queryParam(String key, Object value) { + if (queryParams.containsKey(key)) { + List values = queryParams.get(key); + values.add(value); + } else { + List values = new ArrayList(); + values.add(value); + queryParams.put(key, values); + } + + return this; + } + + protected static String buildPath(String ... elements) { + StringBuilder stringBuilder = new StringBuilder(); + for (String element : elements) { + stringBuilder.append(element); + } + + return stringBuilder.toString(); + } +} From c00283a1251e870525aa532898506cdc0ff8c9dc Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Tue, 18 Jun 2013 14:32:58 +0300 Subject: [PATCH 02/12] ...and the rest of the commit --- .../v3/keystone/api/Authenticate.java | 3 +- .../openstack/v3/keystone/api/Revoke.java | 2 +- .../v3/keystone/api/TrustsResource.java | 4 +- .../v3/keystone/model/Authentication.java | 1 - .../openstack/v3/keystone/model/Trust.java | 1 - .../jersey2-connector/pom.xml | 5 + .../v3/connector/JaxRs20Connector.java | 106 +++++++++++------- .../v3/connector/JaxRs20Response.java | 19 +++- .../openstack/v3/connector/OpenStack.java | 7 +- .../v3/base/client/OpenStackClient.java | 11 +- .../base/client/OpenStackClientConnector.java | 3 +- .../v3/base/client/OpenStackRequest.java | 3 +- pom.xml | 2 +- 13 files changed, 106 insertions(+), 61 deletions(-) diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java index 43b117dc6..aa31306aa 100644 --- a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Authenticate.java @@ -1,8 +1,7 @@ package com.woorea.openstack.v3.keystone.api; import com.woorea.openstack.base.client.HttpMethod; -import com.woorea.openstack.base.client.OpenStackRequest; -import com.woorea.openstack.keystone.model.Access; +import com.woorea.openstack.v3.base.client.OpenStackRequest; import com.woorea.openstack.v3.keystone.model.Authentication; import com.woorea.openstack.v3.keystone.model.Token; import com.woorea.openstack.v3.keystone.model.authentication.*; diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java index 51979f428..6192f69c1 100644 --- a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/Revoke.java @@ -1,7 +1,7 @@ package com.woorea.openstack.v3.keystone.api; import com.woorea.openstack.base.client.HttpMethod; -import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.v3.base.client.OpenStackRequest; import com.woorea.openstack.v3.keystone.model.Token; /** diff --git a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java index 8e9ce8896..43c281c3c 100644 --- a/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java +++ b/keystone-client/src/main/java/com/woorea/openstack/v3/keystone/api/TrustsResource.java @@ -44,14 +44,14 @@ private List(String path) { public List byTrustor(String trustorId) { List ret = new List(new StringBuilder("/OS-TRUST/trusts").toString()); - ret.addParameter("trustor_user_id", trustorId); + ret.queryParam("trustor_user_id", trustorId); return ret; } public List byTrustee(String trusteeId) { List ret = new List(new StringBuilder("/OS-TRUST/trusts").toString()); - ret.addParameter("trustee_user_id", trusteeId); + ret.queryParam("trustee_user_id", trusteeId); return ret; } diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java index a61c0d2d5..d5e56016d 100644 --- a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Authentication.java @@ -3,7 +3,6 @@ import java.io.Serializable; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.map.annotate.JsonRootName; public abstract class Authentication implements Serializable { diff --git a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java index 7433ead1d..b8ee47c89 100644 --- a/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java +++ b/keystone-model/src/main/java/com/woorea/openstack/v3/keystone/model/Trust.java @@ -9,7 +9,6 @@ import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonRootName; import org.codehaus.jackson.map.annotate.JsonSerialize; -import com.woorea.openstack.keystone.model.Link; import com.woorea.openstack.v3.keystone.model.util.TrustDateDeserializer; import com.woorea.openstack.v3.keystone.model.util.TrustDateSerializer; diff --git a/openstack-client-connectors/jersey2-connector/pom.xml b/openstack-client-connectors/jersey2-connector/pom.xml index ba8fc712e..80949c64e 100644 --- a/openstack-client-connectors/jersey2-connector/pom.xml +++ b/openstack-client-connectors/jersey2-connector/pom.xml @@ -34,5 +34,10 @@ openstack-client 3.1.0-SNAPSHOT + + com.woorea + keystone-model + 3.1.0-SNAPSHOT + diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java index 47638784f..33f0b5e78 100644 --- a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java @@ -1,4 +1,4 @@ -package com.woorea.openstack.connector; +package com.woorea.openstack.v3.connector; import java.util.List; import java.util.Map; @@ -12,49 +12,71 @@ import org.glassfish.jersey.filter.LoggingFilter; -import com.woorea.openstack.base.client.OpenStackClientConnector; -import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.v3.base.client.OpenStackClientConnector; +import com.woorea.openstack.v3.base.client.OpenStackRequest; import com.woorea.openstack.base.client.OpenStackResponse; import com.woorea.openstack.base.client.OpenStackResponseException; +import com.woorea.openstack.v3.keystone.model.Token; +import java.util.Iterator; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; public class JaxRs20Connector implements OpenStackClientConnector { - - protected Client client = OpenStack.CLIENT; - - @Override - public OpenStackResponse request(OpenStackRequest request) { - WebTarget target = client.target(request.endpoint()).path(request.path()); - - for(Map.Entry > entry : request.queryParams().entrySet()) { - for (Object o : entry.getValue()) { - target = target.queryParam(entry.getKey(), o); - } - } - - target.register(new LoggingFilter(Logger.getLogger("os"), 10000)); - Invocation.Builder invocation = target.request(); - - for(Map.Entry> h : request.headers().entrySet()) { - StringBuilder sb = new StringBuilder(); - for(Object v : h.getValue()) { - sb.append(String.valueOf(v)); - } - invocation.header(h.getKey(), sb); - } - - Entity entity = (request.entity() == null) ? null : - Entity.entity(request.entity().getEntity(), request.entity().getContentType()); - - try { - if (entity != null) { - return new JaxRs20Response(invocation.method(request.method().name(), entity)); - } else { - return new JaxRs20Response(invocation.method(request.method().name())); - } - } catch (ClientErrorException e) { - throw new OpenStackResponseException(e.getResponse() - .getStatusInfo().toString(), e.getResponse().getStatus()); - } - } - + + protected Client client = OpenStack.CLIENT; + + @Override + public OpenStackResponse request(OpenStackRequest request) { + Iterator>> iter = request.queryParams().entrySet().iterator(); + UriBuilder ub = UriBuilder.fromUri(request.endpoint()); + ub.path(request.path()); + while(iter.hasNext()) { + Map.Entry> param = iter.next(); + for(Object obj : param.getValue()) { + ub.queryParam(param.getKey(), obj); + } + } + WebTarget target = client.target(ub); + + for(Map.Entry > entry : request.queryParams().entrySet()) { + for (Object o : entry.getValue()) { + target = target.queryParam(entry.getKey(), o); + } + } + + target.register(new LoggingFilter(Logger.getLogger("os"), 10000)); + Invocation.Builder invocation = target.request(); + + for(Map.Entry> h : request.headers().entrySet()) { + StringBuilder sb = new StringBuilder(); + for(Object v : h.getValue()) { + sb.append(String.valueOf(v)); + } + invocation.header(h.getKey(), sb); + } + + Entity entity = (request.entity() == null) ? null : + Entity.entity(request.entity().getEntity(), request.entity().getContentType()); + + try { + if (entity != null) { + Response response = invocation.method(request.method().name(), entity); + if(request.returnType() == Token.class) { + return new JaxRs20Response( + response, + client.getConfiguration() + .getProperty("X-Auth-Token") + .toString() + ); + } + return new JaxRs20Response(response); + } else { + return new JaxRs20Response(invocation.method(request.method().name())); + } + } catch (ClientErrorException e) { + throw new OpenStackResponseException(e.getResponse() + .getStatusInfo().toString(), e.getResponse().getStatus()); + } + } + } diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java index 12169042f..bc016abd6 100644 --- a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Response.java @@ -1,4 +1,4 @@ -package com.woorea.openstack.connector; +package com.woorea.openstack.v3.connector; import java.io.InputStream; import java.util.HashMap; @@ -7,22 +7,35 @@ import javax.ws.rs.core.Response; import com.woorea.openstack.base.client.OpenStackResponse; +import com.woorea.openstack.v3.keystone.model.Token; public class JaxRs20Response implements OpenStackResponse { private Response response; - + private String xAuthToken; + public JaxRs20Response(Response response) { this.response = response; + this.xAuthToken = null; + } + + public JaxRs20Response(Response response, String xAuthToken) { + this.response = response; + this.xAuthToken = xAuthToken; } @Override public T getEntity(Class returnType) { - return response.readEntity(returnType); + T obj = response.readEntity(returnType); + if(returnType == Token.class && xAuthToken != null) { + ((Token) obj).setId(xAuthToken); + } + return obj; } @Override public InputStream getInputStream() { + return (InputStream) response.getEntity(); } diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java index 867ee462c..715a7d167 100644 --- a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/OpenStack.java @@ -1,9 +1,6 @@ -package org.openstack.v3.connector; +package com.woorea.openstack.v3.connector; import java.io.IOException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; @@ -20,7 +17,6 @@ import org.codehaus.jackson.map.annotate.JsonRootName; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.jackson.JacksonFeature; public class OpenStack { @@ -60,6 +56,7 @@ private static void initialize() { WRAPPED_MAPPER.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE); WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE); WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + WRAPPED_MAPPER.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS); CLIENT.register(new JacksonFeature()).register(new ContextResolver() { diff --git a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java index a3d32abe8..a786565b5 100644 --- a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java +++ b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClient.java @@ -1,5 +1,10 @@ -package com.woorea.openstack.base.client; +package com.woorea.openstack.v3.base.client; +import com.woorea.openstack.base.client.OpenStackResponse; +import com.woorea.openstack.base.client.OpenStackResponseException; +import com.woorea.openstack.base.client.OpenStackResponseStatus; +import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider; +import com.woorea.openstack.base.client.OpenStackTokenProvider; import java.util.Properties; import java.util.ServiceLoader; @@ -70,6 +75,10 @@ public T execute(OpenStackRequest request) { public void property(String property, String value) { properties.put(property, value); } + + protected String getProperty(String property) { + return properties.getProperty(property); + } public void setTokenProvider(OpenStackTokenProvider tokenProvider) { this.tokenProvider = tokenProvider; diff --git a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java index 417b84440..70dd0f14a 100644 --- a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java +++ b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackClientConnector.java @@ -1,5 +1,6 @@ -package com.woorea.openstack.base.client; +package com.woorea.openstack.v3.base.client; +import com.woorea.openstack.base.client.OpenStackResponse; public interface OpenStackClientConnector { diff --git a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java index d76f87ad8..a7c518025 100644 --- a/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java +++ b/openstack-client/src/main/java/com/woorea/openstack/v3/base/client/OpenStackRequest.java @@ -1,5 +1,6 @@ -package com.woorea.openstack.base.client; +package com.woorea.openstack.v3.base.client; +import com.woorea.openstack.base.client.*; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; diff --git a/pom.xml b/pom.xml index 352528050..2efef9131 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ OpenStack Java SDK - false + true From f4bd093d7741bb0e0945aff267516f42bd90d235 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Tue, 18 Jun 2013 15:42:35 +0300 Subject: [PATCH 03/12] Added support for QuotaSet operations. --- .../java/com/woorea/openstack/nova/Nova.java | 8 + .../openstack/nova/api/QuotaSetResource.java | 59 ++++ .../woorea/openstack/nova/model/QuotaSet.java | 287 ++++++++++-------- 3 files changed, 227 insertions(+), 127 deletions(-) create mode 100644 nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java index d8710d050..4395421b5 100644 --- a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java +++ b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java @@ -6,6 +6,7 @@ import com.woorea.openstack.nova.api.ExtensionsResource; import com.woorea.openstack.nova.api.FlavorsResource; import com.woorea.openstack.nova.api.ImagesResource; +import com.woorea.openstack.nova.api.QuotaSetResource; import com.woorea.openstack.nova.api.ServersResource; import com.woorea.openstack.nova.api.extensions.AggregatesExtension; import com.woorea.openstack.nova.api.extensions.FloatingIpsExtension; @@ -35,6 +36,8 @@ public class Nova extends OpenStackClient { private final VolumesExtension VOLUMES; private final AggregatesExtension AGGREGATES; + + private final QuotaSetResource QUOTAS; public Nova(String endpoint, OpenStackClientConnector connector) { super(endpoint, connector); @@ -48,6 +51,7 @@ public Nova(String endpoint, OpenStackClientConnector connector) { SNAPSHOTS = new SnapshotsExtension(this); VOLUMES = new VolumesExtension(this); AGGREGATES = new AggregatesExtension(this); + QUOTAS = new QuotaSetResource(this); } public Nova(String endpoint) { @@ -90,4 +94,8 @@ public VolumesExtension volumes() { return VOLUMES; } + public QuotaSetResource quotas() { + return QUOTAS; + } + } diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java new file mode 100644 index 000000000..603a0c8bd --- /dev/null +++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java @@ -0,0 +1,59 @@ +package com.woorea.openstack.nova.api; + + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.nova.model.Extensions; +import com.woorea.openstack.nova.model.QuotaSet; + +public class QuotaSetResource { + + private final OpenStackClient CLIENT; + + public QuotaSetResource(OpenStackClient client) { + CLIENT = client; + } + + public Show show(String tenantId) { + return new Show(tenantId); + } + + public Update update(String tenantId, QuotaSet quotaSet) { + return new Update(tenantId, quotaSet); + } + + public Defaults defaults(String tenantId) { + return new Defaults(tenantId); + } + + public class Show extends OpenStackRequest { + + public Show(String tenantId) { + //super(CLIENT, HttpMethod.GET, "/v2/"+tenantId+"/os-quota-sets/"+tenantId, null, QuotaSet.class); + super(CLIENT, HttpMethod.GET, "/os-quota-sets/"+tenantId, null, QuotaSet.class); + } + + } + + public class Update extends OpenStackRequest { + + public Update(String tenantId, QuotaSet quotaSet) { + //super(CLIENT, HttpMethod.POST, "/v2/"+tenantId+"/os-quota-sets/"+tenantId, Entity.json(quotaSet), QuotaSet.class); + super(CLIENT, HttpMethod.POST, "/os-quota-sets/"+tenantId, Entity.json(quotaSet), QuotaSet.class); + } + + } + + public class Defaults extends OpenStackRequest { + + public Defaults(String tenantId) { + //super(CLIENT, HttpMethod.GET, "/v2/"+tenantId+"/os-quota-sets/"+tenantId+"/defaults", null, QuotaSet.class); + super(CLIENT, HttpMethod.GET, "/os-quota-sets/"+tenantId+"/defaults", null, QuotaSet.class); + } + + } + +} + diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java index d9fe704f4..6abdf10f7 100644 --- a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java @@ -5,131 +5,164 @@ @JsonRootName("quota_set") public class QuotaSet { - - private String id; - - @JsonProperty("metadata_items") - private Integer metadataItems; - - @JsonProperty("injected_file_content_bytes") - private Integer injectedFileContentBytes; - - @JsonProperty("injected_files") - private Integer injectedFiles; - - private Integer gigabytes; - - private Integer ram; - - @JsonProperty("floating_ips") - private Integer floatingIps; - - private Integer instances; - - private Integer volumes; - - private Integer cores; - - @JsonProperty("security_groups") - private Integer securityGroups; - - @JsonProperty("security_group_rules") - private Integer securityGroupRules; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Integer getMetadataItems() { - return metadataItems; - } - - public void setMetadataItems(Integer metadataItems) { - this.metadataItems = metadataItems; - } - - public Integer getInjectedFileContentBytes() { - return injectedFileContentBytes; - } - - public void setInjectedFileContentBytes(Integer injectedFileContentBytes) { - this.injectedFileContentBytes = injectedFileContentBytes; - } - - public Integer getInjectedFiles() { - return injectedFiles; - } - - public void setInjectedFiles(Integer injectedFiles) { - this.injectedFiles = injectedFiles; - } - - public Integer getGigabytes() { - return gigabytes; - } - - public void setGigabytes(Integer gigabytes) { - this.gigabytes = gigabytes; - } - - public Integer getRam() { - return ram; - } - - public void setRam(Integer ram) { - this.ram = ram; - } - - public Integer getFloatingIps() { - return floatingIps; - } - - public void setFloatingIps(Integer floatingIps) { - this.floatingIps = floatingIps; - } - - public Integer getInstances() { - return instances; - } - - public void setInstances(Integer instances) { - this.instances = instances; - } - - public Integer getVolumes() { - return volumes; - } - - public void setVolumes(Integer volumes) { - this.volumes = volumes; - } - - public Integer getCores() { - return cores; - } - - public void setCores(Integer cores) { - this.cores = cores; - } - - public Integer getSecurityGroups() { - return securityGroups; - } - - public void setSecurityGroups(Integer securityGroups) { - this.securityGroups = securityGroups; - } - - public Integer getSecurityGroupRules() { - return securityGroupRules; - } - - public void setSecurityGroupRules(Integer securityGroupRules) { - this.securityGroupRules = securityGroupRules; - } - + + private String id; + + @JsonProperty("metadata_items") + private Integer metadataItems; + + @JsonProperty("injected_file_content_bytes") + private Integer injectedFileContentBytes; + + @JsonProperty("injected_files") + private Integer injectedFiles; + + private Integer gigabytes; + + private Integer ram; + + @JsonProperty("floating_ips") + private Integer floatingIps; + + private Integer instances; + + private Integer volumes; + + private Integer cores; + + @JsonProperty("security_groups") + private Integer securityGroups; + + @JsonProperty("security_group_rules") + private Integer securityGroupRules; + + @JsonProperty("key_pairs") + private Integer keyPairs; + + @JsonProperty("fixed_ips") + private Integer fixedIPs; + + @JsonProperty("injected_file_path_bytes") + private Integer injectedFilePathBytes; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Integer getMetadataItems() { + return metadataItems; + } + + public void setMetadataItems(Integer metadataItems) { + this.metadataItems = metadataItems; + } + + public Integer getInjectedFileContentBytes() { + return injectedFileContentBytes; + } + + public void setInjectedFileContentBytes(Integer injectedFileContentBytes) { + this.injectedFileContentBytes = injectedFileContentBytes; + } + + public Integer getInjectedFiles() { + return injectedFiles; + } + + public void setInjectedFiles(Integer injectedFiles) { + this.injectedFiles = injectedFiles; + } + + public Integer getGigabytes() { + return gigabytes; + } + + public void setGigabytes(Integer gigabytes) { + this.gigabytes = gigabytes; + } + + public Integer getRam() { + return ram; + } + + public void setRam(Integer ram) { + this.ram = ram; + } + + public Integer getFloatingIps() { + return floatingIps; + } + + public void setFloatingIps(Integer floatingIps) { + this.floatingIps = floatingIps; + } + + public Integer getInstances() { + return instances; + } + + public void setInstances(Integer instances) { + this.instances = instances; + } + + public Integer getVolumes() { + return volumes; + } + + public void setVolumes(Integer volumes) { + this.volumes = volumes; + } + + public Integer getCores() { + return cores; + } + + public void setCores(Integer cores) { + this.cores = cores; + } + + public Integer getSecurityGroups() { + return securityGroups; + } + + public void setSecurityGroups(Integer securityGroups) { + this.securityGroups = securityGroups; + } + + public Integer getSecurityGroupRules() { + return securityGroupRules; + } + + public void setSecurityGroupRules(Integer securityGroupRules) { + this.securityGroupRules = securityGroupRules; + } + + public Integer getKeyPairs() { + return keyPairs; + } + + public void setKeyPairs(Integer keyPairs) { + this.keyPairs = keyPairs; + } + + public Integer getFixedIPs() { + return fixedIPs; + } + + public void setFixedIPs(Integer fixedIPs) { + this.fixedIPs = fixedIPs; + } + + public Integer getInjectedFilePathBytes() { + return injectedFilePathBytes; + } + + public void setInjectedFilePathBytes(Integer injectedFilePathBytes) { + this.injectedFilePathBytes = injectedFilePathBytes; + } + } From 55dbf63cf0865f9a54761d7e7474d9ed4c7663b6 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Tue, 18 Jun 2013 15:42:35 +0300 Subject: [PATCH 04/12] Added support for QuotaSet operations. --- .../java/com/woorea/openstack/nova/Nova.java | 8 + .../openstack/nova/api/QuotaSetResource.java | 59 ++++ .../woorea/openstack/nova/model/QuotaSet.java | 287 ++++++++++-------- 3 files changed, 227 insertions(+), 127 deletions(-) create mode 100644 nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java index d8710d050..4395421b5 100644 --- a/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java +++ b/nova-client/src/main/java/com/woorea/openstack/nova/Nova.java @@ -6,6 +6,7 @@ import com.woorea.openstack.nova.api.ExtensionsResource; import com.woorea.openstack.nova.api.FlavorsResource; import com.woorea.openstack.nova.api.ImagesResource; +import com.woorea.openstack.nova.api.QuotaSetResource; import com.woorea.openstack.nova.api.ServersResource; import com.woorea.openstack.nova.api.extensions.AggregatesExtension; import com.woorea.openstack.nova.api.extensions.FloatingIpsExtension; @@ -35,6 +36,8 @@ public class Nova extends OpenStackClient { private final VolumesExtension VOLUMES; private final AggregatesExtension AGGREGATES; + + private final QuotaSetResource QUOTAS; public Nova(String endpoint, OpenStackClientConnector connector) { super(endpoint, connector); @@ -48,6 +51,7 @@ public Nova(String endpoint, OpenStackClientConnector connector) { SNAPSHOTS = new SnapshotsExtension(this); VOLUMES = new VolumesExtension(this); AGGREGATES = new AggregatesExtension(this); + QUOTAS = new QuotaSetResource(this); } public Nova(String endpoint) { @@ -90,4 +94,8 @@ public VolumesExtension volumes() { return VOLUMES; } + public QuotaSetResource quotas() { + return QUOTAS; + } + } diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java new file mode 100644 index 000000000..603a0c8bd --- /dev/null +++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java @@ -0,0 +1,59 @@ +package com.woorea.openstack.nova.api; + + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.nova.model.Extensions; +import com.woorea.openstack.nova.model.QuotaSet; + +public class QuotaSetResource { + + private final OpenStackClient CLIENT; + + public QuotaSetResource(OpenStackClient client) { + CLIENT = client; + } + + public Show show(String tenantId) { + return new Show(tenantId); + } + + public Update update(String tenantId, QuotaSet quotaSet) { + return new Update(tenantId, quotaSet); + } + + public Defaults defaults(String tenantId) { + return new Defaults(tenantId); + } + + public class Show extends OpenStackRequest { + + public Show(String tenantId) { + //super(CLIENT, HttpMethod.GET, "/v2/"+tenantId+"/os-quota-sets/"+tenantId, null, QuotaSet.class); + super(CLIENT, HttpMethod.GET, "/os-quota-sets/"+tenantId, null, QuotaSet.class); + } + + } + + public class Update extends OpenStackRequest { + + public Update(String tenantId, QuotaSet quotaSet) { + //super(CLIENT, HttpMethod.POST, "/v2/"+tenantId+"/os-quota-sets/"+tenantId, Entity.json(quotaSet), QuotaSet.class); + super(CLIENT, HttpMethod.POST, "/os-quota-sets/"+tenantId, Entity.json(quotaSet), QuotaSet.class); + } + + } + + public class Defaults extends OpenStackRequest { + + public Defaults(String tenantId) { + //super(CLIENT, HttpMethod.GET, "/v2/"+tenantId+"/os-quota-sets/"+tenantId+"/defaults", null, QuotaSet.class); + super(CLIENT, HttpMethod.GET, "/os-quota-sets/"+tenantId+"/defaults", null, QuotaSet.class); + } + + } + +} + diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java index d9fe704f4..6abdf10f7 100644 --- a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java @@ -5,131 +5,164 @@ @JsonRootName("quota_set") public class QuotaSet { - - private String id; - - @JsonProperty("metadata_items") - private Integer metadataItems; - - @JsonProperty("injected_file_content_bytes") - private Integer injectedFileContentBytes; - - @JsonProperty("injected_files") - private Integer injectedFiles; - - private Integer gigabytes; - - private Integer ram; - - @JsonProperty("floating_ips") - private Integer floatingIps; - - private Integer instances; - - private Integer volumes; - - private Integer cores; - - @JsonProperty("security_groups") - private Integer securityGroups; - - @JsonProperty("security_group_rules") - private Integer securityGroupRules; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Integer getMetadataItems() { - return metadataItems; - } - - public void setMetadataItems(Integer metadataItems) { - this.metadataItems = metadataItems; - } - - public Integer getInjectedFileContentBytes() { - return injectedFileContentBytes; - } - - public void setInjectedFileContentBytes(Integer injectedFileContentBytes) { - this.injectedFileContentBytes = injectedFileContentBytes; - } - - public Integer getInjectedFiles() { - return injectedFiles; - } - - public void setInjectedFiles(Integer injectedFiles) { - this.injectedFiles = injectedFiles; - } - - public Integer getGigabytes() { - return gigabytes; - } - - public void setGigabytes(Integer gigabytes) { - this.gigabytes = gigabytes; - } - - public Integer getRam() { - return ram; - } - - public void setRam(Integer ram) { - this.ram = ram; - } - - public Integer getFloatingIps() { - return floatingIps; - } - - public void setFloatingIps(Integer floatingIps) { - this.floatingIps = floatingIps; - } - - public Integer getInstances() { - return instances; - } - - public void setInstances(Integer instances) { - this.instances = instances; - } - - public Integer getVolumes() { - return volumes; - } - - public void setVolumes(Integer volumes) { - this.volumes = volumes; - } - - public Integer getCores() { - return cores; - } - - public void setCores(Integer cores) { - this.cores = cores; - } - - public Integer getSecurityGroups() { - return securityGroups; - } - - public void setSecurityGroups(Integer securityGroups) { - this.securityGroups = securityGroups; - } - - public Integer getSecurityGroupRules() { - return securityGroupRules; - } - - public void setSecurityGroupRules(Integer securityGroupRules) { - this.securityGroupRules = securityGroupRules; - } - + + private String id; + + @JsonProperty("metadata_items") + private Integer metadataItems; + + @JsonProperty("injected_file_content_bytes") + private Integer injectedFileContentBytes; + + @JsonProperty("injected_files") + private Integer injectedFiles; + + private Integer gigabytes; + + private Integer ram; + + @JsonProperty("floating_ips") + private Integer floatingIps; + + private Integer instances; + + private Integer volumes; + + private Integer cores; + + @JsonProperty("security_groups") + private Integer securityGroups; + + @JsonProperty("security_group_rules") + private Integer securityGroupRules; + + @JsonProperty("key_pairs") + private Integer keyPairs; + + @JsonProperty("fixed_ips") + private Integer fixedIPs; + + @JsonProperty("injected_file_path_bytes") + private Integer injectedFilePathBytes; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Integer getMetadataItems() { + return metadataItems; + } + + public void setMetadataItems(Integer metadataItems) { + this.metadataItems = metadataItems; + } + + public Integer getInjectedFileContentBytes() { + return injectedFileContentBytes; + } + + public void setInjectedFileContentBytes(Integer injectedFileContentBytes) { + this.injectedFileContentBytes = injectedFileContentBytes; + } + + public Integer getInjectedFiles() { + return injectedFiles; + } + + public void setInjectedFiles(Integer injectedFiles) { + this.injectedFiles = injectedFiles; + } + + public Integer getGigabytes() { + return gigabytes; + } + + public void setGigabytes(Integer gigabytes) { + this.gigabytes = gigabytes; + } + + public Integer getRam() { + return ram; + } + + public void setRam(Integer ram) { + this.ram = ram; + } + + public Integer getFloatingIps() { + return floatingIps; + } + + public void setFloatingIps(Integer floatingIps) { + this.floatingIps = floatingIps; + } + + public Integer getInstances() { + return instances; + } + + public void setInstances(Integer instances) { + this.instances = instances; + } + + public Integer getVolumes() { + return volumes; + } + + public void setVolumes(Integer volumes) { + this.volumes = volumes; + } + + public Integer getCores() { + return cores; + } + + public void setCores(Integer cores) { + this.cores = cores; + } + + public Integer getSecurityGroups() { + return securityGroups; + } + + public void setSecurityGroups(Integer securityGroups) { + this.securityGroups = securityGroups; + } + + public Integer getSecurityGroupRules() { + return securityGroupRules; + } + + public void setSecurityGroupRules(Integer securityGroupRules) { + this.securityGroupRules = securityGroupRules; + } + + public Integer getKeyPairs() { + return keyPairs; + } + + public void setKeyPairs(Integer keyPairs) { + this.keyPairs = keyPairs; + } + + public Integer getFixedIPs() { + return fixedIPs; + } + + public void setFixedIPs(Integer fixedIPs) { + this.fixedIPs = fixedIPs; + } + + public Integer getInjectedFilePathBytes() { + return injectedFilePathBytes; + } + + public void setInjectedFilePathBytes(Integer injectedFilePathBytes) { + this.injectedFilePathBytes = injectedFilePathBytes; + } + } From 3a10b7faf372a64b3d8bd69b32776afede8ec2b9 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Wed, 19 Jun 2013 09:36:52 +0300 Subject: [PATCH 05/12] Refactored QuotaSetResource as it is an extension. --- .../{QuotaSetResource.java => extensions/QuotaSetsExtension.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename nova-client/src/main/java/com/woorea/openstack/nova/api/{QuotaSetResource.java => extensions/QuotaSetsExtension.java} (100%) diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/QuotaSetsExtension.java similarity index 100% rename from nova-client/src/main/java/com/woorea/openstack/nova/api/QuotaSetResource.java rename to nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/QuotaSetsExtension.java From f5e7422b9fdf3e2978dcbf4ea252819eeeb501a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 19 Jun 2013 16:22:59 +0300 Subject: [PATCH 06/12] Ceilometer V2 Web API support --- .../openstack/ceilometer/Ceilometer.java | 14 +++++- .../openstack/ceilometer/QueryFilter.java | 43 +++++++++++++++++ .../ceilometer/v2/api/MetersResource.java | 22 +++++---- .../ceilometer/v2/api/ResourcesResource.java | 48 ++++++++++++++----- .../ceilometer/v2/api/SamplesResource.java | 44 +++++++++++++++++ .../ceilometer/v2/api/StatisticsResource.java | 43 +++++++++++++++++ .../openstack/ceilometer/v2/model/Meter.java | 29 +++++------ .../ceilometer/v2/model/Resource.java | 32 +++++++++++-- .../openstack/ceilometer/v2/model/Sample.java | 10 ++-- .../examples/metering/v2/TestAll.java | 34 ++++++++++--- 10 files changed, 270 insertions(+), 49 deletions(-) create mode 100644 ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java create mode 100644 ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java create mode 100644 ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java index 05cda3551..1359cc57a 100644 --- a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java @@ -5,17 +5,25 @@ import com.woorea.openstack.base.client.OpenStackClientConnector; import com.woorea.openstack.ceilometer.v2.api.MetersResource; import com.woorea.openstack.ceilometer.v2.api.ResourcesResource; +import com.woorea.openstack.ceilometer.v2.api.SamplesResource; +import com.woorea.openstack.ceilometer.v2.api.StatisticsResource; public class Ceilometer extends OpenStackClient { private final MetersResource METERS; private final ResourcesResource RESOURCES; + + private final SamplesResource SAMPLES; + + private final StatisticsResource STATISTICS; public Ceilometer(String endpoint, OpenStackClientConnector connector) { super(endpoint, connector); METERS = new MetersResource(this); RESOURCES = new ResourcesResource(this); + SAMPLES = new SamplesResource(this); + STATISTICS = new StatisticsResource(this); } public Ceilometer(String endpoint) { @@ -30,5 +38,9 @@ public ResourcesResource resources() { public MetersResource meters() { return METERS; } - + + public SamplesResource samples() { + return SAMPLES; + } + } diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java new file mode 100644 index 000000000..91d5258af --- /dev/null +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.ceilometer; + +import java.io.Serializable; + +public class QueryFilter implements Serializable { + private String field; + private String op; + private String value; + + public QueryFilter(String field, String op, String value) { + this.field = field; + this.op = op; + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getOp() { + return op; + } + + public void setOp(String op) { + this.op = op; + } + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public String toString() { + return "q.field=" + field + "&q.op="+op + "&q.value=" + value; + } +} diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java index e44dbe649..41d6633ee 100644 --- a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java @@ -1,37 +1,41 @@ package com.woorea.openstack.ceilometer.v2.api; +import com.woorea.openstack.base.client.HttpMethod; import com.woorea.openstack.base.client.OpenStackClient; import com.woorea.openstack.base.client.OpenStackRequest; -import com.woorea.openstack.ceilometer.QueriableCeilometerCommand; import com.woorea.openstack.ceilometer.v2.model.Sample; + public class MetersResource { - private final OpenStackClient CLIENT; + private final OpenStackClient client; public MetersResource(OpenStackClient client) { - CLIENT = client; + this.client = client; } public List list() { return new List(); } - - public Show show() { + + + /*public Show show() { return new Show(); } + public Statistics statistics() { return new Statistics(); - } + }*/ - public class List extends QueriableCeilometerCommand> { + public class List extends OpenStackRequest { /*extends QueriableCeilometerCommand>*/ public List() { + super(client, HttpMethod.GET, "/meters/", null, Sample[].class); //return query(target.path("meters")).request(MediaType.APPLICATION_JSON).get(new GenericType>() {}); } } - +/* public class Show extends QueriableCeilometerCommand> { private String name; @@ -67,5 +71,5 @@ public Statistics() { } } - +*/ } diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java index 405f04fb9..bf8b7a027 100644 --- a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java @@ -1,23 +1,51 @@ package com.woorea.openstack.ceilometer.v2.api; -import java.util.List; - - +import com.woorea.openstack.base.client.HttpMethod; import com.woorea.openstack.base.client.OpenStackClient; import com.woorea.openstack.base.client.OpenStackRequest; -import com.woorea.openstack.ceilometer.QueriableCeilometerCommand; +import com.woorea.openstack.ceilometer.QueryFilter; import com.woorea.openstack.ceilometer.v2.model.Resource; +import java.util.Iterator; + public class ResourcesResource { - private final OpenStackClient CLIENT; + private OpenStackClient client; public ResourcesResource(OpenStackClient client) { - CLIENT = client; + this.client = client; } - public class ResourceList extends QueriableCeilometerCommand> { - + public List list() { + return new List(); + } + + /** + * Response type is always an array of Resource objects even if queried with resourceId. + * Ceilometer V2 Web API return type for querying with resourceId is a single Resource object. + */ + public class List extends OpenStackRequest { + public List() { + super(client, HttpMethod.GET, "/resources", null, Resource[].class); + } + + public List(java.util.List qf) { + super(client, HttpMethod.GET, "/resources/", null, Resource[].class); + Iterator it = qf.iterator(); + for ( int i = 0; i < qf.size(); i++ ) { + this.queryParam("q.field", qf.get(i).getField()); + this.queryParam("q.op", qf.get(i).getOp()); + this.queryParam("q.value", qf.get(i).getValue()); + } + } + + public List(String resourceId) { + super(client, HttpMethod.GET, new StringBuilder("/resources/").append(resourceId).toString(), null, Resource[].class); + } + } +/* + public class ResourceList extends QueriableCeilometerCommand> { + public ResourceList() { OpenStackRequest request = new OpenStackRequest(); //return query(target.path("resources")).request(MediaType.APPLICATION_JSON).get(new GenericType>() {}); @@ -40,7 +68,5 @@ public ResourceShow(OpenStackClient client) { // } // return target.path("resources").path(id).request(MediaType.APPLICATION_JSON).get(Resource.class); } - - } - + */ } diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java new file mode 100644 index 000000000..c33417bba --- /dev/null +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java @@ -0,0 +1,44 @@ +package com.woorea.openstack.ceilometer.v2.api; + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.ceilometer.QueryFilter; +import com.woorea.openstack.ceilometer.v2.model.Sample; + +import java.util.Iterator; + +public class SamplesResource { + private OpenStackClient client; + + public SamplesResource(OpenStackClient client) { + this.client = client; + } + + public List list(String meterId) { + return new List(meterId); + } + + public List list(String meterId, java.util.List qf) { + return new List(meterId, qf); + } + + public class List extends OpenStackRequest { + + public List(String meterId) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).toString(), null, Sample[].class); + } + + public List(String meterId, java.util.List< QueryFilter > qf) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).toString(), null, Sample[].class); + Iterator it = qf.iterator(); + for ( int i = 0; i < qf.size(); i++ ) { + this.queryParam("q.field", qf.get(i).getField()); + this.queryParam("q.op", qf.get(i).getOp()); + this.queryParam("q.value", qf.get(i).getValue()); + } + } + } + + +} diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java new file mode 100644 index 000000000..0f78802f9 --- /dev/null +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.ceilometer.v2.api; + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.ceilometer.QueryFilter; +import com.woorea.openstack.ceilometer.v2.model.Statistics; + +import java.util.Iterator; + +public class StatisticsResource { + private OpenStackClient client; + + public StatisticsResource(OpenStackClient client) { + this.client = client; + } + + public List list(String meterId) { + return new List(meterId); + } + + public List list(String meterType, java.util.List qf) { + return new List(meterType, qf); + } + + public class List extends OpenStackRequest { + + public List(String meterId) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).append("/statistics/").toString(), null, Statistics[].class); + } + + public List(String meterId, java.util.List< QueryFilter > qf) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).append("/statistics/").toString(), null, Statistics[].class); + Iterator it = qf.iterator(); + for ( int i = 0; i < qf.size(); i++ ) { + this.queryParam("q.field", qf.get(i).getField()); + this.queryParam("q.op", qf.get(i).getOp()); + this.queryParam("q.value", qf.get(i).getValue()); + } + } + } + +} diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java index df9182f9c..472b47b73 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java @@ -6,19 +6,21 @@ public class Meter { @JsonProperty("user_id") private String user; - - - private String name; - + + @JsonProperty("type") + private String type; + + @JsonProperty("unit") + private String unit; + + @JsonProperty("name") + private String name; + @JsonProperty("resource_id") private String resource; - + @JsonProperty("project_id") private String project; - - private String type; - - private String unit; public String getUser() { return user; @@ -40,15 +42,14 @@ public String getType() { return type; } - public String getUnit() { - return unit; - } + public String getUnit() { + return unit; + } @Override public String toString() { return "Meter [user=" + user + ", name=" + name + ", resource=" - + resource + ", project=" + project + ", type=" + type - + ", unit=" + unit + "]"; + + resource + ", project=" + project + ", type=" + type + "]"; } } diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java index 24e14aa3d..ec84577ab 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java @@ -1,9 +1,9 @@ package com.woorea.openstack.ceilometer.v2.model; -import java.util.Map; - import org.codehaus.jackson.annotate.JsonProperty; +import java.util.Map; + public class Resource { //{"resource_id": "23b55841eedd41e99d5f3f32149ca086", "timestamp": "2013-03-03T15:19:00", "project_id": "23b55841eedd41e99d5f3f32149ca086", "user_id": null, "metadata": {}} @@ -46,5 +46,31 @@ public String toString() { + ", project=" + project + ", user=" + user + ", metadata=" + metadata + "]"; } - + +/* public class Metadata { + private String display_name; + + private String ephemeral_gb; + + private String disk_gb; + + private String availability_zone; + + private String kernel_id; + + private String ramdisk_id; + + private String host; + + private String memory_mb; + + private String instance_type; + + private String vcpus; + + private String root_gb; + + private String image_ref; + + }*/ } diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java index 8827de466..73a1ead35 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java @@ -1,9 +1,9 @@ package com.woorea.openstack.ceilometer.v2.model; -import java.util.Map; - import org.codehaus.jackson.annotate.JsonProperty; +import java.util.Map; + public class Sample { @JsonProperty("counter_type") @@ -17,7 +17,8 @@ public class Sample { @JsonProperty("counter_volume") private String counterVolume; - + + @JsonProperty("source") private String source; @JsonProperty("project_id") @@ -28,7 +29,8 @@ public class Sample { @JsonProperty("resource_id") private String resource; - + + @JsonProperty("timestamp") private String timestamp; @JsonProperty("message_id") diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java index c9d0c1817..620287e13 100644 --- a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java +++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java @@ -1,32 +1,52 @@ package com.woorea.openstack.examples.metering.v2; -import java.util.List; - - import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider; import com.woorea.openstack.ceilometer.Ceilometer; -import com.woorea.openstack.ceilometer.v2.model.Meter; -import com.woorea.openstack.ceilometer.v2.model.Statistics; +import com.woorea.openstack.ceilometer.QueryFilter; +import com.woorea.openstack.ceilometer.v2.model.Sample; import com.woorea.openstack.examples.ExamplesConfiguration; import com.woorea.openstack.keystone.Keystone; import com.woorea.openstack.keystone.model.Access; import com.woorea.openstack.keystone.model.authentication.UsernamePassword; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class TestAll { /** * @param args */ public static void main(String[] args) { - Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL); + Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_ENDPOINT); Access access = keystone.tokens() - .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD)) + .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME,ExamplesConfiguration.KEYSTONE_PASSWORD)) .withTenantName("admin") .execute(); Ceilometer ceilometer = new Ceilometer(ExamplesConfiguration.CEILOMETER_ENDPOINT); ceilometer.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId())); + ArrayList queryParams = new ArrayList(); + queryParams.add(new QueryFilter("timestamp", "ge", "2013-06-16T00:00:00")); + + /** + * XXX: + */ + List meters = Arrays.asList(ceilometer.meters().list().execute()); + + List samples = Arrays.asList(ceilometer.samples().list("cpu", queryParams).execute()); + + + for (Sample s : meters) { + System.out.println(s); + } + + for (Sample s : samples) { + System.out.println(s); + } + /* List resources = ceilometer.execute(new ResourceList().eq("resource_id", "23b55841eedd41e99d5f3f32149ca086")); From 143d615910066885b136478bd6a2780cccb7b1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 19 Jun 2013 16:22:59 +0300 Subject: [PATCH 07/12] Ceilometer V2 Web API support --- .../openstack/ceilometer/Ceilometer.java | 14 +++++- .../openstack/ceilometer/QueryFilter.java | 43 +++++++++++++++++ .../ceilometer/v2/api/MetersResource.java | 22 +++++---- .../ceilometer/v2/api/ResourcesResource.java | 48 ++++++++++++++----- .../ceilometer/v2/api/SamplesResource.java | 44 +++++++++++++++++ .../ceilometer/v2/api/StatisticsResource.java | 43 +++++++++++++++++ .../openstack/ceilometer/v2/model/Meter.java | 29 +++++------ .../ceilometer/v2/model/Resource.java | 6 +-- .../openstack/ceilometer/v2/model/Sample.java | 10 ++-- .../examples/metering/v2/TestAll.java | 34 ++++++++++--- 10 files changed, 244 insertions(+), 49 deletions(-) create mode 100644 ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java create mode 100644 ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java create mode 100644 ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java index 05cda3551..1359cc57a 100644 --- a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/Ceilometer.java @@ -5,17 +5,25 @@ import com.woorea.openstack.base.client.OpenStackClientConnector; import com.woorea.openstack.ceilometer.v2.api.MetersResource; import com.woorea.openstack.ceilometer.v2.api.ResourcesResource; +import com.woorea.openstack.ceilometer.v2.api.SamplesResource; +import com.woorea.openstack.ceilometer.v2.api.StatisticsResource; public class Ceilometer extends OpenStackClient { private final MetersResource METERS; private final ResourcesResource RESOURCES; + + private final SamplesResource SAMPLES; + + private final StatisticsResource STATISTICS; public Ceilometer(String endpoint, OpenStackClientConnector connector) { super(endpoint, connector); METERS = new MetersResource(this); RESOURCES = new ResourcesResource(this); + SAMPLES = new SamplesResource(this); + STATISTICS = new StatisticsResource(this); } public Ceilometer(String endpoint) { @@ -30,5 +38,9 @@ public ResourcesResource resources() { public MetersResource meters() { return METERS; } - + + public SamplesResource samples() { + return SAMPLES; + } + } diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java new file mode 100644 index 000000000..91d5258af --- /dev/null +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/QueryFilter.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.ceilometer; + +import java.io.Serializable; + +public class QueryFilter implements Serializable { + private String field; + private String op; + private String value; + + public QueryFilter(String field, String op, String value) { + this.field = field; + this.op = op; + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getOp() { + return op; + } + + public void setOp(String op) { + this.op = op; + } + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public String toString() { + return "q.field=" + field + "&q.op="+op + "&q.value=" + value; + } +} diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java index e44dbe649..41d6633ee 100644 --- a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/MetersResource.java @@ -1,37 +1,41 @@ package com.woorea.openstack.ceilometer.v2.api; +import com.woorea.openstack.base.client.HttpMethod; import com.woorea.openstack.base.client.OpenStackClient; import com.woorea.openstack.base.client.OpenStackRequest; -import com.woorea.openstack.ceilometer.QueriableCeilometerCommand; import com.woorea.openstack.ceilometer.v2.model.Sample; + public class MetersResource { - private final OpenStackClient CLIENT; + private final OpenStackClient client; public MetersResource(OpenStackClient client) { - CLIENT = client; + this.client = client; } public List list() { return new List(); } - - public Show show() { + + + /*public Show show() { return new Show(); } + public Statistics statistics() { return new Statistics(); - } + }*/ - public class List extends QueriableCeilometerCommand> { + public class List extends OpenStackRequest { /*extends QueriableCeilometerCommand>*/ public List() { + super(client, HttpMethod.GET, "/meters/", null, Sample[].class); //return query(target.path("meters")).request(MediaType.APPLICATION_JSON).get(new GenericType>() {}); } } - +/* public class Show extends QueriableCeilometerCommand> { private String name; @@ -67,5 +71,5 @@ public Statistics() { } } - +*/ } diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java index 405f04fb9..bf8b7a027 100644 --- a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/ResourcesResource.java @@ -1,23 +1,51 @@ package com.woorea.openstack.ceilometer.v2.api; -import java.util.List; - - +import com.woorea.openstack.base.client.HttpMethod; import com.woorea.openstack.base.client.OpenStackClient; import com.woorea.openstack.base.client.OpenStackRequest; -import com.woorea.openstack.ceilometer.QueriableCeilometerCommand; +import com.woorea.openstack.ceilometer.QueryFilter; import com.woorea.openstack.ceilometer.v2.model.Resource; +import java.util.Iterator; + public class ResourcesResource { - private final OpenStackClient CLIENT; + private OpenStackClient client; public ResourcesResource(OpenStackClient client) { - CLIENT = client; + this.client = client; } - public class ResourceList extends QueriableCeilometerCommand> { - + public List list() { + return new List(); + } + + /** + * Response type is always an array of Resource objects even if queried with resourceId. + * Ceilometer V2 Web API return type for querying with resourceId is a single Resource object. + */ + public class List extends OpenStackRequest { + public List() { + super(client, HttpMethod.GET, "/resources", null, Resource[].class); + } + + public List(java.util.List qf) { + super(client, HttpMethod.GET, "/resources/", null, Resource[].class); + Iterator it = qf.iterator(); + for ( int i = 0; i < qf.size(); i++ ) { + this.queryParam("q.field", qf.get(i).getField()); + this.queryParam("q.op", qf.get(i).getOp()); + this.queryParam("q.value", qf.get(i).getValue()); + } + } + + public List(String resourceId) { + super(client, HttpMethod.GET, new StringBuilder("/resources/").append(resourceId).toString(), null, Resource[].class); + } + } +/* + public class ResourceList extends QueriableCeilometerCommand> { + public ResourceList() { OpenStackRequest request = new OpenStackRequest(); //return query(target.path("resources")).request(MediaType.APPLICATION_JSON).get(new GenericType>() {}); @@ -40,7 +68,5 @@ public ResourceShow(OpenStackClient client) { // } // return target.path("resources").path(id).request(MediaType.APPLICATION_JSON).get(Resource.class); } - - } - + */ } diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java new file mode 100644 index 000000000..c33417bba --- /dev/null +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/SamplesResource.java @@ -0,0 +1,44 @@ +package com.woorea.openstack.ceilometer.v2.api; + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.ceilometer.QueryFilter; +import com.woorea.openstack.ceilometer.v2.model.Sample; + +import java.util.Iterator; + +public class SamplesResource { + private OpenStackClient client; + + public SamplesResource(OpenStackClient client) { + this.client = client; + } + + public List list(String meterId) { + return new List(meterId); + } + + public List list(String meterId, java.util.List qf) { + return new List(meterId, qf); + } + + public class List extends OpenStackRequest { + + public List(String meterId) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).toString(), null, Sample[].class); + } + + public List(String meterId, java.util.List< QueryFilter > qf) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).toString(), null, Sample[].class); + Iterator it = qf.iterator(); + for ( int i = 0; i < qf.size(); i++ ) { + this.queryParam("q.field", qf.get(i).getField()); + this.queryParam("q.op", qf.get(i).getOp()); + this.queryParam("q.value", qf.get(i).getValue()); + } + } + } + + +} diff --git a/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java new file mode 100644 index 000000000..0f78802f9 --- /dev/null +++ b/ceilometer-client/src/main/java/com/woorea/openstack/ceilometer/v2/api/StatisticsResource.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.ceilometer.v2.api; + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.ceilometer.QueryFilter; +import com.woorea.openstack.ceilometer.v2.model.Statistics; + +import java.util.Iterator; + +public class StatisticsResource { + private OpenStackClient client; + + public StatisticsResource(OpenStackClient client) { + this.client = client; + } + + public List list(String meterId) { + return new List(meterId); + } + + public List list(String meterType, java.util.List qf) { + return new List(meterType, qf); + } + + public class List extends OpenStackRequest { + + public List(String meterId) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).append("/statistics/").toString(), null, Statistics[].class); + } + + public List(String meterId, java.util.List< QueryFilter > qf) { + super(client, HttpMethod.GET, new StringBuilder("/meters/").append(meterId).append("/statistics/").toString(), null, Statistics[].class); + Iterator it = qf.iterator(); + for ( int i = 0; i < qf.size(); i++ ) { + this.queryParam("q.field", qf.get(i).getField()); + this.queryParam("q.op", qf.get(i).getOp()); + this.queryParam("q.value", qf.get(i).getValue()); + } + } + } + +} diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java index df9182f9c..472b47b73 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Meter.java @@ -6,19 +6,21 @@ public class Meter { @JsonProperty("user_id") private String user; - - - private String name; - + + @JsonProperty("type") + private String type; + + @JsonProperty("unit") + private String unit; + + @JsonProperty("name") + private String name; + @JsonProperty("resource_id") private String resource; - + @JsonProperty("project_id") private String project; - - private String type; - - private String unit; public String getUser() { return user; @@ -40,15 +42,14 @@ public String getType() { return type; } - public String getUnit() { - return unit; - } + public String getUnit() { + return unit; + } @Override public String toString() { return "Meter [user=" + user + ", name=" + name + ", resource=" - + resource + ", project=" + project + ", type=" + type - + ", unit=" + unit + "]"; + + resource + ", project=" + project + ", type=" + type + "]"; } } diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java index 24e14aa3d..35434e569 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Resource.java @@ -1,9 +1,9 @@ package com.woorea.openstack.ceilometer.v2.model; -import java.util.Map; - import org.codehaus.jackson.annotate.JsonProperty; +import java.util.Map; + public class Resource { //{"resource_id": "23b55841eedd41e99d5f3f32149ca086", "timestamp": "2013-03-03T15:19:00", "project_id": "23b55841eedd41e99d5f3f32149ca086", "user_id": null, "metadata": {}} @@ -46,5 +46,5 @@ public String toString() { + ", project=" + project + ", user=" + user + ", metadata=" + metadata + "]"; } - + } diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java index 8827de466..73a1ead35 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java @@ -1,9 +1,9 @@ package com.woorea.openstack.ceilometer.v2.model; -import java.util.Map; - import org.codehaus.jackson.annotate.JsonProperty; +import java.util.Map; + public class Sample { @JsonProperty("counter_type") @@ -17,7 +17,8 @@ public class Sample { @JsonProperty("counter_volume") private String counterVolume; - + + @JsonProperty("source") private String source; @JsonProperty("project_id") @@ -28,7 +29,8 @@ public class Sample { @JsonProperty("resource_id") private String resource; - + + @JsonProperty("timestamp") private String timestamp; @JsonProperty("message_id") diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java index c9d0c1817..620287e13 100644 --- a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java +++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java @@ -1,32 +1,52 @@ package com.woorea.openstack.examples.metering.v2; -import java.util.List; - - import com.woorea.openstack.base.client.OpenStackSimpleTokenProvider; import com.woorea.openstack.ceilometer.Ceilometer; -import com.woorea.openstack.ceilometer.v2.model.Meter; -import com.woorea.openstack.ceilometer.v2.model.Statistics; +import com.woorea.openstack.ceilometer.QueryFilter; +import com.woorea.openstack.ceilometer.v2.model.Sample; import com.woorea.openstack.examples.ExamplesConfiguration; import com.woorea.openstack.keystone.Keystone; import com.woorea.openstack.keystone.model.Access; import com.woorea.openstack.keystone.model.authentication.UsernamePassword; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class TestAll { /** * @param args */ public static void main(String[] args) { - Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL); + Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_ENDPOINT); Access access = keystone.tokens() - .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD)) + .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME,ExamplesConfiguration.KEYSTONE_PASSWORD)) .withTenantName("admin") .execute(); Ceilometer ceilometer = new Ceilometer(ExamplesConfiguration.CEILOMETER_ENDPOINT); ceilometer.setTokenProvider(new OpenStackSimpleTokenProvider(access.getToken().getId())); + ArrayList queryParams = new ArrayList(); + queryParams.add(new QueryFilter("timestamp", "ge", "2013-06-16T00:00:00")); + + /** + * XXX: + */ + List meters = Arrays.asList(ceilometer.meters().list().execute()); + + List samples = Arrays.asList(ceilometer.samples().list("cpu", queryParams).execute()); + + + for (Sample s : meters) { + System.out.println(s); + } + + for (Sample s : samples) { + System.out.println(s); + } + /* List resources = ceilometer.execute(new ResourceList().eq("resource_id", "23b55841eedd41e99d5f3f32149ca086")); From 95aa6d098f5532aca6b5c0ab0eac76d9cbb76b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Thu, 20 Jun 2013 08:03:10 +0300 Subject: [PATCH 08/12] Ceilometer V2 Web API support --- .../com/woorea/openstack/examples/metering/v2/TestAll.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java index 620287e13..497b45b67 100644 --- a/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java +++ b/openstack-examples/src/main/java/com/woorea/openstack/examples/metering/v2/TestAll.java @@ -19,9 +19,9 @@ public class TestAll { * @param args */ public static void main(String[] args) { - Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_ENDPOINT); + Keystone keystone = new Keystone(ExamplesConfiguration.KEYSTONE_AUTH_URL); Access access = keystone.tokens() - .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME,ExamplesConfiguration.KEYSTONE_PASSWORD)) + .authenticate(new UsernamePassword(ExamplesConfiguration.KEYSTONE_USERNAME, ExamplesConfiguration.KEYSTONE_PASSWORD)) .withTenantName("admin") .execute(); @@ -31,9 +31,6 @@ public static void main(String[] args) { ArrayList queryParams = new ArrayList(); queryParams.add(new QueryFilter("timestamp", "ge", "2013-06-16T00:00:00")); - /** - * XXX: - */ List meters = Arrays.asList(ceilometer.meters().list().execute()); List samples = Arrays.asList(ceilometer.samples().list("cpu", queryParams).execute()); From d0cea1d33ae216b1c165b81baf13f37d53b8e2c3 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Thu, 20 Jun 2013 15:47:40 +0300 Subject: [PATCH 09/12] Some fine tuning. Added Cinder client + model (they're not tested yet). --- cinder-client/pom.xml | 23 +++++ .../com/woorea/openstack/cinder/Cinder.java | 46 +++++++++ .../cinder/api/QuotaSetResource.java | 28 ++++++ .../cinder/api/SnapshotsResource.java | 81 ++++++++++++++++ .../openstack/cinder/api/TypesResource.java | 43 +++++++++ .../openstack/cinder/api/VolumesResource.java | 83 ++++++++++++++++ cinder-model/pom.xml | 11 +++ .../cinder/model/AnonymousSnapshot.java | 96 +++++++++++++++++++ .../openstack/cinder/model/Metadata.java | 18 ++++ .../openstack/cinder/model/QuotaSet.java | 28 ++++++ .../openstack/cinder/model/Snapshot.java | 20 ++++ .../openstack/cinder/model/Snapshots.java | 20 ++++ .../woorea/openstack/cinder/model/Specs.java | 22 +++++ .../woorea/openstack/cinder/model/Type.java | 38 ++++++++ .../woorea/openstack/cinder/model/Types.java | 50 ++++++++++ .../woorea/openstack/cinder/model/Volume.java | 95 ++++++++++++++++++ .../openstack/cinder/model/Volumes.java | 27 ++++++ .../api/extensions/QuotaSetsExtension.java | 1 - .../woorea/openstack/nova/model/QuotaSet.java | 5 +- .../v3/connector/JaxRs20Connector.java | 11 +-- pom.xml | 2 + 21 files changed, 736 insertions(+), 12 deletions(-) create mode 100644 cinder-client/pom.xml create mode 100644 cinder-client/src/main/java/com/woorea/openstack/cinder/Cinder.java create mode 100644 cinder-client/src/main/java/com/woorea/openstack/cinder/api/QuotaSetResource.java create mode 100644 cinder-client/src/main/java/com/woorea/openstack/cinder/api/SnapshotsResource.java create mode 100644 cinder-client/src/main/java/com/woorea/openstack/cinder/api/TypesResource.java create mode 100644 cinder-client/src/main/java/com/woorea/openstack/cinder/api/VolumesResource.java create mode 100644 cinder-model/pom.xml create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/AnonymousSnapshot.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Metadata.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshot.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshots.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Specs.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Type.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Types.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java create mode 100644 cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volumes.java diff --git a/cinder-client/pom.xml b/cinder-client/pom.xml new file mode 100644 index 000000000..f8531dc46 --- /dev/null +++ b/cinder-client/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + + com.woorea + openstack-java-sdk + 3.1.0-SNAPSHOT + + cinder-client + OpenStack Cinder Client + OpenStack Cinder Client + + + com.woorea + openstack-client + 3.1.0-SNAPSHOT + + + com.woorea + cinder-model + 3.1.0-SNAPSHOT + + + diff --git a/cinder-client/src/main/java/com/woorea/openstack/cinder/Cinder.java b/cinder-client/src/main/java/com/woorea/openstack/cinder/Cinder.java new file mode 100644 index 000000000..f145a5705 --- /dev/null +++ b/cinder-client/src/main/java/com/woorea/openstack/cinder/Cinder.java @@ -0,0 +1,46 @@ +package com.woorea.openstack.cinder; + + +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackClientConnector; +import com.woorea.openstack.cinder.api.QuotaSetResource; +import com.woorea.openstack.cinder.api.VolumesResource; +import com.woorea.openstack.cinder.api.TypesResource; +import com.woorea.openstack.cinder.api.SnapshotsResource; + +public class Cinder extends OpenStackClient { + + private final VolumesResource VOLUMES; + private final TypesResource TYPES; + private final SnapshotsResource SNAPSHOTS; + private final QuotaSetResource QUOTAS; + + public Cinder(String endpoint, OpenStackClientConnector connector) { + super(endpoint, connector); + VOLUMES = new VolumesResource(this); + TYPES = new TypesResource(this); + SNAPSHOTS = new SnapshotsResource(this); + QUOTAS = new QuotaSetResource(this); + } + + public Cinder(String endpoint) { + this(endpoint, null); + } + + public VolumesResource volumes() { + return VOLUMES; + } + + public TypesResource types() { + return TYPES; + } + + public SnapshotsResource snapshots() { + return SNAPSHOTS; + } + + public QuotaSetResource quotas() { + return QUOTAS; + } + +} diff --git a/cinder-client/src/main/java/com/woorea/openstack/cinder/api/QuotaSetResource.java b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/QuotaSetResource.java new file mode 100644 index 000000000..113b54926 --- /dev/null +++ b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/QuotaSetResource.java @@ -0,0 +1,28 @@ +package com.woorea.openstack.cinder.api; + + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.cinder.model.QuotaSet; + +public class QuotaSetResource { + + private final OpenStackClient CLIENT; + + public QuotaSetResource(OpenStackClient client) { + CLIENT = client; + } + + public Show show(String tenantId) { + return new Show(tenantId); + } + + public class Show extends OpenStackRequest { + + public Show(String tenantId) { + super(CLIENT, HttpMethod.GET, "/os-quota-sets/"+tenantId, null, QuotaSet.class); + } + } +} + diff --git a/cinder-client/src/main/java/com/woorea/openstack/cinder/api/SnapshotsResource.java b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/SnapshotsResource.java new file mode 100644 index 000000000..6a1e34ff2 --- /dev/null +++ b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/SnapshotsResource.java @@ -0,0 +1,81 @@ +package com.woorea.openstack.cinder.api; + + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.cinder.model.Snapshot; +import com.woorea.openstack.cinder.model.Snapshots; + +public class SnapshotsResource { + + private final OpenStackClient CLIENT; + + public SnapshotsResource(OpenStackClient client) { + CLIENT = client; + } + + public Create create(String tenantId, Snapshot partialSnapshot) { + return new Create(tenantId,partialSnapshot); + } + + public List list(String tenantId, boolean detail) { + return new List(tenantId, detail); + } + + public Show show(String tenantId, String snapshotId) { + return new Show(tenantId, snapshotId); + } + + public Update update(String tenantId, Snapshot snapshot) { + return new Update(tenantId, snapshot); + } + + public class Create extends OpenStackRequest { + + public Create(String tenantId, Snapshot partialSnapshot) { + super(CLIENT, HttpMethod.POST,"/snapshots",Entity.json(partialSnapshot),Snapshot.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("volume_id", partialSnapshot.getVolumeId()); + //TODO API documentation describes this very ambiguously + //this.queryParam("snapshot", partialSnapshot); + } + } + + public class List extends OpenStackRequest { + + public List(String tenantId, boolean detail) { + super(CLIENT, HttpMethod.GET, detail ? "/snapshots/detail" : "/snapshots", null, Snapshots.class); + this.queryParam("tenant_id", tenantId); + } + } + + public class Show extends OpenStackRequest { + + public Show(String tenantId, String snapshotId) { + super(CLIENT, HttpMethod.GET, "/snapshots/"+snapshotId, null, Snapshot.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("snapshot_id", snapshotId); + } + } + + public class Update extends OpenStackRequest { + + public Update(String tenantId, Snapshot snapshot) { + super(CLIENT, HttpMethod.PUT, "/snapshots/"+snapshot.getId(), Entity.json(snapshot), Snapshot.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("snapshot_id", snapshot.getId()); + } + } + + public class Delete extends OpenStackRequest { + + public Delete(String tenantId, String snapshotId) { + super(CLIENT, HttpMethod.DELETE, "/snapshots/"+snapshotId, null, Void.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("snapshot_id", snapshotId); + } + } + +} \ No newline at end of file diff --git a/cinder-client/src/main/java/com/woorea/openstack/cinder/api/TypesResource.java b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/TypesResource.java new file mode 100644 index 000000000..f9d711c4a --- /dev/null +++ b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/TypesResource.java @@ -0,0 +1,43 @@ +package com.woorea.openstack.cinder.api; + + +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.cinder.model.Type; +import com.woorea.openstack.cinder.model.Types; + +public class TypesResource { + + private final OpenStackClient CLIENT; + + public TypesResource(OpenStackClient client) { + CLIENT = client; + } + + public List list(String tenantId) { + return new List(tenantId); + } + + public Show show(String tenantId, String volumeTypeId) { + return new Show(tenantId, volumeTypeId); + } + + public class List extends OpenStackRequest { + + public List(String tenantId) { + super(CLIENT, HttpMethod.GET, "/types", null, Types.class); + this.queryParam("tenant_id", tenantId); + } + } + + public class Show extends OpenStackRequest { + + public Show(String tenantId, String volumeTypeId) { + super(CLIENT, HttpMethod.GET, "/types/"+volumeTypeId, null, Type.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("volume_type_id", volumeTypeId); + } + } +} + diff --git a/cinder-client/src/main/java/com/woorea/openstack/cinder/api/VolumesResource.java b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/VolumesResource.java new file mode 100644 index 000000000..20ba956f2 --- /dev/null +++ b/cinder-client/src/main/java/com/woorea/openstack/cinder/api/VolumesResource.java @@ -0,0 +1,83 @@ +package com.woorea.openstack.cinder.api; + + +import com.woorea.openstack.base.client.Entity; +import com.woorea.openstack.base.client.HttpMethod; +import com.woorea.openstack.base.client.OpenStackClient; +import com.woorea.openstack.base.client.OpenStackRequest; +import com.woorea.openstack.cinder.model.Volume; +import com.woorea.openstack.cinder.model.Volumes; + +public class VolumesResource { + + private final OpenStackClient CLIENT; + + public VolumesResource(OpenStackClient client) { + CLIENT = client; + } + + public Create create(String tenantId, Volume volume) { + return new Create(tenantId,volume); + } + + public Show show(String tenantId, String volumeId) { + return new Show(tenantId,volumeId); + } + + public List list(String tenantId, boolean detail) { + return new List(tenantId,detail); + } + + public Update update(String tenantId, Volume volume) { + return new Update(tenantId, volume); + } + + public Delete delete(String tenantId, String volumeId) { + return new Delete(tenantId, volumeId); + } + + public class Create extends OpenStackRequest { + + public Create(String tenantId,Volume volume) { + super(CLIENT, HttpMethod.POST, "/volumes",Entity.json(volume), Volume.class); + this.queryParam("tenant_id", tenantId); + } + } + + public class Show extends OpenStackRequest { + + public Show(String tenantId,String volumeId) { + super(CLIENT, HttpMethod.GET, "/volumes"+volumeId,null, Volume.class); + this.queryParam("tenant_id", tenantId); + } + } + + public class List extends OpenStackRequest { + + public List(String tenantId, boolean detail) { + super(CLIENT, HttpMethod.GET, detail ? "/volumes/detail" : "/volumes", null, Volumes.class); + this.queryParam("tenant_id", tenantId); + } + } + + public class Update extends OpenStackRequest { + + public Update(String tenantId, Volume volume) { + super(CLIENT, HttpMethod.PUT, "/volumes"+volume.getId(), Entity.json(volume), Volume.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("volume_id", volume.getId()); + } + } + + public class Delete extends OpenStackRequest { + + public Delete(String tenantId, String volumeId) { + super(CLIENT, HttpMethod.DELETE, "/volumes"+volumeId,null,Void.class); + this.queryParam("tenant_id", tenantId); + this.queryParam("volume_id", volumeId); + } + + } + +} + diff --git a/cinder-model/pom.xml b/cinder-model/pom.xml new file mode 100644 index 000000000..38bb61738 --- /dev/null +++ b/cinder-model/pom.xml @@ -0,0 +1,11 @@ + + 4.0.0 + + com.woorea + openstack-java-sdk + 3.1.0-SNAPSHOT + + cinder-model + OpenStack Cinder Model + OpenStack Cinder Model + diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/AnonymousSnapshot.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/AnonymousSnapshot.java new file mode 100644 index 000000000..15267eb6e --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/AnonymousSnapshot.java @@ -0,0 +1,96 @@ +package com.woorea.openstack.cinder.model; + +import java.util.Calendar; +import org.codehaus.jackson.annotate.JsonProperty; + +public abstract class AnonymousSnapshot { + + // Attributes with setters needed for creating a request + private String name; + private String description; + @JsonProperty("volume_id") + private String volumeId; + private boolean force; + // Rest of the attributes in response + private String status; + @JsonProperty("created_at") + private Calendar createdAt; + private Metadata metadata; + private int size; + private String id; + @JsonProperty("os-extended-snapshot-attributes:progress") + private String extAttrProgress; + @JsonProperty("os-extended-snapshot-attributes:project_id") + private String extAttrProjectId; + + public AnonymousSnapshot() { } + + public AnonymousSnapshot(String name, String description, + String volumeId, boolean force) { + this.name = name; + this.description = description; + this.volumeId = volumeId; + this.force = force; + } + + public void setName(String name) { + this.name = name; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setVolumeId(String volumeId) { + this.volumeId = volumeId; + } + + public void setForce(boolean force) { + this.force = force; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public String getVolumeId() { + return volumeId; + } + + public boolean isForce() { + return force; + } + + public String getStatus() { + return status; + } + + public Calendar getCreatedAt() { + return createdAt; + } + + public Metadata getMetadata() { + return metadata; + } + + public int getSize() { + return size; + } + + public String getId() { + return id; + } + + public String getExtAttrProgress() { + return extAttrProgress; + } + + public String getExtAttrProjectId() { + return extAttrProjectId; + } + +} \ No newline at end of file diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Metadata.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Metadata.java new file mode 100644 index 000000000..ef1bd3a95 --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Metadata.java @@ -0,0 +1,18 @@ +package com.woorea.openstack.cinder.model; + +/** + * + * @author Jussi Hynninen + */ +public class Metadata { + + private String contents; + + public String getContents() { + return contents; + } + + public void setContents(String contents) { + this.contents = contents; + } +} diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java new file mode 100644 index 000000000..85e72f5af --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java @@ -0,0 +1,28 @@ +package com.woorea.openstack.cinder.model; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonRootName; + +/** + * + * @author Jussi Hynninen + */ +@JsonRootName("quota_set") +public class QuotaSet { + @JsonProperty("id") + private String projectId; + private int gigabytes; + private int volumes; + + public String getProjectId() { + return projectId; + } + + public int getGigabytes() { + return gigabytes; + } + + public int getVolumes() { + return volumes; + } +} diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshot.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshot.java new file mode 100644 index 000000000..c2230c433 --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshot.java @@ -0,0 +1,20 @@ +package com.woorea.openstack.cinder.model; + +import org.codehaus.jackson.map.annotate.JsonRootName; + +/** + * + * @author Jussi Hynninen + */ +@JsonRootName("snapshot") +public class Snapshot extends AnonymousSnapshot { + + public Snapshot() { + super(); + } + + public Snapshot(String name, String description, + String volumeId, boolean force) { + super(name, description, volumeId, force); + } +} diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshots.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshots.java new file mode 100644 index 000000000..c9582b02a --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Snapshots.java @@ -0,0 +1,20 @@ +package com.woorea.openstack.cinder.model; + +import java.util.Iterator; +import java.util.List; +import org.codehaus.jackson.annotate.JsonProperty; + +public class Snapshots implements Iterable { + @JsonProperty("snapshots") + private List snapshots; + + public List getSnapshots() { + return snapshots; + } + + @Override + public Iterator iterator() { + return snapshots.iterator(); + } + +} \ No newline at end of file diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Specs.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Specs.java new file mode 100644 index 000000000..b7b1e3241 --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Specs.java @@ -0,0 +1,22 @@ +package com.woorea.openstack.cinder.model; + +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * + * @author Jussi Hynninen + */ +public class Specs { + + @JsonProperty("capabilities") + private String capabilities; + + public String getCapabilities() { + return capabilities; + } + + public void setCapabilities(String capabilities) { + this.capabilities = capabilities; + } + +} diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Type.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Type.java new file mode 100644 index 000000000..439e979e5 --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Type.java @@ -0,0 +1,38 @@ +package com.woorea.openstack.cinder.model; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonRootName; + +@JsonRootName("volume_type") +public class Type { + + private String id; + private String name; + @JsonProperty("extra_specs") + private Specs extraSpecs; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Specs getExtraSpecs() { + return extraSpecs; + } + + public void setExtraSpecs(Specs extraSpecs) { + this.extraSpecs = extraSpecs; + } + +} \ No newline at end of file diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Types.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Types.java new file mode 100644 index 000000000..97bb65e89 --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Types.java @@ -0,0 +1,50 @@ +package com.woorea.openstack.cinder.model; + +import java.util.List; +import org.codehaus.jackson.annotate.JsonProperty; + +public class Types { + + @JsonProperty("volume_types") + private List volumeTypes; + + public List getVolumeTypes() { + return volumeTypes; + } + + public void setVolumeTypes(List volumeTypes) { + this.volumeTypes = volumeTypes; + } + + public class Type { + + @JsonProperty("extra_specs") + private Specs extraSpecs; + private String id; + private String name; + + public Specs getExtraSpecs() { + return extraSpecs; + } + + public void setExtraSpecs(Specs extraSpecs) { + this.extraSpecs = extraSpecs; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} \ No newline at end of file diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java new file mode 100644 index 000000000..3df91cf80 --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java @@ -0,0 +1,95 @@ +package com.woorea.openstack.cinder.model; + +import java.io.Serializable; +import java.util.HashMap; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonRootName; + +@JsonRootName("volume") +public class Volume implements Serializable { + + // Attributes with setters needed for creating a request + private String name; + private String description; + private int size; + @JsonProperty("volume_type") + private String volumeType; + @JsonProperty("availability_zone") + private String availabilityZone; + private Metadata metadata; + // Rest of the attributes in response + private String id; + private HashMap links; + + + public Volume() { } + public Volume(String name, String description, + int size, String volumeName, + String availabilityZone, String metadata) { + this.name = name; + this.description = description; + this.size = size; + this.volumeType = volumeName; + this.availabilityZone = availabilityZone; + this.metadata = new Metadata(); + this.metadata.setContents(metadata); + } + + public void setName(String name) { + this.name = name; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setSize(int size) { + this.size = size; + } + + public void setVolumeType(String volumeType) { + this.volumeType = volumeType; + } + + public void setAvailabilityZone(String availabilityZone) { + this.availabilityZone = availabilityZone; + } + + public void setMetadata(Metadata metadata) { + this.metadata = metadata; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public int getSize() { + return size; + } + + public String getVolumeType() { + return volumeType; + } + + public String getAvailabilityZone() { + return availabilityZone; + } + + public Metadata getMetadata() { + return metadata; + } + + public String getId() { + return id; + } + + public HashMap getLinks() { + return links; + } + +} diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volumes.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volumes.java new file mode 100644 index 000000000..db2ae623d --- /dev/null +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volumes.java @@ -0,0 +1,27 @@ +package com.woorea.openstack.cinder.model; + +import java.io.Serializable; +import java.util.Iterator; +import java.util.List; + +import org.codehaus.jackson.annotate.JsonProperty; + +public class Volumes implements Iterable, Serializable { + + @JsonProperty("volumes") + private List volumes; + + public List getVolumes() { + return volumes; + } + + public void setVolumes(List volumes) { + this.volumes = volumes; + } + + @Override + public Iterator iterator() { + return this.volumes.iterator(); + } + +} diff --git a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/QuotaSetsExtension.java b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/QuotaSetsExtension.java index 8b95addcd..299deef02 100644 --- a/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/QuotaSetsExtension.java +++ b/nova-client/src/main/java/com/woorea/openstack/nova/api/extensions/QuotaSetsExtension.java @@ -31,7 +31,6 @@ public Defaults defaults(String tenantId) { public class Show extends OpenStackRequest { public Show(String tenantId) { - //super(CLIENT, HttpMethod.GET, "/v2/"+tenantId+"/os-quota-sets/"+tenantId, null, QuotaSet.class); super(CLIENT, HttpMethod.GET, "/os-quota-sets/"+tenantId, null, QuotaSet.class); } diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java index 6abdf10f7..ab3e8f1b1 100644 --- a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java @@ -78,7 +78,10 @@ public void setInjectedFiles(Integer injectedFiles) { } public Integer getGigabytes() { - return gigabytes; + if(gigabytes != null) { + return gigabytes; + } + return 0; } public void setGigabytes(Integer gigabytes) { diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java index 33f0b5e78..c9eafcbec 100644 --- a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/v3/connector/JaxRs20Connector.java @@ -27,16 +27,7 @@ public class JaxRs20Connector implements OpenStackClientConnector { @Override public OpenStackResponse request(OpenStackRequest request) { - Iterator>> iter = request.queryParams().entrySet().iterator(); - UriBuilder ub = UriBuilder.fromUri(request.endpoint()); - ub.path(request.path()); - while(iter.hasNext()) { - Map.Entry> param = iter.next(); - for(Object obj : param.getValue()) { - ub.queryParam(param.getKey(), obj); - } - } - WebTarget target = client.target(ub); + WebTarget target = client.target(request.endpoint()).path(request.path()); for(Map.Entry > entry : request.queryParams().entrySet()) { for (Object o : entry.getValue()) { diff --git a/pom.xml b/pom.xml index 2efef9131..4caec4bf1 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,8 @@ ceilometer-model ceilometer-client openstack-client-connectors + cinder-client + cinder-model From 1e7eb2f13fbcee3a12e69942aa355c27e909caed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 26 Jun 2013 16:56:54 +0300 Subject: [PATCH 10/12] fixed invalid version numbers --- openstack-console/pom.xml | 8 ++++---- openstack-examples/pom.xml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openstack-console/pom.xml b/openstack-console/pom.xml index c6b9ea5bb..24ec4218e 100644 --- a/openstack-console/pom.xml +++ b/openstack-console/pom.xml @@ -37,7 +37,7 @@ com.woorea jersey-connector - 3.0.0-SNAPSHOT + 3.1.0-SNAPSHOT @@ -47,7 +47,7 @@ com.woorea jersey2-connector - 3.0.0-SNAPSHOT + 3.1.0-SNAPSHOT @@ -57,7 +57,7 @@ com.woorea resteasy-connector - 3.0.0-SNAPSHOT + 3.1.0-SNAPSHOT @@ -74,4 +74,4 @@ - \ No newline at end of file + diff --git a/openstack-examples/pom.xml b/openstack-examples/pom.xml index b29c4b376..733d252ac 100644 --- a/openstack-examples/pom.xml +++ b/openstack-examples/pom.xml @@ -47,7 +47,7 @@ com.woorea jersey-connector - 3.0.0-SNAPSHOT + 3.1.0-SNAPSHOT @@ -60,7 +60,7 @@ com.woorea jersey2-connector - 3.0.0-SNAPSHOT + 3.1.0-SNAPSHOT @@ -70,9 +70,9 @@ com.woorea resteasy-connector - 3.0.0-SNAPSHOT + 3.1.0-SNAPSHOT - \ No newline at end of file + From a82fc5272a317de2823edae1bfdb68163c591353 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Wed, 3 Jul 2013 10:38:40 +0300 Subject: [PATCH 11/12] Minor tweaks to quotasets, Volume now works. --- .../openstack/cinder/model/QuotaSet.java | 5 ++ .../woorea/openstack/cinder/model/Volume.java | 77 ++++++++++++++++++- .../woorea/openstack/nova/model/QuotaSet.java | 5 +- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java index 85e72f5af..dd474e72f 100644 --- a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java @@ -13,6 +13,7 @@ public class QuotaSet { private String projectId; private int gigabytes; private int volumes; + private int snapshots; public String getProjectId() { return projectId; @@ -25,4 +26,8 @@ public int getGigabytes() { public int getVolumes() { return volumes; } + + public int getSnapshots() { + return snapshots; + } } diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java index 3df91cf80..6187a9000 100644 --- a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java @@ -1,14 +1,16 @@ package com.woorea.openstack.cinder.model; import java.io.Serializable; +import java.util.Calendar; import java.util.HashMap; +import java.util.List; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonRootName; @JsonRootName("volume") public class Volume implements Serializable { - + // Attributes with setters needed for creating a request private String name; private String description; @@ -21,7 +23,18 @@ public class Volume implements Serializable { // Rest of the attributes in response private String id; private HashMap links; - + private String status; + private List attachments; + @JsonProperty("display_name") + private String displayName; + private boolean bootable; + private Calendar created_at; + @JsonProperty("display_description") + private String displayDescription; + @JsonProperty("snapshot_id") + private String snapshotId; + @JsonProperty("source_volid") + private String sourceVolId; public Volume() { } public Volume(String name, String description, @@ -91,5 +104,65 @@ public String getId() { public HashMap getLinks() { return links; } + + public String getStatus() { + return status; + } + + public String getDisplayName() { + return displayName; + } + + public boolean isBootable() { + return bootable; + } + + public Calendar getCreated_at() { + return created_at; + } + + public String getDisplayDescription() { + return displayDescription; + } + + public String getSnapshotId() { + return snapshotId; + } + + public String getSourceVolId() { + return sourceVolId; + } + + public List getAttachments() { + return attachments; + } + + public static class Attachment { + private String device; + @JsonProperty("server_id") + private String serverId; + private String id; + @JsonProperty("volume_id") + private String volumeId; + public Attachment() { + } + + public String getDevice() { + return device; + } + + public String getServerId() { + return serverId; + } + + public String getId() { + return id; + } + + public String getVolumeId() { + return volumeId; + } + + } } diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java index ab3e8f1b1..6abdf10f7 100644 --- a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java @@ -78,10 +78,7 @@ public void setInjectedFiles(Integer injectedFiles) { } public Integer getGigabytes() { - if(gigabytes != null) { - return gigabytes; - } - return 0; + return gigabytes; } public void setGigabytes(Integer gigabytes) { From 7396c2c915d22a724bd978bb86dd5fa61a013358 Mon Sep 17 00:00:00 2001 From: Jussi Hynninen Date: Wed, 3 Jul 2013 10:38:40 +0300 Subject: [PATCH 12/12] Timestamp now a date --- .../openstack/ceilometer/v2/model/Sample.java | 5 +- .../openstack/cinder/model/QuotaSet.java | 5 ++ .../woorea/openstack/cinder/model/Volume.java | 77 ++++++++++++++++++- .../woorea/openstack/nova/model/QuotaSet.java | 5 +- 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java index 73a1ead35..59511d1be 100644 --- a/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java +++ b/ceilometer-model/src/main/java/com/woorea/openstack/ceilometer/v2/model/Sample.java @@ -1,5 +1,6 @@ package com.woorea.openstack.ceilometer.v2.model; +import java.util.Date; import org.codehaus.jackson.annotate.JsonProperty; import java.util.Map; @@ -31,7 +32,7 @@ public class Sample { private String resource; @JsonProperty("timestamp") - private String timestamp; + private Date timestamp; @JsonProperty("message_id") private String message; @@ -71,7 +72,7 @@ public String getResource() { return resource; } - public String getTimestamp() { + public Date getTimestamp() { return timestamp; } diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java index 85e72f5af..dd474e72f 100644 --- a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/QuotaSet.java @@ -13,6 +13,7 @@ public class QuotaSet { private String projectId; private int gigabytes; private int volumes; + private int snapshots; public String getProjectId() { return projectId; @@ -25,4 +26,8 @@ public int getGigabytes() { public int getVolumes() { return volumes; } + + public int getSnapshots() { + return snapshots; + } } diff --git a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java index 3df91cf80..6187a9000 100644 --- a/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java +++ b/cinder-model/src/main/java/com/woorea/openstack/cinder/model/Volume.java @@ -1,14 +1,16 @@ package com.woorea.openstack.cinder.model; import java.io.Serializable; +import java.util.Calendar; import java.util.HashMap; +import java.util.List; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonRootName; @JsonRootName("volume") public class Volume implements Serializable { - + // Attributes with setters needed for creating a request private String name; private String description; @@ -21,7 +23,18 @@ public class Volume implements Serializable { // Rest of the attributes in response private String id; private HashMap links; - + private String status; + private List attachments; + @JsonProperty("display_name") + private String displayName; + private boolean bootable; + private Calendar created_at; + @JsonProperty("display_description") + private String displayDescription; + @JsonProperty("snapshot_id") + private String snapshotId; + @JsonProperty("source_volid") + private String sourceVolId; public Volume() { } public Volume(String name, String description, @@ -91,5 +104,65 @@ public String getId() { public HashMap getLinks() { return links; } + + public String getStatus() { + return status; + } + + public String getDisplayName() { + return displayName; + } + + public boolean isBootable() { + return bootable; + } + + public Calendar getCreated_at() { + return created_at; + } + + public String getDisplayDescription() { + return displayDescription; + } + + public String getSnapshotId() { + return snapshotId; + } + + public String getSourceVolId() { + return sourceVolId; + } + + public List getAttachments() { + return attachments; + } + + public static class Attachment { + private String device; + @JsonProperty("server_id") + private String serverId; + private String id; + @JsonProperty("volume_id") + private String volumeId; + public Attachment() { + } + + public String getDevice() { + return device; + } + + public String getServerId() { + return serverId; + } + + public String getId() { + return id; + } + + public String getVolumeId() { + return volumeId; + } + + } } diff --git a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java index ab3e8f1b1..6abdf10f7 100644 --- a/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java +++ b/nova-model/src/main/java/com/woorea/openstack/nova/model/QuotaSet.java @@ -78,10 +78,7 @@ public void setInjectedFiles(Integer injectedFiles) { } public Integer getGigabytes() { - if(gigabytes != null) { - return gigabytes; - } - return 0; + return gigabytes; } public void setGigabytes(Integer gigabytes) {