foreman_statistics 0.1.0

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 (74) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +40 -0
  4. data/Rakefile +47 -0
  5. data/app/controllers/concerns/foreman_statistics/parameters/trend.rb +20 -0
  6. data/app/controllers/foreman_statistics/api/v2/statistics_controller.rb +33 -0
  7. data/app/controllers/foreman_statistics/api/v2/trends_controller.rb +58 -0
  8. data/app/controllers/foreman_statistics/react_controller.rb +19 -0
  9. data/app/controllers/foreman_statistics/statistics_controller.rb +24 -0
  10. data/app/controllers/foreman_statistics/trends_controller.rb +58 -0
  11. data/app/helpers/foreman_statistics/trends_helper.rb +53 -0
  12. data/app/models/concerns/foreman_statistics/compute_resource_decorations.rb +9 -0
  13. data/app/models/concerns/foreman_statistics/environment_decorations.rb +9 -0
  14. data/app/models/concerns/foreman_statistics/general_setting_decorations.rb +17 -0
  15. data/app/models/concerns/foreman_statistics/hostgroup_decorations.rb +9 -0
  16. data/app/models/concerns/foreman_statistics/model_decorations.rb +9 -0
  17. data/app/models/concerns/foreman_statistics/operatingsystem_decorations.rb +9 -0
  18. data/app/models/concerns/foreman_statistics/setting_decorations.rb +9 -0
  19. data/app/models/foreman_statistics/fact_trend.rb +57 -0
  20. data/app/models/foreman_statistics/foreman_trend.rb +41 -0
  21. data/app/models/foreman_statistics/trend.rb +38 -0
  22. data/app/models/foreman_statistics/trend_counter.rb +11 -0
  23. data/app/services/foreman_statistics/statistics.rb +21 -0
  24. data/app/services/foreman_statistics/statistics/base.rb +39 -0
  25. data/app/services/foreman_statistics/statistics/count_facts.rb +17 -0
  26. data/app/services/foreman_statistics/statistics/count_hosts.rb +9 -0
  27. data/app/services/foreman_statistics/statistics/count_numerical_fact_pair.rb +43 -0
  28. data/app/services/foreman_statistics/statistics/count_puppet_classes.rb +23 -0
  29. data/app/services/foreman_statistics/trend_importer.rb +63 -0
  30. data/app/views/foreman_statistics/api/v2/trends/base.json.rabl +4 -0
  31. data/app/views/foreman_statistics/api/v2/trends/create.json.rabl +3 -0
  32. data/app/views/foreman_statistics/api/v2/trends/index.json.rabl +3 -0
  33. data/app/views/foreman_statistics/api/v2/trends/main.json.rabl +5 -0
  34. data/app/views/foreman_statistics/api/v2/trends/show.json.rabl +3 -0
  35. data/app/views/foreman_statistics/api/v2/trends/update.json.rabl +3 -0
  36. data/app/views/foreman_statistics/layouts/application_react.html.erb +16 -0
  37. data/app/views/foreman_statistics/trends/_empty_data.html.erb +7 -0
  38. data/app/views/foreman_statistics/trends/_fields.html.erb +7 -0
  39. data/app/views/foreman_statistics/trends/_form.html.erb +8 -0
  40. data/app/views/foreman_statistics/trends/_hosts.html.erb +13 -0
  41. data/app/views/foreman_statistics/trends/edit.html.erb +46 -0
  42. data/app/views/foreman_statistics/trends/index.html.erb +39 -0
  43. data/app/views/foreman_statistics/trends/new.html.erb +4 -0
  44. data/app/views/foreman_statistics/trends/show.html.erb +25 -0
  45. data/app/views/foreman_statistics/trends/welcome.html.erb +12 -0
  46. data/config/routes.rb +22 -0
  47. data/db/migrate/20200605153005_migrate_core_types.rb +15 -0
  48. data/db/migrate_foreman/20121012170851_create_trends.rb +25 -0
  49. data/db/migrate_foreman/20121012170936_create_trend_counters.rb +14 -0
  50. data/db/migrate_foreman/20150202094307_add_range_to_trend_counters.rb +6 -0
  51. data/db/migrate_foreman/20181031155025_add_trend_counter_created_at_unique_constraint.rb +9 -0
  52. data/lib/foreman_statistics.rb +4 -0
  53. data/lib/foreman_statistics/engine.rb +104 -0
  54. data/lib/foreman_statistics/version.rb +3 -0
  55. data/lib/tasks/foreman_statistics_tasks.rake +78 -0
  56. data/locale/Makefile +60 -0
  57. data/locale/en/foreman_statistics.po +19 -0
  58. data/locale/foreman_statistics.pot +19 -0
  59. data/locale/gemspec.rb +2 -0
  60. data/test/factories/foreman_statistics_factories.rb +68 -0
  61. data/test/fixtures/permissions.yml +26 -0
  62. data/test/fixtures/settings.yml +6 -0
  63. data/test/functional/foreman_statistics/api/v2/statistics_controller_test.rb +19 -0
  64. data/test/functional/foreman_statistics/api/v2/trends_controller_test.rb +74 -0
  65. data/test/functional/foreman_statistics/statistics_controller_test.rb +23 -0
  66. data/test/functional/foreman_statistics/trends_controller_test.rb +115 -0
  67. data/test/models/foreman_statistics/trend_counter_test.rb +10 -0
  68. data/test/models/foreman_statistics/trend_test.rb +22 -0
  69. data/test/test_plugin_helper.rb +6 -0
  70. data/test/unit/foreman_statistics/access_permissions_test.rb +16 -0
  71. data/test/unit/foreman_statistics/statistics_test.rb +82 -0
  72. data/test/unit/foreman_statistics_test.rb +11 -0
  73. data/test/unit/tasks/foreman_statistics_tasks_test.rb +205 -0
  74. metadata +199 -0
