UNPKG

yahoo-swiv

Version:

A web-based exploratory visualization UI for Druid.io

251 lines (250 loc) 11.2 kB
"use strict"; var Q = require('q'); var swiv_plywood_1 = require('swiv-plywood'); var general_1 = require('../../../common/utils/general/general'); var time_monitor_1 = require("../../../common/utils/time-monitor/time-monitor"); var index_1 = require('../../../common/models/index'); var file_manager_1 = require('../file-manager/file-manager'); var cluster_manager_1 = require('../cluster-manager/cluster-manager'); var updater_1 = require('../updater/updater'); var SettingsManager = (function () { function SettingsManager(settingsStore, options) { var _this = this; var logger = options.logger; this.logger = logger; this.verbose = Boolean(options.verbose); this.anchorPath = options.anchorPath; this.timeMonitor = new time_monitor_1.TimeMonitor(logger); this.settingsStore = settingsStore; this.fileManagers = []; this.clusterManagers = []; this.initialLoadTimeout = options.initialLoadTimeout || 30000; this.appSettings = index_1.AppSettings.BLANK; this.currentWork = settingsStore.readSettings() .then(function (appSettings) { return _this.reviseSettings(appSettings); }) .catch(function (e) { logger.error("Fatal settings load error: " + e.message); logger.error(e.stack); throw e; }); } SettingsManager.prototype.isStateful = function () { return Boolean(this.settingsStore.writeSettings); }; SettingsManager.prototype.getClusterManagerFor = function (clusterName) { return swiv_plywood_1.find(this.clusterManagers, function (clusterManager) { return clusterManager.cluster.name === clusterName; }); }; SettingsManager.prototype.addClusterManager = function (cluster, dataCubes) { var _a = this, verbose = _a.verbose, logger = _a.logger, anchorPath = _a.anchorPath; var initialExternals = dataCubes.map(function (dataCube) { return { name: dataCube.name, external: dataCube.toExternal(), suppressIntrospection: dataCube.getIntrospection() === 'none' }; }); logger.log("Adding cluster manager for '" + cluster.name + "' with " + general_1.pluralIfNeeded(dataCubes.length, 'dataCube')); var clusterManager = new cluster_manager_1.ClusterManager(cluster, { logger: logger, verbose: verbose, anchorPath: anchorPath, initialExternals: initialExternals, onExternalChange: this.onExternalChange.bind(this, cluster), generateExternalName: this.generateDataCubeName.bind(this) }); this.clusterManagers.push(clusterManager); return clusterManager.init(); }; SettingsManager.prototype.removeClusterManager = function (cluster) { this.clusterManagers = this.clusterManagers.filter(function (clusterManager) { if (clusterManager.cluster.name !== cluster.name) return true; clusterManager.destroy(); return false; }); }; SettingsManager.prototype.getFileManagerFor = function (uri) { return swiv_plywood_1.find(this.fileManagers, function (fileManager) { return fileManager.uri === uri; }); }; SettingsManager.prototype.addFileManager = function (dataCube) { if (dataCube.clusterName !== 'native') throw new Error("data cube '" + dataCube.name + "' must be native to have a file manager"); var _a = this, verbose = _a.verbose, logger = _a.logger, anchorPath = _a.anchorPath; var fileManager = new file_manager_1.FileManager({ logger: logger, verbose: verbose, anchorPath: anchorPath, uri: dataCube.source, subsetExpression: dataCube.subsetExpression, onDatasetChange: this.onDatasetChange.bind(this, dataCube.name) }); this.fileManagers.push(fileManager); return fileManager.init(); }; SettingsManager.prototype.removeFileManager = function (dataCube) { if (dataCube.clusterName !== 'native') throw new Error("data cube '" + dataCube.name + "' must be native to have a file manager"); this.fileManagers = this.fileManagers.filter(function (fileManager) { if (fileManager.uri !== dataCube.source) return true; fileManager.destroy(); return false; }); }; SettingsManager.prototype.getTimekeeper = function () { return this.timeMonitor.timekeeper; }; SettingsManager.prototype.getSettings = function (opts) { var _this = this; if (opts === void 0) { opts = {}; } var currentWork = this.currentWork; var currentWork = currentWork.then(function () { return Q.all(_this.clusterManagers.map(function (clusterManager) { return clusterManager.refresh(); })); }); var timeout = opts.timeout || this.initialLoadTimeout; if (timeout !== 0) { currentWork = currentWork.timeout(timeout) .catch(function (e) { _this.logger.error("Settings load timeout hit, continuing"); }); } return currentWork.then(function () { return _this.appSettings; }); }; SettingsManager.prototype.reviseSettings = function (newSettings) { var tasks = [ this.reviseClusters(newSettings), this.reviseDataCubes(newSettings) ]; this.appSettings = newSettings; return Q.all(tasks); }; SettingsManager.prototype.reviseClusters = function (newSettings) { var _this = this; var _a = this, verbose = _a.verbose, logger = _a.logger; var oldSettings = this.appSettings; var tasks = []; updater_1.updater(oldSettings.clusters, newSettings.clusters, { onExit: function (oldCluster) { _this.removeClusterManager(oldCluster); }, onUpdate: function (newCluster) { logger.log(newCluster.name + " UPDATED cluster"); }, onEnter: function (newCluster) { tasks.push(_this.addClusterManager(newCluster, newSettings.getDataCubesForCluster(newCluster.name))); } }); return Q.all(tasks); }; SettingsManager.prototype.reviseDataCubes = function (newSettings) { var _this = this; var _a = this, verbose = _a.verbose, logger = _a.logger; var oldSettings = this.appSettings; var tasks = []; var oldNativeDataCubes = oldSettings.getDataCubesForCluster('native'); var newNativeDataCubes = newSettings.getDataCubesForCluster('native'); updater_1.updater(oldNativeDataCubes, newNativeDataCubes, { onExit: function (oldDataCube) { if (oldDataCube.clusterName === 'native') { _this.removeFileManager(oldDataCube); } else { throw new Error("only native data cubes work for now"); } }, onUpdate: function (newDataCube) { logger.log(newDataCube.name + " UPDATED datasource"); }, onEnter: function (newDataCube) { if (newDataCube.clusterName === 'native') { tasks.push(_this.addFileManager(newDataCube)); } else { throw new Error("only native data cube work for now"); } } }); return Q.all(tasks); }; SettingsManager.prototype.updateSettings = function (newSettings) { var _this = this; if (!this.settingsStore.writeSettings) return Q.reject(new Error('must be writable')); var loadedNewSettings = newSettings.attachExecutors(function (dataCube) { if (dataCube.clusterName === 'native') { var fileManager = _this.getFileManagerFor(dataCube.source); if (fileManager) { var dataset = fileManager.dataset; if (!dataset) return null; return swiv_plywood_1.basicExecutorFactory({ datasets: { main: dataset } }); } } else { var clusterManager = _this.getClusterManagerFor(dataCube.clusterName); if (clusterManager) { var external = clusterManager.getExternalByName(dataCube.name); if (!external) return null; return swiv_plywood_1.basicExecutorFactory({ datasets: { main: external } }); } } return null; }); return this.settingsStore.writeSettings(loadedNewSettings) .then(function () { _this.appSettings = loadedNewSettings; }); }; SettingsManager.prototype.generateDataCubeName = function (external) { var appSettings = this.appSettings; var source = String(external.source); var candidateName = source; var i = 0; while (appSettings.getDataCube(candidateName)) { i++; candidateName = source + i; } return candidateName; }; SettingsManager.prototype.onDatasetChange = function (dataCubeName, changedDataset) { var _a = this, logger = _a.logger, verbose = _a.verbose; logger.log("Got native dataset update for " + dataCubeName); var dataCube = this.appSettings.getDataCube(dataCubeName); if (!dataCube) throw new Error("Unknown dataset " + dataCubeName); dataCube = dataCube.updateWithDataset(changedDataset); if (dataCube.refreshRule.isQuery()) { this.timeMonitor.addCheck(dataCube.name, function () { return index_1.DataCube.queryMaxTime(dataCube); }); } this.appSettings = this.appSettings.addOrUpdateDataCube(dataCube); }; SettingsManager.prototype.onExternalChange = function (cluster, dataCubeName, changedExternal) { if (!changedExternal.attributes || !changedExternal.requester) return Q(null); var _a = this, logger = _a.logger, verbose = _a.verbose; logger.log("Got queryable external dataset update for " + dataCubeName + " in cluster " + cluster.name); var dataCube = this.appSettings.getDataCube(dataCubeName); if (!dataCube) { dataCube = index_1.DataCube.fromClusterAndExternal(dataCubeName, cluster, changedExternal); } dataCube = dataCube.updateWithExternal(changedExternal); if (dataCube.refreshRule.isQuery()) { this.timeMonitor.addCheck(dataCube.name, function () { return index_1.DataCube.queryMaxTime(dataCube); }); } this.appSettings = this.appSettings.addOrUpdateDataCube(dataCube); return Q(null); }; return SettingsManager; }()); exports.SettingsManager = SettingsManager;