Exemplo n.º 1
0
 [Fact] void WritesExpectedDefauts() => WithValidPreflightChecks()
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.ClusterName.Should().Be(ConfigurationModel.DefaultClusterName);
     s.NodeName.Should().Be(ConfigurationModel.DefaultNodeName);
     s.MasterNode.Should().Be(ConfigurationModel.DefaultMasterNode);
     s.DataNode.Should().Be(ConfigurationModel.DefaultDataNode);
     s.IngestNode.Should().Be(ConfigurationModel.DefaultIngestNode);
     s.MemoryLock.Should().Be(ConfigurationModel.DefaultMemoryLock);
     s.LogsPath.Should().Be(LocationsModel.DefaultLogsDirectory);
     s.DataPath.Should().Be(LocationsModel.DefaultDataDirectory);
     //because install as service is enabled by default
     s.MaxLocalStorageNodes.Should().Be(1);
     s.NetworkHost.Should().BeNullOrEmpty();
     s.HttpPortString.Should().Be("9200");
     s.TransportTcpPortString.Should().Be("9300");
     s.UnicastHosts.Should().BeNullOrEmpty();
 }
     );
Exemplo n.º 2
0
 [Fact] void DeselectingSecurityWritesFalseToYamlFile() => DefaultValidModelForTasks(s => s
                                                                                     .Elasticsearch(es => es
                                                                                                    .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                                                    )
                                                                                     .FileSystem(fs =>
 {
     fs.AddFile(Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml"), new MockFileData(""));
     return(fs);
 })
                                                                                     )
 .OnStep(m => m.XPackModel, s =>
 {
     s.XPackLicense         = XPackLicenseMode.Trial;
     s.XPackSecurityEnabled = false;
 })
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.XPackLicenseSelfGeneratedType.Should().Be("trial");
     s.XPackSecurityEnabled.Should().BeFalse();
 }
     );
 void DefaultMaxLocalStorageNodesNotService() => WithValidPreflightChecks(s => s
                                                                          .Elasticsearch(es => es
                                                                                         .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                                         )
                                                                          .FileSystem(fs =>
 {
     fs.AddFile(Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml"), new MockFileData(@""));
     return(fs);
 })
                                                                          )
 .OnStep(m => m.ServiceModel, s => s.InstallAsService = false)
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     //because we do not install as service
     s.MaxLocalStorageNodes.Should().NotHaveValue();
 }
     );
Exemplo n.º 4
0
 [Fact] void SelectingTrialDoesNotWriteSecurityEnabled() => WithValidPreflightChecks(s => s
                                                                                     .Elasticsearch(es => es
                                                                                                    .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                                                    )
                                                                                     .FileSystem(fs =>
 {
     fs.AddFile(Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml"), new MockFileData(@""));
     return(fs);
 })
                                                                                     )
 .OnStep(m => m.PluginsModel, s => s.ChangeXPackSelection(true))
 .OnStep(m => m.XPackModel, s => s.XPackLicense = XPackLicenseMode.Trial)
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.XPackLicenseSelfGeneratedType.Should().Be(nameof(XPackLicenseMode.Trial).ToLowerInvariant());
     s.XPackSecurityEnabled.Should().BeNull();
 }
     );
Exemplo n.º 5
0
        [Fact] void XPackSettingsAlreadyInPlaceAreNotOverwritten() => DefaultValidModelForTasks(s => s
                                                                                                .Elasticsearch(es => es
                                                                                                               .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                                                               )
                                                                                                .FileSystem(fs =>
        {
            var yaml = $@"bootstrap.memory_lock: true
xpack.security.enabled: false
xpack.license.self_generated.type: trial
xpack.random_setting: something
";
            fs.AddFile(Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml"), yaml);
            return(fs);
        })
                                                                                                )
        .AssertTask(
            (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
            (m, t) =>
        {
            var dir    = m.LocationsModel.ConfigDirectory;
            var yaml   = Path.Combine(dir, "elasticsearch.yml");
            var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
            var s      = config.Settings;
            s.MemoryLock.Should().BeTrue();
            s.XPackLicenseSelfGeneratedType.Should().Be("trial");
            s.XPackSecurityEnabled.Should().BeFalse();
            //unknown x-pack setting is preserved
            s.Keys.Where(k => k.StartsWith("xpack")).Should().HaveCount(1);
        }
            );
 void PicksUpExistingConfiguration() => WithValidPreflightChecks(s => s
                                                                 .Elasticsearch(e => e
                                                                                .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                                )
                                                                 .FileSystem(fs =>
 {
     fs.AddDirectory(LocationsModel.DefaultConfigDirectory);
     var yaml = Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml");
     fs.AddFile(yaml, new MockFileData(@"cluster.name: x"));
     return(fs);
 })
                                                                 )
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.ClusterName.Should().Be("x");
     s.NodeName.Should().Be(ConfigurationModel.DefaultNodeName);
 }
     );
