gooddata 2.1.8 → 2.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/.travis.yml +1 -1
  4. data/Dockerfile +9 -4
  5. data/Dockerfile.jruby +4 -4
  6. data/Dockerfile.ruby +5 -4
  7. data/SDK_VERSION +1 -1
  8. data/VERSION +1 -1
  9. data/bin/provision.sh +2 -0
  10. data/bin/release.sh +2 -0
  11. data/bin/rollout.sh +2 -0
  12. data/bin/run_brick.rb +28 -7
  13. data/bin/test_projects_cleanup.rb +4 -0
  14. data/bin/user_filters.sh +2 -0
  15. data/ci.rake +1 -1
  16. data/dev-gooddata-sso.pub.encrypted +40 -40
  17. data/gooddata.gemspec +5 -1
  18. data/lcm.rake +10 -0
  19. data/lib/gooddata/bricks/middleware/execution_result_middleware.rb +68 -0
  20. data/lib/gooddata/bricks/middleware/logger_middleware.rb +2 -1
  21. data/lib/gooddata/bricks/middleware/mask_logger_decorator.rb +5 -1
  22. data/lib/gooddata/bricks/pipeline.rb +7 -0
  23. data/lib/gooddata/cloud_resources/cloud_resouce_factory.rb +28 -0
  24. data/lib/gooddata/cloud_resources/cloud_resource_client.rb +24 -0
  25. data/lib/gooddata/cloud_resources/cloud_resources.rb +12 -0
  26. data/lib/gooddata/cloud_resources/redshift/drivers/log4j.properties +15 -0
  27. data/lib/gooddata/cloud_resources/redshift/redshift_client.rb +100 -0
  28. data/lib/gooddata/exceptions/invalid_env_error.rb +15 -0
  29. data/lib/gooddata/helpers/data_helper.rb +10 -0
  30. data/lib/gooddata/helpers/global_helpers.rb +4 -0
  31. data/lib/gooddata/helpers/global_helpers_params.rb +4 -7
  32. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +4 -1
  33. data/lib/gooddata/lcm/actions/collect_segments.rb +1 -2
  34. data/lib/gooddata/lcm/actions/create_segment_masters.rb +5 -3
  35. data/lib/gooddata/lcm/actions/synchronize_clients.rb +1 -1
  36. data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +1 -2
  37. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +10 -2
  38. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +22 -2
  39. data/lib/gooddata/lcm/actions/synchronize_users.rb +19 -0
  40. data/lib/gooddata/lcm/actions/update_release_table.rb +7 -1
  41. data/lib/gooddata/lcm/exceptions/lcm_execution_error.rb +16 -0
  42. data/lib/gooddata/lcm/helpers/release_table_helper.rb +16 -8
  43. data/lib/gooddata/lcm/lcm2.rb +6 -4
  44. data/lib/gooddata/models/execution.rb +0 -1
  45. data/lib/gooddata/models/execution_detail.rb +0 -1
  46. data/lib/gooddata/models/profile.rb +33 -11
  47. data/lib/gooddata/models/project.rb +2 -2
  48. data/lib/gooddata/models/project_creator.rb +2 -0
  49. data/lib/gooddata/models/schedule.rb +0 -1
  50. data/lib/gooddata/rest/client.rb +2 -2
  51. data/lib/gooddata/rest/connection.rb +5 -3
  52. data/rubydev_public.gpg.encrypted +51 -51
  53. data/rubydev_secret_keys.gpg.encrypted +109 -109
  54. metadata +12 -5
  55. data/lib/gooddata/extensions/hash.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26fdaed1447fc9a8286809d0d0c0fa1f8f770758af999b0f542792a2beeb6562
4
- data.tar.gz: aa831822c9861d6fe7bffe5cc88c8563132d9cb4cddc44dcb551161bbfce78d8
3
+ metadata.gz: db8ee40362c67f15f08bf4b4a8ec1d5e98aac617ee327997c28a21fbf618c72e
4
+ data.tar.gz: 1ce32f0cfae0eb7635cccc723cc15050728e25748cff678a33df2840a6ca15ed
5
5
  SHA512:
