Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(tenant API removal): add check in bdm deploy to use maintenance API #417

Merged
merged 7 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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