Exemplo n.º 7
0
        [Fact] void RemovesXPackSettingsIfXPackIsNotBeingInstalled() => WithValidPreflightChecks(s => s
                                                                                                 .Elasticsearch(es => es
                                                                                                                .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                                                                )
                                                                                                 .FileSystem(fs =>
        {
            var yaml = $@"bootstrap.memory_lock: true
xpack.security.enabled = false
xpack.license.self_generated.type = trial
xpack.random_setting = something
";
            fs.AddFile(Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml"), new MockFileData(@""));
            return(fs);
        })
                                                                                                 )
        .OnStep(m => m.PluginsModel, s => s.ChangeXPackSelection(false))
        .AssertTask(
            (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
            (m, t) =>
        {
            var dir          = m.LocationsModel.ConfigDirectory;
            var yaml         = Path.Combine(dir, "elasticsearch.yml");
            var yamlContents = t.FileSystem.File.ReadAllText(yaml);
            yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
            var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
            var s      = config.Settings;
            s.XPackLicenseSelfGeneratedType.Should().BeNull();
            s.XPackSecurityEnabled.Should().BeNull();
            s.Keys.Where(k => k.StartsWith("xpack")).Should().HaveCount(0);
        }
            );
        protected override bool ExecuteTask()
        {
            RestoreConfigDirectory();
            RestoreXPackDirectory();
            RestorePluginsDirectory();

            // only delete config, logs and data if they were created by this installer operation
            var configDirectoryExisted = this.Session.Get <bool>(LocationsModel.ConfigDirectoryExists);
            var logsDirectoryExisted   = this.Session.Get <bool>(LocationsModel.LogsDirectoryExists);
            var dataDirectoryExisted   = this.Session.Get <bool>(LocationsModel.DataDirectoryExists);
            var configDirectory        = this.InstallationModel.LocationsModel.ConfigDirectory;

            if (!this.FileSystem.Directory.Exists(configDirectory))
            {
                this.Session.Log($"Config directory does not exist. skipping {configDirectory}");
            }
            else
            {
                var yamlConfiguration = ElasticsearchYamlConfiguration.FromFolder(configDirectory, this.FileSystem);
                var dataDirectory     = yamlConfiguration?.Settings?.DataPath ?? this.InstallationModel.LocationsModel.DataDirectory;
                var logsDirectory     = yamlConfiguration?.Settings?.LogsPath ?? this.InstallationModel.LocationsModel.LogsDirectory;

                this.Session.SendActionStart(3000, ActionName, "Removing data, logs, and config directory, if created",
                                             "Removing directories: [1]");
                this.DeleteDirectoryIfExistsAndCreated(dataDirectory, !dataDirectoryExisted);
                this.DumpElasticsearchLogOnRollback(logsDirectory);
                this.DeleteDirectoryIfExistsAndCreated(logsDirectory, !logsDirectoryExisted);
                this.DeleteDirectoryIfExistsAndCreated(configDirectory, !configDirectoryExisted);
            }

            return(true);
        }
        public InstallationModelTester(
            MockWixStateProvider wixState,
            MockJavaEnvironmentStateProvider javaState,
            MockElasticsearchEnvironmentStateProvider esState,
            NoopServiceStateProvider serviceState,
            NoopPluginStateProvider pluginState,
            MockFileSystem fileSystem,
            NoopSession session,
            string[] args)
        {
            if (wixState == null)
            {
                throw new ArgumentNullException(nameof(wixState));
            }
            if (javaState == null)
            {
                throw new ArgumentNullException(nameof(javaState));
            }
            if (esState == null)
            {
                throw new ArgumentNullException(nameof(esState));
            }

            this.JavaState         = javaState;
            this.EsState           = esState;
            this.PluginState       = pluginState;
            this.JavaConfig        = new JavaConfiguration(javaState);
            this.EsConfig          = ElasticsearchYamlConfiguration.FromFolder(esState.ConfigDirectory, fileSystem);
            this.JvmConfig         = LocalJvmOptionsConfiguration.FromFolder(esState.ConfigDirectory, fileSystem);
            this.InstallationModel = new InstallationModel(
                wixState, JavaConfig, esState, serviceState, pluginState, EsConfig, JvmConfig, session, args);
            this.FileSystem = fileSystem;
        }
Exemplo n.º 10
0
        public LocationsModel(
            ElasticsearchEnvironmentConfiguration elasticsearchEnvironmentConfiguration,
            ElasticsearchYamlConfiguration yamlConfiguration,
            VersionConfiguration versionConfig,
            IFileSystem fileSystem)
        {
            this.IsRelevant = !versionConfig.ExistingVersionInstalled;
            this.Header     = "Locations";
            this._elasticsearchEnvironmentConfiguration = elasticsearchEnvironmentConfiguration;
            this._yamlConfiguration = yamlConfiguration;
            this.CurrentVersion     = versionConfig.CurrentVersion.ToString();
            this.ExistingVersion    = versionConfig.UpgradeFromVersion?.ToString();
            this.FileSystem         = fileSystem;

            this.Refresh();
            this._refreshing = true;

            this.WhenAny(
                vm => vm.LogsDirectory,
                (c) => {
                var v = c.GetValue();
                return(this.FileSystem.Path.IsPathRooted(v)
                                                ? this.FileSystem.Path.Combine(v, "elasticsearch.log")
                                                : null);
            })
            .ToProperty(this, vm => vm.ElasticsearchLog, out elasticsearchLog);

            this.ThrownExceptions.Subscribe(e =>
            {
            });

            //If install, config, logs or data dir are set force ConfigureLocations to true
            this.WhenAny(
                vm => vm.InstallDir,
                vm => vm.ConfigDirectory,
                vm => vm.LogsDirectory,
                vm => vm.DataDirectory,
                (i, c, l, d) => !this._refreshing
                )
            .Subscribe(x => { if (x)
                              {
                                  this.ConfigureLocations = true;
                              }
                       });

            this.WhenAny(
                vm => vm.ConfigureLocations,
                (c) => !this._refreshing && !c.Value
                )
            .Subscribe(x => { if (x)
                              {
                                  this.Refresh();
                              }
                       });

            this._refreshing = false;
        }
Exemplo n.º 11
0
        [Fact] void InitialMasterNodesAreReadFromStringCommaSeparated()
        {
            var yaml     = $@"cluster.initial_master_nodes: host1, host2";
            var fs       = FakeElasticsearchYaml(yaml);
            var optsFile = new ElasticsearchYamlConfiguration(_path, fs);
            var settings = optsFile.Settings;

            settings.InitialMasterNodes.Should().NotBeEmpty().And.HaveCount(2);
            optsFile.Save();
        }
        [Fact] void InitialMasterNodeAreRead()
        {
            var yaml     = $@"InitialMasterNode: [host1, host2]";
            var fs       = FakeElasticsearchYaml(yaml);
            var optsFile = new ElasticsearchYamlConfiguration(_path, fs);
            var settings = optsFile.Settings;

            settings.InitialMasterNodes.Should().NotBeEmpty().And.HaveCount(2);
            optsFile.Save();
        }
        [Fact] void SeedHostsAreRead()
        {
            var yaml     = $@"discovery.seed_hosts: [host1, host2]";
            var fs       = FakeElasticsearchYaml(yaml);
            var optsFile = new ElasticsearchYamlConfiguration(_path, fs);
            var settings = optsFile.Settings;

            settings.SeedHosts.Should().NotBeEmpty().And.HaveCount(2);
            optsFile.Save();
        }
Exemplo n.º 14
0
        private void RecheckPrequisites()
        {
            var javaState  = new JavaEnvironmentStateProvider();
            var esState    = new ElasticsearchEnvironmentStateProvider();
            var javaConfig = new JavaConfiguration(javaState);
            var esConfig   = ElasticsearchYamlConfiguration.FromFolder(esState.ConfigDirectory);

            this.ViewModel.BadElasticsearchYamlFile = esConfig.FoundButNotValid;
            this.ViewModel.JavaInstalled            = javaConfig.JavaInstalled;
            this.ViewModel.JavaMisconfigured        = javaConfig.JavaMisconfigured;
        }
        [Fact] void UnicastHostsAreStillRead()
        {
            var folder   = @"C:\ProgramData\Elastic\Elasticsearch\";
            var yaml     = $@"discovery.zen.ping.unicast.hosts: [host1, host2]";
            var fs       = FakeElasticsearchYaml(yaml);
            var optsFile = new ElasticsearchYamlConfiguration(_path, fs);
            var settings = optsFile.Settings;

            settings.UnicastHosts.Should().NotBeEmpty().And.HaveCount(2);
            optsFile.Save();
        }
Exemplo n.º 16
0
 [Fact] void CustomConfigValues() => DefaultValidModelForTasks(s => s
                                                               .Elasticsearch(es => es
                                                                              .EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory)
                                                                              )
                                                               .FileSystem(fs =>
 {
     fs.AddFile(Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml"), new MockFileData(@""));
     return(fs);
 })
                                                               )
 .OnStep(m => m.ConfigurationModel, s =>
 {
     s.ClusterName   = "x";
     s.NodeName      = "x";
     s.MasterNode    = false;
     s.DataNode      = false;
     s.IngestNode    = false;
     s.LockMemory    = false;
     s.NetworkHost   = "xyz";
     s.HttpPort      = 80;
     s.TransportPort = 9300;
     s.SeedHosts     = new ReactiveUI.ReactiveList <string>
     {
         "localhost", "192.2.3.1:9301"
     };
 })
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.ClusterName.Should().Be("x");
     s.NodeName.Should().Be("x");
     s.MasterNode.Should().BeFalse();
     s.IngestNode.Should().BeFalse();
     s.MemoryLock.Should().BeFalse();
     s.NetworkHost.Should().Be("xyz");
     s.HttpPort.Should().Be(80);
     s.HttpPortString.Should().Be("80");
     s.TransportTcpPort.Should().Be(9300);
     s.TransportTcpPortString.Should().Be("9300");
     s.UnicastHosts.Should().BeNullOrEmpty();
     s.SeedHosts.Should().BeEquivalentTo(new List <string>
     {
         "localhost", "192.2.3.1:9301"
     });
 }
     );