6
- metadata.gz: b897f3b2dbd8b8fee48f41be53a737ae86e625b712e2f2ef7a0b4d9aa044755a91fe248436a0fda2845b431d3a080c98980e8d61f9ea84b96f8c872ae9b48b3b
7
- data.tar.gz: c0dee9c40b60bcb9224781cc3ed9e84a614235810256676271299331499810d6adcaa83ffaa10515c9ed5199433836cf7f21256f6db0ed288b737383124747ef
6
+ metadata.gz: 77d278325d84ee3e146b6ccace33b30bfe87dc0072b292e5e0e5f74301f1dde578369f1fba0dffce72d987c246855e84bec2928c2b3bacd400e5bebe7cc763ff
7
+ data.tar.gz: df17f823be2441a365f90cff0480972caf8adcaa00db39300b4990d0abbbdb2e13d21b05b27292e4620e6b56f416193f1fbf2dafde688f825a550eba64b78fc9
@@ -98,3 +98,9 @@ UselessAccessModifier:
98
98
 
99
99
  Style/PerlBackrefs:
100
100
  Enabled: false
101
+
102
+ Style/Encoding:
103
+ Enabled: false
104
+
105
+ Layout/EmptyLineAfterMagicComment:
106
+ Enabled: false
@@ -259,7 +259,7 @@ jobs:
259
259
  stage: after-merge
260
260
  script: bundle exec rake test:unit
261
261
  os: osx
262
- osx_image: xcode9.3
262
+ osx_image: xcode9.4
263
263
  rvm: 2.4.3
264
264
 
265
265
  - name: unit tests 2.5
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM harbor.intgdc.com/tools/gdc-java-8-jre:d0f5e08
1
+ FROM harbor.intgdc.com/tools/gdc-java-8-jre:0dec94a
2
2
 
3
3
  ARG RVM_VERSION=stable
4
4
  ARG JRUBY_VERSION=9.2.5.0
@@ -6,10 +6,10 @@ ARG JRUBY_VERSION=9.2.5.0
6
6
  LABEL image_name="GDC LCM Bricks"
7
7
  LABEL maintainer="LCM <lcm@gooddata.com>"
8
8
  LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/"
9
- LABEL parent_image="harbor.intgdc.com/tools/gdc-java-8-jre:d0f5e08"
9
+ LABEL parent_image="harbor.intgdc.com/tools/gdc-java-8-jre:0dec94a"
10
10
 
11
11
  # which is required by RVM
12
- RUN yum install -y curl which patch make git \
12
+ RUN yum install -y curl which patch make git maven \
13
13
  && yum clean all \
14
14
  && rm -rf /var/cache/yum
15
15
 
@@ -43,12 +43,17 @@ RUN groupadd -g 48 apache \
43
43
  USER apache
44
44
 
45
45
  ADD ./bin ./bin
46
- ADD ./lib ./lib
46
+ ADD --chown=apache:apache ./lib ./lib
47
47
  ADD ./SDK_VERSION .
48
48
  ADD ./VERSION .
49
49
  ADD ./Gemfile .
50
50
  ADD ./gooddata.gemspec .
51
51
 
