marty 2.5.2 → 2.5.4
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 +5 -5
- data/.gitignore +4 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +11 -589
- data/Gemfile +9 -9
- data/Gemfile.lock +1 -1
- data/Rakefile +1 -3
- data/app/components/marty/api_auth_view.rb +3 -3
- data/app/components/marty/api_config_view.rb +8 -8
- data/app/components/marty/api_log_view.rb +16 -20
- data/app/components/marty/auth_app.rb +6 -6
- data/app/components/marty/base_rule_view.rb +27 -19
- data/app/components/marty/config_view.rb +12 -9
- data/app/components/marty/data_grid_view.rb +26 -26
- data/app/components/marty/delorean_rule_view.rb +0 -1
- data/app/components/marty/event_view.rb +27 -27
- data/app/components/marty/extras/layout.rb +26 -26
- data/app/components/marty/extras/misc.rb +2 -2
- data/app/components/marty/grid.rb +13 -13
- data/app/components/marty/grid_append_only.rb +0 -1
- data/app/components/marty/import_type_view.rb +13 -13
- data/app/components/marty/import_view.rb +17 -16
- data/app/components/marty/log_view.rb +16 -14
- data/app/components/marty/main_auth_app.rb +59 -59
- data/app/components/marty/main_auth_app/client/main_auth_app.js +3 -3
- data/app/components/marty/mcfly_grid_panel.rb +10 -10
- data/app/components/marty/new_posting_form.rb +11 -11
- data/app/components/marty/new_posting_window.rb +0 -1
- data/app/components/marty/posting_grid.rb +12 -13
- data/app/components/marty/promise_view.rb +6 -6
- data/app/components/marty/report_form.rb +50 -53
- data/app/components/marty/report_select.rb +27 -27
- data/app/components/marty/reporting.rb +4 -4
- data/app/components/marty/script_form.rb +40 -42
- data/app/components/marty/script_grid.rb +24 -24
- data/app/components/marty/script_tester.rb +40 -42
- data/app/components/marty/scripting.rb +25 -27
- data/app/components/marty/simple_app.rb +24 -9
- data/app/components/marty/tag_grid.rb +12 -13
- data/app/components/marty/user_view.rb +35 -35
- data/app/controllers/marty/application_controller.rb +3 -4
- data/app/controllers/marty/components_controller.rb +1 -1
- data/app/controllers/marty/delayed_job_controller.rb +1 -0
- data/app/controllers/marty/diagnostic/controller.rb +4 -6
- data/app/controllers/marty/job_controller.rb +6 -6
- data/app/controllers/marty/report_controller.rb +11 -11
- data/app/controllers/marty/rpc_controller.rb +15 -16
- data/app/helpers/marty/script_set.rb +4 -4
- data/app/models/marty/api_auth.rb +4 -5
- data/app/models/marty/api_config.rb +1 -1
- data/app/models/marty/base.rb +9 -8
- data/app/models/marty/base_rule.rb +18 -13
- data/app/models/marty/config.rb +4 -5
- data/app/models/marty/data_grid.rb +157 -181
- data/app/models/marty/delorean_rule.rb +63 -62
- data/app/models/marty/enum.rb +1 -1
- data/app/models/marty/event.rb +56 -59
- data/app/models/marty/helper.rb +38 -6
- data/app/models/marty/import_type.rb +6 -6
- data/app/models/marty/log.rb +3 -2
- data/app/models/marty/name_validator.rb +3 -2
- data/app/models/marty/pg_enum.rb +3 -4
- data/app/models/marty/posting.rb +20 -24
- data/app/models/marty/promise.rb +28 -30
- data/app/models/marty/script.rb +30 -28
- data/app/models/marty/tag.rb +8 -8
- data/app/models/marty/token.rb +2 -2
- data/app/models/marty/user.rb +24 -23
- data/app/models/marty/vw_promise.rb +10 -11
- data/config/routes.rb +2 -2
- data/delorean/blame_report.dl +268 -0
- data/{spec/dummy/delorean/fields.dl → delorean/marty_fields.dl} +8 -0
- data/delorean/table_report.dl +34 -0
- data/docker-compose.dummy.yml +2 -3
- data/lib/marty/aws/base.rb +8 -8
- data/lib/marty/aws/request.rb +4 -4
- data/lib/marty/cache_adapters/mcfly_ruby_cache.rb +1 -0
- data/lib/marty/content_handler.rb +25 -25
- data/lib/marty/data_change.rb +49 -71
- data/lib/marty/data_conversion.rb +20 -28
- data/lib/marty/data_exporter.rb +25 -28
- data/lib/marty/data_importer.rb +25 -27
- data/lib/marty/engine.rb +1 -2
- data/lib/marty/json_schema.rb +22 -24
- data/lib/marty/logger.rb +6 -9
- data/lib/marty/mcfly_model.rb +20 -24
- data/lib/marty/migrations.rb +37 -35
- data/lib/marty/monkey.rb +33 -33
- data/lib/marty/permissions.rb +18 -18
- data/lib/marty/promise_job.rb +17 -17
- data/lib/marty/promise_proxy.rb +6 -6
- data/lib/marty/relation.rb +6 -7
- data/lib/marty/rpc_call.rb +13 -12
- data/lib/marty/rule_script_set.rb +32 -28
- data/lib/marty/schema_helper.rb +37 -51
- data/lib/marty/util.rb +25 -24
- data/lib/marty/version.rb +1 -1
- data/lib/marty/xl.rb +121 -115
- data/make-dummy.mk +3 -0
- data/marty.gemspec +21 -21
- data/other/marty/api/base.rb +34 -35
- data/other/marty/diagnostic/aws/ec2_instance.rb +8 -8
- data/other/marty/diagnostic/base.rb +13 -14
- data/other/marty/diagnostic/collection.rb +2 -1
- data/other/marty/diagnostic/connections.rb +8 -6
- data/other/marty/diagnostic/database.rb +1 -0
- data/other/marty/diagnostic/delayed_job_version.rb +7 -9
- data/other/marty/diagnostic/delayed_job_worker_total_count.rb +1 -1
- data/other/marty/diagnostic/delayed_job_workers.rb +1 -1
- data/other/marty/diagnostic/environment_variables.rb +17 -15
- data/other/marty/diagnostic/fatal.rb +1 -1
- data/other/marty/diagnostic/node.rb +5 -9
- data/other/marty/diagnostic/nodes.rb +7 -5
- data/other/marty/diagnostic/packer.rb +7 -7
- data/other/marty/diagnostic/reporter.rb +24 -27
- data/other/marty/diagnostic/version.rb +3 -5
- data/script/rails +2 -1
- data/spec/controllers/application_controller_spec.rb +6 -6
- data/spec/controllers/delayed_job_controller_spec.rb +4 -4
- data/spec/controllers/diagnostic/controller_spec.rb +59 -60
- data/spec/controllers/job_controller_spec.rb +68 -69
- data/spec/controllers/rpc_controller_spec.rb +353 -359
- data/spec/controllers/rpc_import_spec.rb +15 -16
- data/spec/dummy/delorean/blame_report.dl +110 -15
- data/spec/dummy/delorean/data_report.dl +4 -4
- data/spec/dummy/delorean/marty_fields.dl +63 -0
- data/spec/dummy/delorean/table_report.dl +34 -0
- data/spec/features/auth_app_spec.rb +1 -2
- data/spec/features/data_import_spec.rb +2 -3
- data/spec/features/enum_spec.rb +42 -46
- data/spec/features/jobs_dashboard_spec.rb +14 -8
- data/spec/features/log_view_spec.rb +40 -43
- data/spec/features/reporting_spec.rb +15 -15
- data/spec/features/rule_spec.rb +195 -190
- data/spec/features/scripting_spec.rb +17 -20
- data/spec/features/scripting_test_spec.rb +32 -33
- data/spec/features/user_view_spec.rb +15 -17
- data/spec/job_helper.rb +11 -11
- data/spec/lib/data_blame_spec.rb +82 -0
- data/spec/lib/data_exporter_spec.rb +31 -32
- data/spec/lib/data_importer_spec.rb +382 -395
- data/spec/lib/delorean_query_spec.rb +117 -119
- data/spec/lib/json_schema_spec.rb +382 -392
- data/spec/lib/logger_spec.rb +23 -24
- data/spec/lib/mcfly_model_spec.rb +112 -109
- data/spec/lib/migrations_spec.rb +10 -10
- data/spec/lib/struct_compare_spec.rb +6 -6
- data/spec/lib/table_report_spec.rb +90 -0
- data/spec/lib/xl_spec.rb +63 -65
- data/spec/lib/xl_styles_spec.rb +16 -19
- data/spec/models/api_auth_spec.rb +30 -30
- data/spec/models/config_spec.rb +32 -32
- data/spec/models/data_grid_spec.rb +642 -655
- data/spec/models/event_spec.rb +96 -88
- data/spec/models/import_type_spec.rb +20 -20
- data/spec/models/posting_spec.rb +35 -35
- data/spec/models/promise_spec.rb +5 -5
- data/spec/models/rule_spec.rb +280 -269
- data/spec/models/script_spec.rb +27 -18
- data/spec/models/user_spec.rb +9 -9
- data/spec/other/diagnostic/base_spec.rb +20 -19
- data/spec/other/diagnostic/collection_spec.rb +6 -5
- data/spec/other/diagnostic/delayed_job_version_spec.rb +1 -1
- data/spec/other/diagnostic/delayed_job_workers_spec.rb +8 -8
- data/spec/other/diagnostic/reporter_spec.rb +31 -33
- data/spec/spec_helper.rb +5 -5
- data/spec/support/chromedriver.rb +3 -5
- data/spec/support/components/netzke_combobox.rb +1 -1
- data/spec/support/components/netzke_grid.rb +17 -17
- data/spec/support/custom_matchers.rb +2 -2
- data/spec/support/download_helper.rb +1 -1
- data/spec/support/helper.rb +1 -2
- data/spec/support/netzke.rb +31 -31
- data/spec/support/performance_helper.rb +8 -8
- data/spec/support/post_run_logger.rb +1 -2
- data/spec/support/setup.rb +1 -4
- data/spec/support/shared_connection.rb +2 -2
- data/spec/support/structure_compare.rb +21 -22
- data/spec/support/suite.rb +1 -2
- data/spec/support/users.rb +5 -6
- metadata +32 -26
data/make-dummy.mk
CHANGED
|
@@ -20,10 +20,13 @@ dummy-app-console:
|
|
|
20
20
|
docker-compose --file=docker-compose.dummy.yml run --rm app bin/rails c
|
|
21
21
|
|
|
22
22
|
dummy-app-initialise-docker:
|
|
23
|
+
touch .bash_history.docker
|
|
24
|
+
touch .pry_history.docker
|
|
23
25
|
make dummy-app-install
|
|
24
26
|
make dummy-app-db-prepare
|
|
25
27
|
|
|
26
28
|
dummy-app-install:
|
|
29
|
+
docker-compose --file=docker-compose.dummy.yml run --rm app gem install bundler
|
|
27
30
|
make dummy-app-install-bundle
|
|
28
31
|
|
|
29
32
|
dummy-app-install-bundle:
|
data/marty.gemspec
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
$:.push File.expand_path(
|
|
1
|
+
$:.push File.expand_path('../lib', __FILE__)
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
3
|
+
require 'marty/version'
|
|
4
|
+
require 'digest/md5'
|
|
5
|
+
require 'base64'
|
|
6
|
+
require 'zlib'
|
|
7
|
+
require 'csv'
|
|
8
8
|
|
|
9
9
|
Gem::Specification.new do |s|
|
|
10
|
-
s.name =
|
|
10
|
+
s.name = 'marty'
|
|
11
11
|
s.version = Marty::VERSION
|
|
12
12
|
s.authors = [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
'Arman Bostani',
|
|
14
|
+
'Brian VanLoo',
|
|
15
|
+
'Chad Edie',
|
|
16
|
+
'Eric Litwin',
|
|
17
|
+
'Iliana Toneva',
|
|
18
|
+
'Jock Cooper',
|
|
19
|
+
'Masaki Matsuo',
|
|
20
20
|
]
|
|
21
|
-
s.email = [
|
|
22
|
-
s.homepage =
|
|
23
|
-
s.summary =
|
|
21
|
+
s.email = ['arman.bostani@pnmac.com']
|
|
22
|
+
s.homepage = 'https://github.com/arman000/marty'
|
|
23
|
+
s.summary = 'A framework for working with versioned data'
|
|
24
24
|
s.description =
|
|
25
|
-
|
|
25
|
+
'Marty is a framework for viewing and reporting on versioned data.'
|
|
26
26
|
s.files = `git ls-files`.split($\)
|
|
27
27
|
s.licenses = ['MIT']
|
|
28
28
|
|
|
29
|
-
s.add_dependency
|
|
29
|
+
s.add_dependency 'pg', '~> 0.21'
|
|
30
30
|
|
|
31
31
|
s.add_dependency 'netzke', '6.5.0.0'
|
|
32
32
|
|
|
@@ -36,14 +36,14 @@ Gem::Specification.new do |s|
|
|
|
36
36
|
s.add_dependency 'mcfly', '0.0.20'
|
|
37
37
|
|
|
38
38
|
s.add_dependency 'coderay'
|
|
39
|
+
s.add_dependency 'json-schema'
|
|
39
40
|
s.add_dependency 'net-ldap', '~> 0.16.1'
|
|
40
41
|
s.add_dependency 'rubyzip'
|
|
41
42
|
s.add_dependency 'sqlite3'
|
|
42
|
-
s.add_dependency 'json-schema'
|
|
43
43
|
|
|
44
44
|
# used for signing aws ec2 requests
|
|
45
45
|
s.add_dependency 'aws-sigv4', '~> 1.0', '>= 1.0.2'
|
|
46
46
|
|
|
47
|
-
s.add_dependency 'delayed_job_active_record'
|
|
48
47
|
s.add_dependency 'daemons', '~> 1.3.1'
|
|
48
|
+
s.add_dependency 'delayed_job_active_record'
|
|
49
49
|
end
|
data/other/marty/api/base.rb
CHANGED
|
@@ -11,11 +11,11 @@ class Marty::Api::Base
|
|
|
11
11
|
result = yield
|
|
12
12
|
controller.respond_to do |format|
|
|
13
13
|
format.json { controller.send_data result.to_json }
|
|
14
|
-
format.csv
|
|
14
|
+
format.csv do
|
|
15
15
|
# SEMI-HACKY: strip outer list if there's only one element.
|
|
16
|
-
result = result[0] if result.is_a?(Array) && result.length==1
|
|
16
|
+
result = result[0] if result.is_a?(Array) && result.length == 1
|
|
17
17
|
controller.send_data Marty::DataExporter.to_csv(result)
|
|
18
|
-
|
|
18
|
+
end
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
@@ -60,27 +60,27 @@ class Marty::Api::Base
|
|
|
60
60
|
# get_schema will either return a hash with the schema,
|
|
61
61
|
# or a string with the error
|
|
62
62
|
input_schema = @@schemas[schema_key] ||=
|
|
63
|
-
|
|
64
|
-
rescue => e
|
|
65
|
-
return {error: e.message}
|
|
63
|
+
Marty::JsonSchema.get_schema(*schema_key)
|
|
64
|
+
rescue StandardError => e
|
|
65
|
+
return { error: e.message }
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
# validate input schema
|
|
69
69
|
if config[:input_validated]
|
|
70
70
|
|
|
71
71
|
# must fail if schema not found or some other error
|
|
72
|
-
return {"error": input_schema} if input_schema.is_a?(String)
|
|
72
|
+
return { "error": input_schema } if input_schema.is_a?(String)
|
|
73
73
|
|
|
74
74
|
begin
|
|
75
75
|
res = SchemaValidator::validate_schema(input_schema, params[:params])
|
|
76
76
|
rescue NameError
|
|
77
|
-
return {error: "Unrecognized PgEnum for attribute #{params[:attr]}"}
|
|
78
|
-
rescue => e
|
|
79
|
-
return {error: "#{params[:attr]}: #{e.message}"}
|
|
77
|
+
return { error: "Unrecognized PgEnum for attribute #{params[:attr]}" }
|
|
78
|
+
rescue StandardError => e
|
|
79
|
+
return { error: "#{params[:attr]}: #{e.message}" }
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
schema_errors = SchemaValidator::get_errors(res) unless res.empty?
|
|
83
|
-
return {error: "Error(s) validating: #{schema_errors}"} if
|
|
83
|
+
return { error: "Error(s) validating: #{schema_errors}" } if
|
|
84
84
|
schema_errors
|
|
85
85
|
end
|
|
86
86
|
|
|
@@ -88,23 +88,23 @@ class Marty::Api::Base
|
|
|
88
88
|
if input_schema.is_a?(Hash)
|
|
89
89
|
# fix numbers types
|
|
90
90
|
numbers = @@numbers[schema_key] ||=
|
|
91
|
-
|
|
91
|
+
Marty::JsonSchema.get_numbers(input_schema)
|
|
92
92
|
|
|
93
93
|
# modify params in place
|
|
94
94
|
Marty::JsonSchema.fix_numbers(params[:params], numbers)
|
|
95
|
-
elsif !input_schema.include?(
|
|
95
|
+
elsif !input_schema.include?('Schema not defined')
|
|
96
96
|
# else if some error besides schema not defined, fail
|
|
97
|
-
return {error: input_schema}
|
|
97
|
+
return { error: input_schema }
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
# get script engine
|
|
101
101
|
begin
|
|
102
102
|
engine = Marty::ScriptSet.new(params[:tag]).get_engine(params[:script])
|
|
103
|
-
rescue => e
|
|
103
|
+
rescue StandardError => e
|
|
104
104
|
error = "Can't get engine: #{params[:script] || 'nil'} with tag: " +
|
|
105
105
|
"#{params[:tag] || 'nil'}; message: #{e.message}"
|
|
106
106
|
Marty::Logger.info error
|
|
107
|
-
return {error: error}
|
|
107
|
+
return { error: error }
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
retval = nil
|
|
@@ -116,7 +116,7 @@ class Marty::Api::Base
|
|
|
116
116
|
params[:params],
|
|
117
117
|
params[:attr])
|
|
118
118
|
|
|
119
|
-
return retval = {
|
|
119
|
+
return retval = { 'job_id' => res.__promise__.id }
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
res = engine.evaluate(params[:node],
|
|
@@ -126,37 +126,36 @@ class Marty::Api::Base
|
|
|
126
126
|
# validate output schema
|
|
127
127
|
if config[:output_validated] && !(res.is_a?(Hash) && res['error'])
|
|
128
128
|
begin
|
|
129
|
-
output_schema_params = params + {attr: params[:attr] + '_'}
|
|
129
|
+
output_schema_params = params + { attr: params[:attr] + '_' }
|
|
130
130
|
schema = SchemaValidator::get_schema(output_schema_params)
|
|
131
|
-
rescue => e
|
|
132
|
-
return {error: e.message}
|
|
131
|
+
rescue StandardError => e
|
|
132
|
+
return { error: e.message }
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
begin
|
|
136
136
|
schema_errors = SchemaValidator::validate_schema(schema, res)
|
|
137
137
|
rescue NameError
|
|
138
|
-
return {error: "Unrecognized PgEnum for attribute #{attr}"}
|
|
139
|
-
rescue => e
|
|
140
|
-
return {error: "#{attr}: #{e.message}"}
|
|
138
|
+
return { error: "Unrecognized PgEnum for attribute #{attr}" }
|
|
139
|
+
rescue StandardError => e
|
|
140
|
+
return { error: "#{attr}: #{e.message}" }
|
|
141
141
|
end
|
|
142
142
|
|
|
143
143
|
if schema_errors.present?
|
|
144
|
-
errors = schema_errors.map{|e| e[:message]}
|
|
144
|
+
errors = schema_errors.map { |e| e[:message] }
|
|
145
145
|
|
|
146
146
|
Marty::Logger.error(
|
|
147
147
|
"API #{params[:script]}:#{params[:node]}.#{params[:attr]}",
|
|
148
|
-
|
|
148
|
+
error: errors, data: res
|
|
149
149
|
)
|
|
150
150
|
|
|
151
151
|
msg = "Error(s) validating: #{errors}"
|
|
152
|
-
res = config[:strict_validate] ? {error: msg
|
|
152
|
+
res = config[:strict_validate] ? { error: msg, data: res } : res
|
|
153
153
|
end
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
# if attr is an array, return result as an array
|
|
157
157
|
return retval = params[:return_array] ? [res] : res
|
|
158
|
-
|
|
159
|
-
rescue => e
|
|
158
|
+
rescue StandardError => e
|
|
160
159
|
msg = Delorean::Engine.grok_runtime_exception(e).symbolize_keys
|
|
161
160
|
Marty::Logger.info "Evaluation error: #{msg}"
|
|
162
161
|
return retval = msg
|
|
@@ -167,6 +166,7 @@ class Marty::Api::Base
|
|
|
167
166
|
|
|
168
167
|
def self.filter_hash hash, filter_params
|
|
169
168
|
return unless hash
|
|
169
|
+
|
|
170
170
|
pf = ActionDispatch::Http::ParameterFilter.new(filter_params)
|
|
171
171
|
pf.filter(hash)
|
|
172
172
|
end
|
|
@@ -175,7 +175,7 @@ class Marty::Api::Base
|
|
|
175
175
|
res = result.is_a?(Hash) ? result.stringify_keys : result
|
|
176
176
|
ret_arr = params[:return_array]
|
|
177
177
|
input = filter_hash(params[:params], engine_params_filter)
|
|
178
|
-
{script: params[:script],
|
|
178
|
+
{ script: params[:script],
|
|
179
179
|
node: params[:node],
|
|
180
180
|
attrs: ret_arr ? [params[:attr]] : params[:attr],
|
|
181
181
|
input: input,
|
|
@@ -197,21 +197,19 @@ class Marty::Api::Base
|
|
|
197
197
|
|
|
198
198
|
class SchemaValidator
|
|
199
199
|
def self.get_schema params
|
|
200
|
-
|
|
201
|
-
Marty::ScriptSet.new(params[:tag]).get_engine(params[:script]+'Schemas').
|
|
200
|
+
Marty::ScriptSet.new(params[:tag]).get_engine(params[:script] + 'Schemas').
|
|
202
201
|
evaluate(params[:node], params[:attr], {})
|
|
203
|
-
|
|
202
|
+
rescue StandardError => e
|
|
204
203
|
msg = e.message == 'No such script' ? 'Schema not defined' :
|
|
205
204
|
'Problem with schema: ' + e.message
|
|
206
205
|
|
|
207
206
|
raise "Schema error for #{params[:script]}/#{params[:node]} "\
|
|
208
207
|
"attrs=#{params[:attr]}: #{msg}"
|
|
209
|
-
end
|
|
210
208
|
end
|
|
211
209
|
|
|
212
210
|
def self.validate_schema schema, hash
|
|
213
211
|
JSON::Validator.fully_validate(
|
|
214
|
-
schema.merge(
|
|
212
|
+
schema.merge("\$schema" => Marty::JsonSchema::RAW_URI),
|
|
215
213
|
hash,
|
|
216
214
|
validate_schema: true,
|
|
217
215
|
errors_as_objects: true,
|
|
@@ -224,6 +222,7 @@ class Marty::Api::Base
|
|
|
224
222
|
match(msg)
|
|
225
223
|
|
|
226
224
|
return msg unless m
|
|
225
|
+
|
|
227
226
|
"disallowed parameter '#{m[1]}' of type #{m[2]} was received"
|
|
228
227
|
end
|
|
229
228
|
|
|
@@ -237,7 +236,7 @@ class Marty::Api::Base
|
|
|
237
236
|
fa, fragment, message, errors = errs.values_at(:failed_attribute,
|
|
238
237
|
:fragment,
|
|
239
238
|
:message, :errors)
|
|
240
|
-
((['AllOf','AnyOf','Not'].include?(fa) && fragment =='#/') ?
|
|
239
|
+
((['AllOf', 'AnyOf', 'Not'].include?(fa) && fragment == '#/') ?
|
|
241
240
|
[] : [massage_message(message)]) + _get_errors(errors || {})
|
|
242
241
|
end
|
|
243
242
|
end
|
|
@@ -11,8 +11,7 @@ class Marty::Diagnostic::Aws::Ec2Instance < Marty::Aws::Request
|
|
|
11
11
|
attr_reader *STATES
|
|
12
12
|
|
|
13
13
|
def get_state instances, state
|
|
14
|
-
instances.map do
|
|
15
|
-
|i|
|
|
14
|
+
instances.map do |i|
|
|
16
15
|
i.except('state') if i['state']['name'] == state
|
|
17
16
|
end.compact
|
|
18
17
|
end
|
|
@@ -33,22 +32,23 @@ class Marty::Diagnostic::Aws::Ec2Instance < Marty::Aws::Request
|
|
|
33
32
|
end
|
|
34
33
|
|
|
35
34
|
private
|
|
35
|
+
|
|
36
36
|
def ec2_request action, params = {}
|
|
37
|
-
resp = request({action: action}, params)
|
|
37
|
+
resp = request({ action: action }, params)
|
|
38
38
|
Hash.from_xml(resp)["#{action}Response"]
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def get_tag
|
|
42
|
-
params = {'Filter.1.Name'
|
|
42
|
+
params = { 'Filter.1.Name' => 'resource-id',
|
|
43
43
|
'Filter.1.Value.1' => get_instance_id,
|
|
44
44
|
'Filter.2.Name' => 'key',
|
|
45
|
-
'Filter.2.Value.1' => 'Name'}
|
|
45
|
+
'Filter.2.Value.1' => 'Name' }
|
|
46
46
|
ec2_request('DescribeTags', params)['tagSet']['item']['value']
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def get_instances
|
|
50
|
-
params = {'Filter.1.Name'
|
|
51
|
-
'Filter.1.Value.1' => @tag}
|
|
50
|
+
params = { 'Filter.1.Name' => 'tag-value',
|
|
51
|
+
'Filter.1.Value.1' => @tag }
|
|
52
52
|
|
|
53
53
|
resp = ec2_request('DescribeInstances', params)
|
|
54
54
|
|
|
@@ -65,6 +65,6 @@ class Marty::Diagnostic::Aws::Ec2Instance < Marty::Aws::Request
|
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
def get_private_ips
|
|
68
|
-
@instances.running.map{|i| i['ip']}.compact
|
|
68
|
+
@instances.running.map { |i| i['ip'] }.compact
|
|
69
69
|
end
|
|
70
70
|
end
|
|
@@ -10,10 +10,10 @@ module Marty::Diagnostic; class Base < Request
|
|
|
10
10
|
|
|
11
11
|
@@read_only = Marty::Util.db_in_recovery?
|
|
12
12
|
@@template = ActionController::Base.new.lookup_context.
|
|
13
|
-
find_template(
|
|
13
|
+
find_template('marty/diagnostic/diag').identifier
|
|
14
14
|
|
|
15
|
-
def self.diagnostic_fn opts={}
|
|
16
|
-
opts.each do |k,v|
|
|
15
|
+
def self.diagnostic_fn opts = {}
|
|
16
|
+
opts.each do |k, v|
|
|
17
17
|
send("#{k}=", v)
|
|
18
18
|
end
|
|
19
19
|
class << self
|
|
@@ -35,26 +35,24 @@ module Marty::Diagnostic; class Base < Request
|
|
|
35
35
|
|
|
36
36
|
def self.process_status_only infos
|
|
37
37
|
return infos unless status_only
|
|
38
|
-
|
|
38
|
+
|
|
39
|
+
infos.map { |info| info.map { |test, result| [test, result['status']] }.to_h }
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def self.get_difference data
|
|
42
43
|
values = process_status_only(data.values)
|
|
43
|
-
Marty::DataExporter.hash_array_merge(values, true).map
|
|
44
|
-
|test, values|
|
|
44
|
+
Marty::DataExporter.hash_array_merge(values, true).map do |test, values|
|
|
45
45
|
test if values.uniq.count > 1
|
|
46
|
-
|
|
46
|
+
end.compact
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def self.apply_consistency data
|
|
50
50
|
diff = get_difference(data)
|
|
51
|
-
data.each_with_object({})
|
|
52
|
-
|(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
}
|
|
51
|
+
data.each_with_object({}) do |(node, diagnostic), new_data|
|
|
52
|
+
new_data[node] = diagnostic.each_with_object({}) do |(test, info), new_diagnostic|
|
|
53
|
+
new_diagnostic[test] = info + { 'consistent' => !diff.include?(test) }
|
|
54
|
+
end
|
|
55
|
+
end
|
|
58
56
|
end
|
|
59
57
|
|
|
60
58
|
def self.consistent? data
|
|
@@ -71,6 +69,7 @@ module Marty::Diagnostic; class Base < Request
|
|
|
71
69
|
return 'inconsistent' if info.nil? || (info['status'] &&
|
|
72
70
|
info['consistent'] == false)
|
|
73
71
|
return 'error' unless info['status']
|
|
72
|
+
|
|
74
73
|
'passed'
|
|
75
74
|
end
|
|
76
75
|
|
|
@@ -6,7 +6,8 @@ module Marty::Diagnostic; class Collection < Base
|
|
|
6
6
|
|
|
7
7
|
def self.generate
|
|
8
8
|
raise 'No diagnostics assigned to collection.' if diagnostics.empty?
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
diagnostics.map(&:generate).reduce(:deep_merge)
|
|
10
11
|
end
|
|
11
12
|
end
|
|
12
13
|
end
|
|
@@ -2,18 +2,20 @@ module Marty::Diagnostic; class Connections < Base
|
|
|
2
2
|
self.aggregatable = false
|
|
3
3
|
diagnostic_fn do
|
|
4
4
|
conns = Node.get_postgres_connections[Database.db_name].
|
|
5
|
-
sort_by
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
sort_by do |h|
|
|
6
|
+
[h['application_name'],
|
|
7
|
+
h['pid'],
|
|
8
|
+
h['client_addr'],
|
|
9
|
+
h['state']]
|
|
10
|
+
end
|
|
9
11
|
|
|
10
12
|
counts = Hash.new(0)
|
|
11
13
|
conns.each_with_object({}) do |c, h|
|
|
12
14
|
c['client_addr'] = 'localhost' unless c['client_addr']
|
|
13
15
|
name = c['application_name']
|
|
14
16
|
counts[name] += 1
|
|
15
|
-
key = "#{name} #{'*' * (counts[name]-1)}"
|
|
16
|
-
h[key] = c.except('application_name').map{|k,v| "<li>#{k}: #{v}</li>"}.join
|
|
17
|
+
key = "#{name} #{'*' * (counts[name] - 1)}"
|
|
18
|
+
h[key] = c.except('application_name').map { |k, v| "<li>#{k}: #{v}</li>" }.join
|
|
17
19
|
end
|
|
18
20
|
end
|
|
19
21
|
end
|
|
@@ -20,25 +20,23 @@ module Marty::Diagnostic; class DelayedJobVersion < Base
|
|
|
20
20
|
|
|
21
21
|
# we will only iterate by half of the total delayed workers to avoid
|
|
22
22
|
# excess use of delayed job time
|
|
23
|
-
total_workers = (total_workers/2).zero? ? 1 : total_workers/2
|
|
23
|
+
total_workers = (total_workers / 2).zero? ? 1 : total_workers / 2
|
|
24
24
|
|
|
25
|
-
d_engine = Marty::ScriptSet.new.get_engine(
|
|
25
|
+
d_engine = Marty::ScriptSet.new.get_engine('Diagnostics')
|
|
26
26
|
res = d_engine.
|
|
27
|
-
evaluate('VersionDelay', 'result',
|
|
27
|
+
evaluate('VersionDelay', 'result', 'count' => total_workers - 1)
|
|
28
28
|
|
|
29
29
|
# merge results, remove duplicates, and construct "aggregate" object
|
|
30
|
-
res.each_with_object({})
|
|
31
|
-
|r, hash|
|
|
30
|
+
res.each_with_object({}) do |r, hash|
|
|
32
31
|
hash[r[0]] ||= []
|
|
33
32
|
hash[r[0]] << r[1]
|
|
34
|
-
|
|
35
|
-
|node, result|
|
|
33
|
+
end.map do |node, result|
|
|
36
34
|
|
|
37
35
|
versions = result.uniq
|
|
38
36
|
status = versions.count == 1 && versions[0] == ENV['DELAYED_VER']
|
|
39
37
|
|
|
40
|
-
{node => {'Version' => create_info(versions.join("\n"), status)}}
|
|
41
|
-
|
|
38
|
+
{ node => { 'Version' => create_info(versions.join("\n"), status) } }
|
|
39
|
+
end.reduce(:deep_merge)
|
|
42
40
|
end
|
|
43
41
|
end
|
|
44
42
|
end
|