/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.server.integrationtests.controller;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeThat;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
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.KieScannerStatus;
import org.kie.server.api.model.KieServerConfigItem;
import org.kie.server.api.model.KieServerInfo;
import org.kie.server.api.model.ReleaseId;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.controller.api.ModelFactory;
import org.kie.server.controller.api.model.spec.Capability;
import org.kie.server.controller.api.model.spec.ContainerConfig;
import org.kie.server.controller.api.model.spec.ContainerSpec;
import org.kie.server.controller.api.model.spec.ProcessConfig;
import org.kie.server.controller.api.model.spec.RuleConfig;
import org.kie.server.controller.api.model.spec.ServerTemplate;
import org.kie.server.controller.impl.storage.InMemoryKieServerTemplateStorage;
import org.kie.server.integrationtests.shared.KieServerDeployer;
import org.kie.server.integrationtests.shared.KieServerSynchronization;
public class ContainerConfigPropagationIntegrationTest extends KieControllerManagementBaseTest {
private static ReleaseId releaseId = new ReleaseId("org.kie.server.testing", "stateless-session-kjar", "1.0.0");
private static ReleaseId releaseId101 = new ReleaseId("org.kie.server.testing", "stateless-session-kjar", "1.0.1");
private static ReleaseId releaseIdLatest = new ReleaseId("org.kie.server.testing", "stateless-session-kjar", "LATEST");
private static final String CONTAINER_ID = "kie-concurrent";
private static final String CONTAINER_NAME = "containerName";
private KieServerInfo kieServerInfo;
@BeforeClass
public static void initialize() throws Exception {
KieServerDeployer.buildAndDeployCommonMavenParent();
KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/stateless-session-kjar").getFile());
KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/stateless-session-kjar101").getFile());
}
@Before
public void getKieServerInfo() {
InMemoryKieServerTemplateStorage.getInstance().clear();
// Getting info from currently started kie server.
ServiceResponse<KieServerInfo> reply = client.getServerInfo();
assumeThat(reply.getType(), is(ServiceResponse.ResponseType.SUCCESS));
kieServerInfo = reply.getResult();
}
@Test
public void testPropagateScannerContainerConfig() throws Exception {
Long pollInterval = 500L;
ServerTemplate serverTemplate = createServerTemplate();
Map<Capability, ContainerConfig> containerConfigMap = new HashMap<>();
RuleConfig ruleConfig = new RuleConfig(pollInterval, KieScannerStatus.STARTED);
containerConfigMap.put(Capability.RULE, ruleConfig);
// Deploy container for kie server instance with started scanner.
ContainerSpec containerToDeploy = new ContainerSpec(CONTAINER_ID, CONTAINER_NAME, serverTemplate, releaseId, KieContainerStatus.STARTED, containerConfigMap);
mgmtControllerClient.saveContainerSpec(serverTemplate.getId(), containerToDeploy);
// Check that container is deployed in kie server.
KieServerSynchronization.waitForKieServerSynchronization(client, 1);
assertContainerInfoWithScanner(releaseId, pollInterval);
containerToDeploy.setReleasedId(releaseIdLatest);
mgmtControllerClient.updateContainerSpec(serverTemplate.getId(), containerToDeploy);
// Check that container is updated
KieServerSynchronization.waitForContainerWithReleaseId(client, releaseId101);
assertContainerInfoWithScanner(releaseId101, pollInterval);
}
@Test
public void testPropagateProcessContainerConfig() throws Exception {
ServerTemplate serverTemplate = createServerTemplate();
Map<Capability, ContainerConfig> containerConfigMap = new HashMap<>();
ProcessConfig processConfig = new ProcessConfig("PER_PROCESS_INSTANCE", "kieBase", "kieSession", "MERGE_COLLECTION");
containerConfigMap.put(Capability.PROCESS, processConfig);
ContainerSpec containerToDeploy = new ContainerSpec(CONTAINER_ID, CONTAINER_NAME, serverTemplate, releaseId, KieContainerStatus.STARTED, containerConfigMap);
mgmtControllerClient.saveContainerSpec(serverTemplate.getId(), containerToDeploy);
KieServerSynchronization.waitForKieServerSynchronization(client, 1);
ServiceResponse<KieContainerResource> containerInfo = client.getContainerInfo(CONTAINER_ID);
assertEquals(ServiceResponse.ResponseType.SUCCESS, containerInfo.getType());
assertEquals(CONTAINER_ID, containerInfo.getResult().getContainerId());
assertEquals(KieContainerStatus.STARTED, containerInfo.getResult().getStatus());
assertEquals(4, containerInfo.getResult().getConfigItems().size());
assertTrue(containsConfigItem(containerInfo.getResult(), KieServerConstants.PCFG_RUNTIME_STRATEGY, "PER_PROCESS_INSTANCE", KieServerConstants.CAPABILITY_BPM));
assertTrue(containsConfigItem(containerInfo.getResult(), KieServerConstants.PCFG_KIE_BASE, "kieBase", KieServerConstants.CAPABILITY_BPM));
assertTrue(containsConfigItem(containerInfo.getResult(), KieServerConstants.PCFG_KIE_SESSION, "kieSession", KieServerConstants.CAPABILITY_BPM));
assertTrue(containsConfigItem(containerInfo.getResult(), KieServerConstants.PCFG_MERGE_MODE, "MERGE_COLLECTION", KieServerConstants.CAPABILITY_BPM));
}
private ServerTemplate createServerTemplate() {
ServerTemplate serverTemplate = new ServerTemplate();
serverTemplate.setId(kieServerInfo.getServerId());
serverTemplate.setName(kieServerInfo.getName());
serverTemplate.addServerInstance(ModelFactory.newServerInstanceKey(serverTemplate.getId(), kieServerInfo.getLocation()));
mgmtControllerClient.saveServerTemplate(serverTemplate);
return serverTemplate;
}
private boolean containsConfigItem(KieContainerResource containerResource, String itemName, String itemValue, String itemType) {
Predicate<KieServerConfigItem> matchItem = (n -> n.getName().equals(itemName) && n.getValue().equals(itemValue) && n.getType().equals(itemType));
return containerResource.getConfigItems().stream().anyMatch(matchItem);
}
private void assertContainerInfoWithScanner(ReleaseId releaseId, Long pollInterval) {
ServiceResponse<KieContainerResource> containerInfo = client.getContainerInfo(CONTAINER_ID);
assertEquals(ServiceResponse.ResponseType.SUCCESS, containerInfo.getType());
assertEquals(CONTAINER_ID, containerInfo.getResult().getContainerId());
assertEquals(KieContainerStatus.STARTED, containerInfo.getResult().getStatus());
assertEquals(releaseId, containerInfo.getResult().getResolvedReleaseId());
assertEquals(pollInterval, containerInfo.getResult().getScanner().getPollInterval());
assertEquals(KieScannerStatus.STARTED, containerInfo.getResult().getScanner().getStatus());
}
}