Exemplo n.º 17
0
        public static InstallationModel Create(IWixStateProvider wixState, ISession session, params string[] args)
        {
            var javaConfig   = JavaConfiguration.Default;
            var esState      = ElasticsearchEnvironmentStateProvider.Default;
            var serviceState = ServiceStateProvider.FromSession(session);
            var pluginState  = PluginStateProvider.Default;

            var esConfig  = ElasticsearchYamlConfiguration.FromFolder(esState.ConfigDirectory);
            var jvmConfig = LocalJvmOptionsConfiguration.FromFolder(esState.ConfigDirectory);

            return(new InstallationModel(wixState, javaConfig, esState, serviceState, pluginState, esConfig, jvmConfig, session, args));
        }
        public ConfigurationModel(ElasticsearchYamlConfiguration yamlConfiguration,
                                  LocalJvmOptionsConfiguration localJvmOptions, IObservable <bool> upgradingFrom6OrNewInstallation)
        {
            this.Header           = "Configuration";
            this._localJvmOptions = localJvmOptions;
            this._yamlSettings    = yamlConfiguration?.Settings;
            upgradingFrom6OrNewInstallation.Subscribe(b => this.UpgradingFrom6OrNewInstallation = b);
            this.Refresh();

            this.AddSeedHost = ReactiveCommand.CreateAsyncTask(async _ => await this.AddSeedHostUserInterfaceTask());
            this.WhenAnyObservable(vm => vm.AddSeedHost)
            .Subscribe(x =>
            {
                if (string.IsNullOrWhiteSpace(x))
                {
                    return;
                }
                var nodes = x
                            .Split(',')
                            .Select(node => node.Trim())
                            .Where(n => !string.IsNullOrEmpty(n))
                            .Distinct();

                foreach (var n in nodes)
                {
                    this.SeedHosts.Add(n);
                }
            });

            this.WhenAny(
                vm => vm.TotalPhysicalMemory,
                (maxMemory) => Math.Min(maxMemory.Value / 2, CompressedOrdinaryPointersThreshold)
                )
            .ToProperty(this, vm => vm.MaxSelectedMemory, out maxSelectedMemory);

            var canRemoveNode = this.WhenAny(vm => vm.SelectedSeedHost, (selected) => !string.IsNullOrWhiteSpace(selected.GetValue()));

            this.RemoveSeedHost = ReactiveCommand.Create(canRemoveNode);
            this.RemoveSeedHost.Subscribe(x =>
            {
                this.SeedHosts.Remove(this.SelectedSeedHost);
            });
            this.WhenAnyValue(vm => vm.MasterNode).Subscribe(b =>
            {
                // if we unset master node make sure InitialMaster is not set either.
                if (!b)
                {
                    this.InitialMaster = false;
                }
            });
        }
        public static ElasticsearchInstallationModel Create(IWixStateProvider wixState, ISession session, params string[] args)
        {
            var javaConfig          = JavaConfiguration.Default;
            var esEnvironmentConfig = ElasticsearchEnvironmentConfiguration.Default;
            var serviceState        = ServiceStateProvider.FromSession(session, "Elasticsearch");
            var pluginState         = PluginStateProviderBase.ElasticsearchDefault(session);

            var esConfig      = ElasticsearchYamlConfiguration.FromFolder(esEnvironmentConfig.ConfigDirectory);
            var jvmConfig     = LocalJvmOptionsConfiguration.FromFolder(esEnvironmentConfig.ConfigDirectory);
            var tempDirConfig = new TempDirectoryConfiguration(session, ElasticsearchEnvironmentStateProvider.Default, null);

            return(new ElasticsearchInstallationModel(wixState,
                                                      javaConfig, esEnvironmentConfig, serviceState, pluginState, esConfig, jvmConfig, tempDirConfig,
                                                      session, args));
        }
