| /******************************************************************************* |
| * Copyright 2017 General Electric Company |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| *******************************************************************************/ |
| |
| package com.ge.predix.acs.zone.management; |
| |
| import static com.ge.predix.acs.commons.web.AcsApiUriTemplates.V1; |
| import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.created; |
| import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.noContent; |
| import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.notFound; |
| import static com.ge.predix.acs.commons.web.ResponseEntityBuilder.ok; |
| import static org.springframework.web.bind.annotation.RequestMethod.DELETE; |
| import static org.springframework.web.bind.annotation.RequestMethod.GET; |
| import static org.springframework.web.bind.annotation.RequestMethod.PUT; |
| |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.http.HttpStatus; |
| import org.springframework.http.MediaType; |
| import org.springframework.http.ResponseEntity; |
| import org.springframework.web.bind.annotation.PathVariable; |
| import org.springframework.web.bind.annotation.RequestBody; |
| import org.springframework.web.bind.annotation.RequestMapping; |
| import org.springframework.web.bind.annotation.RestController; |
| |
| import com.ge.predix.acs.commons.web.ACSWebConstants; |
| import com.ge.predix.acs.commons.web.AcsApiUriTemplates; |
| import com.ge.predix.acs.commons.web.BaseRestApi; |
| import com.ge.predix.acs.commons.web.RestApiException; |
| import com.ge.predix.acs.rest.Zone; |
| |
| import io.swagger.annotations.Api; |
| import io.swagger.annotations.ApiOperation; |
| |
| /** |
| * |
| * @author acs-engineers@ge.com |
| */ |
| @RestController |
| @Api(value = ACSWebConstants.APP_ROOT_PATH, hidden = true) |
| public class ZoneController extends BaseRestApi { |
| |
| @Autowired |
| private ZoneService service; |
| |
| @RequestMapping(method = PUT, value = V1 + AcsApiUriTemplates.ZONE_URL, consumes = MediaType.APPLICATION_JSON_VALUE) |
| @ApiOperation(value = "Creates/Updates the zone.", hidden = true) |
| public ResponseEntity<Zone> putZone(@RequestBody final Zone zone, @PathVariable("zoneName") final String zoneName) { |
| |
| validateAndSanitizeInputOrFail(zone, zoneName); |
| try { |
| |
| boolean zoneCreated = this.service.upsertZone(zone); |
| |
| if (zoneCreated) { |
| return created(false, V1 + AcsApiUriTemplates.ZONE_URL, "zoneName:" + zoneName); |
| } |
| |
| return created(); |
| |
| } catch (ZoneManagementException e) { |
| throw new RestApiException(HttpStatus.UNPROCESSABLE_ENTITY, e); |
| } catch (Exception e) { |
| String message = String.format( |
| "Unexpected Exception while upserting Zone with name %s and subdomain %s", zone.getName(), |
| zone.getSubdomain()); |
| throw new RestApiException(HttpStatus.INTERNAL_SERVER_ERROR, message, e); |
| } |
| } |
| |
| @RequestMapping(method = GET, value = V1 + AcsApiUriTemplates.ZONE_URL, produces = MediaType.APPLICATION_JSON_VALUE) |
| @ApiOperation( |
| value = "An ACS zone defines a data partition which encapsulates policy, resource and privelege data" |
| + "for separation between ACS tenants. Retrieves the zone by a zone name.", |
| hidden = true) |
| public ResponseEntity<Zone> getZone(@PathVariable("zoneName") final String zoneName) { |
| |
| try { |
| |
| Zone zone = this.service.retrieveZone(zoneName); |
| return ok(zone); |
| |
| } catch (ZoneManagementException e) { |
| throw new RestApiException(HttpStatus.NOT_FOUND, e); |
| } catch (Exception e) { |
| String message = String.format("Unexpected Exception while retriving Zone with name %s", zoneName); |
| throw new RestApiException(HttpStatus.INTERNAL_SERVER_ERROR, message, e); |
| } |
| } |
| |
| @RequestMapping(method = DELETE, value = V1 + AcsApiUriTemplates.ZONE_URL) |
| @ApiOperation(value = "Deletes the zone.", hidden = true) |
| public ResponseEntity<Void> deleteZone(@PathVariable("zoneName") final String zoneName) { |
| |
| try { |
| |
| Boolean deleted = this.service.deleteZone(zoneName); |
| if (deleted) { |
| return noContent(); |
| } |
| return notFound(); |
| |
| } catch (Exception e) { |
| String message = String.format("Unexpected Exception while deleting Zone with name %s", zoneName); |
| throw new RestApiException(HttpStatus.INTERNAL_SERVER_ERROR, message, e); |
| } |
| } |
| |
| /** |
| * @param zone |
| */ |
| private void validateAndSanitizeInputOrFail(final Zone zone, final String zoneName) { |
| if (zone.getName() != null && !zoneName.equals(zone.getName())) { |
| throw new RestApiException(HttpStatus.UNPROCESSABLE_ENTITY, |
| "Zone name in URI does not match the Zone Name in Payload"); |
| } |
| if (zone.getName() == null) { |
| zone.setName(zoneName); |
| } |
| } |
| |
| } |