From b99ca5a24718f7203c7e1aff61cdeea8fd647013 Mon Sep 17 00:00:00 2001 From: abirembaut Date: Mon, 24 Feb 2025 17:25:10 +0100 Subject: [PATCH 1/7] refactor(tenant API removal): add check in bdm deploy to use maintenance API * support versions 8.0 to 10.3 (in which system/tenant) has been removed by checking if platform/maintenance API is available --- .../services/impl/DefaultBdmService.java | 62 ++++++++++++------- .../services/impl/DefaultBdmServiceTest.java | 51 ++++++++++----- 2 files changed, 77 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java index 637e0006..210aa766 100644 --- a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java +++ b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java @@ -22,21 +22,12 @@ import java.util.List; import org.bonitasoft.web.client.BonitaClient; -import org.bonitasoft.web.client.api.BdmAccessControlApi; -import org.bonitasoft.web.client.api.BdmApi; -import org.bonitasoft.web.client.api.BusinessDataQueryApi; +import org.bonitasoft.web.client.api.*; import org.bonitasoft.web.client.api.BusinessDataQueryApi.SearchBusinessDataQueryParams; -import org.bonitasoft.web.client.api.SystemTenantApi; -import org.bonitasoft.web.client.api.UploadApi; import org.bonitasoft.web.client.exception.ClientException; import org.bonitasoft.web.client.exception.LicenseException; import org.bonitasoft.web.client.feign.ApiProvider; -import org.bonitasoft.web.client.model.BDMAccessControl; -import org.bonitasoft.web.client.model.BDMInstallRequest; -import org.bonitasoft.web.client.model.Bdm; -import org.bonitasoft.web.client.model.BusinessData; -import org.bonitasoft.web.client.model.TenantPauseRequest; -import org.bonitasoft.web.client.model.TenantResourceState; +import org.bonitasoft.web.client.model.*; import org.bonitasoft.web.client.services.BdmService; import org.bonitasoft.web.client.services.impl.base.AbstractService; import org.bonitasoft.web.client.services.impl.base.ClientContext; @@ -60,13 +51,22 @@ public DefaultBdmService( public void importBDM(File bdm) { log.info("Importing Business Data Model file: {}", bdm.getName()); - // Pause tenant - log.debug("Pausing tenant ..."); + MaintenanceApi maintenanceApi = apiProvider.get(MaintenanceApi.class); SystemTenantApi tenantApi = apiProvider.get(SystemTenantApi.class); - tenantApi.updateSystemTenant( - BonitaClient.DEFAULT_TENANT_ID, new TenantPauseRequest().paused("true")); - log.debug("Tenant paused"); - + boolean isMaintenanceApiAvailable = isMaintenanceApiAvailable(maintenanceApi); + //This check is mandatory to support version < 9.0 of Bonita that don't have the maintenance API + if (isMaintenanceApiAvailable) { + log.debug("Enabling Maintenance mode ..."); + maintenanceApi.updateMaintenanceDetails( + new MaintenanceDetails().maintenanceState(MaintenanceDetails.MaintenanceStateEnum.ENABLED)); + log.debug("Maintenance mode enabled"); + } else { + // Pause tenant + log.debug("Pausing tenant ..."); + tenantApi.updateSystemTenant( + BonitaClient.DEFAULT_TENANT_ID, new TenantPauseRequest().paused("true")); + log.debug("Tenant paused"); + } deleteBdmAccessControlIfNeeded(); UploadApi uploadApi = apiProvider.get(UploadApi.class); @@ -77,15 +77,33 @@ public void importBDM(File bdm) { bdmApi.installBDM(new BDMInstallRequest().fileUpload(uploadedFileName)); log.debug("BDM file installed"); - // Restart tenant - log.debug("Resuming tenant ..."); - tenantApi.updateSystemTenant( - BonitaClient.DEFAULT_TENANT_ID, new TenantPauseRequest().paused("false")); - log.debug("Tenant Resumed"); + //This check is mandatory to support version < 9.0 of Bonita that don't have the maintenance API + if (isMaintenanceApiAvailable) { + log.debug("Disabling Maintenance mode ..."); + maintenanceApi.updateMaintenanceDetails( + new MaintenanceDetails().maintenanceState(MaintenanceDetails.MaintenanceStateEnum.DISABLED)); + log.debug("Maintenance mode disabled"); + } else { + // Restart tenant + log.debug("Resuming tenant ..."); + tenantApi.updateSystemTenant( + BonitaClient.DEFAULT_TENANT_ID, new TenantPauseRequest().paused("false")); + log.debug("Tenant Resumed"); + } log.info("Business Data Model deployed successfully."); } + private boolean isMaintenanceApiAvailable(MaintenanceApi maintenanceApi) { + try { + maintenanceApi.getMaintenanceDetails(); + return true; + } catch (Exception e) { + log.debug("platform/maintenance API is not available, fallback to system/tenant", e); + return false; + } + } + @Override public void importBdmAccessControl(File accessControl) { log.info("Importing BDM AccessControl file: {}", accessControl.getName()); diff --git a/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java b/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java index f61e2d46..df8481f4 100644 --- a/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java +++ b/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java @@ -19,26 +19,15 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.bonitasoft.web.client.TestUtils.getClasspathFile; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.lenient; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; import java.io.File; import org.bonitasoft.web.client.BonitaClient; -import org.bonitasoft.web.client.api.BdmAccessControlApi; -import org.bonitasoft.web.client.api.BdmApi; -import org.bonitasoft.web.client.api.BusinessDataQueryApi; -import org.bonitasoft.web.client.api.LicenseApi; -import org.bonitasoft.web.client.api.SystemTenantApi; -import org.bonitasoft.web.client.api.UploadApi; +import org.bonitasoft.web.client.api.*; import org.bonitasoft.web.client.exception.LicenseException; import org.bonitasoft.web.client.feign.ApiProvider; -import org.bonitasoft.web.client.model.BDMAccessControl; -import org.bonitasoft.web.client.model.TenantPauseRequest; -import org.bonitasoft.web.client.model.TenantResourceState; +import org.bonitasoft.web.client.model.*; import org.bonitasoft.web.client.services.impl.base.CachingClientContext; import org.bonitasoft.web.client.services.impl.base.ClientContext; import org.bonitasoft.web.client.services.impl.bdm.BdmResponseConverter; @@ -50,6 +39,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import feign.FeignException; + @ExtendWith(MockitoExtension.class) class DefaultBdmServiceTest { @@ -74,12 +65,18 @@ class DefaultBdmServiceTest { @Mock private SystemTenantApi tenantApi; + @Mock + private MaintenanceApi maintenanceApi; + @Mock private LicenseApi licenseApi; @Mock private BdmAccessControlApi accessControlApi; + @Mock + private FeignException feignException; + @BeforeEach void setUp() { clientContext.clear(); @@ -88,6 +85,7 @@ void setUp() { lenient().when(apiProvider.get(LicenseApi.class)).thenReturn(licenseApi); lenient().when(apiProvider.get(SystemTenantApi.class)).thenReturn(tenantApi); + lenient().when(apiProvider.get(MaintenanceApi.class)).thenReturn(maintenanceApi); lenient().when(apiProvider.get(BdmApi.class)).thenReturn(bdmApi); lenient().when(apiProvider.get(BusinessDataQueryApi.class)).thenReturn(bdmQueryApi); lenient().when(apiProvider.get(UploadApi.class)).thenReturn(uploadApi); @@ -100,6 +98,7 @@ void setUp() { void should_import_bdm() throws Exception { // Given File bdmFile = getClasspathFile("/bdm.zip"); + doThrow(feignException).when(maintenanceApi).getMaintenanceDetails(); // When bdmService.importBDM(bdmFile); @@ -119,6 +118,30 @@ void should_import_bdm() throws Exception { BonitaClient.DEFAULT_TENANT_ID, new TenantPauseRequest().paused("false")); } + @Test + void should_import_bdm_using_maintenance_mode() throws Exception { + // Given + File bdmFile = getClasspathFile("/bdm.zip"); + doReturn(new MaintenanceDetails()).when(maintenanceApi).getMaintenanceDetails(); + + // When + bdmService.importBDM(bdmFile); + + // Then + // maintenance mode enabled + verify(maintenanceApi) + .updateMaintenanceDetails( + new MaintenanceDetails().maintenanceState(MaintenanceDetails.MaintenanceStateEnum.ENABLED)); + verify(bdmService).deleteBdmAccessControlIfNeeded(); + // bdm installed + verify(uploadApi).uploadFile(any()); + verify(bdmApi).installBDM(any()); + // maintenance mode disabled + verify(maintenanceApi) + .updateMaintenanceDetails( + new MaintenanceDetails().maintenanceState(MaintenanceDetails.MaintenanceStateEnum.DISABLED)); + } + @Test void access_control_should_be_deleted_when_not_community_and_installed() { // Given From c17e3b7bc7c0500c0bdfebc7dd88f3dec5e5fc6f Mon Sep 17 00:00:00 2001 From: abirembaut Date: Mon, 24 Feb 2025 17:27:37 +0100 Subject: [PATCH 2/7] set version to 2.0.1-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d8f54f85..88a75934 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.bonitasoft.web bonita-java-client - 2.0.0 + 2.0.1-SNAPSHOT jar bonita-java-client Java client for Bonita REST API From ba47c46729356cd0942145e7459ec946fc0b79f6 Mon Sep 17 00:00:00 2001 From: abirembaut Date: Tue, 25 Feb 2025 10:02:47 +0100 Subject: [PATCH 3/7] catch right exception --- .../client/services/impl/DefaultBdmService.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java index 210aa766..b1a51e5b 100644 --- a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java +++ b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java @@ -16,11 +16,8 @@ */ package org.bonitasoft.web.client.services.impl; -import static java.util.stream.Collectors.toList; - -import java.io.File; -import java.util.List; - +import feign.FeignException; +import lombok.extern.slf4j.Slf4j; import org.bonitasoft.web.client.BonitaClient; import org.bonitasoft.web.client.api.*; import org.bonitasoft.web.client.api.BusinessDataQueryApi.SearchBusinessDataQueryParams; @@ -34,7 +31,10 @@ import org.bonitasoft.web.client.services.impl.bdm.BdmResponseConverter; import org.jetbrains.annotations.Nullable; -import lombok.extern.slf4j.Slf4j; +import java.io.File; +import java.util.List; + +import static java.util.stream.Collectors.toList; @Slf4j public class DefaultBdmService extends AbstractService implements BdmService { @@ -98,8 +98,8 @@ private boolean isMaintenanceApiAvailable(MaintenanceApi maintenanceApi) { try { maintenanceApi.getMaintenanceDetails(); return true; - } catch (Exception e) { - log.debug("platform/maintenance API is not available, fallback to system/tenant", e); + } catch (FeignException e) { + log.info("platform/maintenance API is not available (Status: {}), fallback to system/tenant", e.status()); return false; } } From 0ba8d67e6a32c8152738d2c065e3a289114f8bff Mon Sep 17 00:00:00 2001 From: abirembaut Date: Tue, 25 Feb 2025 10:03:34 +0100 Subject: [PATCH 4/7] catch right exception --- .../web/client/services/impl/DefaultBdmService.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java index b1a51e5b..51936459 100644 --- a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java +++ b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java @@ -16,8 +16,11 @@ */ package org.bonitasoft.web.client.services.impl; -import feign.FeignException; -import lombok.extern.slf4j.Slf4j; +import static java.util.stream.Collectors.toList; + +import java.io.File; +import java.util.List; + import org.bonitasoft.web.client.BonitaClient; import org.bonitasoft.web.client.api.*; import org.bonitasoft.web.client.api.BusinessDataQueryApi.SearchBusinessDataQueryParams; @@ -31,10 +34,8 @@ import org.bonitasoft.web.client.services.impl.bdm.BdmResponseConverter; import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.util.List; - -import static java.util.stream.Collectors.toList; +import feign.FeignException; +import lombok.extern.slf4j.Slf4j; @Slf4j public class DefaultBdmService extends AbstractService implements BdmService { From 70422220ea4126c66ef057f88fe899ab61131afa Mon Sep 17 00:00:00 2001 From: abirembaut Date: Tue, 25 Feb 2025 10:06:47 +0100 Subject: [PATCH 5/7] update test container versions --- .../java/org/bonitasoft/testcontainers/BonitaContainer.java | 2 +- src/test/java/org/bonitasoft/web/client/BonitaClientIT.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/bonitasoft/testcontainers/BonitaContainer.java b/src/test/java/org/bonitasoft/testcontainers/BonitaContainer.java index f638eaa7..a7167803 100644 --- a/src/test/java/org/bonitasoft/testcontainers/BonitaContainer.java +++ b/src/test/java/org/bonitasoft/testcontainers/BonitaContainer.java @@ -46,7 +46,7 @@ public class BonitaContainer> extends Generic public static final String BONITA_CONTEXT_PATH = "bonita.context-path"; public static final String BONITA_CONTEXT_PATH_DEFAULT = "/bonita"; public static final String BONITA_VERSION = "bonita.version"; - public static final String BONITA_VERSION_DEFAULT = "7.15"; + public static final String BONITA_VERSION_DEFAULT = "8.0"; public static final String BONITA_IMAGE_NAME = "bonita.image.name"; public static final String BONITA_IMAGE_NAME_DEFAULT = "bonita"; public static final String BONITA_IMAGE_PREFIX = "bonita.image.prefix"; diff --git a/src/test/java/org/bonitasoft/web/client/BonitaClientIT.java b/src/test/java/org/bonitasoft/web/client/BonitaClientIT.java index 9acad2b1..9bc99483 100644 --- a/src/test/java/org/bonitasoft/web/client/BonitaClientIT.java +++ b/src/test/java/org/bonitasoft/web/client/BonitaClientIT.java @@ -105,7 +105,7 @@ class BonitaClientIT { private static final BonitaContainer> BONITA_CONTAINER = new BonitaContainer<>( BONITA_DOCKER_IMAGE); - private static final Semver _10_2 = new Semver("10.2", SemverType.LOOSE); + private static final Semver _10_2 = new Semver("10.2.0", SemverType.LOOSE); private BonitaClient bonitaClient; From 1fd35087e3bbb1f7c08fade2a76a4fffd252a398 Mon Sep 17 00:00:00 2001 From: abirembaut Date: Tue, 25 Feb 2025 10:09:04 +0100 Subject: [PATCH 6/7] update PR build base branches --- .github/workflows/_reusable_build.yml | 6 +++--- .github/workflows/build_pr.yml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/_reusable_build.yml b/.github/workflows/_reusable_build.yml index 47d997ca..22df8bdc 100644 --- a/.github/workflows/_reusable_build.yml +++ b/.github/workflows/_reusable_build.yml @@ -51,7 +51,7 @@ jobs: - name: Compile and test project env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - run: ./mvnw -B -ntp clean verify sonar:sonar -Dsonar.scanner.force-deprecated-java-version=true -Dbonita.image=${{ vars.BONITASOFT_DOCKER_REGISTRY }}/${{ vars.DOCKER_SNAPSHOTS_REPOSITORY }}/bonita-community:10.2-SNAPSHOT + run: ./mvnw -B -ntp clean verify sonar:sonar -Dsonar.scanner.force-deprecated-java-version=true -Dbonita.image=${{ vars.BONITASOFT_DOCKER_REGISTRY }}/${{ vars.DOCKER_SNAPSHOTS_REPOSITORY }}/bonita-community:10.3-SNAPSHOT # Build and Push snapshots to maven central - name: Deploy snapshots to Maven central @@ -62,12 +62,12 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - bonita-version: - - '7.15.0' + bonita-version: - '8.0.0' - '9.0.0' - '10.0.0' - '10.1.0' + - '10.2.0' steps: - uses: actions/checkout@v4 - uses: Keeper-Security/ksm-action@v1 diff --git a/.github/workflows/build_pr.yml b/.github/workflows/build_pr.yml index 6e908e42..911efd20 100644 --- a/.github/workflows/build_pr.yml +++ b/.github/workflows/build_pr.yml @@ -6,6 +6,7 @@ on: - develop - release/* - support/* + - 2.0.x paths-ignore: - "README.adoc" - "CHANGELOG.adoc" From e3103de904aaca00b2abd8d7c3527878402b577c Mon Sep 17 00:00:00 2001 From: abirembaut Date: Tue, 25 Feb 2025 10:26:10 +0100 Subject: [PATCH 7/7] catch right exception --- .../web/client/services/impl/DefaultBdmService.java | 6 +++--- .../web/client/services/impl/DefaultBdmServiceTest.java | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java index 51936459..9e909b4b 100644 --- a/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java +++ b/src/main/java/org/bonitasoft/web/client/services/impl/DefaultBdmService.java @@ -26,6 +26,7 @@ import org.bonitasoft.web.client.api.BusinessDataQueryApi.SearchBusinessDataQueryParams; import org.bonitasoft.web.client.exception.ClientException; import org.bonitasoft.web.client.exception.LicenseException; +import org.bonitasoft.web.client.exception.NotFoundException; import org.bonitasoft.web.client.feign.ApiProvider; import org.bonitasoft.web.client.model.*; import org.bonitasoft.web.client.services.BdmService; @@ -34,7 +35,6 @@ import org.bonitasoft.web.client.services.impl.bdm.BdmResponseConverter; import org.jetbrains.annotations.Nullable; -import feign.FeignException; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -99,8 +99,8 @@ private boolean isMaintenanceApiAvailable(MaintenanceApi maintenanceApi) { try { maintenanceApi.getMaintenanceDetails(); return true; - } catch (FeignException e) { - log.info("platform/maintenance API is not available (Status: {}), fallback to system/tenant", e.status()); + } catch (NotFoundException e) { + log.info("platform/maintenance API is not available, fallback to system/tenant"); return false; } } diff --git a/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java b/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java index df8481f4..baa558c4 100644 --- a/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java +++ b/src/test/java/org/bonitasoft/web/client/services/impl/DefaultBdmServiceTest.java @@ -26,6 +26,7 @@ import org.bonitasoft.web.client.BonitaClient; import org.bonitasoft.web.client.api.*; import org.bonitasoft.web.client.exception.LicenseException; +import org.bonitasoft.web.client.exception.NotFoundException; import org.bonitasoft.web.client.feign.ApiProvider; import org.bonitasoft.web.client.model.*; import org.bonitasoft.web.client.services.impl.base.CachingClientContext; @@ -39,8 +40,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import feign.FeignException; - @ExtendWith(MockitoExtension.class) class DefaultBdmServiceTest { @@ -74,9 +73,6 @@ class DefaultBdmServiceTest { @Mock private BdmAccessControlApi accessControlApi; - @Mock - private FeignException feignException; - @BeforeEach void setUp() { clientContext.clear(); @@ -98,7 +94,7 @@ void setUp() { void should_import_bdm() throws Exception { // Given File bdmFile = getClasspathFile("/bdm.zip"); - doThrow(feignException).when(maintenanceApi).getMaintenanceDetails(); + doThrow(NotFoundException.class).when(maintenanceApi).getMaintenanceDetails(); // When bdmService.importBDM(bdmFile);