Exemplo n.º 20
0
        [Fact] void UnderstandsObjectNotation()
        {
            var clusterName = "my-cluster";
            var yaml        = $"cluster:\r\n  name: {clusterName}\r\n  blocks:\r\n    read_only: true";
            var fs          = FakeElasticsearchYaml(yaml);
            var optsFile    = new ElasticsearchYamlConfiguration(_path, fs);

            optsFile.Settings.ClusterName.Should().Be(clusterName);
            optsFile.Settings.ClusterName = "x";
            optsFile.Settings["cluster.blocks.read_only"] = false;
            optsFile.Save();

            var fileContentsAfterSave = fs.File.ReadAllText(_path);
            var updatedYaml           = $"cluster.name: x\r\ncluster.blocks.read_only: false\r\n";

            fileContentsAfterSave.Replace("\r\n", "").Should().Be(updatedYaml.Replace("\r\n", ""));
        }
Exemplo n.º 21
0
        protected override bool ExecuteTask()
        {
            this.Session.SendActionStart(TotalTicks, ActionName, "Configuring Elasticsearch", "Configuring Elasticsearch: [1]");
            var locations = this.InstallationModel.LocationsModel;

            this.Session.SendProgress(1000, "reading elasticsearch.yml from " + locations.ConfigDirectory);
            var yaml = ElasticsearchYamlConfiguration.FromFolder(locations.ConfigDirectory, this.FileSystem);

            var settings = yaml.Settings;

            this.ApplyConfigurationModel(settings);
            this.ApplyLocationsModel(settings, locations);
            this.ApplyServiceModel(settings);
            this.ApplyXPackModel(settings);
            yaml.Save();
            this.Session.SendProgress(1000, "elasticsearch.yml updated");
            return(true);
        }
        [Fact] void InitialMaster7SetsInitialMasterNodesIfNotSetPrior() =>
        DefaultValidModelForTasks(s => s
                                  .Elasticsearch(es => es.EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory))
                                  .FileSystem(fs =>
        {
            var yamlLocation = Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml");
            fs.AddFile(yamlLocation, new MockFileData(@"discovery.zen.minimum_master_nodes: 20"));
            return(fs);
        })
                                  )
        .OnStep(m => m.ConfigurationModel, s =>
        {
            s.ClusterName = "x";
            s.NodeName    = "nodex";
            s.InitialMaster.Should().BeFalse();
            s.InitialMaster = true;
        })
        .AssertTask(
            (m, s, fs) =>
        {
            m.ToMsiParamsString().Should()
            .Contain($"{nameof(ConfigurationModel.InitialMaster).ToUpperInvariant()}=\"true\"");
            return(new EditElasticsearchYamlTask(m, s, fs));
        },

            (m, t) =>
        {
            var dir          = m.LocationsModel.ConfigDirectory;
            var yaml         = Path.Combine(dir, "elasticsearch.yml");
            var yamlContents = t.FileSystem.File.ReadAllText(yaml);
            // validate we are writing the yaml file in 7.0 format
            yamlContents.Should().NotBeEmpty()
            // don't carry over minimum_master_nodes
            .And.NotContain("discovery.zen.minimum_master_nodes")
            .And.Contain("cluster.initial_master_nodes");
            var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
            var s      = config.Settings;
            s.ClusterName.Should().Be("x");
            s.NodeName.Should().Be("nodex");
            s.InitialMasterNodes.Should().BeEquivalentTo(new List <string> {
                "nodex"
            });
        }
            );
 [Fact] void WritesSeedHostsFor7() =>
 DefaultValidModelForTasks(s => s
                           .Elasticsearch(es => es.EsConfigMachineVariable(LocationsModel.DefaultConfigDirectory))
                           .FileSystem(fs =>
 {
     var yamlLocation = Path.Combine(LocationsModel.DefaultConfigDirectory, "elasticsearch.yml");
     fs.AddFile(yamlLocation, new MockFileData(@"discovery.zen.ping.unicast.hosts: ['192.2.3.1:9200']"));
     return(fs);
 })
                           )
 .OnStep(m => m.ConfigurationModel, s =>
 {
     s.ClusterName = "x";
     s.NodeName    = "x";
     //we read unicast host from previous install into seed hosts
     s.SeedHosts.Should().NotBeEmpty().And.Contain(h => h.Contains("9200"));
     //simulate a user change
     s.SeedHosts = new ReactiveUI.ReactiveList <string> {
         "localhost", "192.2.3.1:9201"
     };
 })
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     // validate we are writing the yaml file in 7.0 format
     yamlContents.Should().NotBeEmpty()
     .And.Contain("discovery.seed_hosts")
     .And.Contain("192.2.3.1:9201")
     .And.NotContain("discovery.zen.ping.unicast.hosts")
     .And.NotContain("192.2.3.1:9200");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.ClusterName.Should().Be("x");
     s.NodeName.Should().Be("x");
     s.SeedHosts.Should().BeEquivalentTo(new List <string>
     {
         "localhost", "192.2.3.1:9201"
     });
 }
     );
