package alien4cloud.configuration;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import com.google.common.util.concurrent.ListenableFuture;
import alien4cloud.dao.IGenericSearchDAO;
import alien4cloud.dao.model.GetMultipleDataResult;
import alien4cloud.model.orchestrators.Orchestrator;
import alien4cloud.orchestrators.services.OrchestratorStateService;
import alien4cloud.plugin.Plugin;
import alien4cloud.plugin.PluginManager;
import alien4cloud.plugin.model.PluginConfiguration;
import alien4cloud.repository.services.RepositoryService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class ApplicationBootstrap implements ApplicationListener<ContextRefreshedEvent> {
@Resource(name = "alien-es-dao")
private IGenericSearchDAO alienDAO;
@Inject
private PluginManager pluginManager;
@Inject
private OrchestratorStateService orchestratorStateService;
@Inject
private RepositoryService repositoryService;
@Inject
private InitialLoader initialLoader;
private boolean initialized = false;
/**
* This operation initialize the JVM of Alien with configured plugins and context
*/
public ListenableFuture<?> bootstrap() {
// Starting from 1.3.1 version we don't allow multiple versions of a given plugin in a4c. The orchestrator plugin id does not requires version anymore
// and should be cleaned.
migration();
// try to load plugins from init folder.
initialLoader.loadPlugins();
// Initialize existing enabled plugins.
pluginManager.initialize();
repositoryService.initialize();
return orchestratorStateService.initialize();
}
/**
* Performs data migration for 1.3.1 version where plugin ids are not generated using the version anymore.
*/
private void migration() {
log.debug("Initializing plugin id migrations");
int count = 0;
// This code updates the ids of plugin configurations and plugins in elasticsearch to remove the version reference.
GetMultipleDataResult<Plugin> pluginResult = alienDAO.buildQuery(Plugin.class).prepareSearch().search(0, Integer.MAX_VALUE);
for (Plugin plugin : pluginResult.getData()) {
if (plugin.getEsId().contains(":")) {
PluginConfiguration pluginConfiguration = alienDAO.findById(PluginConfiguration.class, plugin.getEsId());
if (pluginConfiguration != null) {
pluginConfiguration.setPluginId(plugin.getId());
alienDAO.save(pluginConfiguration);
alienDAO.delete(PluginConfiguration.class, plugin.getEsId());
}
alienDAO.save(plugin);
alienDAO.delete(Plugin.class, plugin.getEsId());
count++;
}
}
if (count > 0) {
log.info("{} plugins migrated", count);
}
count = 0;
// This code updates the plugin id in the orchestrators.
GetMultipleDataResult<Orchestrator> orchestratorResult = alienDAO.buildQuery(Orchestrator.class).prepareSearch().search(0, Integer.MAX_VALUE);
for (Orchestrator orchestrator : orchestratorResult.getData()) {
if (orchestrator.getPluginId().contains(":")) {
orchestrator.setPluginId(orchestrator.getPluginId().split(":")[0]);
alienDAO.save(orchestrator);
count++;
}
}
if (count > 0) {
log.info("Orchestrator migrated: {}.", count);
}
log.debug("plugin id migration done.");
}
/**
* This operation unloads all plugin and orchestrator
*/
public void teardown() {
orchestratorStateService.unloadAllOrchestrators();
repositoryService.unloadAllResolvers();
pluginManager.unloadAllPlugins();
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (initialized) {
return;
}
initialized = true;
bootstrap();
}
}