52
+ RUN mkdir -p tmp
53
+ COPY spec/lcm/redshift_driver_pom.xml tmp/pom.xml
54
+ RUN mvn -f tmp/pom.xml clean install -P binary-packaging
55
+ RUN cp -rf tmp/target/*.jar ./lib/gooddata/cloud_resources/redshift/drivers/
56
+
52
57
  RUN bundle install
53
58
 
54
59
  ARG GIT_COMMIT=unspecified
@@ -7,11 +7,11 @@ RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold
7
7
  # Switch to directory with sources
8
8
  WORKDIR /src
9
9
  ENV HOME=/src
10
+ ENV BUNDLE_PATH=$HOME/bundle
10
11
 
11
- RUN gem update --system \
12
- && gem install bundler
13
-
14
- ENV BUNDLE_PATH=/bundle
12
+ RUN gem update --system 3.0.6 \
13
+ && gem install --install-dir $BUNDLE_PATH bundler -v 1.17.3 \
14
+ && gem install --install-dir $BUNDLE_PATH rake -v 11.3.0
15
15
 
16
16
  ADD . .
17
17
 
@@ -8,11 +8,12 @@ RUN ln -s /usr/bin/make /usr/bin/gmake
8
8
 
9
9
  # Switch to directory with sources
10
10
  WORKDIR /src
11
+ ENV HOME=/src
12
+ ENV BUNDLE_PATH=$HOME/bundle
11
13
 
12
- RUN gem update --system \
13
- && gem install bundler
14
-
15
- ENV BUNDLE_PATH=/bundle
14
+ RUN gem update --system 3.0.6 \
15
+ && gem install --install-dir $BUNDLE_PATH bundler -v 1.17.3 \
16
+ && gem install --install-dir $BUNDLE_PATH rake -v 11.3.0
16
17
 
17
18
  ADD . .
18
19
 
@@ -1 +1 @@
1
- 2.1.8
1
+ 2.1.9
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.7.9
1
+ 3.7.14
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ export JRUBY_OPTS=-J-Xmx2560m
4
+
3
5
  /bin/bash -l -c "bundle exec ./bin/run_brick.rb provisioning_brick"
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ export JRUBY_OPTS=-J-Xmx2560m
4
+
3
5
  /bin/bash -l -c "bundle exec ./bin/run_brick.rb release_brick"
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ export JRUBY_OPTS=-J-Xmx2560m
4
+
3
5
  /bin/bash -l -c "bundle exec ./bin/run_brick.rb rollout_brick"
@@ -14,28 +14,49 @@ def get_brick_params(prefix)
14
14
  ENV.select { |k,| k.to_s.match(/^#{prefix}.*/) }.map { |k, v| [k.slice(prefix.length..-1), v] }.to_h
15
15
  end
16
16
 
17
+ def handle_error(params, log, brick_type, error, error_message)
18
+ execution_log = GoodData.logger
19
+ execution_log.error "Execution failed. Error: #{error}" unless execution_log.nil?
20
+ GoodData::Bricks::ExecutionResultMiddleware.update_execution_result(GoodData::Bricks::ExecutionStatus::ERROR, error_message)
21
+ log.error "action=#{brick_type}_execution status=failed commit_hash=#{params['GOODDATA_RUBY_COMMIT']} execution_id=#{params['GDC_EXECUTION_ID']} exception=#{error}"
22
+ raise
23
+ end
24
+
17
25
  syslog_node = ENV['NODE_NAME']
18
26
  log = RemoteSyslogLogger.new(syslog_node, 514, :program => "ruby_#{brick_type}", :facility => 'local2')
19
27
 
20
28
  log.info "action=#{brick_type}_execution status=init"
21
29
 
22
30
  begin
31
+ commit_hash = ENV['GOODDATA_RUBY_COMMIT'] || ''
32
+ execution_id = ENV['GDC_EXECUTION_ID']
33
+ log_directory = ENV['GDC_LOG_DIRECTORY'] || '/tmp/'
34
+ execution_log_path = ENV['GDC_EXECUTION_LOG_PATH']
35
+ execution_result_log_path = ENV['GDC_EXECUTION_RESULT_LOG_PATH']
36
+ execution_result_log_params = {
37
+ 'GOODDATA_RUBY_COMMIT' => commit_hash,
38
+ 'GDC_EXECUTION_ID' => execution_id,
39
+ 'GDC_LOG_DIRECTORY' => log_directory,
40
+ 'GDC_EXECUTION_LOG_PATH' => execution_log_path,
41
+ 'GDC_EXECUTION_RESULT_LOG_PATH' => execution_result_log_path
42
+ }
43
+
23
44
  brick_pipeline = GoodData::Bricks::Pipeline.send("#{brick_type}_pipeline")
24
45
  normal_params = get_brick_params(BRICK_PARAM_PREFIX)
25
46
  hidden_params = get_brick_params(HIDDEN_BRICK_PARAMS_PREFIX)
26
47
  params = normal_params.merge(hidden_params)
27
48
 
28
49
  params['values_to_mask'] = hidden_params.values
