Ejemplo n.º 1
0
        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);
        }