Exemplo n.º 24
0
 [Fact] void CustomConfigValues() => WithValidPreflightChecks()
 .OnStep(m => m.ConfigurationModel, s =>
 {
     s.ClusterName   = "x";
     s.NodeName      = "x";
     s.MasterNode    = false;
     s.DataNode      = false;
     s.IngestNode    = false;
     s.LockMemory    = false;
     s.NetworkHost   = "xyz";
     s.HttpPort      = 80;
     s.TransportPort = 9300;
     s.UnicastNodes  = new ReactiveUI.ReactiveList <string>
     {
         "localhost", "192.2.3.1:9301"
     };
 })
 .AssertTask(
     (m, s, fs) => new EditElasticsearchYamlTask(m, s, fs),
     (m, t) =>
 {
     var dir          = m.LocationsModel.ConfigDirectory;
     var yaml         = Path.Combine(dir, "elasticsearch.yml");
     var yamlContents = t.FileSystem.File.ReadAllText(yaml);
     yamlContents.Should().NotBeEmpty().And.NotBe("cluster.name: x");
     var config = ElasticsearchYamlConfiguration.FromFolder(dir, t.FileSystem);
     var s      = config.Settings;
     s.ClusterName.Should().Be("x");
     s.NodeName.Should().Be("x");
     s.MasterNode.Should().BeFalse();
     s.IngestNode.Should().BeFalse();
     s.MemoryLock.Should().BeFalse();
     s.NetworkHost.Should().Be("xyz");
     s.HttpPort.Should().Be(80);
     s.HttpPortString.Should().Be("80");
     s.TransportTcpPort.Should().Be(9300);
     s.TransportTcpPortString.Should().Be("9300");
     s.UnicastHosts.Should().BeEquivalentTo(new List <string>
     {
         "localhost", "192.2.3.1:9301"
     });
 }
     );
        [Fact] void KnownSettingsAreReadCorrectly()
        {
            var nodeName    = "DESKTOP-O4M5B2Q";
            var clusterName = "my-cluster";
            var networkHost = "127.0.0.1";
            var folder      = @"C:\ProgramData\Elastic\Elasticsearch\";
            var yaml        = $@"bootstrap.memory_lock: true
cluster.name: {clusterName}
network.host: {networkHost}
node.data: true
node.ingest: true
node.master: true
node.max_local_storage_nodes: 1
node.name: {nodeName}
path.data: {folder}data
path.logs: {folder}logs
xpack.license.self_generated.type: trial
xpack.security.enabled: false
xpack.random_setting: something
";
            var fs          = FakeElasticsearchYaml(yaml);
            var optsFile    = new ElasticsearchYamlConfiguration(_path, fs);
            var settings    = optsFile.Settings;

            settings.NodeName.Should().Be(nodeName);
            settings.ClusterName.Should().Be(clusterName);
            settings.NetworkHost.Should().Be(networkHost);
            settings.DataNode.Should().BeTrue();
            settings.IngestNode.Should().BeTrue();
            settings.MemoryLock.Should().BeTrue();
            settings.DataPath.Should().Be(folder + "data");
            settings.LogsPath.Should().Be(folder + "logs");
            settings.MaxLocalStorageNodes.Should().Be(1);
            settings.XPackSecurityEnabled.Should().BeFalse();
            settings.XPackLicenseSelfGeneratedType.Should().Be(nameof(XPackLicenseMode.Trial).ToLowerInvariant());
            settings.Keys.Where(k => k.StartsWith("xpack")).Should().HaveCount(1);
            optsFile.Save();

            var fileContentsAfterSave = fs.File.ReadAllText(_path);

            fileContentsAfterSave.Replace("\r", "").Should().Be(yaml.Replace("\r", ""));
        }
        [Fact] void ReflectsChanges()
        {
            var clusterName = "my-cluster";
            var yaml        = $@"cluster.name: {clusterName}
some.plugin.setting: true
";
            var fs          = FakeElasticsearchYaml(yaml);
            var optsFile    = new ElasticsearchYamlConfiguration(_path, fs);

            optsFile.Settings.ClusterName            = "x";
            optsFile.Settings["some.plugin.setting"] = false;
            optsFile.Save();

            var fileContentsAfterSave = fs.File.ReadAllText(_path);
            var updatedYaml           = $@"cluster.name: x
some.plugin.setting: false
";

            fileContentsAfterSave.Replace("\r", "").Should().Be(updatedYaml.Replace("\r", ""));
        }
        [Fact] void UnknownSettingsAreNotLost()
        {
            var nodeName    = "DESKTOP-O4M5B2Q";
            var clusterName = "my-cluster";
            var yaml        = $@"cluster.name: {clusterName}
node.name: {nodeName}
some.plugin.setting: true
";
            var fs          = FakeElasticsearchYaml(yaml);
            var optsFile    = new ElasticsearchYamlConfiguration(_path, fs);
            var settings    = optsFile.Settings;

            settings.NodeName.Should().Be(nodeName);
            settings.ClusterName.Should().Be(clusterName);
            optsFile.Save();

            var fileContentsAfterSave = fs.File.ReadAllText(_path);

            fileContentsAfterSave.Replace("\r", "").Should().Be(yaml.Replace("\r", ""));
        }
