From d5cbb4f590c73befda35a2e114fb09392a289c42 Mon Sep 17 00:00:00 2001 From: egonzale Date: Fri, 27 Nov 2020 09:02:27 +0100 Subject: [PATCH] [JBPM-9464] Kie server notification causes bad status in BC --- .../kie/server/api/KieServerConstants.java | 2 ++ .../api/model/runtime/Container.java | 2 +- .../impl/KieServerControllerImpl.java | 7 ----- .../impl/KieServerInstanceManager.java | 7 +++++ .../service/SpecManagementServiceImpl.java | 29 ++++++++++++++----- .../impl/KieServerInstanceManagerTest.java | 2 +- .../server/services/impl/KieServerImpl.java | 23 +++++++++++---- .../controller/DefaultRestControllerImpl.java | 22 +++++++------- 8 files changed, 60 insertions(+), 34 deletions(-) diff --git a/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/KieServerConstants.java b/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/KieServerConstants.java index fde353d6c1..69adf6de25 100644 --- a/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/KieServerConstants.java +++ b/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/KieServerConstants.java @@ -63,6 +63,8 @@ public class KieServerConstants { public static final String KIE_SERVER_IMAGESERVICE_MAX_NODES = "org.kie.server.service.image.max_nodes"; public static final String KIE_SERVER_REST_MODE_READONLY = "org.kie.server.rest.mode.readonly"; public static final String KIE_SERVER_NOTIFY_UPDATES_TO_CONTROLLERS = "org.kie.server.update.notifications.rest.enabled"; + public static final String KIE_SERVER_NOTIFY_UPDATES_TO_CONTROLLERS_DELAY = "org.kie.server.update.notifications.delay"; + // configuration parameters public static final String CFG_PERSISTANCE_DS = "org.kie.server.persistence.ds"; public static final String CFG_PERSISTANCE_TM = "org.kie.server.persistence.tm"; diff --git a/kie-server-parent/kie-server-controller/kie-server-controller-api/src/main/java/org/kie/server/controller/api/model/runtime/Container.java b/kie-server-parent/kie-server-controller/kie-server-controller-api/src/main/java/org/kie/server/controller/api/model/runtime/Container.java index 23fbaa73da..7e69aaf63f 100644 --- a/kie-server-parent/kie-server-controller/kie-server-controller-api/src/main/java/org/kie/server/controller/api/model/runtime/Container.java +++ b/kie-server-parent/kie-server-controller/kie-server-controller-api/src/main/java/org/kie/server/controller/api/model/runtime/Container.java @@ -54,7 +54,7 @@ public Container( final String containerSpecId, this.serverInstanceId = serverInstanceKey.getServerInstanceId(); this.messages.addAll( messages ); this.resolvedReleasedId = resolvedReleasedId; - + setUrl(url); } public String getServerInstanceId() { diff --git a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerControllerImpl.java b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerControllerImpl.java index 7edfbd8c0b..073d5acb1a 100644 --- a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerControllerImpl.java +++ b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerControllerImpl.java @@ -26,7 +26,6 @@ import org.kie.server.api.KieServerConstants; import org.kie.server.api.model.KieContainerResource; -import org.kie.server.api.model.KieContainerStatus; import org.kie.server.api.model.KieScannerResource; import org.kie.server.api.model.KieServerConfig; import org.kie.server.api.model.KieServerConfigItem; @@ -165,11 +164,7 @@ public KieServerSetup update(KieServerStateInfo kieServerStateInfo) { // we update the server instance with the containers List containerList = new ArrayList(); - List invalidStatus = Collections.singletonList(KieContainerStatus.STOPPED); for(ContainerSpec containerSpec : serverTemplate.getContainersSpec()) { - if(invalidStatus.contains(containerSpec.getStatus())) { - continue; - } Container container = new Container(containerSpec.getId(), containerSpec.getContainerName(), serverInstanceKey, @@ -189,7 +184,6 @@ public KieServerSetup update(KieServerStateInfo kieServerStateInfo) { // we update and notify notificationService.notify(new ServerInstanceUpdated(serverInstance)); - notificationService.notify(new ServerTemplateUpdated(serverTemplate)); for(ContainerSpec currentSpec : serverTemplate.getContainersSpec()) { List specContainerList = new ArrayList(); @@ -206,7 +200,6 @@ public KieServerSetup update(KieServerStateInfo kieServerStateInfo) { notificationService.notify(serverTemplate, currentSpec, specContainerList); } - return toKieServerSetup(serverTemplate); } diff --git a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerInstanceManager.java b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerInstanceManager.java index 4b0200b5f7..aaa99918fa 100644 --- a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerInstanceManager.java +++ b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/KieServerInstanceManager.java @@ -16,12 +16,14 @@ package org.kie.server.controller.impl; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.ServiceLoader; import org.kie.server.api.KieServerConstants; import org.kie.server.api.model.KieContainerResource; import org.kie.server.api.model.KieContainerResourceList; +import org.kie.server.api.model.KieContainerStatus; import org.kie.server.api.model.KieScannerResource; import org.kie.server.api.model.KieScannerStatus; import org.kie.server.api.model.KieServerConfigItem; @@ -61,6 +63,10 @@ public static KieServerInstanceManager getInstance() { return INSTANCE; } + public boolean isAsync() { + return false; + } + public List startScanner(ServerTemplate serverTemplate, final ContainerSpec containerSpec, final long interval) { @@ -551,6 +557,7 @@ protected void collectContainerInfo(ContainerSpec containerSpec, container.setResolvedReleasedId(containerResource.getResolvedReleaseId() == null ? containerResource.getReleaseId() : containerResource.getResolvedReleaseId()); container.setMessages(containerResource.getMessages()); container.setStatus(containerResource.getStatus()); + container.setContainerName(containerResource.getContainerAlias()); } } diff --git a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/service/SpecManagementServiceImpl.java b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/service/SpecManagementServiceImpl.java index 61dc7555de..fe6138a66f 100644 --- a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/service/SpecManagementServiceImpl.java +++ b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/main/java/org/kie/server/controller/impl/service/SpecManagementServiceImpl.java @@ -72,11 +72,14 @@ public synchronized void saveContainerSpec(String serverTemplateId, templateStorage.update(serverTemplate); + notificationService.notify(new ServerTemplateUpdated(serverTemplate)); if (containerSpec.getStatus().equals(KieContainerStatus.STARTED)) { List containers = kieServerInstanceManager.startContainer(serverTemplate, containerSpec); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } } @@ -130,7 +133,9 @@ public synchronized void updateContainerSpec(String serverTemplateId, String con // in case container was started before it was update or update comes with status started update container in running servers if (currentVersion.getStatus().equals(KieContainerStatus.STARTED) || containerSpec.getStatus().equals(KieContainerStatus.STARTED)) { List containers = kieServerInstanceManager.upgradeAndStartContainer(serverTemplate, containerSpec, resetBeforeUpdate); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } } @@ -150,7 +155,9 @@ public synchronized void saveServerTemplate(ServerTemplate serverTemplate) { for (ContainerSpec containerSpec : containerSpecs) { if (containerSpec.getStatus().equals(KieContainerStatus.STARTED)) { List containers = kieServerInstanceManager.startContainer(serverTemplate, containerSpec); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } } } @@ -414,7 +421,9 @@ public synchronized void startContainer(ContainerSpecKey containerSpecKey) { List containers = kieServerInstanceManager.startContainer(serverTemplate, containerSpec); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } @Override @@ -435,7 +444,9 @@ public synchronized void stopContainer(ContainerSpecKey containerSpecKey) { List containers = kieServerInstanceManager.stopContainer(serverTemplate, containerSpec); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } @Override @@ -460,7 +471,9 @@ public synchronized void activateContainer(ContainerSpecKey containerSpecKey) { List containers = kieServerInstanceManager.activateContainer(serverTemplate, containerSpec); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } @Override @@ -485,7 +498,9 @@ public synchronized void deactivateContainer(ContainerSpecKey containerSpecKey) List containers = kieServerInstanceManager.deactivateContainer(serverTemplate, containerSpec); - notificationService.notify(serverTemplate, containerSpec, containers); + if(!kieServerInstanceManager.isAsync()) { + notificationService.notify(serverTemplate, containerSpec, containers); + } } @Override diff --git a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/test/java/org/kie/server/controller/impl/KieServerInstanceManagerTest.java b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/test/java/org/kie/server/controller/impl/KieServerInstanceManagerTest.java index 6053ecf200..dc91ea274a 100644 --- a/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/test/java/org/kie/server/controller/impl/KieServerInstanceManagerTest.java +++ b/kie-server-parent/kie-server-controller/kie-server-controller-impl/src/test/java/org/kie/server/controller/impl/KieServerInstanceManagerTest.java @@ -108,7 +108,7 @@ public void testGetContainers() { @Test public void testGetContainersRemoteOperationWhenResponseTypeIsSUCCESS() { - + doReturn(KieContainerStatus.STARTED).when(container).getStatus(); doReturn(containerResource).when(response).getResult(); doReturn(response).when(client).getContainerInfo(any()); doReturn(ServiceResponse.ResponseType.SUCCESS).when(response).getType(); diff --git a/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/KieServerImpl.java b/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/KieServerImpl.java index cb696ab04f..c20ffc765f 100644 --- a/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/KieServerImpl.java +++ b/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/KieServerImpl.java @@ -322,7 +322,7 @@ public ServiceResponse createContainer(String containerId, currentState.getContainers().add(container); }); eventSupport.fireAfterContainerStarted(this, ci); - getDefaultController().update(getInternalServerState()); + notifyStatusToControllers(); return new ServiceResponse(ServiceResponse.ResponseType.SUCCESS, "Container " + containerId + " successfully deployed with module " + releaseId + ".", ci.getResource()); } else { ci.getResource().setStatus(KieContainerStatus.FAILED); @@ -432,7 +432,7 @@ public ServiceResponse activateContainer(String containerI }); eventSupport.fireAfterContainerActivated(this, kci); - getDefaultController().update(getInternalServerState()); + notifyStatusToControllers(); messages.add(new Message(Severity.INFO, "Container " + containerId + " activated successfully.")); return new ServiceResponse(ServiceResponse.ResponseType.SUCCESS, "Container " + containerId + " activated successfully.", kci.getResource()); } @@ -481,7 +481,7 @@ public ServiceResponse deactivateContainer(String containe }); eventSupport.fireAfterContainerDeactivated(this, kci); - getDefaultController().update(getInternalServerState()); + notifyStatusToControllers(); messages.add(new Message(Severity.INFO, "Container " + containerId + " deactivated successfully.")); return new ServiceResponse(ServiceResponse.ResponseType.SUCCESS, "Container " + containerId + " deactivated successfully.", kci.getResource()); } @@ -614,7 +614,7 @@ public ServiceResponse disposeContainer(String containerId) { messages.add(new Message(Severity.INFO, "Container " + containerId + " successfully stopped.")); eventSupport.fireAfterContainerStopped(this, kci); - getDefaultController().update(getInternalServerState()); + notifyStatusToControllers(); return new ServiceResponse(ServiceResponse.ResponseType.SUCCESS, "Container " + containerId + " successfully disposed."); } else { messages.add(new Message(Severity.INFO, "Container " + containerId + " was not instantiated.")); @@ -678,7 +678,7 @@ public ServiceResponse updateScanner(String id, KieScannerRe } }); }); - getDefaultController().update(getInternalServerState()); + notifyStatusToControllers(); return scannerResponse; } } else { @@ -955,7 +955,7 @@ public ServiceResponse updateContainerReleaseId(String containerId, R logger.info("Container {} successfully updated to release id {}", containerId, releaseId); ks.getRepository().removeKieModule(originalReleaseId); - getDefaultController().update(getInternalServerState()); + notifyStatusToControllers(); messages.add(new Message(Severity.INFO, "Release id successfully updated for container " + containerId)); return new ServiceResponse(ServiceResponse.ResponseType.SUCCESS, "Release id successfully updated.", kci.getResource().getReleaseId()); } else { @@ -1108,6 +1108,17 @@ protected KieServerController getController() { return controller; } + protected void notifyStatusToControllers() { + new Thread(() -> { + try { + Thread.sleep(Long.getLong(KieServerConstants.KIE_SERVER_NOTIFY_UPDATES_TO_CONTROLLERS_DELAY, 1000L)); + getDefaultController().update(getInternalServerState()); + } catch (InterruptedException e) { + // do nothing + } + }).start(); + } + protected KieServerController getDefaultController() { return new DefaultRestControllerImpl(context); } diff --git a/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/controller/DefaultRestControllerImpl.java b/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/controller/DefaultRestControllerImpl.java index f5dc067599..764814e72b 100644 --- a/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/controller/DefaultRestControllerImpl.java +++ b/kie-server-parent/kie-server-services/kie-server-services-common/src/main/java/org/kie/server/services/impl/controller/DefaultRestControllerImpl.java @@ -146,16 +146,21 @@ public KieServerSetup connect(KieServerInfo serverInfo) { KieServerConfig config = currentState.getConfiguration(); if (controllers != null && !controllers.isEmpty()) { + KieServerSetup kieServerSetup = null; for (String controllerUrl : controllers) { if (controllerUrl != null && !controllerUrl.isEmpty()) { - KieServerSetup kieServerSetup = connectToSingleController(serverInfo, config, controllerUrl); - if (kieServerSetup != null && kieServerSetup.hasNoErrors()) { - return kieServerSetup; + KieServerSetup kieServerSetupController = connectToSingleController(serverInfo, config, controllerUrl); + if (kieServerSetup == null && kieServerSetupController != null && kieServerSetupController.hasNoErrors()) { + kieServerSetup = kieServerSetupController; } } } + if (kieServerSetup != null) { + return kieServerSetup; + } + throw new KieControllerNotConnectedException("Unable to connect to any controller"); } else { throw new KieControllerNotDefinedException("Unable to connect to any controller"); @@ -170,13 +175,8 @@ public void disconnect(KieServerInfo serverInfo) { KieServerConfig config = currentState.getConfiguration(); for (String controllerUrl : controllers ) { - if (controllerUrl != null && !controllerUrl.isEmpty()) { - - boolean disconnected = disconnectFromSingleController(serverInfo, config, controllerUrl); - if (disconnected) { - break; - } + disconnectFromSingleController(serverInfo, config, controllerUrl); } } } @@ -212,9 +212,7 @@ public KieServerSetup update(KieServerStateInfo serverTemplateUpdate) { } } - } else { - logger.warn("No controllers found to update to new status {}", serverTemplateUpdate); - } + } // we return one of them coming fron the controller return kieServerSetup; }