@@ -0,0 +1,22 @@
1
+ require_relative '../../test_plugin_helper'
2
+
3
+ module ForemanStatistics
4
+ class TrendTest < ActiveSupport::TestCase
5
+ test 'should delete trend and associated trend counters' do
6
+ trend = FactoryBot.create(:foreman_statistics_trend, :value, :with_counters)
7
+ trend_id = trend.id
8
+ assert_equal 2, TrendCounter.where(:trend_id => trend_id).length
9
+ assert_difference('Trend.count', -1) do
10
+ as_admin do
11
+ trend.destroy
12
+ end
13
+ end
14
+ assert_equal 0, TrendCounter.where(:trend_id => trend_id).length
15
+ end
16
+
17
+ test '#find hosts returns empty result if associated record does not exist' do
18
+ trend = FactoryBot.build(:foreman_statistics_foreman_trend)
19
+ assert_empty trend.find_hosts
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ # This calls the main test_helper in Foreman-core
2
+ require 'test_helper'
3
+
4
+ # Add plugin to FactoryBot's paths
5
+ FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
6
+ FactoryBot.reload
@@ -0,0 +1,16 @@
1
+ require 'test_plugin_helper'
2
+ require 'unit/shared/access_permissions_test_base'
3
+
4
+ # Permissions are added in AccessPermissions with lists of controllers and
5
+ # actions that they enable access to. For non-admin users, we need to test
6
+ # that there are permissions available that cover every controller action, else
7
+ # it can't be delegated and this will lead to parts of the application that
8
+ # aren't functional for non-admin users.
9
+ #
10
+ # In particular, it's important that actions for AJAX requests are added to
11
+ # an appropriate permission so views using those requests function.
12
+ class AccessPermissionsTest < ActiveSupport::TestCase
13
+ include AccessPermissionsTestBase
14
+
15
+ check_routes(ForemanStatistics::Engine.routes, [])
16
+ end
@@ -0,0 +1,82 @@
1
+ require_relative '../../test_plugin_helper'
2
+
3
+ module ForemanStatistics
4
+ class StatisticsTest < ActiveSupport::TestCase
5
+ def setup
6
+ User.current = users :admin
7
+ end
8
+
9
+ test 'it should return list of statistics objects' do
10
+ assert_not_empty Statistics.charts(nil, nil)
11
+ end
12
+
13
+ test 'it should include an Operating System stat' do
14
+ os = Statistics.charts(nil, nil).detect { |s| s.id == 'operatingsystem' }
15
+ assert_equal 'operatingsystem', os.id
16
+ data = { :id => 'operatingsystem', :title => 'OS Distribution', :url => '/foreman_statistics/statistics/operatingsystem', :search => '/hosts?search=os_title%3D~VAL~' }
17
+ assert_equal data, os.metadata
18
+ end
19
+
20
+ test 'it should set taxonomies as API paramaters according to current context' do
21
+ os = Statistics.charts(taxonomies(:empty_organization).id, nil).detect { |s| s.id == 'operatingsystem' }
22
+ data = { :id => 'operatingsystem', :title => 'OS Distribution', :url => "/foreman_statistics/statistics/operatingsystem?organization_id=#{taxonomies(:empty_organization).id}", :search => '/hosts?search=os_title%3D~VAL~' }
23
+ assert_equal data, os.metadata
24
+
25
+ os = Statistics.charts(nil, taxonomies(:location1).id).detect { |s| s.id == 'operatingsystem' }
26
+ data = { :id => 'operatingsystem', :title => 'OS Distribution', :url => "/foreman_statistics/statistics/operatingsystem?location_id=#{taxonomies(:location1).id}", :search => '/hosts?search=os_title%3D~VAL~' }
27
+ assert_equal data, os.metadata
28
+
29
+ os = Statistics.charts(taxonomies(:empty_organization).id, taxonomies(:location1).id).detect { |s| s.id == 'operatingsystem' }
30
+ data = { :id => 'operatingsystem', :title => 'OS Distribution', :url => "/foreman_statistics/statistics/operatingsystem?location_id=#{taxonomies(:location1).id}&organization_id=#{taxonomies(:empty_organization).id}", :search => '/hosts?search=os_title%3D~VAL~' }
31
+ assert_equal data, os.metadata
32
+ end
33
+
34
+ test 'it should initialize a base statistics object' do
35
+ stat = Statistics::Base.new(:count_by => :hostgroup)
36
+ assert_equal :hostgroup, stat.count_by
37
+ assert_equal 'hostgroup', stat.id
38
+ assert_equal '/foreman_statistics/statistics/hostgroup', stat.url
39
+ assert_raise(NotImplementedError) { stat.calculate }
40
+ end
41
+
42
+ test 'it should initialize a fact counter statistics object' do
43
+ stat = Statistics::CountFacts.new(:count_by => 'uptime')
44
+ assert_kind_of Array, stat.calculate
45
+ end
46
+
47
+ test 'it should initialize a fact counter statistics object with units' do
48
+ stat = Statistics::CountFacts.new(:count_by => 'uptime', :unit => ['%s core', '%s cores'])
49
+ assert_equal ['%s core', '%s cores'], stat.unit
50
+ assert_kind_of Array, stat.calculate
51
+ end
52
+
53
+ test 'it should initialize a host counter statistics object' do
54
+ stat = Statistics::CountHosts.new(:count_by => :compute_resource)
55
+ assert_kind_of Array, stat.calculate
56
+ end
57
+
58
+ test 'it should fail to calculate a puppet class counter statistics object without an id' do
59
+ assert_raise(ArgumentError) { Statistics::CountPuppetClasses.new }
60
+ end
61
+
62
+ test 'it should initialize a puppet class counter statistics object' do
63
+ stat = Statistics::CountPuppetClasses.new(:id => :classes)
64
+ assert_equal '/foreman_statistics/statistics/classes', stat.url
65
+ assert_kind_of Array, stat.calculate
66
+ end
67
+
68
+ test 'it should fail to calculate a Fact class counter statistics object without count_by' do
69
+ assert_raise(ArgumentError) { Statistics::CountNumericalFactPair.new }
70
+ end
71
+
72
+ test 'it should initialize a fact pair counter statistics object' do
73
+ stat = Statistics::CountNumericalFactPair.new(:count_by => :memory)
74
+ assert_equal 'memorysize', stat.send(:total_name)
75
+ assert_equal 'memoryfree', stat.send(:used_name)
76
+ calc = stat.calculate
77
+ assert_kind_of Array, calc
78
+ assert_equal 'free memory', calc[0][:label]
79
+ assert_equal 'used memory', calc[1][:label]
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class ForemanStatisticsTest < ActiveSupport::TestCase
4
+ setup do
5
+ User.current = User.find_by login: 'admin'
6
+ end
7
+
8
+ test 'the truth' do
9
+ assert true
10
+ end
11
+ end
@@ -0,0 +1,205 @@
1
+ require 'test_helper'
2
+ require 'rake'
3
+
4
+ class ForemanStatisticsTasksTest < ActiveSupport::TestCase
5
+ setup do
6
+ Rake.application.rake_require 'tasks/foreman_statistics_tasks'
7
+ Rake::Task.define_task(:environment)
8
+ Rake::Task['foreman_statistics:trends:reduce'].reenable
9
+
10
+ ForemanStatistics::TrendCounter.unscoped.delete_all
11
+ ForemanStatistics::Trend.unscoped.delete_all
12
+ end
13
+
14
+ test 'foreman_statistics:trends:reduce reduces single trend' do
15
+ trend = FactoryBot.build(:foreman_statistics_trend_os)
16
+ point_dates = create_trend_line(trend, [1, 1, 1, 1, 1, 1])
17
+
18
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
19
+
20
+ trend_counter = ForemanStatistics::TrendCounter.where(trend_id: trend.id)
21
+
22
+ assert_equal 1, trend_counter.count
23
+
24
+ trend_counter = trend_counter.first
25
+
26
+ assert_equal point_dates.min.to_i, trend_counter.interval_start.to_i
27
+ assert_nil trend_counter.interval_end
28
+ end
29
+
30
+ test 'foreman_statistics:trends:reduce does not iterfere between two trend ids' do
31
+ trend_1 = FactoryBot.build(:foreman_statistics_trend_os)
32
+ trend_2 = FactoryBot.build(:foreman_statistics_trend_os)
33
+ create_trend_line(trend_1, [1, 1, 1, 1, 1, 1])
34
+ create_trend_line(trend_2, [2, 2, 2, 2, 2, 2])
35
+
36
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
37
+
38
+ trend_10 = ForemanStatistics::TrendCounter.where(trend_id: trend_1.id)
39
+ trend_20 = ForemanStatistics::TrendCounter.where(trend_id: trend_2.id)
40
+
41
+ assert_equal 1, trend_10.count
42
+ assert_equal 1, trend_20.count
43
+
44
+ trend_10 = trend_10.first
45
+ trend_20 = trend_20.first
46
+
47
+ assert_equal trend_10.interval_start, trend_20.interval_start
48
+ assert_nil trend_10.interval_end
49
+ assert_nil trend_20.interval_end
50
+ end
51
+
52
+ test 'foreman_statistics:trends:reduce crossing graphs' do
53
+ new_os_trend = FactoryBot.build(:foreman_statistics_trend_os)
54
+ old_os_trend = FactoryBot.build(:foreman_statistics_trend_os)
55
+ new_os_point_dates = create_trend_line(new_os_trend, [1, 1, 1, 2, 2, 2, 3, 3, 3])
56
+ create_trend_line(old_os_trend, [3, 3, 3, 2, 2, 2, 1, 1, 1])
57
+ interval_starts = [new_os_point_dates[0], new_os_point_dates[3], new_os_point_dates[6]]
58
+
59
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
60
+
61
+ new_os_intervals = ForemanStatistics::TrendCounter.where(trend_id: new_os_trend.id).order(:interval_start).to_a
62
+ old_os_intervals = ForemanStatistics::TrendCounter.where(trend_id: old_os_trend.id).order(:interval_start).to_a
63
+
64
+ assert_equal 3, new_os_intervals.length
65
+ assert_equal 3, old_os_intervals.length
66
+
67
+ interval_starts.each_with_index do |start, idx|
68
+ assert_equal start, old_os_intervals[idx].interval_start
69
+ assert_equal start, new_os_intervals[idx].interval_start
70
+
71
+ if idx < 2
72
+ next_start = interval_starts[idx + 1]
73
+ assert_not_nil next_start
74
+ assert_equal next_start, old_os_intervals[idx].interval_end
75
+ assert_equal next_start, new_os_intervals[idx].interval_end
76
+ else
77
+ assert_nil old_os_intervals[idx].interval_end
78
+ assert_nil new_os_intervals[idx].interval_end
79
+ end
80
+
81
+ assert_equal 4, old_os_intervals[idx].count + new_os_intervals[idx].count
82
+ end
83
+ end
84
+
85
+ test 'foreman_statistics:trends:reduce mirrored saw graphs' do
86
+ new_os_trend = FactoryBot.build(:foreman_statistics_trend_os)
87
+ old_os_trend = FactoryBot.build(:foreman_statistics_trend_os)
88
+ new_os_point_dates = create_trend_line(new_os_trend, [1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2])
89
+ create_trend_line(old_os_trend, [3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2])
90
+ interval_starts = [new_os_point_dates[0], new_os_point_dates[3], new_os_point_dates[6], new_os_point_dates[9]]
91
+ new_os_counts = [1, 2, 1, 2]
92
+
93
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
94
+
95
+ new_os_intervals = ForemanStatistics::TrendCounter.where(trend_id: new_os_trend.id).order(:interval_start).to_a
96
+ old_os_intervals = ForemanStatistics::TrendCounter.where(trend_id: old_os_trend.id).order(:interval_start).to_a
97
+
98
+ assert_equal 4, new_os_intervals.length
99
+ assert_equal 4, old_os_intervals.length
100
+
101
+ interval_starts.each_with_index do |start, idx|
102
+ assert_equal start, old_os_intervals[idx].interval_start
103
+ assert_equal start, new_os_intervals[idx].interval_start
104
+
105
+ if idx < 3
106
+ next_start = interval_starts[idx + 1]
107
+ assert_not_nil next_start
108
+ assert_equal next_start, old_os_intervals[idx].interval_end
109
+ assert_equal next_start, new_os_intervals[idx].interval_end
110
+ else
111
+ assert_nil old_os_intervals[idx].interval_end
112
+ assert_nil new_os_intervals[idx].interval_end
113
+ end
114
+
115
+ assert_equal 4, old_os_intervals[idx].count + new_os_intervals[idx].count
116
+ assert_equal new_os_counts[idx], new_os_intervals[idx].count
117
+ end
118
+ end
119
+
120
+ test 'foreman_statistics:trends:reduce can rerun with additional datapoint with the same value' do
121
+ os_trend = FactoryBot.build(:foreman_statistics_trend_os)
122
+ os_point_dates = create_trend_line(os_trend, [1, 1, 1, 1, 1, 1])
123
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
124
+
125
+ interval = ForemanStatistics::TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
126
+ assert_equal 1, interval.length
127
+ interval = interval.first
128
+
129
+ FactoryBot.build(:foreman_statistics_trend_counter, :trend => os_trend, :created_at => os_point_dates[3], :updated_at => os_point_dates[3], :count => 1)
130
+
131
+ Rake::Task['foreman_statistics:trends:reduce'].reenable
132
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
133
+
134
+ new_interval = ForemanStatistics::TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
135
+ assert_equal 1, new_interval.length
136
+ new_interval = new_interval.first
137
+
138
+ assert_equal new_interval, interval
139
+ end
140
+
141
+ test 'trends:reduce can rerun with additional datapoint with different value in open interval' do
142
+ os_trend = FactoryBot.build(:foreman_statistics_trend_os)
143
+ os_point_dates = create_trend_line(os_trend, [1, 1, 1, 1, 1, 1])
144
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
145
+
146
+ interval = ForemanStatistics::TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
147
+ assert_equal 1, interval.length
148
+
149
+ FactoryBot.create(:foreman_statistics_trend_counter, :trend => os_trend, :created_at => os_point_dates[3], :updated_at => os_point_dates[3], :count => 2)
150
+
151
+ Rake::Task['foreman_statistics:trends:reduce'].reenable
152
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
153
+
154
+ new_intervals = ForemanStatistics::TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
155
+ assert_equal 2, new_intervals.length
156
+
157
+ assert_equal 1, new_intervals[0].count
158
+ assert_equal 2, new_intervals[1].count
159
+
160
+ assert_equal os_point_dates[0], new_intervals[0].interval_start
161
+ assert_equal os_point_dates[3], new_intervals[0].interval_end
162
+ assert_equal os_point_dates[3], new_intervals[1].interval_start
163
+ end
164
+
165
+ test 'foreman_statistics:trends:reduce can rerun with additional datapoint with different value in closed interval' do
166
+ os_trend = FactoryBot.build(:foreman_statistics_trend_os)
167
+ os_point_dates = create_trend_line(os_trend, [1, 1, 1, 1, 1, 2])
168
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
169
+
170
+ interval = ForemanStatistics::TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
171
+ assert_equal 2, interval.length
172
+
173
+ FactoryBot.create(:foreman_statistics_trend_counter, :trend => os_trend, :created_at => os_point_dates[3], :updated_at => os_point_dates[3], :count => 3)
174
+
175
+ Rake::Task['foreman_statistics:trends:reduce'].reenable
176
+ Rake.application.invoke_task 'foreman_statistics:trends:reduce'
177
+
178
+ new_intervals = ForemanStatistics::TrendCounter.where(trend_id: os_trend.id).order(:interval_start).to_a
179
+ assert_equal 3, new_intervals.length
180
+
181
+ assert_equal 1, new_intervals[0].count
182
+ assert_equal 3, new_intervals[1].count
183
+ assert_equal 2, new_intervals[2].count
184
+
185
+ assert_equal os_point_dates[0], new_intervals[0].interval_start
186
+ assert_equal os_point_dates[3], new_intervals[0].interval_end
187
+ assert_equal os_point_dates[3], new_intervals[1].interval_start
188
+ assert_equal os_point_dates[5], new_intervals[1].interval_end
189
+ assert_equal os_point_dates[5], new_intervals[2].interval_start
190
+ end
191
+
192
+ private
193
+
194
+ def create_trend_line(trend, values_line)
195
+ point_dates = []
196
+ point_date = Time.now.utc.beginning_of_day
197
+ values_line.each do |value|
198
+ point_dates << point_date
199
+ FactoryBot.create(:foreman_statistics_trend_counter, :trend => trend, :created_at => point_date, :updated_at => point_date, :count => value)
200
+ point_date += 10.minutes
201
+ end
202
+
203
+ point_dates
204
+ end
205
+ end
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foreman_statistics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ondrej Ezr
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop-minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.9.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-performance
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.5.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.5.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.5.2
83
+ description: Statistics and Trends for Foreman gives users overview of their infrastructure.
84
+ email:
85
+ - oezr@redhat.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - app/controllers/concerns/foreman_statistics/parameters/trend.rb
94
+ - app/controllers/foreman_statistics/api/v2/statistics_controller.rb
95
+ - app/controllers/foreman_statistics/api/v2/trends_controller.rb
96
+ - app/controllers/foreman_statistics/react_controller.rb
97
+ - app/controllers/foreman_statistics/statistics_controller.rb
98
+ - app/controllers/foreman_statistics/trends_controller.rb
99
+ - app/helpers/foreman_statistics/trends_helper.rb
100
+ - app/models/concerns/foreman_statistics/compute_resource_decorations.rb
101
+ - app/models/concerns/foreman_statistics/environment_decorations.rb
102
+ - app/models/concerns/foreman_statistics/general_setting_decorations.rb
103
+ - app/models/concerns/foreman_statistics/hostgroup_decorations.rb
104
+ - app/models/concerns/foreman_statistics/model_decorations.rb
105
+ - app/models/concerns/foreman_statistics/operatingsystem_decorations.rb
106
+ - app/models/concerns/foreman_statistics/setting_decorations.rb
107
+ - app/models/foreman_statistics/fact_trend.rb
108
+ - app/models/foreman_statistics/foreman_trend.rb
109
+ - app/models/foreman_statistics/trend.rb
110
+ - app/models/foreman_statistics/trend_counter.rb
111
+ - app/services/foreman_statistics/statistics.rb
112
+ - app/services/foreman_statistics/statistics/base.rb
113
+ - app/services/foreman_statistics/statistics/count_facts.rb
114
+ - app/services/foreman_statistics/statistics/count_hosts.rb
115
+ - app/services/foreman_statistics/statistics/count_numerical_fact_pair.rb
116
+ - app/services/foreman_statistics/statistics/count_puppet_classes.rb
117
+ - app/services/foreman_statistics/trend_importer.rb
118
+ - app/views/foreman_statistics/api/v2/trends/base.json.rabl
119
+ - app/views/foreman_statistics/api/v2/trends/create.json.rabl
120
+ - app/views/foreman_statistics/api/v2/trends/index.json.rabl
121
+ - app/views/foreman_statistics/api/v2/trends/main.json.rabl
122
+ - app/views/foreman_statistics/api/v2/trends/show.json.rabl
123
+ - app/views/foreman_statistics/api/v2/trends/update.json.rabl
124
+ - app/views/foreman_statistics/layouts/application_react.html.erb
125
+ - app/views/foreman_statistics/trends/_empty_data.html.erb
126
+ - app/views/foreman_statistics/trends/_fields.html.erb
127
+ - app/views/foreman_statistics/trends/_form.html.erb
128
+ - app/views/foreman_statistics/trends/_hosts.html.erb
129
+ - app/views/foreman_statistics/trends/edit.html.erb
130
+ - app/views/foreman_statistics/trends/index.html.erb
131
+ - app/views/foreman_statistics/trends/new.html.erb
132
+ - app/views/foreman_statistics/trends/show.html.erb
133
+ - app/views/foreman_statistics/trends/welcome.html.erb
134
+ - config/routes.rb
135
+ - db/migrate/20200605153005_migrate_core_types.rb
136
+ - db/migrate_foreman/20121012170851_create_trends.rb
137
+ - db/migrate_foreman/20121012170936_create_trend_counters.rb
138
+ - db/migrate_foreman/20150202094307_add_range_to_trend_counters.rb
139
+ - db/migrate_foreman/20181031155025_add_trend_counter_created_at_unique_constraint.rb
140
+ - lib/foreman_statistics.rb
141
+ - lib/foreman_statistics/engine.rb
142
+ - lib/foreman_statistics/version.rb
143
+ - lib/tasks/foreman_statistics_tasks.rake
144
+ - locale/Makefile
145
+ - locale/en/foreman_statistics.po
146
+ - locale/foreman_statistics.pot
147
+ - locale/gemspec.rb
148
+ - test/factories/foreman_statistics_factories.rb
149
+ - test/fixtures/permissions.yml
150
+ - test/fixtures/settings.yml
151
+ - test/functional/foreman_statistics/api/v2/statistics_controller_test.rb
152
+ - test/functional/foreman_statistics/api/v2/trends_controller_test.rb
153
+ - test/functional/foreman_statistics/statistics_controller_test.rb
154
+ - test/functional/foreman_statistics/trends_controller_test.rb
155
+ - test/models/foreman_statistics/trend_counter_test.rb
156
+ - test/models/foreman_statistics/trend_test.rb
157
+ - test/test_plugin_helper.rb
158
+ - test/unit/foreman_statistics/access_permissions_test.rb
159
+ - test/unit/foreman_statistics/statistics_test.rb
160
+ - test/unit/foreman_statistics_test.rb
161
+ - test/unit/tasks/foreman_statistics_tasks_test.rb
162
+ homepage: https://theforeman.org
163
+ licenses:
164
+ - GPL-3.0
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubygems_version: 3.0.3
182
+ signing_key:
183
+ specification_version: 4
184
+ summary: Add Statistics and Trends.
185
+ test_files:
186
+ - test/functional/foreman_statistics/trends_controller_test.rb
187
+ - test/functional/foreman_statistics/statistics_controller_test.rb
188
+ - test/functional/foreman_statistics/api/v2/trends_controller_test.rb
189
+ - test/functional/foreman_statistics/api/v2/statistics_controller_test.rb
190
+ - test/models/foreman_statistics/trend_test.rb
191
+ - test/models/foreman_statistics/trend_counter_test.rb
192
+ - test/unit/foreman_statistics/statistics_test.rb
193
+ - test/unit/foreman_statistics/access_permissions_test.rb
194
+ - test/unit/tasks/foreman_statistics_tasks_test.rb
195
+ - test/unit/foreman_statistics_test.rb
196
+ - test/factories/foreman_statistics_factories.rb
197
+ - test/fixtures/settings.yml
198
+ - test/fixtures/permissions.yml
199
+ - test/test_plugin_helper.rb