/* * Copyright (c) 2014, 2015 Hewlett-Packard Development Company, L.P. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.aaa.idm.rest; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.opendaylight.aaa.api.IDMStoreException; import org.opendaylight.aaa.api.model.IDMError; import org.opendaylight.aaa.api.model.Role; import org.opendaylight.aaa.api.model.Roles; import org.opendaylight.aaa.idm.IdmLightApplication; import org.opendaylight.aaa.idm.IdmLightProxy; import org.opendaylight.yang.gen.v1.config.aaa.authn.idmlight.rev151204.AAAIDMLightModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * REST application used to manipulate the H2 database roles table. The REST * endpoint is /auth/v1/roles. * * The following provides examples of curl commands and payloads to utilize the * roles REST endpoint: * * Get All Roles * curl -u admin:admin http://{HOST}:{PORT}/auth/v1/roles * * Get A Specific Role * curl -u admin:admin http://{HOST}:{PORT}/auth/v1/roles/{id} * * Create A Role * curl -u admin:admin -X POST -H "Content-Type: application/json" --data-binary {@literal @}role.json http://{HOST}:{PORT}/auth/v1/roles * An example of role.json: * { * "name":"IT Administrator", * "description":"A user role for IT admins" * } * * Update A Role * curl -u admin:admin -X PUT -H "Content-Type: application/json" --data-binary {@literal @}role.json http://{HOST}:{PORT}/auth/v1/roles/{id} * An example of role.json: * { * "name":"IT Administrator Limited", * "description":"A user role for IT admins who can only do one thing" * } * * @author peter.mellquist@hp.com * @author Ryan Goulding (ryandgoulding@gmail.com) */ @Path("/v1/roles") public class RoleHandler { private static final Logger LOG = LoggerFactory.getLogger(RoleHandler.class); /** * Extracts all roles. * * @return A response with all roles in the H2 database, or internal error if one is encountered */ @GET @Produces("application/json") public Response getRoles() { LOG.info("get /roles"); Roles roles = null; try { roles = AAAIDMLightModule.getStore().getRoles(); } catch (IDMStoreException se) { return new IDMError(500, "internal error getting roles", se.getMessage()).response(); } return Response.ok(roles).build(); } /** * Extract a specific role identified by id * * @param id the String id for the role * @return A response with the role identified by id, or internal error if one is encountered */ @GET @Path("/{id}") @Produces("application/json") public Response getRole(@PathParam("id") String id) { LOG.info("get /roles/{}", id); Role role = null; try { role = AAAIDMLightModule.getStore().readRole(id); } catch (IDMStoreException se) { return new IDMError(500, "internal error getting roles", se.getMessage()).response(); } if (role == null) { return new IDMError(404, "role not found id :" + id, "").response(); } return Response.ok(role).build(); } /** * Creates a role. * * @param info passed from Jersey * @param role the role JSON payload * @return A response stating success or failure of role creation, or internal error if one is encountered */ @POST @Consumes("application/json") @Produces("application/json") public Response createRole(@Context UriInfo info, Role role) { LOG.info("Post /roles"); try { // TODO: role names should be unique! // name if (role.getName() == null) { return new IDMError(404, "name must be defined on role create", "").response(); } else if (role.getName().length() > IdmLightApplication.MAX_FIELD_LEN) { return new IDMError(400, "role name max length is :" + IdmLightApplication.MAX_FIELD_LEN, "").response(); } // domain if (role.getDomainid() == null) { return new IDMError(404, "The role's domain must be defined on role when creating a role.", "") .response(); } else if (role.getDomainid().length() > IdmLightApplication.MAX_FIELD_LEN) { return new IDMError(400, "role domain max length is :" + IdmLightApplication.MAX_FIELD_LEN, "").response(); } // description if (role.getDescription() == null) { role.setDescription(""); } else if (role.getDescription().length() > IdmLightApplication.MAX_FIELD_LEN) { return new IDMError(400, "role description max length is :" + IdmLightApplication.MAX_FIELD_LEN, "").response(); } role = AAAIDMLightModule.getStore().writeRole(role); } catch (IDMStoreException se) { return new IDMError(500, "internal error creating role", se.getMessage()).response(); } return Response.status(201).entity(role).build(); } /** * Updates a specific role identified by id. * * @param info passed from Jersey * @param role the role JSON payload * @param id the String id for the role * @return A response stating success or failure of role update, or internal error if one occurs */ @PUT @Path("/{id}") @Consumes("application/json") @Produces("application/json") public Response putRole(@Context UriInfo info, Role role, @PathParam("id") String id) { LOG.info("put /roles/{}", id); try { role.setRoleid(id); // name // TODO: names should be unique if ((role.getName() != null) && (role.getName().length() > IdmLightApplication.MAX_FIELD_LEN)) { return new IDMError(400, "role name max length is :" + IdmLightApplication.MAX_FIELD_LEN, "").response(); } // description if ((role.getDescription() != null) && (role.getDescription().length() > IdmLightApplication.MAX_FIELD_LEN)) { return new IDMError(400, "role description max length is :" + IdmLightApplication.MAX_FIELD_LEN, "").response(); } role = AAAIDMLightModule.getStore().updateRole(role); if (role == null) { return new IDMError(404, "role id not found :" + id, "").response(); } IdmLightProxy.clearClaimCache(); return Response.status(200).entity(role).build(); } catch (IDMStoreException se) { return new IDMError(500, "internal error putting role", se.getMessage()).response(); } } /** * Delete a role. * * @param info passed from Jersey * @param id the String id for the role * @return A response stating success or failure of user deletion, or internal error if one occurs */ @DELETE @Path("/{id}") public Response deleteRole(@Context UriInfo info, @PathParam("id") String id) { LOG.info("Delete /roles/{}", id); try { Role role = AAAIDMLightModule.getStore().deleteRole(id); if (role == null) { return new IDMError(404, "role id not found :" + id, "").response(); } } catch (IDMStoreException se) { return new IDMError(500, "internal error deleting role", se.getMessage()).response(); } IdmLightProxy.clearClaimCache(); return Response.status(204).build(); } }