-
Notifications
You must be signed in to change notification settings - Fork 611
/
Copy pathtest_tasks.rake
146 lines (123 loc) · 4.86 KB
/
test_tasks.rake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 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.
UNIT_TESTED_PROJECTS = [
'elasticsearch',
'elasticsearch-transport',
'elasticsearch-dsl',
'elasticsearch-api',
'elasticsearch-xpack'
].freeze
INTEGRATION_TESTED_PROJECTS = (UNIT_TESTED_PROJECTS - ['elasticsearch-api']).freeze
namespace :test do
require 'open-uri'
task bundle: 'bundle:install'
desc 'Run all tests in all subprojects'
task client: [:unit, :integration]
desc 'Run unit tests in all subprojects'
task :unit do
UNIT_TESTED_PROJECTS.each do |project|
puts '-' * 80
sh "cd #{CURRENT_PATH.join(project)} && unset BUNDLE_GEMFILE && unset BUNDLE_PATH && unset BUNDLE_BIN && bundle exec rake test:unit"
puts "\n"
end
end
desc 'Run integration tests in all subprojects'
task :integration do
INTEGRATION_TESTED_PROJECTS.each do |project|
puts '-' * 80
sh "cd #{CURRENT_PATH.join(project)} && unset BUNDLE_GEMFILE && bundle exec rake test:integration"
puts "\n"
end
end
desc 'Run rest api tests'
task rest_api: ['elasticsearch:wait_for_green'] do
puts '-' * 80
sh "cd #{CURRENT_PATH.join('elasticsearch-api')} && unset BUNDLE_GEMFILE && bundle exec rake test:rest_api"
puts "\n"
end
desc 'Run security (Platinum) rest api yaml tests'
task security: 'elasticsearch:wait_for_green' do
puts '-' * 80
sh "cd #{CURRENT_PATH.join('elasticsearch-api')} && unset BUNDLE_GEMFILE && TEST_SUITE=platinum bundle exec rake test:rest_api"
puts "\n"
end
desc 'Download test artifacts for running cluster'
task :download_artifacts do
json_filename = CURRENT_PATH.join('tmp/artifacts.json')
# Get version number and build hash of running cluster:
es_info = cluster_info
version_number = cluster_info['number']
build_hash = cluster_info['build_hash']
puts "Build hash: #{build_hash}"
# 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)
# Get the package url from the json file given the build hash
zip_url = package_url(json_filename, build_hash)
# Download the zip file
filename = CURRENT_PATH.join("tmp/#{zip_url.split('/').last}")
download_file!(zip_url, filename)
puts "Unzipping file #{filename}"
`unzip -o #{filename} -d tmp/`
`rm #{filename}`
puts 'Artifacts downloaded in ./tmp'
end
# Returns: version_number, build_hash
def cluster_info
require 'elasticsearch'
version_info = admin_client.info['version']
abort('[!] Cannot determine cluster version information -- Is the server running?') unless version_info
version_info
rescue Faraday::ConnectionFailed => e
STDERR.puts "[!] Test cluster not running?"
abort e
end
def package_url(filename, build_hash)
begin
artifacts = JSON.parse(File.read(filename))
rescue StandardError => e
STDERR.puts "[!] Couldn't read JSON file #{filename}"
exit 1
end
build_hash_artifact = artifacts['version']['builds'].select do |build|
build.dig('projects', 'elasticsearch', 'commit_hash') == build_hash
end.first
unless build_hash_artifact
STDERR.puts "[!] Could not find artifact with build hash #{build_hash}, using latest instead"
build_hash_artifact = artifacts['version']['builds'].first
end
# 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,v| k =~ /rest-resources-zip/ }.map { | _, v| v['url'] }.first
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.exists?(filename)
STDERR.puts "[!] Couldn't download #{filename}"
exit 1
end
rescue StandardError => e
abort e
end
end