From 5efec2c3cfcead17394beb825200e132f827eb31 Mon Sep 17 00:00:00 2001 From: Ittay Stern Date: Tue, 30 Jul 2019 18:01:21 +0300 Subject: Fix /version endpoint * Modify maven-replacer-plugin to set value in version.json * Configure features.set.filename=onap.features.properties Issue-ID: VID-507 Change-Id: I692ab3e9221118b836ae7249f483b5277a70bf6b Signed-off-by: Ittay Stern --- .../src/main/webapp/WEB-INF/conf/system.properties | 2 + .../webapp/WEB-INF/conf/system_template.properties | 2 + vid-app-common/pom.xml | 4 +- .../vid/controller/open/VersionController.java | 50 ++------ .../main/webapp/WEB-INF/conf/features.properties | 46 +------ .../webapp/WEB-INF/conf/onap.features.properties | 38 ++++++ .../vid/controller/open/VersionControllerTest.java | 52 -------- .../org/onap/vid/services/VersionServiceTest.java | 136 +++++++++++++++++++++ .../test/resources/WEB-INF/conf/system.properties | 2 + .../src/test/resources/version.example.json | 1 + 10 files changed, 194 insertions(+), 139 deletions(-) create mode 100644 vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties delete mode 100644 vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/services/VersionServiceTest.java create mode 100644 vid-app-common/src/test/resources/version.example.json diff --git a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties index 70b41c6e4..96fa22082 100755 --- a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties +++ b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties @@ -199,6 +199,8 @@ scheduler.submit.new.vnf.change=/v1/ChangeManagement/schedules/{scheduleId}/appr scheduler.get.schedules=/v1/ChangeManagement/schedules/scheduleDetails/ scheduler.basic.auth= +features.set.filename=onap.features.properties + vid.asyncJob.howLongToKeepOldJobsInDays=7 # thread definition - count and timeout (in seconds) diff --git a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties index 5143b1e6d..726b56f09 100755 --- a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties +++ b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties @@ -155,6 +155,8 @@ mso.dme2.server.url=${MSO_DME2_SERVER_URL} mso.dme2.enabled=${MSO_DME2_ENABLED} scheduler.basic.auth= +features.set.filename=onap.features.properties + vid.asyncJob.howLongToKeepOldJobsInDays=7 # thread definition - count and timeout (in seconds) diff --git a/vid-app-common/pom.xml b/vid-app-common/pom.xml index 28b17a373..8d32eda7a 100755 --- a/vid-app-common/pom.xml +++ b/vid-app-common/pom.xml @@ -54,7 +54,7 @@ 5.6.0 - ${env.RELEASE_VERSION} + -javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar -Drp.enable=true -Drp.mode=DEFAULT -Drp.tags="CICD;BE_UNIT;BUILD_${env.BUILD_NUMBER}" @@ -268,7 +268,7 @@ BUILD_NUMBER - ${release_version}.${patch_version}.${env.BUILD_NUMBER} + ${env.RELEASE_VERSION}${release_version}.${patch_version}.${env.BUILD_NUMBER} 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 index 0a4d6f5ac..a96cd74eb 100644 --- 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 @@ -21,63 +21,29 @@ 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 javax.inject.Inject; import org.onap.portalsdk.core.controller.UnRestrictedBaseController; -import org.onap.portalsdk.core.util.SystemProperties; +import org.onap.vid.model.VersionAndFeatures; +import org.onap.vid.services.VersionService; 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; + private final VersionService versionService; @Inject - public VersionController(ServletContext servletContext) { - this.servletContext = servletContext; + public VersionController(VersionService versionService) { + this.versionService = versionService; } @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); + public VersionAndFeatures getVersionAndFeatures() { + return versionService.retrieveVersionAndFeatures(); } - 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/webapp/WEB-INF/conf/features.properties b/vid-app-common/src/main/webapp/WEB-INF/conf/features.properties index fd236c39a..87f1017ed 100644 --- a/vid-app-common/src/main/webapp/WEB-INF/conf/features.properties +++ b/vid-app-common/src/main/webapp/WEB-INF/conf/features.properties @@ -4,47 +4,7 @@ # This file is, generally, empty. # Configure `features.set.filename` in system.properties to use -# one of the ready-made sets: - -# - features.set.filename = ci.features.properties -# - features.set.filename = ist.features.properties -# - features.set.filename = e2e.features.properties - -FLAG_PNP_INSTANTIATION = true - -CREATE_INSTANCE_TEST = false -FLAG_ADD_MSO_TESTAPI_FIELD = true -FLAG_UNASSIGN_SERVICE = true -FLAG_SERVICE_MODEL_CACHE = true -FLAG_SHOW_ASSIGNMENTS = true -FLAG_SHOW_VERIFY_SERVICE = false -FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS = true -FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS = true -FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST = true -FLAG_1810_CR_LET_SELECTING_COLLECTOR_TYPE_UNCONDITIONALLY = true -FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE = true -FLAG_1810_AAI_LOCAL_CACHE = true -FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER = false -FLAG_HANDLE_SO_WORKFLOWS = true -FLAG_CREATE_ERROR_REPORTS = true - -# Modern UI (Drawing-Board; View/Edit) -# - - - - - - - - - - - - - - - - - - -FLAG_COLLECTION_RESOURCE_SUPPORT = false -FLAG_ASYNC_INSTANTIATION = false -FLAG_ASYNC_JOBS = false -EMPTY_DRAWING_BOARD_TEST = false -FLAG_NETWORK_TO_ASYNC_INSTANTIATION = false -FLAG_DUPLICATE_VNF = false -FLAG_DEFAULT_VNF = false -FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD = false -FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF = false -FLAG_A_LA_CARTE_AUDIT_INFO = false -FLAG_5G_IN_NEW_INSTANTIATION_UI = false -FLAG_ASYNC_ALACARTE_VNF = false -FLAG_ASYNC_ALACARTE_VFMODULE = false -FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI = false -FLAG_SUPPLEMENTARY_FILE = false -FLAG_1902_NEW_VIEW_EDIT=false -FLAG_1902_VNF_GROUPING = false +# one of the ready-made sets; e.g.: +# - features.set.filename = onap.features.properties +# - features.set.filename = dublin.features.properties diff --git a/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties b/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties new file mode 100644 index 000000000..66435b024 --- /dev/null +++ b/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties @@ -0,0 +1,38 @@ +FLAG_PNP_INSTANTIATION = true + +CREATE_INSTANCE_TEST = false +FLAG_ADD_MSO_TESTAPI_FIELD = true +FLAG_UNASSIGN_SERVICE = true +FLAG_SERVICE_MODEL_CACHE = true +FLAG_SHOW_ASSIGNMENTS = true +FLAG_SHOW_VERIFY_SERVICE = false +FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS = true +FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS = true +FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST = true +FLAG_1810_CR_LET_SELECTING_COLLECTOR_TYPE_UNCONDITIONALLY = true +FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE = true +FLAG_1810_AAI_LOCAL_CACHE = true +FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER = false +FLAG_HANDLE_SO_WORKFLOWS = true +FLAG_CREATE_ERROR_REPORTS = true + +# Modern UI (Drawing-Board; View/Edit) +# - - - - - - - - - - - - - - - - - - +FLAG_COLLECTION_RESOURCE_SUPPORT = false +FLAG_ASYNC_INSTANTIATION = false +FLAG_ASYNC_JOBS = false +EMPTY_DRAWING_BOARD_TEST = false +FLAG_NETWORK_TO_ASYNC_INSTANTIATION = false +FLAG_DUPLICATE_VNF = false +FLAG_DEFAULT_VNF = false +FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD = false +FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF = false +FLAG_A_LA_CARTE_AUDIT_INFO = false +FLAG_5G_IN_NEW_INSTANTIATION_UI = false +FLAG_ASYNC_ALACARTE_VNF = false +FLAG_ASYNC_ALACARTE_VFMODULE = false +FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI = false +FLAG_SUPPLEMENTARY_FILE = false +FLAG_1902_NEW_VIEW_EDIT=false +FLAG_1902_VNF_GROUPING = false + diff --git a/vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java deleted file mode 100644 index 835ea4a66..000000000 --- a/vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java +++ /dev/null @@ -1,52 +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.open; - -import org.onap.vid.controller.open.VersionController; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - - -public class VersionControllerTest { - - @DataProvider - public static Object[][] majorVersionContainer() { - return new Object[][]{ - {"features.properties", "1.0.2000", "features.properties.2000"}, - {"", "1.0.2000", ".2000"}, - {"kuku", "1.0.2000", "kuku.2000"}, - {"/kuku", "1.0.2000", "kuku.2000"}, - {"1810p.features.properties", "1.0.2000", "1810p.2000"}, - {"/opt/app/dev.features.properties", "1.0.2000", "dev.2000"}, - {"foo", "2000", "foo.2000"}, - }; - } - - final VersionController versionController = new VersionController(null); - - @Test(dataProvider = "majorVersionContainer") - public void testGetDisplayVersion(String majorVersionContainer, String buildNumberContainer, String expected) { - assertThat(versionController.getDisplayVersion(majorVersionContainer, buildNumberContainer), is(expected)); - } -} diff --git a/vid-app-common/src/test/java/org/onap/vid/services/VersionServiceTest.java b/vid-app-common/src/test/java/org/onap/vid/services/VersionServiceTest.java new file mode 100644 index 000000000..7299ba312 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/services/VersionServiceTest.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.services; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.servlet.ServletContext; +import org.jetbrains.annotations.NotNull; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.onap.portalsdk.core.util.SystemProperties; +import org.onap.vid.model.VersionAndFeatures; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +@ContextConfiguration(classes = {SystemProperties.class}) +public class VersionServiceTest extends AbstractTestNGSpringContextTests { + + private static final String VERSION_FILE_PATH = "/app/vid/scripts/constants/version.json"; + @Mock + ServletContext servletContext; + + VersionService versionService; + + @BeforeClass + public void initMocks() { + MockitoAnnotations.initMocks(this); + } + + @BeforeMethod + public void resetMocks() { + Mockito.reset(servletContext); + versionService = new VersionService(servletContext); + } + + @DataProvider + public static Object[][] majorVersionContainer() { + return new Object[][]{ + {"features.properties", "1.0.2000", "features.properties.2000"}, + {"", "1.0.2000", ".2000"}, + {"kuku", "1.0.2000", "kuku.2000"}, + {"/kuku", "1.0.2000", "kuku.2000"}, + {"1810p.features.properties", "1.0.2000", "1810p.2000"}, + {"/opt/app/dev.features.properties", "1.0.2000", "dev.2000"}, + {"foo", "2000", "foo.2000"}, + }; + } + + @Test(dataProvider = "majorVersionContainer") + public void testGetDisplayVersion(String majorVersionContainer, String buildNumberContainer, String expected) { + assertThat(versionService.buildDisplayVersion(majorVersionContainer, buildNumberContainer), is(expected)); + } + + @Test + public void testReadFeatureSet() { + assertEquals("onap.features.properties", versionService.readFeatureSet()); + } + + @Test + public void whenReadBuildNumber_thenTheRightBuildIsReturn_andReadOnlyOnce() throws MalformedURLException { + mockForVersionFile(); + assertEquals("1.0.151", versionService.retrieveBuildNumber()); + //second call shall not read resource + assertEquals("1.0.151", versionService.retrieveBuildNumber()); + verify(servletContext).getResource(any()); + } + + private void mockForVersionFile() throws MalformedURLException { + URL versionFileExample = this.getClass().getResource("/version.example.json"); + when(servletContext.getResource(eq(VERSION_FILE_PATH))).thenReturn(versionFileExample); + } + + @NotNull + protected VersionAndFeatures retrieveAndAssertVersionWithGoodResult() throws MalformedURLException { + mockForVersionFile(); + VersionAndFeatures expected = new VersionAndFeatures("onap.features.properties", "1.0.151", "onap.151"); + assertEquals(expected, versionService.retrieveVersionAndFeatures()); + return expected; + } + + @Test(expectedExceptions = RuntimeException.class, expectedExceptionsMessageRegExp = "abc") + public void whenExceptionThrownDuringGetBuildNumber_thenExceptionIsThrown() throws MalformedURLException { + when(servletContext.getResource(any())).thenThrow(new RuntimeException("abc")); + versionService.retrieveBuildNumber(); + } + + @Test + public void whenExceptionThrownDuringVersionAndFeatures_thenUnknownIsReturn() throws MalformedURLException { + //exception is thrown during retrieveVersionAndFeatures, so expect to "unknown" result + when(servletContext.getResource(eq(VERSION_FILE_PATH))).thenThrow(new RuntimeException()); + assertEquals(VersionAndFeatures.Companion.getUnknown(), versionService.retrieveVersionAndFeatures()); + + //retrieveVersionAndFeatures going smoothly, so expecting to good result + retrieveAndAssertVersionWithGoodResult(); + } + + + @Test + public void whenRetrieveVersionAndFeatures_expectedValuesReturn_andExecuteOnce() throws MalformedURLException { + VersionAndFeatures expected = retrieveAndAssertVersionWithGoodResult(); + //second call shall not read resource + assertEquals(expected, versionService.retrieveVersionAndFeatures()); + verify(servletContext).getResource(eq(VERSION_FILE_PATH)); + } +} diff --git a/vid-app-common/src/test/resources/WEB-INF/conf/system.properties b/vid-app-common/src/test/resources/WEB-INF/conf/system.properties index 829c2cae9..33778babb 100644 --- a/vid-app-common/src/test/resources/WEB-INF/conf/system.properties +++ b/vid-app-common/src/test/resources/WEB-INF/conf/system.properties @@ -221,6 +221,8 @@ mso.asyncPollingIntervalSeconds=0 # Only required for applications using WebJunction or FE/BE separation. For example: # app_base_url = https://www.e-access.att.com/app_junction/app_context/ +features.set.filename=onap.features.properties + vid.asyncJob.howLongToKeepOldJobsInDays=7 # thread definition - count and timeout (in seconds) diff --git a/vid-app-common/src/test/resources/version.example.json b/vid-app-common/src/test/resources/version.example.json new file mode 100644 index 000000000..81b06f711 --- /dev/null +++ b/vid-app-common/src/test/resources/version.example.json @@ -0,0 +1 @@ +{"Version": "1.0.151"} \ No newline at end of file -- cgit 1.2.3-korg