29
- commit_hash = ENV['GOODDATA_RUBY_COMMIT'] || ''
30
- execution_id = ENV['GDC_EXECUTION_ID']
31
50
  params['gooddata_ruby_commit'] = commit_hash
32
- params['GDC_LOG_DIRECTORY'] = ENV['GDC_LOG_DIRECTORY'] || '/tmp/'
51
+ params['GDC_LOG_DIRECTORY'] = log_directory
33
52
  params['GDC_EXECUTION_ID'] = execution_id
53
+ params['GDC_EXECUTION_LOG_PATH'] = execution_log_path
54
+ params['GDC_EXECUTION_RESULT_LOG_PATH'] = execution_result_log_path
55
+
34
56
  log.info "action=#{brick_type}_execution status=start commit_hash=#{commit_hash} execution_id=#{execution_id}"
35
57
  brick_pipeline.call(params)
58
+ rescue GoodData::LcmExecutionError => lcm_error
59
+ handle_error(execution_result_log_params, log, brick_type, lcm_error, lcm_error.summary_error)
36
60
  rescue Exception => e # rubocop:disable RescueException
37
- execution_log = GoodData.logger
38
- execution_log.error "Execution failed. Message: #{e.message}. Error: #{e}" unless execution_log.nil?
39
- log.info "action=#{brick_type}_execution status=failed commit_hash=#{commit_hash} execution_id=#{execution_id} exception=#{e}"
40
- raise
61
+ handle_error(execution_result_log_params, log, brick_type, e, e.to_s)
41
62
  end
@@ -29,6 +29,7 @@ def delete_project_by_title(title, projects, days = 14, force = false)
29
29
  p.title.match(title) && p.created < dead_line
30
30
  end
31
31
  filtered_projects.each do |project|
32
+ begin
32
33
  if force
33
34
  puts "Deleting: #{project.pid} - #{project.title} - #{project.created}"
34
35
  project_add = project.add
@@ -37,6 +38,9 @@ def delete_project_by_title(title, projects, days = 14, force = false)
37
38
  else
38
39
  puts "Would delete: #{project.pid} - #{project.title} - #{project.created}"
39
40
  end
41
+ rescue StandardError => ex
42
+ puts "Failed to delete project #{project.pid}, reason: #{ex}"
43
+ end
40
44
  end
41
45
  puts "#{filtered_projects.length} projects matching \"#{title}\" #{'would be ' unless force}deleted."
42
46
  end
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ export JRUBY_OPTS=-J-Xmx2560m
4
+
3
5
  /bin/bash -l -c "bundle exec ./bin/run_brick.rb user_filters_brick"
data/ci.rake CHANGED
@@ -1,7 +1,7 @@
1
1
  namespace :docker do
2
2
  desc 'Build Docker image'
3
3
  task :build do
4
- system('docker-compose build')
4
+ system('docker-compose build --no-cache')
5
5
  end
6
6
 
7
7
  desc 'Bundles gems using cache'
@@ -1,40 +1,40 @@
1
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- IqyBZEEpASgupQJz77OOyF1lderX6/vC7MwNkjUuMmtRr0q3WwtxildcHKr0
9
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Fwvg/S4Fs8ESOh08Sh16ExIbHl98+DP6qyqRHpXKkMlGe2W3n+AxgPu1NBeb
21
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ZZLcW1Kqna9DxY/PLE5JbQS/CmRaPRt2VLKyKyqoSYQFdbdRzJyAIe0PT+6A
30
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
40
- B+9dpPw=
1
+ 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
40
+ PHRjAjc=
@@ -54,7 +54,11 @@ Gem::Specification.new do |s|
54
54
 
55
55
  s.add_development_dependency 'sqlite3' if RUBY_PLATFORM != 'java'
56
56
 
57
- s.add_dependency 'activesupport', '> 4.2.9', '< 6.1'
57
+ if RUBY_VERSION >= '2.5'
58
+ s.add_dependency 'activesupport', '> 4.2.9', '< 6.1'
59
+ else
60
+ s.add_dependency 'activesupport', '> 4.2.9', '< 6.0'
61
+ end
58
62
 
