facter-statistax 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/acceptance/Gemfile +2 -1
- data/acceptance/log_performance/configuration.rb +65 -0
- data/acceptance/log_performance/custom_exceptions.rb +5 -0
- data/acceptance/log_performance/execute_beaker_tests/beaker.rb +77 -0
- data/acceptance/log_performance/execute_beaker_tests/command_logger.rb +24 -0
- data/acceptance/log_performance/execute_beaker_tests/ns_pooler.rb +60 -0
- data/acceptance/log_performance/execute_beaker_tests/output_parser.rb +40 -0
- data/acceptance/log_performance/execute_beaker_tests/run_command.rb +30 -0
- data/acceptance/log_performance/execute_beaker_tests/test_all_platforms.rb +99 -0
- data/acceptance/log_performance/execute_beaker_tests/vm_pooler.rb +7 -0
- data/acceptance/log_performance/get_supported_platforms.rb +1904 -0
- data/acceptance/log_performance/performance_times_logging/facter_performance_logs_parser.rb +65 -0
- data/acceptance/log_performance/performance_times_logging/google_sheets.rb +133 -0
- data/acceptance/log_performance/performance_times_logging/log_performance_times.rb +20 -0
- data/acceptance/log_performance/performance_times_logging/table_logging_utils.rb +55 -0
- data/acceptance/log_performance/performance_times_logging/write_facter_times_to_logger.rb +109 -0
- data/acceptance/log_performance/rspec/file_folder_utils_rspec.rb +12 -0
- data/acceptance/log_performance/utils.rb +41 -0
- data/acceptance/run/run_statistax.rb +45 -29
- data/lib/version.rb +1 -1
- data/scripts/benchmark_script.rb +9 -7
- metadata +21 -5
- data/acceptance/build_facter_ng_gem.sh +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ebdaaa85edad0d762e03120c79a30ece47041dcf61287bbd82c2b9ae9635bcb
|
4
|
+
data.tar.gz: 8d0b91944694256ad8455e93edcf8b09c464ae0dea51a093611dc8e6021b4fcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3dbfe4ce4094370d43301e30b1fbb504dc463fd61f87b09706ce40a85f564e20996a97f3eb953347647c308ea1efaa8bbb241ee47dba7f74bb25be6fffab0304
|
7
|
+
data.tar.gz: 3c3b4615a699b39f114ba4e4d29388a0f8511c084ea6878c492dc2c15801433c495e9ae8b8329e7d8dd1754751db4d9340da49f24ee6466d4fd4fec0201c7333
|
data/acceptance/Gemfile
CHANGED
@@ -13,7 +13,7 @@ def location_for(place, fake_version = nil)
|
|
13
13
|
end
|
14
14
|
|
15
15
|
gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 4.0')
|
16
|
-
gem "beaker-puppet", *location_for(ENV['BEAKER_PUPPET_VERSION'] || ["~>1.0", ">= 1.18
|
16
|
+
gem "beaker-puppet", *location_for(ENV['BEAKER_PUPPET_VERSION'] || ["~>1.0", ">= 1.18"])
|
17
17
|
gem "beaker-hostgenerator", *location_for(ENV['BEAKER_HOSTGENERATOR_VERSION'] || "~> 1.1")
|
18
18
|
gem "beaker-abs", *location_for(ENV['BEAKER_ABS_VERSION'] || "~> 0.4")
|
19
19
|
gem "beaker-vagrant", *location_for(ENV['BEAKER_VAGRANT_VERSION'] || "~> 0")
|
@@ -23,6 +23,7 @@ gem "beaker-docker", *location_for(ENV['BEAKER_DOCKER_VERSION'] || "~> 0.5")
|
|
23
23
|
gem "rake", "~> 10.1"
|
24
24
|
gem "httparty", :require => false
|
25
25
|
gem 'uuidtools', :require => false
|
26
|
+
gem "google-api-client", "~>0.36.4"
|
26
27
|
|
27
28
|
group(:test) do
|
28
29
|
gem "rspec", "~> 2.14.0", :require => false
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Configuration
|
4
|
+
BEAKER_ENV_VARS = {
|
5
|
+
'GOOGLE_APPLICATION_CREDENTIALS' => '/Users/andrei.filipovici/projects/google-sheets/Facter Performance History-99315759f0c6.json',
|
6
|
+
'IS_GEM' => 'true'
|
7
|
+
}
|
8
|
+
SPREADSHEET_ID = '1giARlXsBSGhxIWRlThV8QfmybeAfaBrNRzdr9C0pvPw'
|
9
|
+
USER_HOME_PATH = '/Users/andrei.filipovici/'
|
10
|
+
FACTER_NG_PROJECT_PATH = '/Users/andrei.filipovici/projects/facter-ng-for-statistax'
|
11
|
+
STATISTAX_PROJECT_PATH = '/Users/andrei.filipovici/projects/facter-statistax/acceptance/'
|
12
|
+
LOGS_FOLDER_PATH = '/Users/andrei.filipovici/projects/facter-statistax/acceptance/cron_logs'
|
13
|
+
RUN_FAILS_LOG_NAME = '_run_failures'
|
14
|
+
SCRIPT_ERRORS_LOG_NAME = '_script_failures'
|
15
|
+
PRE_TESTS_LOG_NAME = '_all'
|
16
|
+
VMPOOLERP_PLATFORMS = [
|
17
|
+
# 'centos6-32',
|
18
|
+
# 'centos6-64',
|
19
|
+
# 'debian8-32',
|
20
|
+
# 'debian8-64',
|
21
|
+
# 'debian9-32',
|
22
|
+
# 'debian9-64',
|
23
|
+
# 'debian10-64',
|
24
|
+
# 'fedora28-64',
|
25
|
+
# 'fedora29-64',
|
26
|
+
# 'fedora30-64',
|
27
|
+
# 'fedora31-64',
|
28
|
+
# 'osx1012-64',
|
29
|
+
# 'osx1013-64',
|
30
|
+
# 'osx1014-64',
|
31
|
+
# 'osx1015-64',
|
32
|
+
# 'redhat5-64',
|
33
|
+
# 'redhat7-64',
|
34
|
+
# 'redhatfips7-64',
|
35
|
+
# 'redhat8-64',
|
36
|
+
# 'sles11-32',
|
37
|
+
# 'sles11-64',
|
38
|
+
# 'sles12-64',
|
39
|
+
# 'sles15-64',
|
40
|
+
# 'solaris10-64',
|
41
|
+
# 'solaris11-64',
|
42
|
+
# 'solaris114-64',
|
43
|
+
# 'ubuntu1404-32',
|
44
|
+
'ubuntu1404-64',
|
45
|
+
# 'ubuntu1604-32',
|
46
|
+
# 'ubuntu1604-64',
|
47
|
+
# 'ubuntu1804-64',
|
48
|
+
# 'windows2008r2-64',
|
49
|
+
# 'windows2012r2-64',
|
50
|
+
# 'windowsfips2012r2-64',
|
51
|
+
# 'windows2016-64',
|
52
|
+
# 'windows2019-64',
|
53
|
+
# 'windows10ent-32',
|
54
|
+
# 'windows10ent-64',
|
55
|
+
]
|
56
|
+
NSPOOLER_PLATFORMS = {
|
57
|
+
# "aix61-POWER" => "aix-6.1-power",
|
58
|
+
# "aix71-POWER" => "aix-7.1-power",
|
59
|
+
# "aix72-POWER" => "aix-7.2-power",
|
60
|
+
# "redhat7-POWER" => "redhat-7.3-power8",
|
61
|
+
# "redhat7-AARCH64" => "centos-7-arm64",
|
62
|
+
# "ubuntu1604-POWER" => "ubuntu-16.04-power8",
|
63
|
+
# "sles12-POWER" => "sles-12-power8",
|
64
|
+
}
|
65
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require_relative '../custom_exceptions'
|
2
|
+
class Beaker
|
3
|
+
|
4
|
+
def initialize(platforms, user_home_path, beaker_env_vars, logger)
|
5
|
+
@platforms = platforms
|
6
|
+
@user_home_path = user_home_path
|
7
|
+
@beaker_env_vars = beaker_env_vars
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def run_test_on_all_platforms
|
12
|
+
@platforms.each do |platform|
|
13
|
+
begin
|
14
|
+
@current_platform = platform
|
15
|
+
test_sequence
|
16
|
+
rescue FailedCommand
|
17
|
+
destroy_environment
|
18
|
+
next
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_sequence
|
24
|
+
time = TimedMethods.get_run_time{
|
25
|
+
clean_beaker_home
|
26
|
+
create_vm_hosts_file
|
27
|
+
config_hosts_options
|
28
|
+
provision
|
29
|
+
install_agent_facter_statistax
|
30
|
+
run_statistax_tests
|
31
|
+
destroy_environment
|
32
|
+
}
|
33
|
+
@logger.log("Runtime was #{time} minutes.", @current_platform)
|
34
|
+
end
|
35
|
+
|
36
|
+
def clean_beaker_home
|
37
|
+
# if an error happened and beaker destroy doesn't get called, the .beaker folder remains
|
38
|
+
# and it need to be deleted. Otherwise you get an error saying the beaker parameters can't be parsed
|
39
|
+
log_run_command("cd #{@user_home_path} && rm -rf .beaker")
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_vm_hosts_file
|
43
|
+
log_run_command("beaker-hostgenerator #{@current_platform} > hosts.yaml")
|
44
|
+
end
|
45
|
+
|
46
|
+
def config_hosts_options
|
47
|
+
log_run_command('beaker init -h hosts.yaml --options-file config/aio/options.rb', 2)
|
48
|
+
end
|
49
|
+
|
50
|
+
def provision
|
51
|
+
log_run_command('bundle exec beaker provision', 10)
|
52
|
+
end
|
53
|
+
|
54
|
+
def install_agent_facter_statistax
|
55
|
+
log_run_command('bundle exec beaker exec pre-suite --pre-suite presuite/01_install_puppet_agent.rb,presuite/011_install_facter_ng.rb,presuite/02_install_facter_statistax.rb', 10)
|
56
|
+
end
|
57
|
+
|
58
|
+
def run_statistax_tests
|
59
|
+
log_run_command('bundle exec beaker exec run/run_statistax.rb', 10)
|
60
|
+
end
|
61
|
+
|
62
|
+
def destroy_environment
|
63
|
+
log_run_command('beaker destroy')
|
64
|
+
end
|
65
|
+
|
66
|
+
def log_run_command(command, timeout_minutes = 1)
|
67
|
+
output = RunCommand.run_command(timeout_minutes, @beaker_env_vars, command)
|
68
|
+
has_errors, errors = OutputParser.errors?(output)
|
69
|
+
@logger.log("Running command: #{command}\n#{output}", @current_platform)
|
70
|
+
|
71
|
+
return output unless has_errors
|
72
|
+
|
73
|
+
@logger.log_error("On platform #{@current_platform},
|
74
|
+
running command:\n #{command}\ngot error:\n#{errors.join("\n")}")
|
75
|
+
raise FailedCommand
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class CommandLogger
|
2
|
+
def initialize(log_folder, error_log_file, log_file = 'log.log')
|
3
|
+
@log_folder = log_folder
|
4
|
+
@log_file = log_file
|
5
|
+
@errors_file = error_log_file
|
6
|
+
end
|
7
|
+
|
8
|
+
def log(data, log_file_name = nil)
|
9
|
+
log_file = log_file_name.nil? ? @log_file : log_file_name
|
10
|
+
append_to_file(data, log_file)
|
11
|
+
end
|
12
|
+
|
13
|
+
def log_error(data)
|
14
|
+
append_to_file(data, @errors_file)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def append_to_file(data, log_file_name)
|
20
|
+
File.open("#{@log_folder}/#{log_file_name}.log", mode: 'a') do |file|
|
21
|
+
file.write("\n#{data}\n")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative 'beaker'
|
2
|
+
|
3
|
+
class NSPooler < Beaker
|
4
|
+
def initialize(platforms, user_home_path, env_vars, logger)
|
5
|
+
super(platforms, user_home_path, env_vars, logger)
|
6
|
+
end
|
7
|
+
|
8
|
+
def run_test_on_all_platforms
|
9
|
+
@platforms.each do |platform, platform_template|
|
10
|
+
begin
|
11
|
+
@current_platform = platform
|
12
|
+
next unless get_nspooler_vm(platform_template)
|
13
|
+
|
14
|
+
test_sequence
|
15
|
+
rescue FailedCommand
|
16
|
+
destroy_environment
|
17
|
+
next
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_vm_hosts_file
|
23
|
+
log_run_command("beaker-hostgenerator #{get_beaker_platform_name(@current_platform, @nspooler_host_name)} > hosts.yaml")
|
24
|
+
end
|
25
|
+
|
26
|
+
def destroy_environment
|
27
|
+
super
|
28
|
+
log_run_command("curl -H X-AUTH-TOKEN:VmPoolerAuthToken -X POST -d '' --url https://nspooler-service-prod-1.delivery.puppetlabs.net/api/v1/maint/reset/#{@nspooler_host_name}")
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def get_nspooler_vm(platform_template)
|
34
|
+
provisioned_vm = make_request_for_vm(platform_template)
|
35
|
+
if provisioned_vm['ok'] == true
|
36
|
+
@nspooler_host_name = provisioned_vm[platform_template]['hostname']
|
37
|
+
true
|
38
|
+
else
|
39
|
+
@logger.log_error("No VM available for #{@current_platform}")
|
40
|
+
false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def make_request_for_vm(platform_template)
|
45
|
+
get_vm_response = log_run_command("curl --fail --silent --show-error -H X-AUTH-TOKEN:VmPoolerAuthToken -X POST -d '{\"#{platform_template}\":1}' --url https://nspooler-service-prod-1.delivery.puppetlabs.net/api/v1/host/")
|
46
|
+
JSON.parse(get_vm_response.gsub('=>', ':'))
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_beaker_platform_name(platform, nsPooler_host_name)
|
50
|
+
#because of how packaging for agent is made we need to lie beaker about aix version. If we have a version 7, we need
|
51
|
+
# to tell it, it's running on version 6
|
52
|
+
beaker_platform = if platform.include?('aix7')
|
53
|
+
platform.sub(/aix7[1-2]/, 'aix61')
|
54
|
+
else
|
55
|
+
platform
|
56
|
+
end
|
57
|
+
"#{beaker_platform}\\{hypervisor=none\\,hostname=#{nsPooler_host_name}\\}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module OutputParser
|
4
|
+
@error_tokens = [
|
5
|
+
'retrying in',
|
6
|
+
'command not found',
|
7
|
+
'invalidurierror',
|
8
|
+
'timed out',
|
9
|
+
'Failed while running the pre_suite suite',
|
10
|
+
'Failed while running the tests suite',
|
11
|
+
'NoMethodError',
|
12
|
+
'ERROR Facter',
|
13
|
+
'ERROR: Gemspec file not found:'
|
14
|
+
]
|
15
|
+
|
16
|
+
def self.errors?(data)
|
17
|
+
errors = extract_errors(data)
|
18
|
+
if errors.empty?
|
19
|
+
[false, '']
|
20
|
+
else
|
21
|
+
[true, errors.to_a]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private_class_method def self.extract_errors(data)
|
26
|
+
# data needs to be encoded because you never know what you get from different vms
|
27
|
+
data.encode!('UTF-8', invalid: :replace, undef: :replace)
|
28
|
+
errors = Set.new
|
29
|
+
@error_tokens.each do |error|
|
30
|
+
# Match substring that contains the error token and is between [<time>] and [<time>]
|
31
|
+
# used 'i' to ignore case
|
32
|
+
data.scan(/[^\[]*#{error}[^\[]*/i) do |entire_error|
|
33
|
+
errors << entire_error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
errors
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'open3'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module RunCommand
|
5
|
+
def self.run_command(timeout_in_minutes = 1, env_vars = {}, command)
|
6
|
+
@wait_thread = nil
|
7
|
+
@output = ''
|
8
|
+
begin
|
9
|
+
Timeout.timeout(timeout_in_minutes * 60) do
|
10
|
+
get_command_output(command, env_vars)
|
11
|
+
end
|
12
|
+
rescue Timeout::Error
|
13
|
+
Process.kill('KILL', @wait_thread) if @wait_thread.alive?
|
14
|
+
"Timed out! Did only:\n#{@output}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private_class_method def self.get_command_output(command, env_vars)
|
19
|
+
Open3.popen2e(env_vars, command) do |_stdin, stdout_and_stderr, wait_thr|
|
20
|
+
@wait_thread = wait_thr
|
21
|
+
stdout_and_stderr.each do |line|
|
22
|
+
@output << line
|
23
|
+
puts line
|
24
|
+
end
|
25
|
+
end
|
26
|
+
@output
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require 'date'
|
3
|
+
require_relative 'vm_pooler'
|
4
|
+
require_relative 'ns_pooler'
|
5
|
+
require_relative 'run_command'
|
6
|
+
require_relative '../configuration'
|
7
|
+
require_relative '../utils'
|
8
|
+
require_relative 'command_logger'
|
9
|
+
require_relative 'output_parser'
|
10
|
+
require_relative '../custom_exceptions'
|
11
|
+
|
12
|
+
class TestAllPlatforms
|
13
|
+
def initialize
|
14
|
+
@logs_folder = "#{Configuration::LOGS_FOLDER_PATH}/#{DateTime.now.strftime("%d-%m-%Y_%H:%M")}"
|
15
|
+
@logger = CommandLogger.new(@logs_folder, Configuration::SCRIPT_ERRORS_LOG_NAME, Configuration::PRE_TESTS_LOG_NAME)
|
16
|
+
beaker_logger = CommandLogger.new(@logs_folder, Configuration::RUN_FAILS_LOG_NAME)
|
17
|
+
@vmpooler = VMPooler.new(Configuration::VMPOOLERP_PLATFORMS,
|
18
|
+
Configuration::USER_HOME_PATH,
|
19
|
+
Configuration::BEAKER_ENV_VARS,
|
20
|
+
beaker_logger)
|
21
|
+
@nspooler = NSPooler.new(Configuration::NSPOOLER_PLATFORMS,
|
22
|
+
Configuration::USER_HOME_PATH,
|
23
|
+
Configuration::BEAKER_ENV_VARS,
|
24
|
+
beaker_logger)
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_tests
|
28
|
+
time = TimedMethods.get_run_time {
|
29
|
+
prepare_environment
|
30
|
+
run_tests_on_vms
|
31
|
+
}
|
32
|
+
@logger.log("Runtime was #{time} minutes.")
|
33
|
+
rescue FailedCommand
|
34
|
+
exit
|
35
|
+
rescue StandardError => e
|
36
|
+
log_script_error(e)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def prepare_environment
|
42
|
+
FileFolderUtils.create_directories(@logs_folder)
|
43
|
+
clean_workspace
|
44
|
+
Configuration::BEAKER_ENV_VARS['SHA'] = get_latest_agent_sha
|
45
|
+
get_latest_facter_ng_gem
|
46
|
+
end
|
47
|
+
|
48
|
+
def clean_workspace
|
49
|
+
Dir.chdir(Configuration::STATISTAX_PROJECT_PATH) do
|
50
|
+
log_run_command('rm *.gem')
|
51
|
+
log_run_command('rm puppet-agent*')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_latest_agent_sha
|
56
|
+
log_run_command('curl --fail --silent GET --url http://builds.delivery.puppetlabs.net/passing-agent-SHAs/puppet-agent-master')
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_latest_facter_ng_gem
|
60
|
+
Dir.chdir(Configuration::FACTER_NG_PROJECT_PATH) do
|
61
|
+
update_facter_ng_master
|
62
|
+
log_run_command('gem build facter.gemspec')
|
63
|
+
log_run_command("mv *gem #{Configuration::STATISTAX_PROJECT_PATH}")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def update_facter_ng_master
|
68
|
+
log_run_command('git checkout master')
|
69
|
+
log_run_command('git fetch --all')
|
70
|
+
log_run_command('git reset --hard origin/master')
|
71
|
+
end
|
72
|
+
|
73
|
+
def run_tests_on_vms
|
74
|
+
Dir.chdir(Configuration::STATISTAX_PROJECT_PATH) do
|
75
|
+
@vmpooler.run_test_on_all_platforms
|
76
|
+
@nspooler.run_test_on_all_platforms
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def log_run_command(command)
|
81
|
+
output = RunCommand.run_command(command)
|
82
|
+
has_errors, = OutputParser.errors?(output)
|
83
|
+
if has_errors
|
84
|
+
@logger.log("Command: #{command} had error:\n#{output}")
|
85
|
+
raise FailedCommand
|
86
|
+
else
|
87
|
+
@logger.log("Running command: #{command}\n#{output}")
|
88
|
+
end
|
89
|
+
output
|
90
|
+
end
|
91
|
+
|
92
|
+
def log_script_error(e)
|
93
|
+
error_message = e.message + "\n" + e.backtrace.inspect.gsub(', ', "\n")
|
94
|
+
puts error_message
|
95
|
+
@logger.log_error("#{@start_time}\n" + error_message)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
TestAllPlatforms.new.run_tests
|