Skip to content

Commit

Permalink
JBPM-6833 - Server template id should match exactly (kiegroup#982)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristianonicolai authored Feb 15, 2018
1 parent f45f673 commit c431579
Show file tree
Hide file tree
Showing 3 changed files with 429 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import org.slf4j.LoggerFactory;
import org.uberfire.commons.services.cdi.Startup;

import static java.util.Collections.emptyMap;
import static org.jbpm.workbench.ks.utils.KieServerUtils.*;

@Startup
Expand All @@ -61,9 +62,11 @@ public class KieServerIntegration {

private static final Logger logger = LoggerFactory.getLogger(KieServerIntegration.class);

protected static final String SERVER_TEMPLATE_KEY = "_SERVER_TEMPLATE_MAIN_CLIENT_";

private KieServices kieServices;

private ConcurrentMap<String, KieServicesClient> serverTemplatesClients = new ConcurrentHashMap<String, KieServicesClient>();
private ConcurrentMap<String, Map<String, KieServicesClient>> serverTemplatesClients = new ConcurrentHashMap<String, Map<String, KieServicesClient>>();
private ConcurrentMap<String, KieServicesClient> adminClients = new ConcurrentHashMap<String, KieServicesClient>();
private ConcurrentMap<String, ServerInstanceKey> serverInstancesById = new ConcurrentHashMap<String, ServerInstanceKey>();

Expand All @@ -85,10 +88,8 @@ public void createAvailableClients() {
if (!provider.supports("http")) {
clientProviders.add(provider);
}

});


clientProviders.sort((KieServicesClientProvider one, KieServicesClientProvider two) -> one.getPriority().compareTo(two.getPriority()));

kieServices = KieServices.Factory.get();
Expand All @@ -102,16 +103,23 @@ public void createAvailableClients() {
}
}

protected void setKieServices(final KieServices kieServices) {
this.kieServices = kieServices;
}

public KieServicesClient getServerClient(String serverTemplateId) {
return serverTemplatesClients.get(serverTemplateId);
return serverTemplatesClients.getOrDefault(serverTemplateId,
emptyMap()).get(SERVER_TEMPLATE_KEY);
}

public KieServicesClient getServerClient(String serverTemplateId,
String containerId) {
return serverTemplatesClients.get(serverTemplateId + "|" + containerId);
return serverTemplatesClients.getOrDefault(serverTemplateId,
emptyMap()).get(containerId);
}

