marty 1.1.8 → 1.1.9

Sign up to get free protection for your applications and to get access to all the features.
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