Exemplo n.º 28
0
        public ConfigurationModel(ElasticsearchYamlConfiguration yamlConfiguration, LocalJvmOptionsConfiguration localJvmOptions)
        {
            this.Header           = "Configuration";
            this._localJvmOptions = localJvmOptions;
            this._yamlSettings    = yamlConfiguration?.Settings;
            this.Refresh();

            this.AddUnicastNode = ReactiveCommand.CreateAsyncTask(async _ => await this.AddUnicastNodeUITask());
            this.WhenAnyObservable(vm => vm.AddUnicastNode)
            .Subscribe(x =>
            {
                if (string.IsNullOrWhiteSpace(x))
                {
                    return;
                }
                var nodes = x
                            .Split(',')
                            .Select(node => node.Trim())
                            .Where(n => !string.IsNullOrEmpty(n))
                            .Distinct();

                foreach (var n in nodes)
                {
                    this.UnicastNodes.Add(n);
                }
            });

            this.WhenAny(
                vm => vm.TotalPhysicalMemory,
                (maxMemory) => Math.Min(maxMemory.Value / 2, CompressedOrdinaryPointersThreshold)
                )
            .ToProperty(this, vm => vm.MaxSelectedMemory, out maxSelectedMemory);

            var canRemoveNode = this.WhenAny(vm => vm.SelectedUnicastNode, (selected) => !string.IsNullOrWhiteSpace(selected.GetValue()));

            this.RemoveUnicastNode = ReactiveCommand.Create(canRemoveNode);
            this.RemoveUnicastNode.Subscribe(x =>
            {
                this.UnicastNodes.Remove(this.SelectedUnicastNode);
            });
        }