public KieServicesClient getAdminServerClient(String serverTemplateId, String serverInstanceId) {
public KieServicesClient getAdminServerClient(String serverTemplateId,
String serverInstanceId) {
try {
ServerInstanceKey instance = specManagementService.getServerTemplate(serverTemplateId).getServerInstanceKeys()
.stream()
Expand All @@ -125,10 +133,10 @@ public KieServicesClient getAdminServerClient(String serverTemplateId, String se
.findFirst()
.get()
.get(url);
logger.debug("Using client {}", client);
logger.debug("Using client {}",
client);
return client;
} catch (Exception e) {

return adminClients.get(serverTemplateId);
}
}
Expand All @@ -143,10 +151,8 @@ public KieServicesClient getAdminServerClientCheckEndpoints(String serverTemplat
}

protected void indexServerInstances(ServerTemplate serverTemplate) {
for (ServerInstanceKey serverInstanceKey : serverTemplate.getServerInstanceKeys()) {
serverInstancesById.put(serverInstanceKey.getServerInstanceId(),
serverInstanceKey);
}
serverTemplate.getServerInstanceKeys().forEach(serverInstanceKey -> serverInstancesById.put(serverInstanceKey.getServerInstanceId(),
serverInstanceKey));
}

protected void removeServerInstancesFromIndex(String serverTemplateId) {
Expand All @@ -165,18 +171,12 @@ public void onServerTemplateDeleted(@Observes ServerTemplateUpdated serverTempla

public void onServerTemplateDeleted(@Observes ServerTemplateDeleted serverTemplateDeleted) {
// remove all clients for this server template and its containers
Iterator<Map.Entry<String, KieServicesClient>> iterator = serverTemplatesClients.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, KieServicesClient> entry = iterator.next();
if (entry.getKey().startsWith(serverTemplateDeleted.getServerTemplateId())) {
//KieServicesClient client = entry.getValue();
//client.close();
logger.debug("KieServerClient removed and closed for server template {}",
entry.getKey());

iterator.remove();
}
final Map<String, KieServicesClient> clients = serverTemplatesClients.remove(serverTemplateDeleted.getServerTemplateId());
if (clients != null) {
logger.debug("KieServerClient removed and closed for server template {}",
serverTemplateDeleted.getServerTemplateId());
}

// remove admin client
adminClients.remove(serverTemplateDeleted.getServerTemplateId());

Expand All @@ -187,24 +187,21 @@ public void onServerInstanceDisconnected(@Observes ServerInstanceDisconnected se
ServerInstanceKey serverInstanceKey = serverInstancesById.get(serverInstanceDisconnected.getServerInstanceId());

if (serverInstanceKey != null) {
Iterator<Map.Entry<String, KieServicesClient>> iterator = serverTemplatesClients.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, KieServicesClient> entry = iterator.next();
if (entry.getKey().startsWith(serverInstanceKey.getServerTemplateId())) {
KieServicesClient client = entry.getValue();
if (client != null) {
LoadBalancer loadBalancer = ((AbstractKieServicesClientImpl) client).getLoadBalancer();
loadBalancer.markAsFailed(serverInstanceKey.getUrl());

logger.debug("Server instance {} for server template {} removed from client thus won't be used for operations",
serverInstanceKey.getUrl(),
serverInstanceKey.getServerTemplateId());
}

logger.debug("KieServerClient load balancer updated for server template {}",
entry.getKey());
}
}
serverTemplatesClients.computeIfPresent(serverInstanceKey.getServerTemplateId(),
(serverTemplateId, clients) -> {
clients.forEach((key, client) -> {
LoadBalancer loadBalancer = ((AbstractKieServicesClientImpl) client).getLoadBalancer();
loadBalancer.markAsFailed(serverInstanceKey.getUrl());

logger.debug("Server instance '{}' for server template {} removed from client thus won't be used for operations",
serverInstanceKey.getUrl(),
serverInstanceKey.getServerTemplateId());

logger.debug("KieServerClient load balancer updated for server template {}",
serverTemplateId.equals(SERVER_TEMPLATE_KEY) ? serverInstanceKey.getServerTemplateId() : serverTemplateId);
});
return clients;
});

serverInstancesById.remove(serverInstanceKey.getServerInstanceId());

Expand All @@ -222,22 +219,23 @@ public void onServerInstanceDisconnected(@Observes ServerInstanceDisconnected se
}

public void onServerInstanceConnected(@Observes ServerInstanceConnected serverInstanceConnected) {

ServerInstance serverInstance = serverInstanceConnected.getServerInstance();

Iterator<Map.Entry<String, KieServicesClient>> iterator = serverTemplatesClients.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, KieServicesClient> entry = iterator.next();
if (entry.getKey().startsWith(serverInstance.getServerTemplateId())) {
KieServicesClient client = entry.getValue();
// update regular clients
updateOrBuildClient(client,
serverInstance);

logger.debug("KieServerClient load balancer updated for server template {}",
entry.getKey());
}
}
serverTemplatesClients.computeIfPresent(serverInstance.getServerTemplateId(),
(serverTemplateId, clients) -> {
clients.forEach((key, client) -> {
// update regular clients
updateOrBuildClient(client,
serverInstance);

logger.debug("KieServerClient load balancer updated for server template {}",
serverTemplateId.equals(SERVER_TEMPLATE_KEY) ? serverInstance.getServerTemplateId() : serverTemplateId);
});
return clients;
});

serverInstancesById.put(serverInstance.getServerInstanceId(),
serverInstance);

KieServicesClient adminClient = adminClients.get(serverInstance.getServerTemplateId());
// update admin clients
Expand Down Expand Up @@ -271,17 +269,18 @@ protected void buildClientsForServer(ServerTemplate serverTemplate) {
null,
getCredentialsProvider());
if (kieServicesClient != null) {
serverTemplatesClients.put(serverTemplate.getId(),
kieServicesClient);
serverTemplatesClients.computeIfAbsent(serverTemplate.getId(),
(k) -> new ConcurrentHashMap<String, KieServicesClient>());
serverTemplatesClients.get(serverTemplate.getId()).put(SERVER_TEMPLATE_KEY,
kieServicesClient);
}

if (serverTemplate.getContainersSpec() != null) {
for (ContainerSpec containerSpec : serverTemplate.getContainersSpec()) {
try {
String key = serverTemplate.getId() + "|" + containerSpec.getId();
if (serverTemplatesClients.containsKey(key)) {
if (serverTemplatesClients.get(serverTemplate.getId()).containsKey(containerSpec.getId())) {
logger.debug("KieServerClient for {} is already created",
key);
containerSpec.getId());
continue;
}

Expand All @@ -291,8 +290,8 @@ protected void buildClientsForServer(ServerTemplate serverTemplate) {
kieContainer.getClassLoader(),
getCredentialsProvider());
if (kieServicesClient != null) {
serverTemplatesClients.put(key,
kieServicesClientForContainer);
serverTemplatesClients.get(serverTemplate.getId()).put(containerSpec.getId(),
kieServicesClientForContainer);
}
} catch (Exception e) {
logger.warn("Failed ot create kie server client for container {} due to {}",
Expand Down Expand Up @@ -346,7 +345,7 @@ protected KieServicesClient createClientForTemplate(ServerTemplate serverTemplat
mappedCapabilities.toArray(new String[mappedCapabilities.size()]));

logger.debug("KieServerClient created successfully for server template {}",
serverTemplate);
serverTemplate.getId());

indexServerInstances(serverTemplate);

Expand All @@ -359,4 +358,12 @@ protected KieServicesClient createClientForTemplate(ServerTemplate serverTemplat
return null;
}
}

protected Map<String, Map<String, KieServicesClient>> getServerTemplatesClients() {
return serverTemplatesClients;
}

protected Map<String, ServerInstanceKey> getServerInstancesById() {
return serverInstancesById;
}
}
Loading

0 comments on commit c431579

Please sign in to comment.