class Opensearch < Formula desc "Open source distributed and RESTful search engine" homepage "https://github.com/opensearch-project/OpenSearch" url "https://github.com/opensearch-project/OpenSearch/archive/refs/tags/3.4.0.tar.gz" sha256 "04f51a656a19c5831759abec75306d7fd501d9fb5a990bd71fdd1a95a236a3ea" license "Apache-2.0" bottle do sha256 cellar: :any_skip_relocation, arm64_tahoe: "756554f32172472f177f4247ccf4cbd3f97fe867f4a4abc7c1c5a1b86b2713f1" sha256 cellar: :any_skip_relocation, arm64_sequoia: "377e322396929af6a1baf814ccab6a1fc9fea4873ecefb1db5deeeab7ae9dc9e" sha256 cellar: :any_skip_relocation, arm64_sonoma: "c26f89b151abdaea46ecb84c289ee9902164e8c10738af02cd4f9d001f052b17" sha256 cellar: :any_skip_relocation, sonoma: "ec5100c664980a09408981362ccc128e2e9c44cc1045bc016cc22cef194d2fd3" sha256 cellar: :any_skip_relocation, arm64_linux: "e01e673705f84ebdd6a9b73cf255fe1a3d7c08dfee81321f8140001f1774fdfe" sha256 cellar: :any_skip_relocation, x86_64_linux: "2744b64a839465006ee91c8b871bc466b1b6c553220c96c2196a485039c7ee22" end depends_on "gradle@8" => :build depends_on "openjdk" def install platform = OS.kernel_name.downcase platform += "-arm64" if Hardware::CPU.arm? system "gradle", "-Dbuild.snapshot=false", ":distribution:archives:no-jdk-#{platform}-tar:assemble" mkdir "tar" do # Extract the package to the tar directory system "tar", "--strip-components=1", "-xf", Dir["../distribution/archives/no-jdk-#{platform}-tar/build/distributions/opensearch-*.tar.gz"].first # Install into package directory libexec.install "bin", "lib", "modules", "agent" # Set up Opensearch for local development: inreplace "config/opensearch.yml" do |s| # 1. Give the cluster a unique name s.gsub!(/#\s*cluster\.name: .*/, "cluster.name: opensearch_homebrew") # 2. Configure paths s.sub!(%r{#\s*path\.data: /path/to.+$}, "path.data: #{var}/lib/opensearch/") s.sub!(%r{#\s*path\.logs: /path/to.+$}, "path.logs: #{var}/log/opensearch/") end inreplace "config/jvm.options", %r{logs/gc.log}, "#{var}/log/opensearch/gc.log" # add placeholder to avoid removal of empty directory touch "config/jvm.options.d/.keepme" # Move config files into etc (etc/"opensearch").install Dir["config/*"] end inreplace libexec/"bin/opensearch-env", "if [ -z \"$OPENSEARCH_PATH_CONF\" ]; then OPENSEARCH_PATH_CONF=\"$OPENSEARCH_HOME\"/config; fi", "if [ -z \"$OPENSEARCH_PATH_CONF\" ]; then OPENSEARCH_PATH_CONF=\"#{etc}/opensearch\"; fi" bin.install libexec/"bin/opensearch", libexec/"bin/opensearch-keystore", libexec/"bin/opensearch-plugin", libexec/"bin/opensearch-shard" bin.env_script_all_files(libexec/"bin", JAVA_HOME: Formula["openjdk"].opt_prefix) end def post_install # Make sure runtime directories exist (var/"lib/opensearch").mkpath (var/"log/opensearch").mkpath ln_s etc/"opensearch", libexec/"config" unless (libexec/"config").exist? (var/"opensearch/plugins").mkpath ln_s var/"opensearch/plugins", libexec/"plugins" unless (libexec/"plugins").exist? (var/"opensearch/extensions").mkpath ln_s var/"opensearch/extensions", libexec/"extensions" unless (libexec/"extensions").exist? # fix test not being able to create keystore because of sandbox permissions system bin/"opensearch-keystore", "create" unless (etc/"opensearch/opensearch.keystore").exist? end def caveats <<~EOS Data: #{var}/lib/opensearch/ Logs: #{var}/log/opensearch/opensearch_homebrew.log Plugins: #{var}/opensearch/plugins/ Config: #{etc}/opensearch/ EOS end service do run opt_bin/"opensearch" working_dir var log_path var/"log/opensearch.log" error_log_path var/"log/opensearch.log" end test do port = free_port (testpath/"data").mkdir (testpath/"logs").mkdir spawn bin/"opensearch", "-Ehttp.port=#{port}", "-Epath.data=#{testpath}/data", "-Epath.logs=#{testpath}/logs" sleep 60 output = shell_output("curl -s -XGET localhost:#{port}/") assert_equal "opensearch", JSON.parse(output)["version"]["distribution"] system bin/"opensearch-plugin", "list" end end