Skip to content

Commit

Permalink
refactor(tenant API removal): add check in bdm deploy to use maintena…
Browse files Browse the repository at this point in the history
…nce API (#417)

* support versions 8.0 to 10.3 (in which system/tenant) has been removed by checking if platform/maintenance API is available
* set version to 2.0.1-SNAPSHOT
* update test container versions
  • Loading branch information
abirembaut authored Feb 26, 2025
1 parent 47c9990 commit 2ac37d5
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 42 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/_reusable_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/build_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ on:
- develop
- release/*
- support/*
- 2.0.x
paths-ignore:
- "README.adoc"
- "CHANGELOG.adoc"
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.bonitasoft.web</groupId>
<artifactId>bonita-java-client</artifactId>
<version>2.0.0</version>
<version>2.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>bonita-java-client</name>
<description>Java client for Bonita REST API</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,13 @@
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.exception.NotFoundException;
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;
Expand All @@ -60,13 +52,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);
Expand All @@ -77,15 +78,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 (NotFoundException e) {
log.info("platform/maintenance API is not available, fallback to system/tenant");
return false;
}
}

@Override
public void importBdmAccessControl(File accessControl) {
log.info("Importing BDM AccessControl file: {}", accessControl.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class BonitaContainer<SELF extends BonitaContainer<SELF>> 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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class BonitaClientIT {
private static final BonitaContainer<? extends 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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,16 @@
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.exception.NotFoundException;
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;
Expand Down Expand Up @@ -74,6 +64,9 @@ class DefaultBdmServiceTest {
@Mock
private SystemTenantApi tenantApi;

@Mock
private MaintenanceApi maintenanceApi;

@Mock
private LicenseApi licenseApi;

Expand All @@ -88,6 +81,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);
Expand All @@ -100,6 +94,7 @@ void setUp() {
void should_import_bdm() throws Exception {
// Given
File bdmFile = getClasspathFile("/bdm.zip");
doThrow(NotFoundException.class).when(maintenanceApi).getMaintenanceDetails();

// When
bdmService.importBDM(bdmFile);
Expand All @@ -119,6 +114,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
Expand Down

0 comments on commit 2ac37d5

Please sign in to comment.