marty 1.1.8 → 1.1.9

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/controllers/marty/diagnostic/controller.rb +40 -0
  4. data/app/models/{diagnostic → marty/diagnostic}/aws/ec2_instance.rb +1 -1
  5. data/app/models/{diagnostic → marty/diagnostic}/base.rb +6 -5
  6. data/app/models/{diagnostic → marty/diagnostic}/collection.rb +2 -1
  7. data/app/models/{diagnostic → marty/diagnostic}/delayed_job.rb +4 -2
  8. data/app/models/{diagnostic/env.rb → marty/diagnostic/environment_variables.rb} +4 -3
  9. data/app/models/{diagnostic → marty/diagnostic}/fatal.rb +4 -3
  10. data/app/models/{diagnostic → marty/diagnostic}/nodes.rb +7 -4
  11. data/app/models/{diagnostic → marty/diagnostic}/reporter.rb +19 -14
  12. data/app/models/{diagnostic → marty/diagnostic}/request.rb +2 -1
  13. data/app/models/{diagnostic/environment.rb → marty/diagnostic/version.rb} +14 -15
  14. data/app/models/marty/helper.rb +8 -0
  15. data/config/routes.rb +1 -1
  16. data/delorean/diagnostics.dl +1 -1
  17. data/lib/{diagnostic → marty/diagnostic}/database.rb +2 -2
  18. data/lib/{diagnostic → marty/diagnostic}/node.rb +2 -2
  19. data/lib/{diagnostic → marty/diagnostic}/packer.rb +6 -8
  20. data/lib/marty/monkey.rb +5 -1
  21. data/lib/marty/version.rb +1 -1
  22. data/spec/controllers/diagnostic/controller_spec.rb +152 -0
  23. data/spec/models/diagnostic/base_spec.rb +17 -13
  24. data/spec/models/diagnostic/collection_spec.rb +10 -10
  25. data/spec/models/diagnostic/delayed_job_spec.rb +5 -5
  26. data/spec/models/diagnostic/reporter_spec.rb +42 -43
  27. metadata +17 -20
  28. data/app/controllers/marty/diagnostic_controller.rb +0 -32
  29. data/app/models/diagnostic/base_collection.rb +0 -10
  30. data/app/models/diagnostic/helper.rb +0 -11
  31. data/app/models/diagnostic/version.rb +0 -17
  32. data/spec/controllers/diagnostic_controller_spec.rb +0 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8178a6b1a8ee6a92bfe1ddc4c3cae736c023f958
4
- data.tar.gz: 2266f831f31d5ba5ae669967dcc30fe138cc539c
3
+ metadata.gz: bbf4105fb28ba2f431e2b8a8e0e68f6774ff6792
4
+ data.tar.gz: 20367feadccdd5e9de0e441837da1ee8916f5838
5
5
  SHA512:
6
- metadata.gz: efaf4082e86a48ebca8273b493fa0736b54725bb5e8cc6d4000d1cef78162c8fb68615216c5432fe7adb0f5e367d62a026f08c9404e1a12c76f6195597ebe717
7
- data.tar.gz: 3a5fa3ada0971c0caf898a874f84b67b175e68d3aab088cca2832e8a9d865ebfe31abe4f1e9e0c6b159fd0a035a6ea6a7f0a9ae9baa9f6ca01f84bd3f1b64ac7
6
+ metadata.gz: 4f5617f786e53cf0e543a1594c7d50022b4b55bb25be508c9ec5ffd4a9ca4b1a5b4de4968151d022bd11f8f6b4efdec9a8c2bf1cd29138cb59ed4625b6a41a36
7
+ data.tar.gz: 5cddaced6b94fcdfdc9d42c2d6723137a36967022d59f0da2a2792f6968ceb1b27efb8ad95f1573c3265626d124fcf13ceb90677c3d3a83f7f3f2d644ea6fae6
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (1.1.8)
4
+ marty (1.1.9)
5
5
  axlsx (= 2.1.0pre)
6
6
  coderay
7
7
  delorean_lang (~> 0.3.33)
@@ -0,0 +1,40 @@
1
+ module Marty::Diagnostic; class Controller < ActionController::Base
2
+ def self.inherited(klass)
3
+ Reporter.namespaces.unshift(klass.name.deconstantize)
4
+ super
5
+ end
6
+
7
+ def op
8
+ begin
9
+ @result = Reporter.run(request)
10
+ rescue NameError
11
+ render file: 'public/400', formats: [:html], status: 400, layout: false
12
+ else
13
+ respond_to do |format|
14
+ format.html {@result = display_parameters}
15
+ format.json {render json: process_result_for_api}
16
+ end
17
+ end
18
+ end
19
+
20
+ def process_result_for_api
21
+ @result.delete('data') unless request.params['data'] == 'true'
22
+ @result.delete('errors') if @result['errors'] && @result['errors'].empty?
23
+ @result
24
+ end
25
+
26
+ def display_parameters
27
+ local = params[:scope] == 'local'
28
+ data = local ? @result : @result['data']
29
+ errors = local ? Reporter.errors(data) : @result['errors']
30
+ {
31
+ 'display' => Reporter.displays(data),
32
+ 'errors' => errors
33
+ }
34
+ end
35
+
36
+ def self.add_report name, diagnostics
37
+ Reporter.reports[name] = diagnostics
38
+ end
39
+ end
40
+ end
@@ -1,4 +1,4 @@
1
- class Diagnostic::Aws::Ec2Instance
1
+ class Marty::Diagnostic::Aws::Ec2Instance
2
2
  attr_reader :id, :doc, :role, :creds, :version, :host, :tag, :nodes
3
3
 
4
4
  # aws reserved host used to get instance meta-data
@@ -1,5 +1,5 @@
1
- class Diagnostic::Base < Diagnostic::Request
2
- extend Diagnostic::Packer
1
+ module Marty::Diagnostic; class Base < Request
2
+ extend Packer
3
3
  include ActionView::Helpers::TextHelper
4
4
 
5
5
  # all diagnostics have `aggregatable` set to true.
@@ -10,16 +10,16 @@ class Diagnostic::Base < Diagnostic::Request
10
10
  self.aggregatable = true
11
11
  self.status_only = false
12
12
 
13
- @@read_only = Marty::Util.db_in_recovery?
13
+ @@read_only = Util.db_in_recovery?
14
14
  @@template = ActionController::Base.new.lookup_context.
