rake_tasks/elasticsearch_tasks.rake (99 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. namespace :es do desc 'Wait for elasticsearch cluster to be in green state' task :wait_for_green do require 'elasticsearch' ready = nil 5.times do |i| begin puts "Attempting to wait for green status: #{i + 1}" if admin_client.cluster.health(wait_for_status: 'green', timeout: '50s') ready = true break end rescue Elastic::Transport::Transport::Errors::RequestTimeout => e puts "Couldn't confirm green status.\n#{e.inspect}." rescue Faraday::ConnectionFailed => e puts "Couldn't connect to Elasticsearch.\n#{e.inspect}." sleep(30) end end unless ready puts "Couldn't connect to Elasticsearch, aborting program." exit(1) end end desc 'Automatically update to latest version' task :autoupdate_version do require 'tempfile' branch = `git branch --show-current`.strip url = "https://artifacts-snapshot.elastic.co/elasticsearch/latest/#{branch}.json" file = Tempfile.new('version') download_file!(url, file) version = JSON.parse(file.read)['version'] puts "Latest version is #{version}" Rake::Task['automation:bumpmatrix'].invoke(version) end def download_file!(url, filename) puts "Downloading #{filename} from #{url}" File.open(filename, 'w') do |downloaded_file| URI.open(url, 'rb') do |artifact_file| downloaded_file.write(artifact_file.read) end end puts "Successfully downloaded #{filename}" unless File.exist?(filename) warn "[!] Couldn't download #{filename}" exit 1 end rescue OpenURI::HTTPError => e abort e.message rescue StandardError => e puts e.backtrace.join("\n\t") abort e.message end # Deprecated desc 'Download Elasticsearch artifacts (tests and REST spec) for currently running cluster' task :download_artifacts, :version do |_, args| json_filename = CURRENT_PATH.join('tmp/artifacts.json') version_number = args[:version] || ENV['STACK_VERSION'] || version_from_buildkite || version_from_running_cluster # Create ./tmp if it doesn't exist Dir.mkdir(CURRENT_PATH.join('tmp'), 0700) unless File.directory?(CURRENT_PATH.join('tmp')) # Download json file with package information for version: json_url = "https://artifacts-api.elastic.co/v1/versions/#{version_number}" download_file!(json_url, json_filename) # Parse the downloaded JSON begin artifacts = JSON.parse(File.read(json_filename)) rescue StandardError => e STDERR.puts "[!] Couldn't read JSON file #{json_filename}" exit 1 end # Either find the artifacts for the exact same build hash from the current running cluster or # use the first one from the list of builds: build_hash_artifact = artifacts['version']['builds'].find do |build| build.dig('projects', 'elasticsearch', 'commit_hash') == @build_hash end || artifacts['version']['builds'].first zip_url = build_hash_artifact.dig('projects', 'elasticsearch', 'packages').select { |k, _| k =~ /rest-resources-zip/ }.map { |_, v| v['url'] }.first # Dig into the elasticsearch packages, search for the rest-resources-zip package and return the URL: build_hash_artifact.dig('projects', 'elasticsearch', 'packages').select { |k, _| k =~ /rest-resources-zip/ }.map { |_, v| v['url'] }.first # Download the zip file filename = CURRENT_PATH.join("tmp/#{zip_url.split('/').last}") download_file!(zip_url, filename) spec = CURRENT_PATH.join('tmp/rest-api-spec') FileUtils.remove_dir(spec) if File.directory?(spec) puts "Unzipping file #{filename}" `unzip -o #{filename} -d tmp/` `rm #{filename}` puts "Artifacts downloaded in ./tmp, build hash #{@build_hash}" File.write(CURRENT_PATH.join('tmp/rest-api-spec/build_hash'), @build_hash) end def version_from_buildkite require 'yaml' yaml = YAML.load_file(File.expand_path('../.buildkite/pipeline.yml', __dir__)) yaml['steps'].first['env']['STACK_VERSION'] end def version_from_running_cluster info = cluster_info @build_hash = info['build_hash'] if info['build_hash'] info['number'] end desc 'Check Elasticsearch health' task :health do require 'elasticsearch' puts "ELASTICSEARCH_HOST: #{ENV['ELASTICSEARCH_HOST']}" client = Elasticsearch::Client.new(hosts: [ENV['ELASTICSEARCH_HOST']]) puts client.cluster.health end end