From 86683c58addadfeabe12d10c2fa26cfead22c2fe Mon Sep 17 00:00:00 2001 From: Wojciech Sliwka Date: Tue, 9 Apr 2019 14:57:02 +0200 Subject: Support for swagger API definitions available under /vid/v2/api-docs Change-Id: Ie7e63bfbdb8d41c43bc04ca13351dba533776a8a Issue-ID: VID-377 Signed-off-by: Wojciech Sliwka --- .../onap/vid/controller/HealthCheckController.java | 135 ------------------ .../onap/vid/controller/MaintenanceController.java | 151 --------------------- .../vid/controller/RoleGeneratorController.java | 48 ------- .../org/onap/vid/controller/VersionController.java | 83 ----------- .../java/org/onap/vid/controller/WebConfig.java | 15 ++ .../vid/controller/open/HealthCheckController.java | 136 +++++++++++++++++++ .../vid/controller/open/MaintenanceController.java | 151 +++++++++++++++++++++ .../controller/open/RoleGeneratorController.java | 48 +++++++ .../vid/controller/open/VersionController.java | 83 +++++++++++ 9 files changed, 433 insertions(+), 417 deletions(-) delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java delete mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java (limited to 'vid-app-common/src/main') diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java b/vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java deleted file mode 100644 index 04d5babcc..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/HealthCheckController.java +++ /dev/null @@ -1,135 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.vid.controller; - -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.onap.portalsdk.core.util.SystemProperties; -import org.onap.vid.dao.FnAppDoaImpl; -import org.onap.vid.model.GitRepositoryState; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; - -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; -import static org.springframework.http.HttpStatus.OK; - -/** - * Controller for user profile view. The view is restricted to authenticated - * users. The view name resolves to page user_profile.jsp which uses Angular. - */ - -@RestController -@RequestMapping("/") -public class HealthCheckController extends UnRestrictedBaseController { - - private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(HealthCheckController.class); - private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); - private static final String GIT_PROPERTIES_FILENAME = "git.properties"; - private FnAppDoaImpl fnAppDoaImpl; - - @Autowired - public HealthCheckController(FnAppDoaImpl fnAppDoaImpl) { - this.fnAppDoaImpl = fnAppDoaImpl; - } - - /** - * Obtain the HealthCheck Status from the System.Properties file. - * Used by IDNS for redundancy - * - * @return ResponseEntity The response entity - */ - @RequestMapping(value = "/healthCheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public HealthStatus getHealthCheckStatusForIDNS() { - return createCorrespondingStatus(); - } - - /** - * Obtain the HealthCheck Status from the System.Properties file. - * - * @return ResponseEntity The response entity - */ - @RequestMapping(value = "rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public HealthStatus getHealthCheck( - @PathVariable("User-Agent") String UserAgent, - @PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent ", UserAgent); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID ", ECOMPRequestID); - return createCorrespondingStatus(); - } - - @RequestMapping(value = "/commitInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public GitRepositoryState getCommitInfo() throws IOException { - Properties properties = new Properties(); - properties.load(getClass().getClassLoader().getResourceAsStream(GIT_PROPERTIES_FILENAME)); - return new GitRepositoryState(properties); - } - - private HealthStatus createCorrespondingStatus() { - logData(); - try { - int count = fnAppDoaImpl.getProfileCount(getUrl(), getUsername(), getPassword()); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::", count); - return okStatus(); - } catch (Exception ex) { - String errorMsg = ex.getMessage(); - LOGGER.error(EELFLoggerDelegate.errorLogger, errorMsg); - return errorStatus(errorMsg); - } - } - - private void logData() { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::", getUrl()); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::", getUsername()); - } - - private HealthStatus okStatus() { - return new HealthStatus(OK, dateFormat.format(new Date()), "health check succeeded"); - } - - private HealthStatus errorStatus(String msg) { - return new HealthStatus(INTERNAL_SERVER_ERROR, dateFormat.format( - new Date()), "health check failed: " + msg); - } - - private String getUrl() { - return SystemProperties.getProperty("db.connectionURL"); - } - - private String getUsername() { - return SystemProperties.getProperty("db.userName"); - } - - private String getPassword() { - return SystemProperties.getProperty("db.password"); - } -} - diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java b/vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java deleted file mode 100644 index dfba4e31a..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/MaintenanceController.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.onap.vid.controller; - -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved. - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.onap.vid.category.AddCategoryOptionResponse; -import org.onap.vid.category.AddCategoryOptionsRequest; -import org.onap.vid.category.CategoryParameterOptionRep; -import org.onap.vid.category.CategoryParametersResponse; -import org.onap.vid.model.CategoryParameter.Family; -import org.onap.vid.model.CategoryParameterOption; -import org.onap.vid.services.CategoryParameterService; -import org.onap.vid.services.CategoryParameterServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.ws.rs.ForbiddenException; - -import static org.onap.vid.utils.Logging.getMethodCallerName; - -/** - * Controler for APIs that are used only by vid operators - */ - -@RestController -@RequestMapping("maintenance") -public class MaintenanceController extends UnRestrictedBaseController { - - private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class); - private CategoryParameterService categoryParameterService; - - @Autowired - public MaintenanceController(CategoryParameterService categoryParameterService) { - this.categoryParameterService = categoryParameterService; - } - - /** - * Add list of options to one category parameter - */ - @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.POST) - public ResponseEntity addCategoryOptions(@PathVariable String categoryName, - @RequestBody AddCategoryOptionsRequest option) { - debugStartLog(); - try { - AddCategoryOptionResponse response = categoryParameterService - .createCategoryParameterOptions(categoryName, option); - HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; - debugEndLog(response); - return createResponseWithBody(httpStatus, response); - } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { - return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); - } catch (RuntimeException exception) { - LOGGER.error("failed to add option to parameter category " + categoryName, exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.PUT) - public ResponseEntity updateNameForOption(@PathVariable String categoryName, - @RequestBody CategoryParameterOptionRep option) { - debugStartLog(); - try { - AddCategoryOptionResponse response = categoryParameterService - .updateCategoryParameterOption(categoryName, option); - HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; - debugEndLog(response); - return createResponseWithBody(httpStatus, response); - } catch (ForbiddenException exception) { - return createResponseWithBody(HttpStatus.FORBIDDEN, new AddCategoryOptionResponse(exception.getMessage())); - } catch (CategoryParameterServiceImpl.UnfoundedCategoryException | CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) { - return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); - - } catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) { - return createResponseWithBody(HttpStatus.CONFLICT, new AddCategoryOptionResponse(exception.getMessage())); - - } catch (RuntimeException exception) { - LOGGER.error("failed to update option to parameter category " + categoryName, exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - /** - * Gets the owning entity properties. - */ - @RequestMapping(value = "/category_parameter", method = RequestMethod.GET) - public ResponseEntity getCategoryParameter(@RequestParam(value = "familyName", required = true) Family familyName) { - debugStartLog(); - try { - CategoryParametersResponse response = categoryParameterService.getCategoryParameters(familyName); - debugEndLog(response); - return ResponseEntity.ok().body(response); - } catch (RuntimeException exception) { - LOGGER.error("failed to retrieve category parameter list from DB.", exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - /** - * Delete option of the category. - */ - @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.DELETE) - public ResponseEntity deleteCategoryOption(@PathVariable String categoryName, - @RequestBody CategoryParameterOption option) { - debugStartLog(); - - try { - categoryParameterService.deleteCategoryOption(categoryName, option); - debugEndLog(HttpStatus.OK); - return ResponseEntity.status(HttpStatus.OK).build(); - } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { - return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); - } catch (RuntimeException exception) { - LOGGER.error("failed to add/update owning entity option", exception); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - private ResponseEntity createResponseWithBody(HttpStatus status, AddCategoryOptionResponse response) { - return ResponseEntity.status(status).body(response); - } - - private void debugStartLog() { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "start {}({})", getMethodCallerName()); - } - - private void debugEndLog(Object response) { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "end {}() => {}", getMethodCallerName(), response); - } -} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java b/vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java deleted file mode 100644 index 107142d7f..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/RoleGeneratorController.java +++ /dev/null @@ -1,48 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright 2019 Nokia - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.vid.controller; - -import static org.springframework.http.HttpStatus.OK; - -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.vid.services.RoleGeneratorService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class RoleGeneratorController extends UnRestrictedBaseController { - public static final String GENERATE_ROLE_SCRIPT = "generateRoleScript"; - private RoleGeneratorService roleGeneratorService; - - @Autowired - public RoleGeneratorController(RoleGeneratorService roleGeneratorService) { - this.roleGeneratorService = roleGeneratorService; - } - @RequestMapping(value = GENERATE_ROLE_SCRIPT +"/{firstRun}", method = RequestMethod.GET ) - public ResponseEntity generateRoleScript (@PathVariable("firstRun") boolean firstRun) { - return ResponseEntity.status(OK).body(roleGeneratorService.generateRoleScript(firstRun)); - } -} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java b/vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java deleted file mode 100644 index aa15f0fa3..000000000 --- a/vid-app-common/src/main/java/org/onap/vid/controller/VersionController.java +++ /dev/null @@ -1,83 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * VID - * ================================================================================ - * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.vid.controller; - - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; -import org.apache.commons.lang3.StringUtils; -import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.util.SystemProperties; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import javax.inject.Inject; -import javax.servlet.ServletContext; -import java.io.IOException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.apache.commons.lang3.StringUtils.substringAfterLast; - -@RestController -@RequestMapping("version") -public class VersionController extends UnRestrictedBaseController { - - private final ServletContext servletContext; - - @Inject - public VersionController(ServletContext servletContext) { - this.servletContext = servletContext; - } - - @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public Map getVersionAndFeatures() - { - String features = SystemProperties.getProperty("features.set.filename"); - String version; - try { - final URL resource = servletContext.getResource("/app/vid/scripts/constants/version.json"); - HashMap versionFile = new HashMap <>(); - ObjectMapper mapper = new ObjectMapper(); - versionFile.putAll(mapper.readValue(resource, new TypeReference>() {})); - version = versionFile.get("Version"); - } catch (IOException e) { - version = "Error retrieving build number"; - } - String majorVersion = getDisplayVersion(features, version); - return ImmutableMap.of("Features", features, "Build", version, "DisplayVersion", majorVersion); - } - - String getDisplayVersion(String features, String build) { - Matcher matcher = Pattern.compile("([^/]+?)(\\.features|$)").matcher(features); - final String majorByFeatures = matcher.find() ? matcher.group(1) : features; - - final String buildByVersion = StringUtils.defaultIfBlank(substringAfterLast(build, "."), build); - - return StringUtils.join(majorByFeatures, ".", buildByVersion); - } -} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java b/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java index 543aa9432..e00c2d7a5 100644 --- a/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java +++ b/vid-app-common/src/main/java/org/onap/vid/controller/WebConfig.java @@ -42,11 +42,18 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.togglz.core.manager.FeatureManager; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + import javax.servlet.ServletContext; import java.io.File; import java.io.IOException; +@EnableSwagger2 @Configuration public class WebConfig { @@ -193,4 +200,12 @@ public class WebConfig { } + @Bean + public Docket api(){ + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("org.onap.vid.controller.open")) + .paths(PathSelectors.any()) + .build(); + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java new file mode 100644 index 000000000..92e1a1802 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/HealthCheckController.java @@ -0,0 +1,136 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.controller.open; + +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.portalsdk.core.util.SystemProperties; +import org.onap.vid.controller.HealthStatus; +import org.onap.vid.dao.FnAppDoaImpl; +import org.onap.vid.model.GitRepositoryState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.OK; + +/** + * Controller for user profile view. The view is restricted to authenticated + * users. The view name resolves to page user_profile.jsp which uses Angular. + */ + +@RestController +@RequestMapping("/") +public class HealthCheckController extends UnRestrictedBaseController { + + private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(HealthCheckController.class); + private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + private static final String GIT_PROPERTIES_FILENAME = "git.properties"; + private FnAppDoaImpl fnAppDoaImpl; + + @Autowired + public HealthCheckController(FnAppDoaImpl fnAppDoaImpl) { + this.fnAppDoaImpl = fnAppDoaImpl; + } + + /** + * Obtain the HealthCheck Status from the System.Properties file. + * Used by IDNS for redundancy + * + * @return ResponseEntity The response entity + */ + @RequestMapping(value = "/healthCheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public HealthStatus getHealthCheckStatusForIDNS() { + return createCorrespondingStatus(); + } + + /** + * Obtain the HealthCheck Status from the System.Properties file. + * + * @return ResponseEntity The response entity + */ + @RequestMapping(value = "rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public HealthStatus getHealthCheck( + @PathVariable("User-Agent") String UserAgent, + @PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent ", UserAgent); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID ", ECOMPRequestID); + return createCorrespondingStatus(); + } + + @RequestMapping(value = "/commitInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public GitRepositoryState getCommitInfo() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getClassLoader().getResourceAsStream(GIT_PROPERTIES_FILENAME)); + return new GitRepositoryState(properties); + } + + private HealthStatus createCorrespondingStatus() { + logData(); + try { + int count = fnAppDoaImpl.getProfileCount(getUrl(), getUsername(), getPassword()); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::", count); + return okStatus(); + } catch (Exception ex) { + String errorMsg = ex.getMessage(); + LOGGER.error(EELFLoggerDelegate.errorLogger, errorMsg); + return errorStatus(errorMsg); + } + } + + private void logData() { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::", getUrl()); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::", getUsername()); + } + + private HealthStatus okStatus() { + return new HealthStatus(OK, dateFormat.format(new Date()), "health check succeeded"); + } + + private HealthStatus errorStatus(String msg) { + return new HealthStatus(INTERNAL_SERVER_ERROR, dateFormat.format( + new Date()), "health check failed: " + msg); + } + + private String getUrl() { + return SystemProperties.getProperty("db.connectionURL"); + } + + private String getUsername() { + return SystemProperties.getProperty("db.userName"); + } + + private String getPassword() { + return SystemProperties.getProperty("db.password"); + } +} + diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java new file mode 100644 index 000000000..d1004401a --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/MaintenanceController.java @@ -0,0 +1,151 @@ +package org.onap.vid.controller.open; + +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.vid.category.AddCategoryOptionResponse; +import org.onap.vid.category.AddCategoryOptionsRequest; +import org.onap.vid.category.CategoryParameterOptionRep; +import org.onap.vid.category.CategoryParametersResponse; +import org.onap.vid.model.CategoryParameter.Family; +import org.onap.vid.model.CategoryParameterOption; +import org.onap.vid.services.CategoryParameterService; +import org.onap.vid.services.CategoryParameterServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.ws.rs.ForbiddenException; + +import static org.onap.vid.utils.Logging.getMethodCallerName; + +/** + * Controler for APIs that are used only by vid operators + */ + +@RestController +@RequestMapping("maintenance") +public class MaintenanceController extends UnRestrictedBaseController { + + private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class); + private CategoryParameterService categoryParameterService; + + @Autowired + public MaintenanceController(CategoryParameterService categoryParameterService) { + this.categoryParameterService = categoryParameterService; + } + + /** + * Add list of options to one category parameter + */ + @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.POST) + public ResponseEntity addCategoryOptions(@PathVariable String categoryName, + @RequestBody AddCategoryOptionsRequest option) { + debugStartLog(); + try { + AddCategoryOptionResponse response = categoryParameterService + .createCategoryParameterOptions(categoryName, option); + HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; + debugEndLog(response); + return createResponseWithBody(httpStatus, response); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + } catch (RuntimeException exception) { + LOGGER.error("failed to add option to parameter category " + categoryName, exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.PUT) + public ResponseEntity updateNameForOption(@PathVariable String categoryName, + @RequestBody CategoryParameterOptionRep option) { + debugStartLog(); + try { + AddCategoryOptionResponse response = categoryParameterService + .updateCategoryParameterOption(categoryName, option); + HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; + debugEndLog(response); + return createResponseWithBody(httpStatus, response); + } catch (ForbiddenException exception) { + return createResponseWithBody(HttpStatus.FORBIDDEN, new AddCategoryOptionResponse(exception.getMessage())); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException | CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + + } catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) { + return createResponseWithBody(HttpStatus.CONFLICT, new AddCategoryOptionResponse(exception.getMessage())); + + } catch (RuntimeException exception) { + LOGGER.error("failed to update option to parameter category " + categoryName, exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * Gets the owning entity properties. + */ + @RequestMapping(value = "/category_parameter", method = RequestMethod.GET) + public ResponseEntity getCategoryParameter(@RequestParam(value = "familyName", required = true) Family familyName) { + debugStartLog(); + try { + CategoryParametersResponse response = categoryParameterService.getCategoryParameters(familyName); + debugEndLog(response); + return ResponseEntity.ok().body(response); + } catch (RuntimeException exception) { + LOGGER.error("failed to retrieve category parameter list from DB.", exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + /** + * Delete option of the category. + */ + @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.DELETE) + public ResponseEntity deleteCategoryOption(@PathVariable String categoryName, + @RequestBody CategoryParameterOption option) { + debugStartLog(); + + try { + categoryParameterService.deleteCategoryOption(categoryName, option); + debugEndLog(HttpStatus.OK); + return ResponseEntity.status(HttpStatus.OK).build(); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + } catch (RuntimeException exception) { + LOGGER.error("failed to add/update owning entity option", exception); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + private ResponseEntity createResponseWithBody(HttpStatus status, AddCategoryOptionResponse response) { + return ResponseEntity.status(status).body(response); + } + + private void debugStartLog() { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "start {}({})", getMethodCallerName()); + } + + private void debugEndLog(Object response) { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "end {}() => {}", getMethodCallerName(), response); + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java new file mode 100644 index 000000000..7b57df2c7 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/RoleGeneratorController.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright 2019 Nokia + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.controller.open; + +import static org.springframework.http.HttpStatus.OK; + +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.vid.services.RoleGeneratorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class RoleGeneratorController extends UnRestrictedBaseController { + public static final String GENERATE_ROLE_SCRIPT = "generateRoleScript"; + private RoleGeneratorService roleGeneratorService; + + @Autowired + public RoleGeneratorController(RoleGeneratorService roleGeneratorService) { + this.roleGeneratorService = roleGeneratorService; + } + @RequestMapping(value = GENERATE_ROLE_SCRIPT +"/{firstRun}", method = RequestMethod.GET ) + public ResponseEntity generateRoleScript (@PathVariable("firstRun") boolean firstRun) { + return ResponseEntity.status(OK).body(roleGeneratorService.generateRoleScript(firstRun)); + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java b/vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java new file mode 100644 index 000000000..0a4d6f5ac --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.controller.open; + + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableMap; +import org.apache.commons.lang3.StringUtils; +import org.onap.portalsdk.core.controller.UnRestrictedBaseController; +import org.onap.portalsdk.core.util.SystemProperties; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.inject.Inject; +import javax.servlet.ServletContext; +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.apache.commons.lang3.StringUtils.substringAfterLast; + +@RestController +@RequestMapping("version") +public class VersionController extends UnRestrictedBaseController { + + private final ServletContext servletContext; + + @Inject + public VersionController(ServletContext servletContext) { + this.servletContext = servletContext; + } + + @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public Map getVersionAndFeatures() + { + String features = SystemProperties.getProperty("features.set.filename"); + String version; + try { + final URL resource = servletContext.getResource("/app/vid/scripts/constants/version.json"); + HashMap versionFile = new HashMap <>(); + ObjectMapper mapper = new ObjectMapper(); + versionFile.putAll(mapper.readValue(resource, new TypeReference>() {})); + version = versionFile.get("Version"); + } catch (IOException e) { + version = "Error retrieving build number"; + } + String majorVersion = getDisplayVersion(features, version); + return ImmutableMap.of("Features", features, "Build", version, "DisplayVersion", majorVersion); + } + + String getDisplayVersion(String features, String build) { + Matcher matcher = Pattern.compile("([^/]+?)(\\.features|$)").matcher(features); + final String majorByFeatures = matcher.find() ? matcher.group(1) : features; + + final String buildByVersion = StringUtils.defaultIfBlank(substringAfterLast(build, "."), build); + + return StringUtils.join(majorByFeatures, ".", buildByVersion); + } +} -- cgit 1.2.3-korg