15
- find_template("marty/diagnostic/diag").identifier
15
+ find_template("marty/diagnostic/diag").identifier
16
16
 
17
17
  def self.generate
18
18
  raise "generate has not been defined for #{name}"
19
19
  end
20
20
 
21
21
  def self.fatal?
22
- name == 'Diagnostic::Fatal'
22
+ name.include?('Fatal')
23
23
  end
24
24
 
25
25
  def self.process_status_only infos
@@ -67,3 +67,4 @@ class Diagnostic::Base < Diagnostic::Request
67
67
  new.simple_format(info ? info['description'] : 'N/A')
68
68
  end
69
69
  end
70
+ end
@@ -1,4 +1,4 @@
1
- class Diagnostic::Collection < Diagnostic::Base
1
+ module Marty::Diagnostic; class Collection < Base
2
2
  class_attribute :diagnostics
3
3
  self.diagnostics = []
4
4
  self.status_only = true
@@ -8,3 +8,4 @@ class Diagnostic::Collection < Diagnostic::Base
8
8
  diagnostics.map{|d| d.generate}.reduce(:deep_merge)
9
9
  end
10
10
  end
11
+ end
@@ -5,7 +5,7 @@
5
5
  # `DELAYED_VER` environment variable should be set in the
6
6
  # delayed jobs initializer.
7
7
  #
8
- class Diagnostic::DelayedJob < Diagnostic::Base
8
+ module Marty::Diagnostic; class DelayedJob < Base
9
9
  self.aggregatable = false
10
10
 
11
11
  def self.generate
@@ -42,7 +42,9 @@ class Diagnostic::DelayedJob < Diagnostic::Base
42
42
  end
43
43
 
44
44
  def self.delayed_worker_count
45
- Diagnostic::Node.get_postgres_connections[Diagnostic::Database.db_name].
45
+ db = Database.db_name
46
+ Node.get_postgres_connections[db].
46
47
  count{|conn| conn['application_name'].include?('delayed_job')}
47
48
  end
48
49
  end
50
+ end
@@ -1,5 +1,5 @@
1
- class Diagnostic::Env < Diagnostic::Base
2
- def self.environment_variables filter=''
1
+ module Marty::Diagnostic; class EnvironmentVariables < Base
2
+ def self.env filter=''
3
3
  env = ENV.clone
4
4
 
5
5
  # obfuscate SECRET_KEY_BASE for comparison
@@ -16,7 +16,7 @@ class Diagnostic::Env < Diagnostic::Base
16
16
 
17
17
  def self.generate
18
18
  pack do
19
- environment_variables
19
+ env
20
20
  end
21
21
  end
22
22
 
@@ -33,3 +33,4 @@ class Diagnostic::Env < Diagnostic::Base
33
33
  }
34
34
  end
35
35
  end
36
+ end
@@ -1,12 +1,13 @@
1
- class Diagnostic::Fatal < Diagnostic::Base
1
+ module Marty::Diagnostic; class Fatal < Base
2
2
  def self.display_alert_message
3
3
  '<h3 class="error">Something went wrong.</br>'\
4
4
  'Consistency is checked between remaining nodes if applicable.</h3>'
5
5
  end
6
6
 
7
7
  def self.message msg, opts = {}
8
- node = opts[:node] || Diagnostic::Node.my_ip
8
+ node = opts[:node] || Node.my_ip
9
9
  type = opts[:type] || 'RuntimeError'
10
- {name => {node => {type => error(msg)}}}
10
+ {name.demodulize => {node => {type => error(msg)}}}
11
11
  end
12
12
  end
13
+ end
@@ -1,13 +1,15 @@
1
- class Diagnostic::Nodes < Diagnostic::Base
1
+ require_relative 'aws/ec2_instance'
2
+
3
+ module Marty::Diagnostic; class Nodes < Base
2
4
  def self.generate
3
5
  pack do
4
6
  begin
5
- a_nodes = Diagnostic::Aws::Ec2Instance.new.nodes.sort if
6
- Diagnostic::Aws::Ec2Instance.is_aws?
7
+ a_nodes = Aws::Ec2Instance.new.nodes.sort if
8
+ Aws::Ec2Instance.is_aws?
7
9
  rescue => e
8
10
  a_nodes = [e.message]
9
11
  end
10
- pg_nodes = Diagnostic::Node.get_nodes.sort
12
+ pg_nodes = Node.get_nodes.sort
11
13
  a_nodes.nil? || pg_nodes == a_nodes ? pg_nodes.join("\n") :