Exemplo n.º 29
0
        protected override bool ExecuteTask()
        {
            this.Session.SendActionStart(TotalTicks, ActionName, "Configuring Elasticsearch", "Configuring Elasticsearch: [1]");
            var locations = this.InstallationModel.LocationsModel;
            var config    = this.InstallationModel.ConfigurationModel;

            this.Session.SendProgress(1000, "reading elasticsearch.yml from " + locations.ConfigDirectory);
            var yaml = ElasticsearchYamlConfiguration.FromFolder(locations.ConfigDirectory, this.FileSystem);

            this.Session.SendProgress(1000, "updating elasticsearch.yml");
            var settings = yaml.Settings;

            settings.ClusterName          = config.ClusterName;
            settings.NodeName             = config.NodeName;
            settings.MasterNode           = config.MasterNode;
            settings.DataNode             = config.DataNode;
            settings.IngestNode           = config.IngestNode;
            settings.MemoryLock           = config.LockMemory;
            settings.LogsPath             = locations.LogsDirectory;
            settings.DataPath             = locations.DataDirectory;
            settings.MaxLocalStorageNodes = this.InstallationModel.ServiceModel.InstallAsService ? (int?)1 : null;
            settings.NetworkHost          = !string.IsNullOrEmpty(config.NetworkHost) ? config.NetworkHost : null;
            if (config.HttpPort.HasValue)
            {
                settings.HttpPortString = config.HttpPort.Value.ToString(CultureInfo.InvariantCulture);
            }
            if (config.TransportPort.HasValue)
            {
                settings.TransportTcpPortString = config.TransportPort.Value.ToString(CultureInfo.InvariantCulture);
            }
            var hosts = config.UnicastNodes;

            settings.UnicastHosts = hosts.Any() ? hosts.ToList() : null;
            yaml.Save();
            this.Session.SendProgress(1000, "elasticsearch.yml updated");
            return(true);
        }
