public IObservable <ElasticsearchMessage> Start(string typeOfCluster, string[] additionalSettings = null) { if (!this.RunningIntegrations) { return(Observable.Empty <ElasticsearchMessage>()); } this.Stop(); var settingMarker = this.VersionInfo.ParsedVersion.Major >= 5 ? "-E " : "-D"; var settings = DefaultNodeSettings .Concat(additionalSettings ?? Enumerable.Empty <string>()) .Select(s => $"{settingMarker}{s}") .ToList(); var easyRunBat = Path.Combine(this.RoamingFolder, $"run-{typeOfCluster.ToLowerInvariant()}.bat"); if (!File.Exists(easyRunBat)) { var badSettings = new[] { "node.name", "cluster.name" }; var batSettings = string.Join(" ", settings.Where(s => !badSettings.Any(s.Contains))); File.WriteAllText(easyRunBat, $@"elasticsearch-{this.Version}\bin\elasticsearch.bat {batSettings}"); } #if DOTNETCORE var handle = new Signal(false); #else var handle = new ManualResetEvent(false); #endif var alreadyRunning = UseAlreadyRunningInstance(handle); if (alreadyRunning != null) { return(alreadyRunning); } this._process = new ObservableProcess(this.Binary, settings.ToArray()); var observable = Observable.Using(() => this._process, process => process.Start()) .Select(consoleLine => new ElasticsearchMessage(consoleLine)); this._processListener = observable.Subscribe(onNext: s => HandleConsoleMessage(s, handle)); if (handle.WaitOne(this.HandleTimeout, true)) { return(observable); } this.Stop(); throw new Exception($"Could not start elasticsearch within {this.HandleTimeout}"); }
public IObservable <ElasticsearchConsoleOut> Start(string[] additionalSettings = null) { if (!this._config.RunIntegrationTests) { return(Observable.Empty <ElasticsearchConsoleOut>()); } this.Stop(); var settingMarker = this.Version.Major >= 5 ? "-E " : "-D"; var settings = DefaultNodeSettings .Concat(additionalSettings ?? Enumerable.Empty <string>()) .Select(s => $"{settingMarker}{s}") .ToList(); this.FileSystem.BeforeStart(settings); var handle = new XplatManualResetEvent(false); var alreadyRunning = UseAlreadyRunningInstance(handle); if (alreadyRunning != null) { return(alreadyRunning); } this._process = new ObservableProcess(this.FileSystem.Binary, settings.ToArray()); var observable = Observable.Using(() => this._process, process => process.Start()) .Select(c => new ElasticsearchConsoleOut(c.Error, c.Data)); Console.WriteLine($"Starting: {_process.Binary} {_process.Arguments}"); this._processListener = observable .Subscribe(s => this.HandleConsoleMessage(s, handle), (e) => this.Stop(), () => { }); if (!handle.WaitOne(HandleTimeout, true)) { this.Stop(); throw new Exception($"Could not start elasticsearch within {HandleTimeout}"); } if (this.Exception != null) { throw this.Exception; } return(observable); }