diff --git a/apiml/src/main/java/org/zowe/apiml/controller/ApimlHomepageController.java b/apiml/src/main/java/org/zowe/apiml/controller/ApimlHomepageController.java index 1527a91cc9..3168759efa 100644 --- a/apiml/src/main/java/org/zowe/apiml/controller/ApimlHomepageController.java +++ b/apiml/src/main/java/org/zowe/apiml/controller/ApimlHomepageController.java @@ -21,8 +21,9 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.zowe.apiml.config.ApplicationInfo; -import org.zowe.apiml.product.version.BuildInfo; -import org.zowe.apiml.product.version.BuildInfoDetails; +import org.zowe.apiml.product.version.VersionInfo; +import org.zowe.apiml.product.version.VersionInfoDetails; +import org.zowe.apiml.product.version.VersionService; import org.zowe.apiml.zaas.security.login.Providers; import org.zowe.apiml.zaas.security.service.JwtSecurity; @@ -40,12 +41,13 @@ public class ApimlHomepageController { private static final String WARNING_ICON_NAME = "warning"; private final DiscoveryClient discoveryClient; - private final BuildInfo buildInfo; + private final VersionService versionService; private final ApplicationInfo applicationInfo; private final ApplicationContext applicationContext; private String buildString; + private String zoweVersionText; @PostConstruct public void init() { @@ -61,10 +63,15 @@ public String home(Model model) { } private void initializeBuildInfos() { - BuildInfoDetails buildInfoDetails = buildInfo.getBuildInfoDetails(); + VersionInfo versionInfo = versionService.getVersion(); + VersionInfoDetails apiml = versionInfo.getApiml(); buildString = "Build information is not available"; - if (!buildInfoDetails.getVersion().equalsIgnoreCase("unknown")) { - buildString = String.format("Version %s build # %s", buildInfoDetails.getVersion(), buildInfoDetails.getNumber()); + if (apiml != null && apiml.getVersion() != null && !apiml.getVersion().equalsIgnoreCase("unknown")) { + buildString = String.format("API ML Version %s build # %s", apiml.getVersion(), apiml.getBuildNumber()); + } + VersionInfoDetails zowe = versionInfo.getZowe(); + if (zowe != null && zowe.getVersion() != null && !zowe.getVersion().equalsIgnoreCase("unknown")) { + zoweVersionText = String.format("Zowe Version %s build # %s", zowe.getVersion(), zowe.getBuildNumber()); } } @@ -86,6 +93,7 @@ private void initializeParameters(Model model) { model.addAttribute("catalogLinkEnabled", true); model.addAttribute("catalogStatusText", "The API Catalog"); model.addAttribute("buildInfoText", buildString); + model.addAttribute("zoweVersionText", zoweVersionText); } private boolean isAuthReady() { diff --git a/apiml/src/main/resources/templates/home.html b/apiml/src/main/resources/templates/home.html index 993f915461..d5d26c6e2c 100644 --- a/apiml/src/main/resources/templates/home.html +++ b/apiml/src/main/resources/templates/home.html @@ -184,7 +184,10 @@

API Mediation Layer

diff --git a/apiml/src/test/java/org/zowe/apiml/controller/ApimlHomepageControllerTest.java b/apiml/src/test/java/org/zowe/apiml/controller/ApimlHomepageControllerTest.java new file mode 100644 index 0000000000..103fb4c3ec --- /dev/null +++ b/apiml/src/test/java/org/zowe/apiml/controller/ApimlHomepageControllerTest.java @@ -0,0 +1,117 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +package org.zowe.apiml.controller; + +import org.hamcrest.collection.IsMapContaining; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.ApplicationContext; +import org.springframework.ui.ConcurrentModel; +import org.springframework.ui.Model; +import org.zowe.apiml.config.ApplicationInfo; +import org.zowe.apiml.product.constants.CoreService; +import org.zowe.apiml.product.version.VersionInfo; +import org.zowe.apiml.product.version.VersionInfoDetails; +import org.zowe.apiml.product.version.VersionService; +import org.zowe.apiml.zaas.security.login.Providers; +import org.zowe.apiml.zaas.security.service.JwtSecurity; + +import java.util.Map; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class ApimlHomepageControllerTest { + + private DiscoveryClient discoveryClient; + private VersionService versionService; + private ApplicationContext applicationContext; + private ApimlHomepageController apimlHomepageController; + + @BeforeEach + void setup() { + discoveryClient = mock(DiscoveryClient.class); + applicationContext = mock(ApplicationContext.class); + + Providers providers = mock(Providers.class); + when(providers.isZosfmUsed()).thenReturn(false); + when(applicationContext.getBean(Providers.class)).thenReturn(providers); + when(applicationContext.getBean(JwtSecurity.class)).thenReturn(mock(JwtSecurity.class)); + + versionService = mock(VersionService.class); + when(versionService.getVersion()).thenReturn(new VersionInfo(null, new VersionInfoDetails("unknown", "000", "abc"))); + + ApplicationInfo applicationInfo = ApplicationInfo.builder() + .isModulith(false) + .authServiceId(CoreService.ZAAS.getServiceId()).build(); + + apimlHomepageController = new ApimlHomepageController(discoveryClient, versionService, applicationInfo, applicationContext); + } + + @Test + void givenBuildVersionUnknown_whenHomePageCalled_thenBuildInfoShouldBeStaticText() { + Model model = new ConcurrentModel(); + apimlHomepageController.init(); + apimlHomepageController.home(model); + + Map actualModelMap = model.asMap(); + assertThat(actualModelMap, IsMapContaining.hasEntry("buildInfoText", "Build information is not available")); + } + + @Test + void givenSpecificBuildVersion_whenHomePageCalled_thenBuildInfoShouldBeGivenVersionAndNumber() { + VersionService versionService = mock(VersionService.class); + when(versionService.getVersion()).thenReturn(new VersionInfo(null, new VersionInfoDetails("test-version", "test-number", "abc"))); + + ApplicationInfo applicationInfo = ApplicationInfo.builder() + .isModulith(false) + .authServiceId(CoreService.ZAAS.getServiceId()).build(); + ApimlHomepageController controller = new ApimlHomepageController(discoveryClient, versionService, applicationInfo, applicationContext); + + Model model = new ConcurrentModel(); + controller.init(); + controller.home(model); + + Map actualModelMap = model.asMap(); + assertThat(actualModelMap, IsMapContaining.hasEntry("buildInfoText", "API ML Version test-version build # test-number")); + } + + @Test + void givenZoweVersion_whenHomePageCalled_thenZoweVersionTextShouldBeIncluded() { + VersionService versionService = mock(VersionService.class); + when(versionService.getVersion()).thenReturn(new VersionInfo( + new VersionInfoDetails("2.0.0", "500", "def"), + new VersionInfoDetails("test-version", "test-number", "abc") + )); + + ApplicationInfo applicationInfo = ApplicationInfo.builder() + .isModulith(false) + .authServiceId(CoreService.ZAAS.getServiceId()).build(); + ApimlHomepageController controller = new ApimlHomepageController(discoveryClient, versionService, applicationInfo, applicationContext); + + Model model = new ConcurrentModel(); + controller.init(); + controller.home(model); + + Map actualModelMap = model.asMap(); + assertThat(actualModelMap, IsMapContaining.hasEntry("zoweVersionText", "Zowe Version 2.0.0 build # 500")); + } + + @Test + void givenHomePageCalled_thenHomePageShouldReturnHomeLiteral() { + String redirectedPage = apimlHomepageController.home(new ConcurrentModel()); + assertEquals("home", redirectedPage, "Expected page is not 'home'"); + } + +} diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/controllers/GatewayHomepageController.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/controllers/GatewayHomepageController.java index f1f682dea9..eca5506ad5 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/controllers/GatewayHomepageController.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/controllers/GatewayHomepageController.java @@ -22,8 +22,9 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.zowe.apiml.config.ApplicationInfo; -import org.zowe.apiml.product.version.BuildInfo; -import org.zowe.apiml.product.version.BuildInfoDetails; +import org.zowe.apiml.product.version.VersionInfo; +import org.zowe.apiml.product.version.VersionInfoDetails; +import org.zowe.apiml.product.version.VersionService; import java.util.List; @@ -43,12 +44,13 @@ public class GatewayHomepageController { private static final String UI_V1_ROUTE = "%s.ui-v1.%s"; private final DiscoveryClient discoveryClient; - private final BuildInfo buildInfo; + private final VersionService versionService; @Value("${apiml.catalog.serviceId:}") private String apiCatalogServiceId; private final ApplicationInfo applicationInfo; private String buildString; + private String zoweVersionText; @PostConstruct public void init() { @@ -63,14 +65,20 @@ public String home(Model model) { initializeAuthenticationAttributes(model); model.addAttribute("buildInfoText", buildString); + model.addAttribute("zoweVersionText", zoweVersionText); return "home"; } private void initializeBuildInfos() { - BuildInfoDetails buildInfoDetails = buildInfo.getBuildInfoDetails(); + VersionInfo versionInfo = versionService.getVersion(); + VersionInfoDetails apiml = versionInfo.getApiml(); buildString = "Build information is not available"; - if (!buildInfoDetails.getVersion().equalsIgnoreCase("unknown")) { - buildString = String.format("Version %s build # %s", buildInfoDetails.getVersion(), buildInfoDetails.getNumber()); + if (apiml != null && apiml.getVersion() != null && !apiml.getVersion().equalsIgnoreCase("unknown")) { + buildString = String.format("API ML Version %s build # %s", apiml.getVersion(), apiml.getBuildNumber()); + } + VersionInfoDetails zowe = versionInfo.getZowe(); + if (zowe != null && zowe.getVersion() != null && !zowe.getVersion().equalsIgnoreCase("unknown")) { + zoweVersionText = String.format("Zowe Version %s build # %s", zowe.getVersion(), zowe.getBuildNumber()); } } diff --git a/gateway-service/src/main/resources/templates/home.html b/gateway-service/src/main/resources/templates/home.html index bff3ba6cc1..e1eb559293 100644 --- a/gateway-service/src/main/resources/templates/home.html +++ b/gateway-service/src/main/resources/templates/home.html @@ -190,7 +190,10 @@

API Mediation Layer

-
diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/GatewayHomepageControllerTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/GatewayHomepageControllerTest.java index d0376a142b..6734bcb061 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/GatewayHomepageControllerTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/controllers/GatewayHomepageControllerTest.java @@ -21,8 +21,9 @@ import org.springframework.ui.Model; import org.zowe.apiml.config.ApplicationInfo; import org.zowe.apiml.product.constants.CoreService; -import org.zowe.apiml.product.version.BuildInfo; -import org.zowe.apiml.product.version.BuildInfoDetails; +import org.zowe.apiml.product.version.VersionInfo; +import org.zowe.apiml.product.version.VersionInfoDetails; +import org.zowe.apiml.product.version.VersionService; import java.util.*; @@ -36,7 +37,7 @@ class GatewayHomepageControllerTest { private DiscoveryClient discoveryClient; private GatewayHomepageController gatewayHomepageController; - private BuildInfo buildInfo; + private VersionService versionService; private final String API_CATALOG_ID = "apicatalog"; private final String AUTHORIZATION_SERVICE_ID = "zaas"; @@ -45,15 +46,14 @@ class GatewayHomepageControllerTest { void setup() { discoveryClient = mock(DiscoveryClient.class); - buildInfo = mock(BuildInfo.class); + versionService = mock(VersionService.class); + when(versionService.getVersion()).thenReturn(new VersionInfo(null, new VersionInfoDetails("unknown", "000", "abc"))); - BuildInfoDetails buildInfoDetails = new BuildInfoDetails(new Properties(), new Properties()); - when(buildInfo.getBuildInfoDetails()).thenReturn(buildInfoDetails); ApplicationInfo applicationInfo = ApplicationInfo.builder() .isModulith(false) .authServiceId(CoreService.ZAAS.getServiceId()).build(); gatewayHomepageController = new GatewayHomepageController( - discoveryClient, buildInfo, applicationInfo); + discoveryClient, versionService, applicationInfo); ReflectionTestUtils.setField(gatewayHomepageController, "apiCatalogServiceId", "apicatalog"); } @@ -69,19 +69,14 @@ void givenBuildVersionNull_whenHomePageCalled_thenBuildInfoShouldStaticText() { @Test void givenSpecificBuildVersion_whenHomePageCalled_thenBuildInfoShouldBeGivenVersionAndNumber() { - BuildInfo buildInfo = mock(BuildInfo.class); - - Properties buildProperties = new Properties(); - buildProperties.setProperty("build.version", "test-version"); - buildProperties.setProperty("build.number", "test-number"); - BuildInfoDetails buildInfoDetails = new BuildInfoDetails(buildProperties, new Properties()); - when(buildInfo.getBuildInfoDetails()).thenReturn(buildInfoDetails); + VersionService versionService = mock(VersionService.class); + when(versionService.getVersion()).thenReturn(new VersionInfo(null, new VersionInfoDetails("test-version", "test-number", "abc"))); ApplicationInfo applicationInfo = ApplicationInfo.builder() .isModulith(false) .authServiceId(CoreService.ZAAS.getServiceId()).build(); GatewayHomepageController gatewayHomepageController = new GatewayHomepageController( - discoveryClient, buildInfo, applicationInfo); + discoveryClient, versionService, applicationInfo); Model model = new ConcurrentModel(); @@ -90,7 +85,29 @@ void givenSpecificBuildVersion_whenHomePageCalled_thenBuildInfoShouldBeGivenVers Map actualModelMap = model.asMap(); - assertThat(actualModelMap, IsMapContaining.hasEntry("buildInfoText", "Version test-version build # test-number")); + assertThat(actualModelMap, IsMapContaining.hasEntry("buildInfoText", "API ML Version test-version build # test-number")); + } + + @Test + void givenZoweVersion_whenHomePageCalled_thenZoweVersionTextShouldBeIncluded() { + VersionService versionService = mock(VersionService.class); + when(versionService.getVersion()).thenReturn(new VersionInfo( + new VersionInfoDetails("2.0.0", "500", "def"), + new VersionInfoDetails("test-version", "test-number", "abc") + )); + + ApplicationInfo applicationInfo = ApplicationInfo.builder() + .isModulith(false) + .authServiceId(CoreService.ZAAS.getServiceId()).build(); + GatewayHomepageController gatewayHomepageController = new GatewayHomepageController( + discoveryClient, versionService, applicationInfo); + + Model model = new ConcurrentModel(); + gatewayHomepageController.init(); + gatewayHomepageController.home(model); + + Map actualModelMap = model.asMap(); + assertThat(actualModelMap, IsMapContaining.hasEntry("zoweVersionText", "Zowe Version 2.0.0 build # 500")); } @@ -114,7 +131,7 @@ void givenApiCatalogueIsEmpty_whenHomePageIsCalled_thenThereIsNoMessageAroundThe .isModulith(false) .authServiceId(CoreService.GATEWAY.getServiceId()).build(); - GatewayHomepageController underTest = new GatewayHomepageController(discoveryClient, buildInfo, applicationInfo); + GatewayHomepageController underTest = new GatewayHomepageController(discoveryClient, versionService, applicationInfo); Model model = new ConcurrentModel(); underTest.home(model);