59
63
  s.add_dependency 'aws-sdk-s3', '~> 1.16'
60
64
  s.add_dependency 'docile', '~> 1.1'
data/lcm.rake CHANGED
@@ -118,6 +118,7 @@ end
118
118
  namespace :docker do
119
119
  desc 'Build Docker image'
120
120
  task :build do
121
+ Rake::Task["maven:build_redshift"].invoke
121
122
  system('docker build -f Dockerfile.jruby -t gooddata/appstore .')
122
123
  end
123
124
 
@@ -127,6 +128,15 @@ namespace :docker do
127
128
  end
128
129
  end
129
130
 
131
+ namespace :maven do
132
+ task :build_redshift do
133
+ system("cp -rf spec/lcm/redshift_driver_pom.xml tmp/pom.xml")
134
+ system('mvn -f tmp/pom.xml clean install -P binary-packaging')
135
+ system('cp -rf tmp/target/*.jar lib/gooddata/cloud_resources/redshift/drivers/')
136
+ system('rm -rf lib/gooddata/cloud_resources/redshift/drivers/lcm-redshift-driver*.jar')
137
+ end
138
+ end
139
+
130
140
  namespace :sdk do
131
141
  desc 'Updates gooddata-ruby to the version specified in the root Gemfile'
132
142
  task :update do
@@ -0,0 +1,68 @@
1
+ # Copyright (c) 2019, GoodData Corporation. All rights reserved.
2
+ # This source code is licensed under the BSD-style license found in the
3
+ # LICENSE file in the root directory of this source tree.
4
+
5
+ require_relative 'base_middleware'
6
+
7
+ # rubocop:disable Style/ClassVars
8
+ module GoodData
9
+ module Bricks
10
+ module ExecutionStatus
11
+ OK = 'OK'
12
+ ERROR = 'ERROR'
13
+ WARNING = 'WARNING'
14
+ end
15
+
16
+ class ExecutionResultMiddleware < Bricks::Middleware
17
+ @@result_log_path = nil
18
+
19
+ def call(params)
20
+ result_log_path(params)
21
+ @app.call(params)
22
+ end
23
+
24
+ # Update process execution result when the script is executed inside a GDC ETL process execution (ruby bricks).
25
+ # Ruby bricks should update execution result at the end of script with status=WARNING or OK and summary message if the script exits normally.
26
+ # If any fatal error, script should update execution result with status=ERROR and error message,
27
+ # then throw exception to notify GDC platform that the script terminated unexpectedly.
28
+ # @param [HashMap] params contains GDC_EXECUTION_RESULT_LOG_PATH or GDC_LOG_DIRECTORY, GDC_EXECUTION_ID
29
+ # @param [ExecutionStatus] status execution status
30
+ # @param [String] message execution message
31
+ def self.update_execution_result(status, message = "")
32
+ if status != ExecutionStatus::OK && status != ExecutionStatus::ERROR && status != ExecutionStatus::WARNING
33
+ GoodData.logger.warn("Unknown execution status #{status}, ignored it.")
34
+ end
35
+
36
+ result = {
37
+ executionResult: {
38
+ status: status,
39
+ message: message
40
+ }
41
+ }
42
+ update_result(result)
43
+ end
44
+
45
+ private
46
+
47
+ def result_log_path(params)
48
+ log_directory = params['GDC_LOG_DIRECTORY']
49
+ execution_id = params['GDC_EXECUTION_ID']
50
+ result_log_path = params['GDC_EXECUTION_RESULT_LOG_PATH'] || ENV['GDC_EXECUTION_RESULT_LOG_PATH']
51
+ result_log_path = "#{log_directory}/#{execution_id}_result.json" if result_log_path.nil? && !log_directory.nil?
52
+ @@result_log_path = result_log_path
53
+ end
54
+
55
+ def self.update_result(result)
56
+ if @@result_log_path.nil?
57
+ GoodData.gd_logger.warn("action=update_execution_result status=error Not found execution result logger file.") unless GoodData.gd_logger.nil?
58
+ return
59
+ end
60
+
61
+ File.open(@@result_log_path, 'w') { |file| file.write(JSON.pretty_generate(result)) }
62
+ rescue Exception => e # rubocop:disable RescueException
63
+ GoodData.gd_logger.error("action=update_execution_result status=error reason=#{e.message}") unless GoodData.gd_logger.nil?
64
+ end
65
+ end
66
+ end
67
+ end
68
+ # rubocop:enable Style/ClassVars
@@ -36,7 +36,8 @@ module GoodData
36
36
  log_directory = params['GDC_LOG_DIRECTORY']