Exemplo n.º 30
0
        [Fact] void KnownSettingsAreReadCorrectly()
        {
            var nodeName    = "DESKTOP-O4M5B2Q";
            var clusterName = "my-cluster";
            var networkHost = "127.0.0.1";
            var folder      = @"C:\ProgramData\Elastic\Elasticsearch\";
            var yaml        = $@"bootstrap.memory_lock: true
cluster.name: {clusterName}
network.host: {networkHost}
node.data: true
node.ingest: true
node.master: true
node.max_local_storage_nodes: 1
node.name: {nodeName}
path.data: {folder}data
path.logs: {folder}logs
";
            var fs          = FakeElasticsearchYaml(yaml);
            var optsFile    = new ElasticsearchYamlConfiguration(_path, fs);
            var settings    = optsFile.Settings;

            settings.NodeName.Should().Be(nodeName);
            settings.ClusterName.Should().Be(clusterName);
            settings.NetworkHost.Should().Be(networkHost);
            settings.DataNode.Should().BeTrue();
            settings.IngestNode.Should().BeTrue();
            settings.MemoryLock.Should().BeTrue();
            settings.DataPath.Should().Be(folder + "data");
            settings.LogsPath.Should().Be(folder + "logs");
            settings.MaxLocalStorageNodes.Should().Be(1);
            optsFile.Save();

            var fileContentsAfterSave = fs.File.ReadAllText(_path);

            fileContentsAfterSave.Replace("\r", "").Should().Be(yaml.Replace("\r", ""));
        }