12
14
  error("There is a discrepancy between nodes connected to "\
13
15
  "Postgres and those discovered through AWS EC2.\n"\
@@ -16,3 +18,4 @@ class Diagnostic::Nodes < Diagnostic::Base
16
18
  end
17
19
  end
18
20
  end
21
+ end
@@ -1,8 +1,9 @@
1
- class Diagnostic::Reporter < Diagnostic::Request
2
- class_attribute :reports, :diagnostics
1
+ module Marty::Diagnostic; class Reporter < Request
2
+ class_attribute :reports, :diagnostics, :namespaces
3
3
 
4
4
  self.reports = {}
5
5
  self.diagnostics = []
6
+ self.namespaces = ['Marty']
6
7
 
7
8
  def self.run request
8
9
  self.request = request
@@ -17,9 +18,16 @@ class Diagnostic::Reporter < Diagnostic::Request
17
18
  end
18
19
 
19
20
  private
20
- def self.resolve_diagnostic name
21
- return name.constantize unless name.slice('Diagnostic::').nil?
22
- ('Diagnostic::' + name.downcase.camelize).constantize
21
+ def self.resolve_diagnostic diag_name
22
+ diag_name = diag_name.camelize
23
+ klass = nil
24
+ self.namespaces.each do |n|
25
+ klass = (n + '::Diagnostic::' + diag_name).constantize rescue nil
26
+ break if klass
27
+ end
28
+ raise NameError.new("#{diag_name} could not be resolved by #{name}") if
29
+ klass.nil?
30
+ klass
23
31
  end
24
32
 
25
33
  def self.unresolve_diagnostic klass
@@ -30,9 +38,9 @@ class Diagnostic::Reporter < Diagnostic::Request
30
38
  diagnostics.each_with_object({}){
31
39
  |d, h|
32
40
  begin
33
- h[d.name] = d.generate
41
+ h[d.name.demodulize] = d.generate
34
42
  rescue => e
35
- h.deep_merge!(Diagnostic::Fatal.message(e.message, type: d.name))
43
+ h.deep_merge!(Fatal.message(e.message, type: d.name.demodulize))
36
44
  end
37
45
  }
38
46
  end
@@ -73,7 +81,7 @@ class Diagnostic::Reporter < Diagnostic::Request
73
81
  ops = diagnostics.map{|d| unresolve_diagnostic(d) if d.aggregatable}.compact
74
82
  return {} if ops.empty?
75
83
 
76
- nodes = Diagnostic::Node.get_nodes - [Diagnostic::Node.my_ip]
84
+ nodes = Node.get_nodes - [Node.my_ip]
77
85
  remote = nodes.sort.map do |n|
78
86
  Thread.new do
79
87
  uri = Addressable::URI.new(host: n, port: request.port)
@@ -92,13 +100,9 @@ class Diagnostic::Reporter < Diagnostic::Request
92
100
  response = req.start {|http| http.get(uri.to_s)}
93
101
  next JSON.parse(response.body) if response.code == "200"
94
102
 
95
- Diagnostic::Fatal.message(response.body,
96
- type: response.message,
97
- node: uri.host)
103
+ Fatal.message(response.body, type: response.message, node: uri.host)
98
104
  rescue => e
99
- Diagnostic::Fatal.message(e.message,
100
- type: e.class,
101
- node: uri.host)
105
+ Fatal.message(e.message, type: e.class, node: uri.host)
102
106
  end
103
107
  end
104
108
  end
@@ -106,3 +110,4 @@ class Diagnostic::Reporter < Diagnostic::Request
106
110
  remote.empty? ? {} : remote.map(&:join).map(&:value).reduce(:deep_merge)
107
111
  end
108
112
  end
113
+ end
@@ -1,4 +1,4 @@
1
- class Diagnostic::Request
1
+ module Marty::Diagnostic; class Request
2
2
  def self.request
3
3
  raise 'Request object has not been been injected into #{name}' unless
4
4
  @@request
@@ -26,3 +26,4 @@ class Diagnostic::Request
26
26
  request.port == 443
27
27
  end
28
28
  end
29
+ end
@@ -1,35 +1,34 @@
1
- class Diagnostic::Environment < Diagnostic::Base
1
+ module Marty::Diagnostic; class Version < Base
2
2
  def self.generate
3
3
  pack do
4
+ begin
5
+ message = `cd #{Rails.root.to_s}; git describe --tags --always;`.strip
6
+ rescue
7
+ message = error("Failed accessing git")
8
+ end
4
9
  rbv = "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})"
5
10
  {
6
- 'Environment' => Rails.env,
11
+ 'Marty' => Marty::VERSION,
12
+ 'Delorean' => Delorean::VERSION,
13
+ 'Mcfly' => Mcfly::VERSION,
14
+ 'Git' => message,
7
15
  'Rails' => Rails.version,
8
16
  'Netzke Core' => Netzke::Core::VERSION,
9
17
  'Netzke Basepack' => Netzke::Basepack::VERSION,
10
18
  'Ruby' => rbv,
11
19
  'RubyGems' => Gem::VERSION,
12
- 'Database Adapter' => Diagnostic::Database.db_adapter_name,
13
- 'Database Server' => Diagnostic::Database.db_server_name,
14
- 'Database Version' => db_version,
15
- 'Database Schema Version' => db_schema
20
+ 'Database Schema Version' => db_schema,
21
+ 'Environment' => Rails.env,
16
22
  }
17
23
  end
18
24
  end
19
25
 
20
- def self.db_version
21
- begin
22
- Diagnostic::Database.db_version
23
- rescue => e
24
- error(e.message)
25
- end
26
- end
27
-
28
26
  def self.db_schema
29
27
  begin
30
- Diagnostic::Database.db_schema
28
+ Database.db_schema
31
29
  rescue => e
32
30
  error(e.message)
33
31
  end
34
32
  end
35
33
  end
34
+ end
@@ -10,4 +10,12 @@ class Marty::Helper
10
10
  |rstart, rend, step|
11
11
  (rstart..rend).step(step).to_a
12
12
  end
13
+
14
+ delorean_fn :my_ip, sig:0 do
15
+ Marty::Diagnostic::Node.my_ip
16
+ end
17
+
18
+ delorean_fn :git, sig:0 do
19
+ [my_ip, ENV['DELAYED_VER']]
20
+ end
13
21
  end
@@ -6,5 +6,5 @@ Marty::Engine.routes.draw do
6
6
  match via: [:get, :post], "rpc/:action(.:format)" => "rpc", as: :rpc
7
7
  get "job/:action" => "job", as: :job
8
8
  match via: [:get, :post], "report(.:format)" => "report#index", as: :report
9
- get 'diag', to: 'diagnostic#op'
9
+ get 'diag', to: 'diagnostic/#op'
10
10
  end
@@ -3,7 +3,7 @@ Delay:
3
3
  # the delay parameter delays the next created job so that a different
4
4
  # worker is more likely to claim it
5
5
  delay =? 2.6
6
- ver = Marty::Helper.sleep(delay) && Diagnostic::Helper.git
6
+ ver = Marty::Helper.sleep(delay) && Marty::Helper.git
7
7
  res = [(Delay() | "ver") for i in Marty::Helper.range_step(0, count, 1)]
8
8
  result = [r.to_a for r in res]
9
9
 
@@ -1,4 +1,4 @@
1
- module Diagnostic::Database
1
+ module Marty::Diagnostic::Database
2
2
  def self.db_name
3
3
  ActiveRecord::Base.connection_config[:database]
4
4
  end
@@ -23,6 +23,6 @@ module Diagnostic::Database
23
23
  current = ActiveRecord::Migrator.current_version
24
24
  raise "Migration is needed.\nCurrent Version: #{current}" if
25
25
  ActiveRecord::Migrator.needs_migration?
26
- current
26
+ current.to_s
27
27
  end
28
28
  end
@@ -1,4 +1,4 @@
1
- module Diagnostic::Node
1
+ module Marty::Diagnostic::Node
2
2
  def self.my_ip
3
3
  begin
4
4
  Socket.ip_address_list.detect{|intf| intf.ipv4_private?}.ip_address
@@ -21,7 +21,7 @@ module Diagnostic::Node
21
21
  end
22
22
 
23
23
  def self.get_target_connections target
24
- get_postgres_connections[Diagnostic::Database.db_name].select{|conn|
24
+ get_postgres_connections[Marty::Diagnostic::Database.db_name].select{|conn|
25
25
  conn['application_name'].include?(target)
26
26
  }.map{|conn|
27
27
  conn['client_addr'] == '127.0.0.1' ? my_ip : conn['client_addr']
@@ -1,4 +1,4 @@
1
- module Diagnostic::Packer
1
+ module Marty::Diagnostic; module Packer
2
2
  # expects a block that returns either a String or a Hash value and formats
3
3
  # it into a diagnostic info object.
4
4
  def pack include_ip=true
@@ -10,22 +10,19 @@ module Diagnostic::Packer
10
10
  data.each_with_object({}) do
11
11
  |(key, value), hash|
12
12
  case value
13
- when String
14
- hash[key] = create_info(value)
15
13
  when Hash
16
14
  raise "Invalid Diagnostic Info #{value}" unless
17
15
  is_valid_info?(value)
18
16
 
19
17
  hash[key] = value
18
+ else
19
+ hash[key] = create_info(value.to_s)
20
20
  end
21
21
  end
22
- when String
23
- {name.demodulize => create_info(data)}
24
22
  else
25
- raise "Invalid Data Type: (#{data}, #{data.class}) "\
26
- "`package` expects a String or Hash value."
23
+ {name.demodulize => create_info(data.to_s)}
27
24
  end
28
- include_ip ? {Diagnostic::Node.my_ip => info} : info
25
+ include_ip ? {Node.my_ip => info} : info
29
26
  end
30
27
  end
31
28
 
@@ -45,3 +42,4 @@ module Diagnostic::Packer
45
42
  create_info(description, false)
46
43
  end
47
44
  end
45
+ end
@@ -239,7 +239,11 @@ module ActiveRecord
239
239
  def pg_enum(*args)
240
240
  options = args.extract_options!
241
241
  column_names = args
242
- column_names.each { |name| column(name, name.to_s.pluralize, options) }
242
+
243
+ enum = options.delete(:enum)
244
+
245
+ column_names.each { |name|
246
+ column(name, enum || name.to_s.pluralize, options) }
243
247
  end
244
248
  end
245
249
  module PostgreSQL
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "1.1.8"
2
+ VERSION = "1.1.9"
3
3
  end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ # used for testing controller inheritance
4
+ module Test
5
+ module Diagnostic; end
6
+ end
7
+
8
+ module Marty::Diagnostic
9
+ RSpec.describe Controller, type: :controller do
10
+ before(:each) { @routes = Marty::Engine.routes }
11
+ let(:json_response) { JSON.parse(response.body) }
12
+
13
+ def my_ip
14
+ Node.my_ip
15
+ end
16
+
17
+ def git
18
+ `cd #{Rails.root.to_s}; git describe --tags --always;`.
19
+ strip rescue "Failed accessing git"
20
+ end
21
+
22
+ describe 'GET #op' do
23
+ it 'returns http success' do
24
+ get :op, format: :json, op: 'version'
25
+ expect(response).to have_http_status(:success)
26
+ end
27
+
28
+ it 'a request injects the request object into Diagnostic classes' do
29
+ get :op, format: :json, op: 'version'
30
+ expect(Reporter.request).not_to eq(nil)
31
+ end
32
+
33
+ it 'returns the current version JSON' do
34
+ get :op, format: :json, op: 'version', data: 'true'
35
+
36
+ # generate version data and declare all values consistent
37
+ versions = Version.generate.each_with_object({}){
38
+ |(n, v),h|
39
+ h[n] = v.each{|t, r| r['consistent'] = true}
40
+ }
41
+
42
+ expected = {
43
+ 'data' => {
44
+ 'Version' => versions
45
+ }
46
+ }
47
+
48
+ expect(assigns('result')).to eq(expected)
49
+ end
50
+
51
+ it 'returns the expected cummulative diagnostic' do
52
+ expected = {
53
+ "data" => {
54
+ "Version" => {
55
+ my_ip => {
56
+ "Marty" => {
57
+ "description" => Marty::VERSION,
58
+ "status" => true,
59
+ "consistent" => true
60
+ },
61
+ "Delorean" => {
62
+ "description" => Delorean::VERSION,
63
+ "status" => true,
64
+ "consistent" => true
65
+ },
66
+ "Mcfly" => {
67
+ "description" => Mcfly::VERSION,
68
+ "status" => true,
69
+ "consistent" => true
70
+ },
71
+ "Git" => {
72
+ "description" => git,
73
+ "status" => true,
74
+ "consistent" => true
75
+ },
76
+ "Rails" => {
77
+ "description" => Rails.version,
78
+ "status" => true,
79
+ "consistent" => true
80
+ },
81
+ "Netzke Core" => {
82
+ "description" => Netzke::Core::VERSION,
83
+ "status" => true,
84
+ "consistent" => true
85
+ },
86
+ "Netzke Basepack" => {
87
+ "description" => Netzke::Basepack::VERSION,
88
+ "status" => true,
89
+ "consistent" => true
90
+ },
91
+ "Ruby" => {
92
+ "description" => "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} "\
93
+ "(#{RUBY_PLATFORM})",
94
+ "status" => true,
95
+ "consistent" => true
96
+ },
97
+ "RubyGems" => {
98
+ "description" => Gem::VERSION,
99
+ "status" => true,
100
+ "consistent" => true
101
+ },
102
+ "Database Schema Version" => {
103
+ "description" => Database.db_schema,
104
+ "status" => true,
105
+ "consistent" => true
106
+ },
107
+ "Environment" => {
108
+ "description" => Rails.env,
109
+ "status" => true,
110
+ "consistent" => true
111
+ }
112
+ }
113
+ },
114
+ "EnvironmentVariables" => {
115
+ my_ip => {
116
+ }
117
+ },
118
+ "Nodes" => {
119
+ my_ip => {
120
+ "Nodes"=> {
121
+ "description" => my_ip,
122
+ "status" => true,
123
+ "consistent" => true
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ get :op,
131
+ format: :json,
132
+ op: 'version, environment_variables, nodes',
133
+ data: 'true'
134
+
135
+ expect(JSON.parse(response.body)).to eq(expected)
136
+ end
137
+ end
138
+
139
+ describe 'Inheritance behavior' do
140
+ it 'appends namespace to reporter and resolves in order of inheritance' do
141
+ class Test::SomeController < Controller; end
142
+ expect(Reporter.namespaces).to include('Test')
143
+
144
+ class Test::Diagnostic::Version; end
145
+ expect(Reporter.resolve_diagnostic('Version').name).
146
+ to include('Test')
147
+
148
+ Reporter.namespaces.shift
149
+ end
150
+ end
151
+ end
152
+ end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Diagnostic::Base do
3
+ describe Marty::Diagnostic::Base do
4
4
  def sample_data consistent=true
5
- node_data_a = Diagnostic::Base.pack(include_ip=false){'A'}
6
- node_data_b = Diagnostic::Base.pack(include_ip=false){'B'}
5
+ node_data_a = Marty::Diagnostic::Base.pack(include_ip=false){'A'}
6
+ node_data_b = Marty::Diagnostic::Base.pack(include_ip=false){'B'}
7
7
 
8
8
  data = {
9
9
  'NodeA' => node_data_a,
@@ -18,8 +18,8 @@ describe Diagnostic::Base do
18
18
  a = sample_data
19
19
  b = sample_data(consistent=false)
20
20
 
21
- expect(Diagnostic::Base.consistent?(a)).to eq(true)
22
- expect(Diagnostic::Base.consistent?(b)).to eq(false)
21
+ expect(Marty::Diagnostic::Base.consistent?(a)).to eq(true)
22
+ expect(Marty::Diagnostic::Base.consistent?(b)).to eq(false)
23
23
  end
24
24
 
25
25
  it 'can produce a valid diagnostic hash from a String' do
@@ -31,7 +31,7 @@ describe Diagnostic::Base do
31
31
  }
32
32
  }
33
33
 
34
- expect(Diagnostic::Base.pack(include_ip=false){'A'}).to eq(expected)
34
+ expect(Marty::Diagnostic::Base.pack(include_ip=false){'A'}).to eq(expected)
35
35
  end
36
36
 
37
37
  it 'can produce a valid diagnostic hash from a Hash' do
@@ -58,13 +58,15 @@ describe Diagnostic::Base do
58
58
  },
59
59
  }
60
60
 
61
- expect(Diagnostic::Base.pack(include_ip=false){test_a}).to eq(expected)
62
- expect(Diagnostic::Base.pack(include_ip=false){test_a}).to eq(expected)
61
+ expect(Marty::Diagnostic::Base.
62
+ pack(include_ip=false){test_a}).to eq(expected)
63
+ expect(Marty::Diagnostic::Base.
64
+ pack(include_ip=false){test_a}).to eq(expected)
63
65
  end
64
66
 
65
67
  it 'can produce a valid diagnostic hash from an error Hash' do
66
- test = Diagnostic::Base.pack(include_ip=false){
67
- Diagnostic::Base.error('E')
68
+ test = Marty::Diagnostic::Base.pack(include_ip=false){
69
+ Marty::Diagnostic::Base.error('E')
68
70
  }
69
71
 
70
72
  expected = {
@@ -81,7 +83,9 @@ describe Diagnostic::Base do
81
83
  test_a = {
82
84
  'ImportantA' => 'A',
83
85
  'ImportantB' => 'B',
84
- 'ImportantC' => Diagnostic::Base.create_info('C') + {'extra' => 'D'}
86
+ 'ImportantC' => Marty::Diagnostic::Base.create_info('C') + {
87
+ 'extra' => 'D'
88
+ }
85
89
  }
86
90
 
87
91
  test_b = {
@@ -92,7 +96,7 @@ describe Diagnostic::Base do
92
96
  }
93
97
  }
94
98
 
95
- expect{Diagnostic::Base.pack{test_a}}.to raise_error(RuntimeError)
96
- expect{Diagnostic::Base.pack{test_b}}.to raise_error(RuntimeError)
99
+ expect{Marty::Diagnostic::Base.pack{test_a}}.to raise_error(RuntimeError)
100
+ expect{Marty::Diagnostic::Base.pack{test_b}}.to raise_error(RuntimeError)
97
101
  end
98
102
  end
@@ -1,32 +1,32 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Diagnostic::Collection do
3
+ describe Marty::Diagnostic::Collection do
4
4
  def sample_data consistent = true
5
- node_a_data = Diagnostic::Collection.pack(include_ip=false){'A'}
5
+ node_a_data = Marty::Diagnostic::Collection.pack(include_ip=false){'A'}
6
6
  data = {
7
7
  'NodeA' => node_a_data,
8
8
  'NodeB' => node_a_data,
9
9
  }
10
10
  return data if consistent
11
- data + {'NodeB' => {'Base' => Diagnostic::Collection.error('B')}}
11
+ data + {'NodeB' => {'Base' => Marty::Diagnostic::Collection.error('B')}}
12
12
  end
13
13
 
14
14
  it 'all diagnostics in diagnostics class attribute are generated' do
15
- diags = [Diagnostic::Version, Diagnostic::Environment]
15
+ diags = [Marty::Diagnostic::Version, Marty::Diagnostic::Nodes]
16
16
  expected = diags.map{|d| d.generate}.reduce(:deep_merge)
17
- Diagnostic::Collection.diagnostics = diags
18
- expect(Diagnostic::Collection.generate).to eq(expected)
17
+ Marty::Diagnostic::Collection.diagnostics = diags
18
+ expect(Marty::Diagnostic::Collection.generate).to eq(expected)
19
19
  end
20
20
 
21
21
  it 'declares data consistency via status consistency' do
22
22
  a = sample_data
23
23
  b = sample_data + {
24
- 'NodeB' => Diagnostic::Collection.pack(include_ip=false){'B'}
24
+ 'NodeB' => Marty::Diagnostic::Collection.pack(include_ip=false){'B'}
25
25
  }
26
26
  c = sample_data(consistent=false)
27
27
 
28
- expect(Diagnostic::Collection.consistent?(a)).to eq(true)
29
- expect(Diagnostic::Collection.consistent?(b)).to eq(true)
30
- expect(Diagnostic::Collection.consistent?(c)).to eq(false)
28
+ expect(Marty::Diagnostic::Collection.consistent?(a)).to eq(true)
29
+ expect(Marty::Diagnostic::Collection.consistent?(b)).to eq(true)
30
+ expect(Marty::Diagnostic::Collection.consistent?(c)).to eq(false)
31
31
  end
32
32
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'job_helper'
3
3
 
4
- describe Diagnostic::DelayedJob do
4
+ describe Marty::Diagnostic::DelayedJob do
5
5
  # used to stub request object
6
6
  class DummyRequest
7
7
  attr_accessor :params, :port
@@ -12,12 +12,12 @@ describe Diagnostic::DelayedJob do
12
12
 
13
13
  before(:each) do
14
14
  Marty::Script.load_scripts(nil, Date.today)
15
- allow(Diagnostic::DelayedJob).to receive(:scope).and_return(nil)
15
+ allow(Marty::Diagnostic::DelayedJob).to receive(:scope).and_return(nil)
16
16
  end
17
17
 
18
18
  def sample_data
19
19
  {
20
- Diagnostic::Helper.my_ip => {
20
+ Marty::Helper.my_ip => {
21
21
  'Version' => {
22
22
  'description' => Marty::VERSION,
23
23
  'status' => true,
@@ -30,14 +30,14 @@ describe Diagnostic::DelayedJob do
30
30
  it 'can detect if all workers are running correct application version' do
31
31
  ENV['DELAYED_VER'] = Marty::VERSION
32
32
  start_delayed_job
33
- expect(Diagnostic::DelayedJob.generate).to eq(sample_data)
33
+ expect(Marty::Diagnostic::DelayedJob.generate).to eq(sample_data)
34
34
  stop_delayed_job
35
35
  end
36
36
 
37
37
  it 'will fail if DELAYED_VER is not set' do
38
38
  ENV.delete('DELAYED_VER')
39
39
  start_delayed_job
40
- expect{Diagnostic::DelayedJob.generate}.to raise_error(RuntimeError)
40
+ expect{Marty::Diagnostic::DelayedJob.generate}.to raise_error(RuntimeError)
41
41
  stop_delayed_job
42
42
  end
43
43
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'job_helper'
3
3
 
4
- describe Diagnostic::Reporter do
4
+ describe Marty::Diagnostic::Reporter do
5
5
  # used to stub request object
6
6
  class DummyRequest
7
7
  attr_accessor :params, :port
@@ -21,7 +21,7 @@ describe Diagnostic::Reporter do
21
21
 
22
22
  def aggregate_data opts={}
23
23
  {
24
- 'Diagnostic::Dummy' => {
24
+ 'Dummy' => {
25
25
  'NodeA' => {
26
26
  'ImportantTest' => {
27
27
  'description' => 'A',
@@ -34,8 +34,8 @@ describe Diagnostic::Reporter do
34
34
  end
35
35
 
36
36
  def aggregate_consistency_data diagnostic='Base'
37
- original_a = Diagnostic::Base.create_info('A')
38
- original_b = Diagnostic::Base.create_info('B')
37
+ original_a = Marty::Diagnostic::Base.create_info('A')
38
+ original_b = Marty::Diagnostic::Base.create_info('B')
39
39
 
40
40
  data = {
41
41
  'CONSTANTA' => original_a,
@@ -43,11 +43,10 @@ describe Diagnostic::Reporter do
43
43
  'CONSTANTB2' => original_b,
44
44
  }
45
45
 
46
- different_b = Diagnostic::Base.create_info('C')
46
+ different_b = Marty::Diagnostic::Base.create_info('C')
47
47
 
48
- key = "Diagnostic::" + diagnostic
49
48
  test = {
50
- key => {
49
+ diagnostic => {
51
50
  'NodeA' => data,
52
51
  'NodeB' => data + {
53
52
  'CONSTANTB' => different_b,
@@ -56,12 +55,12 @@ describe Diagnostic::Reporter do
56
55
  }
57
56
  }
58
57
 
59
- inconsistent_b = Diagnostic::Base.create_info('B', true, false)
60
- inconsistent_c = Diagnostic::Base.create_info('C', true, false)
58
+ inconsistent_b = Marty::Diagnostic::Base.create_info('B', true, false)
59
+ inconsistent_c = Marty::Diagnostic::Base.create_info('C', true, false)
61
60
 
62
- if diagnostic == 'Env'
61
+ if diagnostic == 'EnvironmentVariables'
63
62
  expected = {
64
- key => {
63
+ diagnostic => {
65
64
  'NodeA' => {
66
65
  'CONSTANTB' => inconsistent_b,
67
66
  'CONSTANTB2' => inconsistent_b,
@@ -74,7 +73,7 @@ describe Diagnostic::Reporter do
74
73
  }
75
74
  else
76
75
  expected = {
77
- key => {
76
+ diagnostic => {
78
77
  'NodeA' => {
79
78
  'CONSTANTA' => original_a + {'consistent' => true},
80
79
  'CONSTANTB' => inconsistent_b,
@@ -92,11 +91,11 @@ describe Diagnostic::Reporter do
92
91
  end
93
92
 
94
93
  def info v, status, consistent
95
- Diagnostic::Base.create_info(v, status, consistent)
94
+ Marty::Diagnostic::Base.create_info(v, status, consistent)
96
95
  end
97
96
 
98
97
  def version_data consistent = true
99
- Diagnostic::Base.pack(include_ip=false){
98
+ Marty::Diagnostic::Base.pack(include_ip=false){
100
99
  {
101
100
  "Marty" => info(Marty::VERSION, true, consistent),
102
101
  "Delorean" => info(Delorean::VERSION, true, true),
@@ -112,17 +111,17 @@ describe Diagnostic::Reporter do
112
111
 
113
112
  describe 'display mechanism for version diagnostic' do
114
113
  before(:all) do
115
- Diagnostic::Reporter.diagnostics = [Diagnostic::Version]
114
+ Marty::Diagnostic::Reporter.diagnostics = [Marty::Diagnostic::Version]
116
115
  end
117
116
 
118
117
  before(:each) do
119
- Diagnostic::Reporter.request = DummyRequest.new
118
+ Marty::Diagnostic::Reporter.request = DummyRequest.new
120
119
  end
121
120
 
122
121
  it 'masks consistent nodes for display (version)' do
123
- Diagnostic::Reporter.request.params = params(scope='local')
122
+ Marty::Diagnostic::Reporter.request.params = params(scope='local')
124
123
  data = {
125
- 'Diagnostic::Version' => {
124
+ 'Version' => {
126
125
  'NodeA' => version_data,
127
126
  'NodeB' => version_data,
128
127
  }
@@ -159,19 +158,19 @@ describe Diagnostic::Reporter do
159
158
  </div>
160
159
  ERB
161
160
 
162
- test = Diagnostic::Reporter.displays(data)
161
+ test = Marty::Diagnostic::Reporter.displays(data)
163
162
  expect(minimize(test)).to eq(minimize(expected))
164
163
  end
165
164
 
166
165
  it 'displays all nodes when there is an inconsistent node (version)' do
167
- Diagnostic::Reporter.request.params = params
166
+ Marty:: Diagnostic::Reporter.request.params = params
168
167
  bad_ver = '0.0.0'
169
168
 
170
169
  data = {
171
- 'Diagnostic::Version' => {
170
+ 'Version' => {
172
171
  'NodeA' => version_data(consistent=false),
173
172
  'NodeB' => version_data + {
174
- 'Marty' => Diagnostic::Base.create_info(bad_ver, true, false)
173
+ 'Marty' => Marty::Diagnostic::Base.create_info(bad_ver, true, false)
175
174
  },
176
175
  }
177
176
  }
@@ -210,41 +209,41 @@ describe Diagnostic::Reporter do
210
209
  </div>
211
210
  ERB
212
211
 
213
- test = Diagnostic::Reporter.displays(data)
212
+ test = Marty::Diagnostic::Reporter.displays(data)
214
213
  expect(minimize(test)).to eq(minimize(expected))
215
214
  end
216
215
 
217
216
  it 'can detect errors in diagnostic for display and api' do
218
- Diagnostic::Reporter.request.params = params
217
+ Marty::Diagnostic::Reporter.request.params = params
219
218
  n = aggregate_data
220
219
  e = aggregate_data(status: false)
221
220
  c = aggregate_data(consistent: false)
222
221
  ce = aggregate_data(status: false, consistent: false)
223
222
 
224
223
  aggregate_failures do
225
- expect(Diagnostic::Reporter.errors(n)).to eq({})
226
- expect(Diagnostic::Reporter.errors(e)).not_to eq({})
227
- expect(Diagnostic::Reporter.errors(c)).not_to eq({})
228
- expect(Diagnostic::Reporter.errors(ce)).not_to eq({})
224
+ expect(Marty::Diagnostic::Reporter.errors(n)).to eq({})
225
+ expect(Marty::Diagnostic::Reporter.errors(e)).not_to eq({})
226
+ expect(Marty::Diagnostic::Reporter.errors(c)).not_to eq({})
227
+ expect(Marty::Diagnostic::Reporter.errors(ce)).not_to eq({})
229
228
  end
230
229
  end
231
230
 
232
231
  it 'can survive and display fatal errors' do
233
- Diagnostic::Reporter.request.params = params
232
+ Marty::Diagnostic::Reporter.request.params = params
234
233
 
235
- a_err_a = Diagnostic::Fatal.message('A',
236
- node: 'NodeA')
234
+ a_err_a = Marty::Diagnostic::Fatal.message('A',
235
+ node: 'NodeA')
237
236
 
238
- a_err_b = Diagnostic::Fatal.message('B',
239
- node: 'NodeA')
237
+ a_err_b = Marty::Diagnostic::Fatal.message('B',
238
+ node: 'NodeA')
240
239
 
241
- b_err_c = Diagnostic::Fatal.message('C',
242
- node: 'NodeB',
243
- type: 'OtherError')
240
+ b_err_c = Marty::Diagnostic::Fatal.message('C',
241
+ node: 'NodeB',
242
+ type: 'OtherError')
244
243
 
245
- c_err_d = Diagnostic::Fatal.message('D',
246
- node: 'NodeC',
247
- type: 'OtherOtherError')
244
+ c_err_d = Marty::Diagnostic::Fatal.message('D',
245
+ node: 'NodeC',
246
+ type: 'OtherOtherError')
248
247
 
249
248
  data = [a_err_a, a_err_b, b_err_c, c_err_d].reduce(:deep_merge)
250
249
 
@@ -300,20 +299,20 @@ describe Diagnostic::Reporter do
300
299
  </h3>
301
300
  ERB
302
301
 
303
- result = Diagnostic::Reporter.displays(data)
302
+ result = Marty::Diagnostic::Reporter.displays(data)
304
303
  expect(minimize(result)).to eq(minimize(expected))
305
304
  end
306
305
  end
307
306
 
308
307
  describe 'aggregation consistency functionality' do
309
308
  it 'env diagnostic' do
310
- test, expected = aggregate_consistency_data('Env')
311
- expect(Diagnostic::Reporter.consistency(test)).to eq(expected)
309
+ test, expected = aggregate_consistency_data('EnvironmentVariables')
310
+ expect(Marty::Diagnostic::Reporter.consistency(test)).to eq(expected)
312
311
  end
313
312
 
314
313
  it 'marks data as consistent/inconsistent' do
315
314
  test, expected = aggregate_consistency_data
316
- expect(Diagnostic::Reporter.consistency(test)).to eq(expected)
315
+ expect(Marty::Diagnostic::Reporter.consistency(test)).to eq(expected)
317
316
  end
318
317
  end
319
318
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marty
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.8
4
+ version: 1.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2018-01-10 00:00:00.000000000 Z
17
+ date: 2018-01-23 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg
@@ -404,30 +404,27 @@ files:
404
404
  - app/components/marty/user_view.rb
405
405
  - app/controllers/marty/application_controller.rb
406
406
  - app/controllers/marty/components_controller.rb
407
- - app/controllers/marty/diagnostic_controller.rb
407
+ - app/controllers/marty/diagnostic/controller.rb
408
408
  - app/controllers/marty/job_controller.rb
409
409
  - app/controllers/marty/report_controller.rb
410
410
  - app/controllers/marty/rpc_controller.rb
411
411
  - app/helpers/marty/application_helper.rb
412
412
  - app/helpers/marty/script_set.rb
413
- - app/models/diagnostic/aws/ec2_instance.rb
414
- - app/models/diagnostic/base.rb
415
- - app/models/diagnostic/base_collection.rb
416
- - app/models/diagnostic/collection.rb
417
- - app/models/diagnostic/delayed_job.rb
418
- - app/models/diagnostic/env.rb
419
- - app/models/diagnostic/environment.rb
420
- - app/models/diagnostic/fatal.rb
421
- - app/models/diagnostic/helper.rb
422
- - app/models/diagnostic/nodes.rb
423
- - app/models/diagnostic/reporter.rb
424
- - app/models/diagnostic/request.rb
425
- - app/models/diagnostic/version.rb
426
413
  - app/models/marty/api_auth.rb
427
414
  - app/models/marty/api_config.rb
428
415
  - app/models/marty/base.rb
429
416
  - app/models/marty/config.rb
430
417
  - app/models/marty/data_grid.rb
418
+ - app/models/marty/diagnostic/aws/ec2_instance.rb
419
+ - app/models/marty/diagnostic/base.rb
420
+ - app/models/marty/diagnostic/collection.rb
421
+ - app/models/marty/diagnostic/delayed_job.rb
422
+ - app/models/marty/diagnostic/environment_variables.rb
423
+ - app/models/marty/diagnostic/fatal.rb
424
+ - app/models/marty/diagnostic/nodes.rb
425
+ - app/models/marty/diagnostic/reporter.rb
426
+ - app/models/marty/diagnostic/request.rb
427
+ - app/models/marty/diagnostic/version.rb
431
428
  - app/models/marty/enum.rb
432
429
  - app/models/marty/enum_event_operation.rb
433
430
  - app/models/marty/event.rb
@@ -499,15 +496,15 @@ files:
499
496
  - delorean/diagnostics.dl
500
497
  - delorean/script_report.dl
501
498
  - gemini_deprecations.md
502
- - lib/diagnostic/database.rb
503
- - lib/diagnostic/node.rb
504
- - lib/diagnostic/packer.rb
505
499
  - lib/marty.rb
506
500
  - lib/marty/content_handler.rb
507
501
  - lib/marty/data_change.rb
508
502
  - lib/marty/data_conversion.rb
509
503
  - lib/marty/data_exporter.rb
510
504
  - lib/marty/data_importer.rb
505
+ - lib/marty/diagnostic/database.rb
506
+ - lib/marty/diagnostic/node.rb
507
+ - lib/marty/diagnostic/packer.rb
511
508
  - lib/marty/engine.rb
512
509
  - lib/marty/json_schema.rb
513
510
  - lib/marty/lazy_column_loader.rb
@@ -533,7 +530,7 @@ files:
533
530
  - marty.gemspec
534
531
  - script/rails
535
532
  - spec/controllers/application_controller_spec.rb
536
- - spec/controllers/diagnostic_controller_spec.rb
533
+ - spec/controllers/diagnostic/controller_spec.rb
537
534
  - spec/controllers/job_controller_spec.rb
538
535
  - spec/controllers/rpc_controller_spec.rb
539
536
  - spec/controllers/rpc_import_spec.rb
@@ -1,32 +0,0 @@
1
- module Marty
2
- class DiagnosticController < ActionController::Base
3
- def op
4
- begin
5
- @result = Diagnostic::Reporter.run(request)
6
- rescue NameError
7
- render file: 'public/400', formats: [:html], status: 400, layout: false
8
- else
9
- respond_to do |format|
10
- format.html {@result = display_parameters}
11
- format.json {render json: process_result_for_api}
12
- end
13
- end
14
- end
15
-
16
- def process_result_for_api
17
- @result.delete('data') unless request.params['data'] == 'true'
18
- @result.delete('errors') if @result['errors'] && @result['errors'].empty?
19
- @result
20
- end
21
-
22
- def display_parameters
23
- local = params[:scope] == 'local'
24
- data = local ? @result : @result['data']
25
- errors = local ? Diagnostic::Reporter.errors(data) : @result['errors']
26
- {
27
- 'display' => Diagnostic::Reporter.displays(data),
28
- 'errors' => errors
29
- }
30
- end
31
- end
32
- end
@@ -1,10 +0,0 @@
1
- # used to group separate diagnostics into one diagnostic
2
- class Diagnostic::Collection < Diagnostic::Base
3
- class_attribute :diagnostics
4
- self.diagnostics = []
5
-
6
- def self.generate
7
- raise 'No diagnostics assigned to collection.' if diagnostics.empty?
8
- diagnostics.map{|diagnostic| diagnostic.generate}.reduce(:deep_merge)
9
- end
10
- end
@@ -1,11 +0,0 @@
1
- class Diagnostic::Helper
2
- include Delorean::Model
3
-
4
- delorean_fn :my_ip, sig:0 do
5
- Diagnostic::Node.my_ip
6
- end
7
-
8
- delorean_fn :git, sig:0 do
9
- [my_ip, ENV['DELAYED_VER']]
10
- end
11
- end
@@ -1,17 +0,0 @@
1
- class Diagnostic::Version < Diagnostic::Base
2
- def self.generate
3
- pack do
4
- begin
5
- message = `cd #{Rails.root.to_s}; git describe --tags --always;`.strip
6
- rescue
7
- message = error("Failed accessing git")
8
- end
9
- {
10
- 'Marty' => Marty::VERSION,
11
- 'Delorean' => Delorean::VERSION,
12
- 'Mcfly' => Mcfly::VERSION,
13
- 'Git' => message,
14
- }
15
- end
16
- end
17
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
- module Marty
3
- RSpec.describe DiagnosticController, type: :controller do
4
- before(:each) { @routes = Marty::Engine.routes }
5
- let(:json_response) { JSON.parse(response.body) }
6
-
7
- describe 'GET #op' do
8
- it 'returns http success' do
9
- get :op, format: :json, op: 'version'
10
- expect(response).to have_http_status(:success)
11
- end
12
-
13
- it 'a request injects the request object into Diagnostic classes' do
14
- get :op, format: :json, op: 'version'
15
- expect(Diagnostic::Reporter.request).not_to eq(nil)
16
- end
17
-
18
- it 'returns the current version JSON' do
19
- get :op, format: :json, op: 'version', data: 'true'
20
-
21
- # generate version data and declare all values consistent
22
- versions = Diagnostic::Version.generate.each_with_object({}){
23
- |(n, v),h|
24
- h[n] = v.each{|t, r| r['consistent'] = true}
25
- }
26
-
27
- expected = {
28
- 'data' => {
29
- 'Diagnostic::Version' => versions
30
- }
31
- }
32
-
33
- expect(assigns('result')).to eq(expected)
34
- end
35
- end
36
- end
37
- end