37
37
  execution_id = params['GDC_EXECUTION_ID']
38
38
  FileUtils.mkpath log_directory
39
- logger = Logger.new("#{log_directory}/#{execution_id}.log")
39
+ execution_log_path = params['GDC_EXECUTION_LOG_PATH'].nil? ? "#{log_directory}/#{execution_id}.log" : params['GDC_EXECUTION_LOG_PATH']
40
+ logger = Logger.new(execution_log_path)
40
41
  logger.level = params['GDC_LOG_LEVEL'] || 'info'
41
42
  values_to_mask = params['values_to_mask'] || []
42
43
  logger = MaskLoggerDecorator.new(logger, values_to_mask)
@@ -20,7 +20,11 @@ module GoodData
20
20
  # @return [[String]] array of all String in values
21
21
  def extract_values(values)
22
22
  if values.is_a?(String)
23
- [values]
23
+ if values.nil? || values.empty? || values.gsub(/[*|\s]/, '') == ''
24
+ []
25
+ else
26
+ [values]
27
+ end
24
28
  elsif values.is_a?(Hash) || values.is_a?(Array)
25
29
  (values.is_a?(Hash) ? values.values : values).reduce([]) do |strings, item|
26
30
  strings.concat extract_values(item)
@@ -32,6 +32,7 @@ module GoodData
32
32
  prepare([
33
33
  LoggerMiddleware,
34
34
  DecodeParamsMiddleware,
35
+ ExecutionResultMiddleware,
35
36
  BenchMiddleware,
36
37
  GoodDataMiddleware,
37
38
  AWSMiddleware,
@@ -44,6 +45,7 @@ module GoodData
44
45
  prepare([
45
46
  LoggerMiddleware,
46
47
  DecodeParamsMiddleware,
48
+ ExecutionResultMiddleware,
47
49
  BenchMiddleware,
48
50
  GoodDataMiddleware,
49
51
  AWSMiddleware,
@@ -56,6 +58,7 @@ module GoodData
56
58
  def self.release_brick_pipeline
57
59
  prepare([
58
60
  LoggerMiddleware,
61
+ ExecutionResultMiddleware,
59
62
  DecodeParamsMiddleware,
60
63
  BenchMiddleware,
61
64
  GoodDataMiddleware,
@@ -68,6 +71,7 @@ module GoodData
68
71
  def self.provisioning_brick_pipeline
69
72
  prepare([
70
73
  LoggerMiddleware,
74
+ ExecutionResultMiddleware,
71
75
  DecodeParamsMiddleware,
72
76
  BenchMiddleware,
73
77
  GoodDataMiddleware,
@@ -80,6 +84,7 @@ module GoodData
80
84
  def self.rollout_brick_pipeline
81
85
  prepare([
82
86
  LoggerMiddleware,
87
+ ExecutionResultMiddleware,
83
88
  DecodeParamsMiddleware,
84
89
  BenchMiddleware,
85
90
  GoodDataMiddleware,
@@ -93,6 +98,7 @@ module GoodData
93
98
  prepare(
94
99
  [
95
100
  LoggerMiddleware,
101
+ ExecutionResultMiddleware,
96
102
  DecodeParamsMiddleware,
97
103
  BenchMiddleware,
98
104
  HelloWorldBrick
@@ -104,6 +110,7 @@ module GoodData
104
110
  prepare(
105
111
  [
106
112
  LoggerMiddleware,
113
+ ExecutionResultMiddleware,
107
114
  DecodeParamsMiddleware,
108
115
  BenchMiddleware,
109
116
  HelpBrick