package alien4cloud.orchestrator; import alien4cloud.dao.IGenericSearchDAO; import alien4cloud.deployment.DeploymentService; import alien4cloud.model.orchestrators.Orchestrator; import alien4cloud.model.orchestrators.OrchestratorConfiguration; import alien4cloud.model.orchestrators.OrchestratorState; import alien4cloud.orchestrators.locations.services.PluginArchiveIndexer; import alien4cloud.orchestrators.plugin.IOrchestratorPlugin; import alien4cloud.orchestrators.plugin.IOrchestratorPluginFactory; import alien4cloud.orchestrators.services.OrchestratorConfigurationService; import alien4cloud.orchestrators.services.OrchestratorService; import alien4cloud.orchestrators.services.OrchestratorStateService; import alien4cloud.paas.OrchestratorPluginService; import alien4cloud.paas.exception.PluginConfigurationException; import com.google.common.collect.Lists; import java.io.IOException; import java.lang.reflect.Field; import java.util.List; import java.util.concurrent.ExecutionException; import org.junit.Test; import org.mockito.Mockito; public class OrchestratorServiceTest { public static final String DEFAULT_CLOUD_CONFIGURATION = "This is the cloud configuration"; private OrchestratorPluginService orchestratorPluginService; private OrchestratorConfigurationService orchestratorConfigurationService; private IGenericSearchDAO alienDAO; private DeploymentService deploymentService; private OrchestratorStateService orchestratorStateService; private OrchestratorService orchestratorService; private PluginArchiveIndexer archiveIndexer; private void setPrivateField(Object target, String fieldName, Object fieldValue) { Field field; try { field = target.getClass().getDeclaredField(fieldName); field.setAccessible(true); field.set(target, fieldValue); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new RuntimeException("Test failed as we cannot set private field.", e); } } private void initializeMockedOrchestratorService() { alienDAO = Mockito.mock(IGenericSearchDAO.class); orchestratorConfigurationService = Mockito.mock(OrchestratorConfigurationService.class); orchestratorPluginService = Mockito.mock(OrchestratorPluginService.class); deploymentService = Mockito.mock(DeploymentService.class); orchestratorService = Mockito.mock(OrchestratorService.class); archiveIndexer = Mockito.mock(PluginArchiveIndexer.class); // initialize orchestrator state service instance with mocks orchestratorStateService = new OrchestratorStateService(); setPrivateField(orchestratorStateService, "alienDAO", alienDAO); setPrivateField(orchestratorStateService, "orchestratorConfigurationService", orchestratorConfigurationService); setPrivateField(orchestratorStateService, "orchestratorPluginService", orchestratorPluginService); setPrivateField(orchestratorStateService, "deploymentService", deploymentService); setPrivateField(orchestratorStateService, "orchestratorService", orchestratorService); setPrivateField(orchestratorStateService, "archiveIndexer", archiveIndexer); } @Test public void testInitializeNullData() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { initializeMockedOrchestratorService(); List<Orchestrator> enabledOrchestrators = Lists.newArrayList(); initSearch(enabledOrchestrators); orchestratorStateService.initialize(); } @Test public void testInitializeEmptyData() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { initializeMockedOrchestratorService(); List<Orchestrator> enabledOrchestrators = Lists.newArrayList(new Orchestrator[0]); initSearch(enabledOrchestrators); orchestratorStateService.initialize(); } @SuppressWarnings("unchecked") private void initSearch(List<Orchestrator> enabledOrchestrators) { Mockito.when(orchestratorService.getAllEnabledOrchestrators()).thenReturn(enabledOrchestrators); } private List<Orchestrator> searchOrchestrator() { Orchestrator cloud = new Orchestrator(); cloud.setId("id"); cloud.setName("name"); cloud.setState(OrchestratorState.CONNECTED); cloud.setPluginId("paasPluginId"); cloud.setPluginBean("paasPluginBean"); return Lists.newArrayList(cloud); } private void initializeAndWait() throws ExecutionException, InterruptedException { orchestratorStateService.initialize().get(); } @SuppressWarnings("unchecked") @Test public void testInitializeConfigurableOrchestratorValidConfig() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, PluginConfigurationException, ExecutionException, InterruptedException, IOException { initializeMockedOrchestratorService(); IOrchestratorPluginFactory orchestratorPluginFactory = Mockito.mock(IOrchestratorPluginFactory.class); IOrchestratorPlugin orchestratorPlugin = Mockito.mock(IOrchestratorPlugin.class); List<Orchestrator> enabledOrchestrators = searchOrchestrator(); Orchestrator orchestrator = enabledOrchestrators.get(0); OrchestratorConfiguration configuration = new OrchestratorConfiguration(orchestrator.getId(), DEFAULT_CLOUD_CONFIGURATION); initSearch(enabledOrchestrators); Mockito.when(orchestratorService.getPluginFactory(orchestrator)).thenReturn(orchestratorPluginFactory); Mockito.when(orchestratorPluginFactory.newInstance()).thenReturn(orchestratorPlugin); Mockito.when(orchestratorPluginFactory.getConfigurationType()).thenReturn(String.class); Mockito.when(orchestratorPluginFactory.getDefaultConfiguration()).thenReturn(DEFAULT_CLOUD_CONFIGURATION); Mockito.when(orchestratorConfigurationService.configurationAsValidObject(orchestrator.getId(), configuration.getConfiguration())) .thenReturn(DEFAULT_CLOUD_CONFIGURATION); Mockito.when(orchestratorConfigurationService.getConfigurationOrFail(orchestrator.getId())).thenReturn(configuration); initializeAndWait(); Mockito.verify(orchestratorPlugin, Mockito.times(1)).setConfiguration((String) configuration.getConfiguration()); Mockito.verify(orchestratorPluginService, Mockito.times(1)).register(orchestrator.getId(), orchestratorPlugin); IOrchestratorPluginFactory fatory = orchestratorService.getPluginFactory(orchestrator); Mockito.verify(archiveIndexer, Mockito.times(1)).indexOrchestratorArchives(fatory, fatory.newInstance()); ; } @SuppressWarnings("unchecked") @Test public void testInitializeConfigurableOrchstratorInvalidConfig() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, PluginConfigurationException, ExecutionException, InterruptedException, IOException { initializeMockedOrchestratorService(); IOrchestratorPluginFactory orchestratorPluginFactory = Mockito.mock(IOrchestratorPluginFactory.class); IOrchestratorPlugin orchestratorPlugin = Mockito.mock(IOrchestratorPlugin.class); List<Orchestrator> enabledOrchestrators = searchOrchestrator(); Orchestrator orchestrator = enabledOrchestrators.get(0); OrchestratorConfiguration configuration = new OrchestratorConfiguration(orchestrator.getId(), DEFAULT_CLOUD_CONFIGURATION); initSearch(enabledOrchestrators); Mockito.when(orchestratorService.getPluginFactory(orchestrator)).thenReturn(orchestratorPluginFactory); Mockito.when(orchestratorPluginFactory.newInstance()).thenReturn(orchestratorPlugin); Mockito.when(orchestratorPluginFactory.getConfigurationType()).thenReturn(String.class); Mockito.when(orchestratorPluginFactory.getDefaultConfiguration()).thenReturn(DEFAULT_CLOUD_CONFIGURATION); Mockito.when(orchestratorConfigurationService.getConfigurationOrFail(orchestrator.getId())).thenReturn(configuration); Mockito.when(orchestratorConfigurationService.configurationAsValidObject(orchestrator.getId(), configuration.getConfiguration())) .thenReturn(DEFAULT_CLOUD_CONFIGURATION); Mockito.doThrow(PluginConfigurationException.class).when(orchestratorPlugin).setConfiguration((String) configuration.getConfiguration()); initializeAndWait(); Mockito.verify(orchestratorPluginService, Mockito.times(0)).register(orchestrator.getId(), orchestratorPlugin); orchestrator = (Orchestrator) searchOrchestrator().get(0); orchestrator.setState(OrchestratorState.DISABLED); Mockito.verify(alienDAO, Mockito.times(2)).save(Mockito.refEq(orchestrator)); } }