/* * Copyright 2016 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.controller.impl.service; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.kie.server.api.model.KieContainerStatus; import org.kie.server.api.model.KieScannerStatus; import org.kie.server.api.model.ReleaseId; import org.kie.server.controller.api.model.runtime.Container; 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.api.model.spec.ServerTemplateKey; import org.kie.server.controller.impl.KieServerInstanceManager; import org.kie.server.controller.impl.storage.InMemoryKieServerTemplateStorage; import org.mockito.Mockito; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; public class SpecManagementServiceImplTest extends AbstractServiceImplTest { @Before public void setup() { specManagementService = new SpecManagementServiceImpl(); kieServerInstanceManager = Mockito.mock(KieServerInstanceManager.class); ((SpecManagementServiceImpl)specManagementService).setKieServerInstanceManager(kieServerInstanceManager); } @After public void cleanup() { InMemoryKieServerTemplateStorage.getInstance().clear(); } @Test public void testCreateServerTemplate() { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server"); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(1, existing.size()); org.kie.server.controller.api.model.spec.ServerTemplateKey saved = existing.iterator().next(); assertEquals(serverTemplate.getName(), saved.getName()); assertEquals(serverTemplate.getId(), saved.getId()); } @Test public void testCreateServerTemplateAndContainer() { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server"); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(1, existing.size()); Map<Capability, ContainerConfig> configs = new HashMap<Capability, ContainerConfig>(); RuleConfig ruleConfig = new RuleConfig(); ruleConfig.setPollInterval(1000l); ruleConfig.setScannerStatus(KieScannerStatus.STARTED); configs.put(Capability.RULE, ruleConfig); ProcessConfig processConfig = new ProcessConfig(); processConfig.setKBase("defaultKieBase"); processConfig.setKSession("defaultKieSession"); processConfig.setMergeMode("MERGE_COLLECTION"); processConfig.setRuntimeStrategy("PER_PROCESS_INSTANCE"); configs.put(Capability.PROCESS, processConfig); ContainerSpec containerSpec = new ContainerSpec(); containerSpec.setId("test container"); containerSpec.setServerTemplateKey(new ServerTemplateKey(serverTemplate.getId(), serverTemplate.getName())); containerSpec.setReleasedId(new ReleaseId("org.kie", "kie-server-kjar", "1.0")); containerSpec.setStatus(KieContainerStatus.STOPPED); containerSpec.setConfigs(configs); specManagementService.saveContainerSpec(serverTemplate.getId(), containerSpec); org.kie.server.controller.api.model.spec.ServerTemplate createdServerTemplate = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(createdServerTemplate); assertNotNull(createdServerTemplate.getContainersSpec()); assertEquals(1, createdServerTemplate.getContainersSpec().size()); org.kie.server.controller.api.model.spec.ContainerSpec container = createdServerTemplate.getContainersSpec().iterator().next(); assertNotNull(container); assertEquals(containerSpec.getId(), container.getId()); assertEquals(containerSpec.getStatus(), container.getStatus()); assertEquals(containerSpec.getServerTemplateKey(), container.getServerTemplateKey()); assertEquals(containerSpec.getReleasedId(), container.getReleasedId()); assertNotNull(container.getConfigs()); assertEquals(containerSpec.getConfigs().size(), container.getConfigs().size()); Collection<org.kie.server.controller.api.model.spec.ContainerSpec> specs = specManagementService.listContainerSpec(serverTemplate.getId()); assertNotNull(specs); assertEquals(1, specs.size()); container = specs.iterator().next(); assertNotNull(container); assertEquals(containerSpec.getId(), container.getId()); assertEquals(containerSpec.getStatus(), container.getStatus()); assertEquals(containerSpec.getServerTemplateKey(), container.getServerTemplateKey()); assertEquals(containerSpec.getReleasedId(), container.getReleasedId()); assertNotNull(container.getConfigs()); assertEquals(containerSpec.getConfigs().size(), container.getConfigs().size()); } @Test public void testListServerTemplates() { int limit = getRandomInt(5, 10); for (int x = 0; x < limit; x++) { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server " + x); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); } Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(limit, existing.size()); Collection<org.kie.server.controller.api.model.spec.ServerTemplate> allTemplates = specManagementService.listServerTemplates(); assertNotNull(allTemplates); assertEquals(limit, allTemplates.size()); } @Test public void testCreateAndDeleteServerTemplate() { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server"); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(1, existing.size()); org.kie.server.controller.api.model.spec.ServerTemplateKey saved = existing.iterator().next(); assertEquals(serverTemplate.getName(), saved.getName()); assertEquals(serverTemplate.getId(), saved.getId()); specManagementService.deleteServerTemplate(serverTemplate.getId()); existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(0, existing.size()); } @Test public void testCreateServerTemplateAndAddRemoveContainer() { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server"); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(1, existing.size()); int limit = getRandomInt(3, 6); for (int x = 0; x < limit; x++) { Map<Capability, ContainerConfig> configs = new HashMap<Capability, ContainerConfig>(); RuleConfig ruleConfig = new RuleConfig(); ruleConfig.setPollInterval(1000l); ruleConfig.setScannerStatus(KieScannerStatus.STARTED); ProcessConfig processConfig = new ProcessConfig(); processConfig.setKBase("defaultKieBase"); processConfig.setKSession("defaultKieSession"); processConfig.setMergeMode("MERGE_COLLECTION"); processConfig.setRuntimeStrategy("PER_PROCESS_INSTANCE"); ContainerSpec containerSpec = new ContainerSpec(); containerSpec.setId("test container " + x); containerSpec.setServerTemplateKey(new ServerTemplateKey(serverTemplate.getId(), serverTemplate.getName())); containerSpec.setReleasedId(new ReleaseId("org.kie", "kie-server-kjar", x + ".0")); containerSpec.setStatus(KieContainerStatus.STOPPED); containerSpec.setConfigs(configs); specManagementService.saveContainerSpec(serverTemplate.getId(), containerSpec); } org.kie.server.controller.api.model.spec.ServerTemplate createdServerTemplate = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(createdServerTemplate); assertNotNull(createdServerTemplate.getContainersSpec()); assertEquals(limit, createdServerTemplate.getContainersSpec().size()); // remove first container with suffix 0 specManagementService.deleteContainerSpec(serverTemplate.getId(), "test container " + 0); createdServerTemplate = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(createdServerTemplate); assertNotNull(createdServerTemplate.getContainersSpec()); assertEquals(limit-1, createdServerTemplate.getContainersSpec().size()); } @Test public void testCreateServerTemplateAndCreateThenCopyContainer() { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server"); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(1, existing.size()); Map<Capability, ContainerConfig> configs = new HashMap<Capability, ContainerConfig>(); RuleConfig ruleConfig = new RuleConfig(); ruleConfig.setPollInterval(1000l); ruleConfig.setScannerStatus(KieScannerStatus.STARTED); ProcessConfig processConfig = new ProcessConfig(); processConfig.setKBase("defaultKieBase"); processConfig.setKSession("defaultKieSession"); processConfig.setMergeMode("MERGE_COLLECTION"); processConfig.setRuntimeStrategy("PER_PROCESS_INSTANCE"); ContainerSpec containerSpec = new ContainerSpec(); containerSpec.setId("test container"); containerSpec.setServerTemplateKey(new ServerTemplateKey(serverTemplate.getId(), serverTemplate.getName())); containerSpec.setReleasedId(new ReleaseId("org.kie", "kie-server-kjar", "1.0")); containerSpec.setStatus(KieContainerStatus.STOPPED); containerSpec.setConfigs(configs); specManagementService.saveContainerSpec(serverTemplate.getId(), containerSpec); org.kie.server.controller.api.model.spec.ServerTemplate createdServerTemplate = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(createdServerTemplate); assertNotNull(createdServerTemplate.getContainersSpec()); assertEquals(1, createdServerTemplate.getContainersSpec().size()); org.kie.server.controller.api.model.spec.ContainerSpec container = createdServerTemplate.getContainersSpec().iterator().next(); assertNotNull(container); assertEquals(containerSpec.getId(), container.getId()); assertEquals(containerSpec.getStatus(), container.getStatus()); assertEquals(containerSpec.getServerTemplateKey(), container.getServerTemplateKey()); assertEquals(containerSpec.getReleasedId(), container.getReleasedId()); assertNotNull(container.getConfigs()); assertEquals(containerSpec.getConfigs().size(), container.getConfigs().size()); String newServerTemplateId = "Copied server id"; String newServerTemplateName = "Copied server name"; specManagementService.copyServerTemplate(serverTemplate.getId(), newServerTemplateId, newServerTemplateName); existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(2, existing.size()); createdServerTemplate = specManagementService.getServerTemplate(newServerTemplateId); assertNotNull(createdServerTemplate); assertEquals(newServerTemplateName, createdServerTemplate.getName()); assertEquals(newServerTemplateId, createdServerTemplate.getId()); assertNotNull(createdServerTemplate.getContainersSpec()); assertEquals(1, createdServerTemplate.getContainersSpec().size()); container = createdServerTemplate.getContainersSpec().iterator().next(); assertNotNull(container); assertEquals(containerSpec.getId(), container.getId()); assertEquals(containerSpec.getStatus(), container.getStatus()); assertEquals(newServerTemplateId, container.getServerTemplateKey().getId()); assertEquals(newServerTemplateName, container.getServerTemplateKey().getName()); assertEquals(containerSpec.getReleasedId(), container.getReleasedId()); assertNotNull(container.getConfigs()); assertEquals(containerSpec.getConfigs().size(), container.getConfigs().size()); } @Test public void testCreateServerTemplateAndUpdateContainerConfig() { ServerTemplate serverTemplate = new ServerTemplate(); serverTemplate.setName("test server"); serverTemplate.setId(UUID.randomUUID().toString()); specManagementService.saveServerTemplate(serverTemplate); Collection<org.kie.server.controller.api.model.spec.ServerTemplateKey> existing = specManagementService.listServerTemplateKeys(); assertNotNull(existing); assertEquals(1, existing.size()); Map<Capability, ContainerConfig> configs = new HashMap<Capability, ContainerConfig>(); RuleConfig ruleConfig = new RuleConfig(); ruleConfig.setPollInterval(1000l); ruleConfig.setScannerStatus(KieScannerStatus.STARTED); configs.put(Capability.RULE, ruleConfig); ProcessConfig processConfig = new ProcessConfig(); processConfig.setKBase("defaultKieBase"); processConfig.setKSession("defaultKieSession"); processConfig.setMergeMode("MERGE_COLLECTION"); processConfig.setRuntimeStrategy("PER_PROCESS_INSTANCE"); configs.put(Capability.PROCESS, processConfig); ContainerSpec containerSpec = new ContainerSpec(); containerSpec.setId("test container"); containerSpec.setServerTemplateKey(new ServerTemplateKey(serverTemplate.getId(), serverTemplate.getName())); containerSpec.setReleasedId(new ReleaseId("org.kie", "kie-server-kjar", "1.0")); containerSpec.setStatus(KieContainerStatus.STOPPED); containerSpec.setConfigs(configs); specManagementService.saveContainerSpec(serverTemplate.getId(), containerSpec); org.kie.server.controller.api.model.spec.ServerTemplate createdServerTemplate = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(createdServerTemplate); assertNotNull(createdServerTemplate.getContainersSpec()); assertEquals(1, createdServerTemplate.getContainersSpec().size()); org.kie.server.controller.api.model.spec.ContainerSpec container = createdServerTemplate.getContainersSpec().iterator().next(); assertNotNull(container); assertEquals(containerSpec.getId(), container.getId()); assertEquals(containerSpec.getStatus(), container.getStatus()); assertEquals(containerSpec.getServerTemplateKey(), container.getServerTemplateKey()); assertEquals(containerSpec.getReleasedId(), container.getReleasedId()); assertNotNull(container.getConfigs()); assertEquals(containerSpec.getConfigs().size(), container.getConfigs().size()); ContainerConfig ruleConfigCurrent = containerSpec.getConfigs().get(Capability.RULE); assertNotNull(ruleConfigCurrent); assertTrue(ruleConfigCurrent instanceof org.kie.server.controller.api.model.spec.RuleConfig); assertEquals(ruleConfig.getPollInterval(), ((org.kie.server.controller.api.model.spec.RuleConfig)ruleConfigCurrent).getPollInterval()); assertEquals(ruleConfig.getScannerStatus(), ((org.kie.server.controller.api.model.spec.RuleConfig)ruleConfigCurrent).getScannerStatus()); ContainerConfig containerConfig = new RuleConfig(); ((RuleConfig) containerConfig).setScannerStatus(KieScannerStatus.SCANNING); ((RuleConfig) containerConfig).setPollInterval(10l); specManagementService.updateContainerConfig(serverTemplate.getId(), containerSpec.getId(), Capability.RULE, containerConfig); Collection<org.kie.server.controller.api.model.spec.ContainerSpec> specs = specManagementService.listContainerSpec(serverTemplate.getId()); assertNotNull(specs); assertEquals(1, specs.size()); container = specs.iterator().next(); assertNotNull(container); assertEquals(containerSpec.getId(), container.getId()); assertEquals(containerSpec.getStatus(), container.getStatus()); assertEquals(containerSpec.getServerTemplateKey(), container.getServerTemplateKey()); assertEquals(containerSpec.getReleasedId(), container.getReleasedId()); assertNotNull(container.getConfigs()); assertEquals(containerSpec.getConfigs().size(), container.getConfigs().size()); ContainerConfig ruleConfigCurrent2 = containerSpec.getConfigs().get(Capability.RULE); assertNotNull(ruleConfigCurrent2); assertTrue(ruleConfigCurrent2 instanceof org.kie.server.controller.api.model.spec.RuleConfig); assertEquals(((org.kie.server.controller.api.model.spec.RuleConfig)containerConfig).getPollInterval(), ((org.kie.server.controller.api.model.spec.RuleConfig)ruleConfigCurrent2).getPollInterval()); assertEquals(((org.kie.server.controller.api.model.spec.RuleConfig)containerConfig).getScannerStatus(), ((org.kie.server.controller.api.model.spec.RuleConfig)ruleConfigCurrent2).getScannerStatus()); } @Test public void testStartContainer() { createServerTemplateWithContainer(); List<Container> fakeResult = new ArrayList<Container>(); fakeResult.add(container); when(kieServerInstanceManager.startContainer(any(ServerTemplate.class), any(ContainerSpec.class))).thenReturn(fakeResult); specManagementService.startContainer(containerSpec); verify(kieServerInstanceManager, times(1)).startContainer(any(ServerTemplate.class), any(ContainerSpec.class)); ServerTemplate updated = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(updated); ContainerSpec updatedContainer = updated.getContainerSpec(containerSpec.getId()); assertNotNull(updatedContainer); assertEquals(KieContainerStatus.STARTED, updatedContainer.getStatus()); } @Test public void testStopContainer() { createServerTemplateWithContainer(); List<Container> fakeResult = new ArrayList<Container>(); fakeResult.add(container); when(kieServerInstanceManager.stopContainer(any(ServerTemplate.class), any(ContainerSpec.class))).thenReturn(fakeResult); specManagementService.stopContainer(containerSpec); verify(kieServerInstanceManager, times(1)).stopContainer(any(ServerTemplate.class), any(ContainerSpec.class)); ServerTemplate updated = specManagementService.getServerTemplate(serverTemplate.getId()); assertNotNull(updated); ContainerSpec updatedContainer = updated.getContainerSpec(containerSpec.getId()); assertNotNull(updatedContainer); assertEquals(KieContainerStatus.STOPPED, updatedContainer.getStatus()); } protected int getRandomInt(int min, int max) { return (int) Math.floor(Math.random() * (max - min + 1)) + min; } }