diff --git a/application/src/main/java/org/thingsboard/server/controller/AdminController.java b/application/src/main/java/org/thingsboard/server/controller/AdminController.java index e0d9f894e8..026e730441 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AdminController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AdminController.java @@ -29,16 +29,13 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -120,6 +117,9 @@ public class AdminController extends BaseController { private final SystemInfoService systemInfoService; private final AuditLogService auditLogService; + @Value("${queue.vc.request-timeout:180000}") + private int vcRequestTimeout; + @ApiOperation(value = "Get the Administration Settings object using key (getAdminSettings)", notes = "Get the Administration Settings object using specified string key. Referencing non-existing key will cause an error." + SYSTEM_AUTHORITY_PARAGRAPH) @PreAuthorize("hasAuthority('SYS_ADMIN')") @@ -308,7 +308,7 @@ public class AdminController extends BaseController { savedSettings.setPrivateKey(null); savedSettings.setPrivateKeyPassword(null); return savedSettings; - }, MoreExecutors.directExecutor())); + }, MoreExecutors.directExecutor()), vcRequestTimeout); } @ApiOperation(value = "Delete repository settings (deleteRepositorySettings)", @@ -319,7 +319,7 @@ public class AdminController extends BaseController { @ResponseStatus(value = HttpStatus.OK) public DeferredResult deleteRepositorySettings() throws Exception { accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.DELETE); - return wrapFuture(versionControlService.deleteVersionControlSettings(getTenantId())); + return wrapFuture(versionControlService.deleteVersionControlSettings(getTenantId()), vcRequestTimeout); } @ApiOperation(value = "Check repository access (checkRepositoryAccess)", @@ -331,7 +331,7 @@ public class AdminController extends BaseController { @RequestBody RepositorySettings settings) throws Exception { accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ); settings = checkNotNull(settings); - return wrapFuture(versionControlService.checkVersionControlAccess(getTenantId(), settings)); + return wrapFuture(versionControlService.checkVersionControlAccess(getTenantId(), settings), vcRequestTimeout); } @ApiOperation(value = "Get auto commit settings (getAutoCommitSettings)", diff --git a/application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java b/application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java index 63de6ae85e..51ed75be88 100644 --- a/application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java +++ b/application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java @@ -119,6 +119,7 @@ public class VersionControlTest extends AbstractControllerTest { protected User tenantAdmin2; private String repoKey; + private String branch; @Before public void beforeEach() throws Exception { @@ -146,6 +147,7 @@ public class VersionControlTest extends AbstractControllerTest { this.tenantAdmin2 = createUser(tenantAdmin2, tenantAdmin2.getEmail()); this.repoKey = UUID.randomUUID().toString(); + this.branch = "test_" + repoKey; configureRepository(tenantId1); configureRepository(tenantId2); @@ -618,7 +620,7 @@ public class VersionControlTest extends AbstractControllerTest { private String createVersion(String name, EntityType... entityTypes) throws Exception { ComplexVersionCreateRequest request = new ComplexVersionCreateRequest(); request.setVersionName(name); - request.setBranch("test"); + request.setBranch(branch); request.setSyncStrategy(SyncStrategy.MERGE); request.setEntityTypes(Arrays.stream(entityTypes).collect(Collectors.toMap(t -> t, entityType -> { EntityTypeVersionCreateConfig config = new EntityTypeVersionCreateConfig(); @@ -645,7 +647,7 @@ public class VersionControlTest extends AbstractControllerTest { private String createVersion(String name, EntityId... entities) throws Exception { ComplexVersionCreateRequest request = new ComplexVersionCreateRequest(); request.setVersionName(name); - request.setBranch("test"); + request.setBranch(branch); request.setSyncStrategy(SyncStrategy.MERGE); request.setEntityTypes(new HashMap<>()); Map> entitiesByType = Arrays.stream(entities) @@ -677,11 +679,13 @@ public class VersionControlTest extends AbstractControllerTest { return result.getVersion().getId(); } - private Map loadVersion(String versionId, EntityType... entityTypes) { + private Map loadVersion(String versionId, EntityType... entityTypes) throws Exception { return loadVersion(versionId, config -> {}, entityTypes); } - private Map loadVersion(String versionId, Consumer configModifier, EntityType... entityTypes) { + private Map loadVersion(String versionId, Consumer configModifier, EntityType... entityTypes) throws Exception { + assertThat(listVersions()).extracting(EntityVersion::getId).contains(versionId); + EntityTypeVersionLoadRequest request = new EntityTypeVersionLoadRequest(); request.setVersionId(versionId); request.setRollbackOnError(true); @@ -698,17 +702,14 @@ public class VersionControlTest extends AbstractControllerTest { UUID requestId = doPost("/api/entities/vc/entity", request, UUID.class); VersionLoadResult result = await().atMost(30, TimeUnit.SECONDS) - .until(() -> doGet("/api/entities/vc/entity/" + requestId + "/status", VersionLoadResult.class), r -> { - if (r.getError() != null) { - throw new RuntimeException("Failed to load version: " + r.getError()); - } - return r.isDone(); - }); + .until(() -> doGet("/api/entities/vc/entity/" + requestId + "/status", VersionLoadResult.class), VersionLoadResult::isDone); + if (result.getError() != null) { + throw new RuntimeException("Failed to load version: " + result); + } return result.getResult().stream().collect(Collectors.toMap(EntityTypeLoadResult::getEntityType, r -> r)); } private List listVersions() throws Exception { - String branch = "test"; PageData versions = doGetAsyncTyped("/api/entities/vc/version?branch=" + branch + "&pageSize=100&page=0&sortProperty=timestamp&sortOrder=DESC", new TypeReference>() {}); return versions.getData(); } @@ -716,7 +717,7 @@ public class VersionControlTest extends AbstractControllerTest { private void configureRepository(TenantId tenantId) throws Exception { RepositorySettings repositorySettings = new RepositorySettings(); repositorySettings.setLocalOnly(true); - repositorySettings.setDefaultBranch("test"); + repositorySettings.setDefaultBranch(branch); repositorySettings.setAuthMethod(RepositoryAuthMethod.USERNAME_PASSWORD); repositorySettings.setRepositoryUri(repoKey); versionControlService.saveVersionControlSettings(tenantId, repositorySettings).get(); diff --git a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitRepositoryService.java b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitRepositoryService.java index 12e01156ef..bf3e202c2d 100644 --- a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitRepositoryService.java +++ b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitRepositoryService.java @@ -81,8 +81,6 @@ public class DefaultGitRepositoryService implements GitRepositoryService { GitRepository repository = checkRepository(commit.getTenantId()); String branch = commit.getBranch(); try { - repository.fetch(); - List branches = repository.listBranches().stream().map(BranchInfo::getName).toList(); if (repository.getSettings().isLocalOnly()) { if (branches.contains(commit.getBranch())) {