From 21e86e29eb704711faa0a84734a735f294a2cdf4 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 18 Dec 2023 14:39:29 +1300 Subject: [PATCH] Set initial admin password Signed-off-by: Thomas Farr --- .github/workflows/integration.yml | 2 +- .../Tasks/IClusterComposeTask.cs | 24 +++-- .../InstallationTasks/InitialConfiguration.cs | 60 +++++++++---- .../Tasks/InstallationTasks/InstallPlugins.cs | 1 + .../Samples/Utils/OpenSearchClientOptions.cs | 1 - .../Clusters/ReadOnlyCluster.cs | 2 +- .../Clusters/WritableCluster.cs | 1 - .../NodeSeeders/DefaultSeeder.cs | 34 +++---- tests/Tests.Domain/Project.cs | 8 +- .../PutMapping/PutMappingApiTest.cs | 89 ++++++++++--------- .../Specialized/Knn/KnnVectorPropertyTests.cs | 3 + .../Specialized/Knn/KnnQueryUsageTests.cs | 14 ++- .../RenderSearchTemplateApiTests.cs | 1 + 13 files changed, 149 insertions(+), 91 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 53dc466457..5a66dad612 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -95,7 +95,7 @@ jobs: with: ref: ${{ matrix.opensearch_ref }} security_plugin: ${{ matrix.opensearch_ref == '1.x' }} - knn_plugin: true + knn_plugin: false plugins_output_directory: ${{ env.OPENSEARCH_PLUGINS_DIRECTORY }} - run: "./build.sh integrate $OPENSEARCH_VERSION readonly,writable random:test_only_one --report" diff --git a/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/IClusterComposeTask.cs b/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/IClusterComposeTask.cs index 199e363e34..cf6942a61a 100644 --- a/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/IClusterComposeTask.cs +++ b/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/IClusterComposeTask.cs @@ -172,26 +172,34 @@ protected static void WriteFileIfNotExist(string fileLocation, string contents) protected static void ExecuteBinary(EphemeralClusterConfiguration config, IConsoleLineHandler writer, string binary, string description, params string[] arguments) => - ExecuteBinaryInternal(config, writer, binary, description, null, arguments); + ExecuteBinaryInternal(config, writer, binary, description, null, null, arguments); protected static void ExecuteBinary(EphemeralClusterConfiguration config, IConsoleLineHandler writer, string binary, string description, StartedHandler startedHandler, params string[] arguments) => - ExecuteBinaryInternal(config, writer, binary, description, startedHandler, arguments); + ExecuteBinaryInternal(config, writer, binary, description, startedHandler, null, arguments); + + protected static void ExecuteBinary(EphemeralClusterConfiguration config, IConsoleLineHandler writer, + string binary, string description, IDictionary environmentVariables, + params string[] arguments) => + ExecuteBinaryInternal(config, writer, binary, description, null, environmentVariables, arguments); private static void ExecuteBinaryInternal(EphemeralClusterConfiguration config, IConsoleLineHandler writer, - string binary, string description, StartedHandler startedHandler, params string[] arguments) + string binary, string description, StartedHandler startedHandler, IDictionary environmentVariables, params string[] arguments) { var command = $"{{{binary}}} {{{string.Join(" ", arguments)}}}"; writer?.WriteDiagnostic($"{{{nameof(ExecuteBinary)}}} starting process [{description}] {command}"); + var environment = environmentVariables != null + ? new Dictionary(environmentVariables) + : new Dictionary(); + + environment.Add(config.FileSystem.ConfigEnvironmentVariableName, config.FileSystem.ConfigPath); + environment.Add("OPENSEARCH_HOME", config.FileSystem.OpenSearchHome); + var timeout = TimeSpan.FromSeconds(420); var processStartArguments = new StartArguments(binary, arguments) { - Environment = new Dictionary - { - {config.FileSystem.ConfigEnvironmentVariableName, config.FileSystem.ConfigPath}, - {"OPENSEARCH_HOME", config.FileSystem.OpenSearchHome}, - } + Environment = environment }; var result = startedHandler != null diff --git a/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InitialConfiguration.cs b/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InitialConfiguration.cs index b938890102..64d83aca57 100644 --- a/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InitialConfiguration.cs +++ b/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InitialConfiguration.cs @@ -26,10 +26,11 @@ * under the License. */ +using System.Collections.Generic; using System.IO; using System.Linq; using OpenSearch.OpenSearch.Managed.ConsoleWriters; -using OpenSearch.Stack.ArtifactsApi; +using SemanticVersioning; namespace OpenSearch.OpenSearch.Ephemeral.Tasks.InstallationTasks { @@ -38,26 +39,55 @@ public class InitialConfiguration : ClusterComposeTask public override void Run(IEphemeralCluster cluster) { var fs = cluster.FileSystem; - var configFile = Path.Combine(fs.OpenSearchHome, "config", "opensearch.yml"); - if (File.Exists(configFile) && File.ReadLines(configFile).Any(l => !string.IsNullOrWhiteSpace(l) && !l.StartsWith("#"))) - { - cluster.Writer?.WriteDiagnostic($"{{{nameof(InitialConfiguration)}}} opensearch.yml already exists, skipping initial configuration"); - return; - } + var installConfigDir = Path.Combine(fs.OpenSearchHome, "config"); + var installConfigFile = Path.Combine(installConfigDir, "opensearch.yml"); + var configFile = Path.Combine(fs.ConfigPath, "opensearch.yml"); + var configSecurity = Path.Combine(fs.ConfigPath, "opensearch-security"); + + var isNewDemoScript = cluster.ClusterConfiguration.Version.BaseVersion() >= new Version(2, 12, 0); + + var installSecurityConfig = Path.Combine(installConfigDir, "opensearch-security"); - var securityInstallDemoConfigSubPath = "plugins/opensearch-security/tools/install_demo_configuration.sh"; + if (isNewDemoScript && Directory.Exists(configSecurity)) Directory.Move(configSecurity, installSecurityConfig); + + const string securityInstallDemoConfigSubPath = "plugins/opensearch-security/tools/install_demo_configuration.sh"; var securityInstallDemoConfig = Path.Combine(fs.OpenSearchHome, securityInstallDemoConfigSubPath); cluster.Writer?.WriteDiagnostic($"{{{nameof(InitialConfiguration)}}} going to run [{securityInstallDemoConfigSubPath}]"); - ExecuteBinary( - cluster.ClusterConfiguration, - cluster.Writer, - "/bin/bash", - "install security plugin demo configuration", - securityInstallDemoConfig, - "-y", "-i", "-s"); + var alreadyInstalled = File.Exists(installConfigFile) && File.ReadLines(installConfigFile).Any(l => l.Contains("plugins.security")); + + if (!alreadyInstalled) + { + var env = new Dictionary(); + var args = new List { securityInstallDemoConfig, "-y", "-i" }; + + if (isNewDemoScript) + { + env.Add("OPENSEARCH_INITIAL_ADMIN_PASSWORD", "admin"); + args.Add("-t"); + } + + ExecuteBinary( + cluster.ClusterConfiguration, + cluster.Writer, + "/bin/bash", + "install security plugin demo configuration", + env, + args.ToArray()); + } + + Directory.CreateDirectory(fs.ConfigPath); + + if (isNewDemoScript) + { + Directory.CreateDirectory(configSecurity); + CopyFolder(installSecurityConfig, configSecurity); + } + + foreach (var f in new[]{"opensearch.yml", "esnode.pem", "esnode-key.pem", "root-ca.pem"}) + File.Copy(Path.Combine(installConfigDir, f), Path.Combine(fs.ConfigPath, f), true); if (cluster.ClusterConfiguration.EnableSsl) return; diff --git a/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InstallPlugins.cs b/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InstallPlugins.cs index c64501038e..89c76b8ec3 100644 --- a/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InstallPlugins.cs +++ b/abstractions/src/OpenSearch.OpenSearch.Ephemeral/Tasks/InstallationTasks/InstallPlugins.cs @@ -196,6 +196,7 @@ private static void CopyConfigDirectoryToHomeCacheConfigDirectory( var configPluginPathCached = Path.Combine(configTarget, plugin.SubProductName); if (!Directory.Exists(configPluginPath) || Directory.Exists(configPluginPathCached)) return; + cluster.Writer?.WriteDiagnostic($"{{{nameof(InstallPlugins)}}} copying plugin config from [{configPluginPath}] to [{configPluginPathCached}]"); Directory.CreateDirectory(configPluginPathCached); CopyFolder(configPluginPath, configPluginPathCached); } diff --git a/samples/Samples/Utils/OpenSearchClientOptions.cs b/samples/Samples/Utils/OpenSearchClientOptions.cs index 628a448d0d..ae42bdb387 100644 --- a/samples/Samples/Utils/OpenSearchClientOptions.cs +++ b/samples/Samples/Utils/OpenSearchClientOptions.cs @@ -18,7 +18,6 @@ public static IValueDescriptor AddOpenSearchClientOptions(thi { Option host = new("--host", () => new Uri("https://localhost:9200"), "The OpenSearch host to connect to"); Option username = new("--username", () => "admin", "The username to use for authentication"); - // TODO: This line needs to be updated to replace 'admin' with custom password Option password = new("--password", () => "admin", "The password to use for authentication"); Action