Fix /version endpoint 86/92286/4
authorIttay Stern <ittay.stern@att.com>
Tue, 30 Jul 2019 15:01:21 +0000 (18:01 +0300)
committerIttay Stern <ittay.stern@att.com>
Wed, 31 Jul 2019 08:18:30 +0000 (11:18 +0300)
* 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 <ittay.stern@att.com>
epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties
epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties
vid-app-common/pom.xml
vid-app-common/src/main/java/org/onap/vid/controller/open/VersionController.java
vid-app-common/src/main/webapp/WEB-INF/conf/features.properties
vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/controller/open/VersionControllerTest.java [deleted file]
vid-app-common/src/test/java/org/onap/vid/services/VersionServiceTest.java [new file with mode: 0644]
vid-app-common/src/test/resources/WEB-INF/conf/system.properties
vid-app-common/src/test/resources/version.example.json [new file with mode: 0644]

index 70b41c6..96fa220 100755 (executable)
@@ -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)
index 5143b1e..726b56f 100755 (executable)
@@ -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)
index 28b17a3..8d32eda 100755 (executable)
@@ -54,7 +54,7 @@
         <npm.version>5.6.0</npm.version>
 
         <!-- override using -Drelease_version=foo -Dpatch_version=bar -->
-        <release_version>${env.RELEASE_VERSION}</release_version>
+        <release_version/>
         <patch_version/>
 
         <reportportal.argline>-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}"</reportportal.argline>
                     <replacements>
                         <replacement>
                             <token>BUILD_NUMBER</token>
-                            <value>${release_version}.${patch_version}.${env.BUILD_NUMBER}</value>
+                            <value>${env.RELEASE_VERSION}${release_version}.${patch_version}.${env.BUILD_NUMBER}</value>
                         </replacement>
                     </replacements>
                 </configuration>
index 0a4d6f5..a96cd74 100644 (file)
 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<String,String> getVersionAndFeatures()
-    {
-        String features = SystemProperties.getProperty("features.set.filename");
-        String version;
-        try {
-            final URL resource = servletContext.getResource("/app/vid/scripts/constants/version.json");
-            HashMap<String,String> versionFile = new HashMap <>();
-            ObjectMapper mapper = new ObjectMapper();
-            versionFile.putAll(mapper.readValue(resource, new TypeReference<HashMap<String, String>>() {}));
-            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);
-    }
 }
index fd236c3..87f1017 100644 (file)
@@ -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 (file)
index 0000000..66435b0
--- /dev/null
@@ -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 (file)
index 835ea4a..0000000
+++ /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 (file)
index 0000000..7299ba3
--- /dev/null
@@ -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));
+    }
+}
index 829c2ca..33778ba 100644 (file)
@@ -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 (file)
index 0000000..81b06f7
--- /dev/null
@@ -0,0 +1 @@
+{"Version": "1.0.151"}
\ No newline at end of file