puppet-herald 0.2.0 → 0.8.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 +5 -13
  2. data/.gitignore +3 -0
  3. data/.jshintrc +19 -0
  4. data/Gemfile +25 -12
  5. data/Gemfile.local.example +3 -0
  6. data/Guardfile +57 -0
  7. data/README.md +1 -1
  8. data/Rakefile +100 -20
  9. data/db/migrate/20141218200108_remove_no_of_reports_from_nodes.rb +7 -0
  10. data/lib/puppet-herald.rb +95 -65
  11. data/lib/puppet-herald/app/api.rb +79 -12
  12. data/lib/puppet-herald/app/configuration.rb +47 -15
  13. data/lib/puppet-herald/app/frontend.rb +6 -6
  14. data/lib/puppet-herald/app/views/app.erb +14 -20
  15. data/lib/puppet-herald/app/views/err500.erb +8 -5
  16. data/lib/puppet-herald/application.rb +9 -1
  17. data/lib/puppet-herald/cli.rb +5 -11
  18. data/lib/puppet-herald/database.rb +1 -7
  19. data/lib/puppet-herald/javascript.rb +16 -10
  20. data/lib/puppet-herald/models.rb +47 -0
  21. data/lib/puppet-herald/models/log-entry.rb +2 -0
  22. data/lib/puppet-herald/models/node.rb +49 -2
  23. data/lib/puppet-herald/models/report.rb +33 -9
  24. data/lib/puppet-herald/project.js +46 -0
  25. data/lib/puppet-herald/public/app.js +11 -9
  26. data/lib/puppet-herald/public/bower.json +10 -3
  27. data/lib/puppet-herald/public/components/artifact/artifact-directive.js +4 -0
  28. data/lib/puppet-herald/public/components/artifact/artifact.js +1 -3
  29. data/lib/puppet-herald/public/components/directives/directives.js +5 -1
  30. data/lib/puppet-herald/public/components/directives/status-button.html +1 -1
  31. data/lib/puppet-herald/public/components/directives/status-button.js +11 -11
  32. data/lib/puppet-herald/public/components/filters/filters.js +6 -2
  33. data/lib/puppet-herald/public/components/page.js +2 -2
  34. data/lib/puppet-herald/public/components/pagination.js +142 -0
  35. data/lib/puppet-herald/public/components/settings.js +25 -0
  36. data/lib/puppet-herald/public/css/herald.css +100 -3
  37. data/lib/puppet-herald/public/general/app.html +73 -0
  38. data/lib/puppet-herald/public/img/shield97-white.svg +53 -0
  39. data/lib/puppet-herald/public/img/shield97.png +0 -0
  40. data/lib/puppet-herald/public/node/node.html +27 -9
  41. data/lib/puppet-herald/public/node/node.js +43 -15
  42. data/lib/puppet-herald/public/nodes/nodes.html +25 -7
  43. data/lib/puppet-herald/public/nodes/nodes.js +29 -14
  44. data/lib/puppet-herald/public/report/report.html +60 -13
  45. data/lib/puppet-herald/public/report/report.js +21 -14
  46. data/lib/puppet-herald/public/router.js +55 -0
  47. data/lib/puppet-herald/purgecronjob.rb +35 -0
  48. data/lib/puppet-herald/version.rb +2 -2
  49. data/package.json +14 -16
  50. data/puppet-herald.gemspec +12 -7
  51. data/spec/integration/app/configuration_spec.rb +33 -0
  52. data/spec/integration/application_spec.rb +139 -20
  53. data/spec/integration/fixtures/nodes.yml +13 -0
  54. data/spec/integration/fixtures/pending-notify.yaml +346 -0
  55. data/spec/integration/fixtures/reports.yml +61 -0
  56. data/spec/integration/models/node_spec.rb +12 -3
  57. data/spec/integration/models/report_spec.rb +60 -4
  58. data/spec/spec_helper.rb +6 -10
  59. data/spec/support/active_record.rb +1 -0
  60. data/spec/support/fixtures.rb +16 -0
  61. data/spec/unit/puppet-herald/cli_spec.rb +4 -4
  62. data/spec/unit/puppet-herald/database_spec.rb +5 -3
  63. data/spec/unit/puppet-herald/purgecronjob_spec.rb +37 -0
  64. data/test/javascript/.bowerrc +3 -0
  65. data/test/javascript/bower.json +21 -0
  66. data/test/javascript/karma.conf.js +17 -22
  67. data/test/javascript/src/app_test.js +10 -61
  68. data/test/javascript/src/components/directives/status-button_test.js +10 -10
  69. data/test/javascript/src/components/paginate_test.js +183 -0
  70. data/test/javascript/src/node/node_test.js +16 -6
  71. data/test/javascript/src/nodes/nodes_test.js +14 -2
  72. data/test/javascript/src/report/report_test.js +6 -6
  73. data/test/javascript/src/router_test.js +79 -0
  74. metadata +642 -23
@@ -14,9 +14,9 @@ module PuppetHerald
14
14
  end
15
15
 
16
16
  # Version for Herald
17
- VERSION = version_prep '0.2.0'
17
+ VERSION = version_prep '0.8.0'
18
18
  # Lincense for Herald
19
- LICENSE = 'Apache 2.0'
19
+ LICENSE = 'Apache-2.0'
20
20
  # Project name
21
21
  NAME = 'Puppet Herald'
22
22
  # Package (gem) for Herald
data/package.json CHANGED
@@ -1,28 +1,26 @@
1
1
  {
2
2
  "name": "puppet-herald",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Provides a gateway for consuming puppet reports, a REST API and a simple Web app to display reports.",
5
5
  "main": "lib/puppet-herald/public/app.js",
6
6
  "directories": {
7
7
  "test": "test"
8
8
  },
9
- "dependencies": {
10
- "angular": "1.3.x",
11
- "angular-route": "1.3.x",
12
- "moment": "~2.8",
13
- "angular-moment": "~0.8"
14
- },
9
+ "dependencies": {},
15
10
  "devDependencies": {
16
- "angular-loader": "1.3.x",
17
- "angular-mocks": "1.3.x",
18
- "jasmine-core": "~2.1.0",
19
- "karma-jasmine": "~0.3.0",
11
+ "bower": "~1.4.0",
12
+ "coveralls": "~2.11.0",
13
+ "globby": "~2.0.0",
14
+ "jasmine-core": "~2.2.0",
20
15
  "karma": "~0.12.0",
21
- "phantomjs": "~1.9.0",
22
- "karma-story-reporter": "~0.2",
23
- "karma-coverage": "~0.1",
16
+ "karma-coverage": "~0.2",
17
+ "karma-jasmine": "~0.3.0",
18
+ "karma-ng-html2js-preprocessor": "~0.1",
24
19
  "karma-phantomjs-launcher": "~0.1",
25
- "karma-ng-html2js-preprocessor": "~0.1"
20
+ "karma-story-reporter": "~0.3",
21
+ "lcov-result-merger": "~1.0.0",
22
+ "phantomjs": "~1.9.0",
23
+ "wiredep": "~2.2.2"
26
24
  },
27
25
  "scripts": {
28
26
  "test": "test/javascript/karma.conf.js"
@@ -37,7 +35,7 @@
37
35
  "herald"
38
36
  ],
39
37
  "author": "Krzysztof Suszynski",
40
- "license": "Apache 2.0",
38
+ "license": "Apache-2.0",
41
39
  "bugs": {
42
40
  "url": "https://github.com/wavesoftware/gem-puppet-herald/issues"
43
41
  },
@@ -1,8 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- require File.expand_path('../lib/puppet-herald/version', __FILE__)
3
+ ROOT = Pathname.new(File.expand_path('../', __FILE__))
4
+ LIB = Pathname.new('lib/puppet-herald')
5
+ ph = ROOT.join(LIB)
6
+ require ph.join('version')
4
7
 
5
8
  Gem::Specification.new do |gem|
9
+ deps = Dir.glob(LIB.join('public').join('bower_components').join('**/*'))
6
10
  gem.name = PuppetHerald::PACKAGE
7
11
  gem.version = PuppetHerald::VERSION
8
12
  gem.author = 'Krzysztof Suszynski'
@@ -13,7 +17,7 @@ Gem::Specification.new do |gem|
13
17
  gem.description = PuppetHerald::DESCRIPTION
14
18
 
15
19
  gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
16
- gem.files = `git ls-files`.split("\n")
20
+ gem.files = `git ls-files`.split("\n").concat(deps)
17
21
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
22
  gem.require_paths = ['lib']
19
23
 
@@ -21,11 +25,12 @@ Gem::Specification.new do |gem|
21
25
  gem.required_ruby_version = '>= 1.9.2'
22
26
 
23
27
  # Runtime
24
- gem.add_runtime_dependency 'sinatra', '~> 1.4'
25
- gem.add_runtime_dependency 'sinatra-contrib', '~> 1.4'
26
- gem.add_runtime_dependency 'sinatra-activerecord', '~> 2.0'
27
- gem.add_runtime_dependency 'micro-optparse', '~> 1.2'
28
- gem.add_runtime_dependency 'uglifier', '~> 2.6'
28
+ gem.add_runtime_dependency 'sinatra', '~> 1.4', '>= 1.4.0'
29
+ gem.add_runtime_dependency 'sinatra-contrib', '~> 1.4', '>= 1.4.0'
30
+ gem.add_runtime_dependency 'sinatra-activerecord', '~> 2.0', '>= 2.0.0'
31
+ gem.add_runtime_dependency 'rufus-scheduler', '~> 3.0', '>= 3.0.0'
32
+ gem.add_runtime_dependency 'micro-optparse', '~> 1.2', '>= 1.2.0'
33
+ gem.add_runtime_dependency 'uglifier', '~> 2.7', '>= 2.7.0'
29
34
  end
30
35
 
31
36
  # vim:ft=ruby
@@ -0,0 +1,33 @@
1
+ require 'model_helper'
2
+ require 'puppet-herald/app/configuration'
3
+
4
+ describe PuppetHerald::App::Configuration do
5
+ after(:all) do
6
+ PuppetHerald.environment = :test
7
+ end
8
+ describe '.setup_database_logger' do
9
+ subject { PuppetHerald::App::Configuration.configure_app(dbmigrate: false, cron: false) }
10
+ context 'in DEV environment' do
11
+ before(:each) do
12
+ PuppetHerald.environment = :development
13
+ end
14
+ it 'executes properlly' do
15
+ expect(subject).to be_nil
16
+ end
17
+ it 'sets logger level to DEBUG' do
18
+ expect(ActiveRecord::Base.logger.level).to eq(Logger::DEBUG)
19
+ end
20
+ end
21
+ context 'in PROD environment' do
22
+ before(:each) do
23
+ PuppetHerald.environment = :production
24
+ end
25
+ it 'executes properlly' do
26
+ expect(subject).to be_nil
27
+ end
28
+ it 'sets logger level to INFO' do
29
+ expect(ActiveRecord::Base.logger.level).to eq(Logger::INFO)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,15 +1,14 @@
1
1
  ENV['RACK_ENV'] = 'test'
2
2
 
3
- require 'support/reconnectdb'
4
- require 'spec_helper'
3
+ require 'model_helper'
5
4
  require 'rspec'
6
5
  require 'rack/test'
7
6
 
8
- shared_examples 'a redirect to app.html' do
7
+ shared_examples 'a redirect to /' do
9
8
  it { expect(subject).not_to be_successful }
10
9
  it { expect(subject).to be_redirection }
11
10
  it { expect(subject.status).to eq(301) }
12
- it { expect(subject.header['Location']).to eq('http://example.org/app.html') }
11
+ it { expect(subject.header['Location']).to eq('http://example.org/') }
13
12
  end
14
13
 
15
14
  shared_examples 'a proper 2xx - success' do
@@ -26,6 +25,12 @@ shared_examples '500 - error' do
26
25
  it { expect(subject.body).not_to be_empty }
27
26
  end
28
27
 
28
+ shared_examples '400 - bad request' do
29
+ it { expect(subject).not_to be_successful }
30
+ it { expect(subject).to be_client_error }
31
+ it { expect(subject.status).to eq 400 }
32
+ it { expect(subject.body).not_to be_empty }
33
+ end
29
34
  shared_examples '404 - not found' do
30
35
  it { expect(subject).not_to be_successful }
31
36
  it { expect(subject).to be_client_error }
@@ -42,6 +47,10 @@ shared_examples "working API - not found" do
42
47
  it { expect(subject.content_type).to eq 'application/json' }
43
48
  it_behaves_like '404 - not found'
44
49
  end
50
+ shared_examples "working API - bad request" do
51
+ it { expect(subject.content_type).to eq 'application/json' }
52
+ it_behaves_like '400 - bad request'
53
+ end
45
54
 
46
55
  shared_examples "working API - error" do
47
56
  it { expect(subject.content_type).to eq 'application/json' }
@@ -51,27 +60,40 @@ end
51
60
  describe 'The Herald App' do
52
61
  include Rack::Test::Methods
53
62
 
54
- before(:all) { reconnectdb }
63
+ before(:all) do
64
+ reconnectdb
65
+ end
55
66
 
56
67
  def app
57
68
  require 'puppet-herald/application'
58
69
  PuppetHerald::Application
59
70
  end
60
71
 
61
- describe "on '/' redirects to '/app.html'" do
62
- it_behaves_like 'a redirect to app.html' do
63
- subject { get '/' }
72
+ describe "on '/app.html'" do
73
+ level = nil
74
+ before(:all) do
75
+ require 'puppet-herald/app/configuration'
76
+ level = PuppetHerald.logger.level
77
+ PuppetHerald.logger.level = 100
78
+ PuppetHerald::App::Configuration.configure_app(dbmigrate: false)
79
+ end
80
+ after(:all) do
81
+ app.quit!
82
+ PuppetHerald.logger.level = level
83
+ end
84
+ it_behaves_like 'a redirect to /' do
85
+ subject { get '/app.html' }
64
86
  end
65
87
  end
66
88
 
67
- describe "on '/index.html' redirects to '/app.html'" do
68
- it_behaves_like 'a redirect to app.html' do
89
+ describe "on '/index.html'" do
90
+ it_behaves_like 'a redirect to /' do
69
91
  subject { get '/index.html' }
70
92
  end
71
93
  end
72
94
 
73
- describe "on main page '/app.html'" do
74
- subject { get '/app.html' }
95
+ describe "on main page '/'" do
96
+ subject { get '/' }
75
97
  context 'in production' do
76
98
  before { expect(PuppetHerald).to receive(:in_prod?).at_least(:once).and_return true }
77
99
  it { expect(subject.body).to include 'app.min.js' }
@@ -106,7 +128,7 @@ describe 'The Herald App' do
106
128
  it { expect(subject.content_type).to eq 'application/javascript;charset=utf-8' }
107
129
  end
108
130
 
109
- describe "that is received a fatal error" do
131
+ describe "that had received a fatal error" do
110
132
  after :each do
111
133
  Dir.glob(Dir.tmpdir + '/puppet-herald-bug*.log') { |file| Pathname.new(file).unlink }
112
134
  PuppetHerald.environment = :test
@@ -133,7 +155,7 @@ describe 'The Herald App' do
133
155
  before :each do
134
156
  expect_any_instance_of(PuppetHerald::App::LogicImpl).to receive(:app_html).and_raise :expected
135
157
  end
136
- subject { get '/app.html' }
158
+ subject { get '/' }
137
159
  context 'in production environment' do
138
160
  before { PuppetHerald.environment = :production }
139
161
  it_behaves_like '500 - error'
@@ -152,19 +174,116 @@ describe 'The Herald App' do
152
174
 
153
175
  before :each do
154
176
  reconnectdb
177
+ fixtures :nodes
178
+ fixtures :reports
155
179
  end
156
180
  describe "post '/api/v1/reports'" do
157
181
  let(:yaml) { File.read(File.expand_path("../fixtures/changed-notify.yaml", __FILE__)) }
158
182
  subject { post '/api/v1/reports', yaml }
159
183
  it_behaves_like 'working API - success'
160
184
  end
161
- describe "get '/api/v1/nodes'" do
162
- subject { get '/api/v1/nodes' }
163
- it_behaves_like 'working API - success'
185
+ context 'without pagination' do
186
+ describe "get '/api/v1/nodes'" do
187
+ subject { get '/api/v1/nodes' }
188
+ let(:json) { JSON.parse subject.body }
189
+ it_behaves_like 'working API - success'
190
+ it { expect(json.size).to be(2) }
191
+ end
192
+ describe "get '/api/v1/nodes/1'" do
193
+ subject { get '/api/v1/nodes/1' }
194
+ let(:json) { JSON.parse subject.body }
195
+ it_behaves_like 'working API - success'
196
+ it { expect(json['reports'].class).to be(Array) }
197
+ it { expect(json['reports'].size).to be(5) }
198
+ end
199
+ describe "get '/api/v1/nodes/12'" do
200
+ subject { get '/api/v1/nodes/12' }
201
+ it_behaves_like 'working API - not found'
202
+ end
164
203
  end
165
- describe "get '/api/v1/nodes/1'" do
166
- subject { get '/api/v1/nodes/1' }
167
- it_behaves_like 'working API - not found'
204
+ context 'with pagination given' do
205
+ let(:compile_headers) do
206
+ lambda do |pag|
207
+ api = PuppetHerald::App::ApiImplV1.new(nil)
208
+ api.send(:headers, pag, true)
209
+ end
210
+ end
211
+ context 'with page 1 and limit 10' do
212
+ let(:headers) { compile_headers.call(PuppetHerald::Models::Pagination.new(1, 10)) }
213
+ describe "get '/api/v1/nodes'" do
214
+ subject { get('/api/v1/nodes', {}, headers) }
215
+ let(:json) { JSON.parse subject.body }
216
+ it_behaves_like 'working API - success'
217
+ it { expect(json.size).to be(2) }
218
+ it { expect(json[0]['no_of_reports']).to eq(5) }
219
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:page] => '1') }
220
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:limit] => '10') }
221
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:total] => '2') }
222
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:pages] => '1') }
223
+ end
224
+ describe "get '/api/v1/nodes/1'" do
225
+ subject { get('/api/v1/nodes/1', {}, headers) }
226
+ let(:json) { JSON.parse subject.body }
227
+ it_behaves_like 'working API - success'
228
+ it { expect(json['reports'].class).to be(Array) }
229
+ it { expect(json['reports'].size).to be(5) }
230
+ it { expect(json['no_of_reports']).to eq(5) }
231
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:page] => '1') }
232
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:limit] => '10') }
233
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:total] => '5') }
234
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:pages] => '1') }
235
+ end
236
+ end
237
+ context 'with page 2 and limit 1' do
238
+ let(:headers) { compile_headers.call(PuppetHerald::Models::Pagination.new(2, 1)) }
239
+ describe "get '/api/v1/nodes'" do
240
+ subject { get('/api/v1/nodes', {}, headers) }
241
+ let(:json) { JSON.parse subject.body }
242
+ it_behaves_like 'working API - success'
243
+ it { expect(json.size).to be(1) }
244
+ it { expect(json[0]['name']).to eq('slave1.vm') }
245
+ it { expect(json[0]['no_of_reports']).to eq(0) }
246
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:page] => '2') }
247
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:limit] => '1') }
248
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:total] => '2') }
249
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:pages] => '2') }
250
+ end
251
+ describe "get '/api/v1/nodes/1'" do
252
+ subject { get('/api/v1/nodes/1', {}, headers) }
253
+ let(:json) { JSON.parse subject.body }
254
+ it_behaves_like 'working API - success'
255
+ it { expect(json['reports'].class).to be(Array) }
256
+ it { expect(json['reports'].size).to be(1) }
257
+ it { expect(json['no_of_reports']).to eq(5) }
258
+ it { expect(json['reports'][0]['configuration_version']).to eq('12345721') }
259
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:page] => '2') }
260
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:limit] => '1') }
261
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:total] => '5') }
262
+ it { expect(subject.headers).to include(PuppetHerald::Models::Pagination::KEYS[:pages] => '5') }
263
+ end
264
+ end
265
+ context 'with page -12 and limit 2' do
266
+ let(:headers) do
267
+ api = PuppetHerald::App::ApiImplV1.new(nil)
268
+ httpize = lambda {|name| api.send(:httpize, name) }
269
+ {
270
+ httpize.call(PuppetHerald::Models::Pagination::KEYS[:page]) => '-12',
271
+ httpize.call(PuppetHerald::Models::Pagination::KEYS[:limit]) => '2'
272
+ }
273
+ end
274
+ describe "get '/api/v1/nodes'" do
275
+ subject { get('/api/v1/nodes', {}, headers) }
276
+ let(:json) { JSON.parse subject.body }
277
+ it_behaves_like 'working API - bad request'
278
+ it { expect(json['error']).to eq('ArgumentError: Invalid value for pagination page "-12"') }
279
+ end
280
+ describe "get '/api/v1/nodes/1'" do
281
+ subject { get('/api/v1/nodes/1', {}, headers) }
282
+ let(:json) { JSON.parse subject.body }
283
+ it_behaves_like 'working API - bad request'
284
+ it { expect(json['error']).to eq('ArgumentError: Invalid value for pagination page "-12"') }
285
+ end
286
+ end
168
287
  end
169
288
  describe "get '/api/v1/reports/1'" do
170
289
  subject { get '/api/v1/reports/1' }
@@ -0,0 +1,13 @@
1
+ ---
2
+
3
+ master:
4
+ id: 1
5
+ name: 'master.vm'
6
+ status: 'changed'
7
+ last_run: '2014-12-17T17:34:08'
8
+
9
+ slave1:
10
+ id: 2
11
+ name: 'slave1.vm'
12
+ status: 'unchanged'
13
+ last_run: '2014-12-17T16:32:18'
@@ -0,0 +1,346 @@
1
+ --- !ruby/object:Puppet::Transaction::Report
2
+ metrics:
3
+ resources: !ruby/object:Puppet::Util::Metric
4
+ name: resources
5
+ label: Resources
6
+ values:
7
+ - - total
8
+ - Total
9
+ - 8
10
+ - - skipped
11
+ - Skipped
12
+ - 0
13
+ - - failed
14
+ - Failed
15
+ - 0
16
+ - - failed_to_restart
17
+ - "Failed to restart"
18
+ - 0
19
+ - - restarted
20
+ - Restarted
21
+ - 0
22
+ - - changed
23
+ - Changed
24
+ - 0
25
+ - - out_of_sync
26
+ - "Out of sync"
27
+ - 1
28
+ - - scheduled
29
+ - Scheduled
30
+ - 0
31
+ time: !ruby/object:Puppet::Util::Metric
32
+ name: time
33
+ label: Time
34
+ values:
35
+ - - schedule
36
+ - Schedule
37
+ - 0.000240972
38
+ - - notify
39
+ - Notify
40
+ - 0.000303028
41
+ - - filebucket
42
+ - Filebucket
43
+ - 6.039e-05
44
+ - - config_retrieval
45
+ - "Config retrieval"
46
+ - 0.064040677
47
+ - - total
48
+ - Total
49
+ - 0.064645067
50
+ changes: !ruby/object:Puppet::Util::Metric
51
+ name: changes
52
+ label: Changes
53
+ values:
54
+ - - total
55
+ - Total
56
+ - 0
57
+ events: !ruby/object:Puppet::Util::Metric
58
+ name: events
59
+ label: Events
60
+ values:
61
+ - - total
62
+ - Total
63
+ - 1
64
+ - - failure
65
+ - Failure
66
+ - 0
67
+ - - success
68
+ - Success
69
+ - 0
70
+ - - noop
71
+ - Noop
72
+ - 1
73
+ logs:
74
+ - !ruby/object:Puppet::Util::Log
75
+ level: !ruby/sym debug
76
+ tags:
77
+ - debug
78
+ message: "Loaded state in 0.00 seconds"
79
+ source: Puppet
80
+ time: 2015-04-08 14:20:15.877861 +02:00
81
+ - !ruby/object:Puppet::Util::Log
82
+ level: !ruby/sym info
83
+ tags:
84
+ - info
85
+ message: "Applying configuration version '1428495615'"
86
+ source: Puppet
87
+ time: 2015-04-08 14:20:15.878967 +02:00
88
+ - !ruby/object:Puppet::Util::Log
89
+ level: !ruby/sym notice
90
+ tags:
91
+ - notice
92
+ - notify
93
+ - class
94
+ message: "current_value absent, should be Notify of something (noop)"
95
+ source: "/Stage[main]/Main/Notify[Notify of something]/message"
96
+ time: 2015-04-08 14:20:15.880377 +02:00
97
+ file: /home/ksuszynski/tmp/notify.pp
98
+ line: 1
99
+ - !ruby/object:Puppet::Util::Log
100
+ level: !ruby/sym debug
101
+ tags:
102
+ - debug
103
+ - notify
104
+ - class
105
+ message: "The container Class[Main] will propagate my refresh event"
106
+ source: "/Stage[main]/Main/Notify[Notify of something]"
107
+ time: 2015-04-08 14:20:15.880532 +02:00
108
+ file: /home/ksuszynski/tmp/notify.pp
109
+ line: 1
110
+ - !ruby/object:Puppet::Util::Log
111
+ level: !ruby/sym notice
112
+ tags:
113
+ - notice
114
+ - completed_class
115
+ - main
116
+ message: "Would have triggered 'refresh' from 1 events"
117
+ source: Class[Main]
118
+ time: 2015-04-08 14:20:15.881331 +02:00
119
+ - !ruby/object:Puppet::Util::Log
120
+ level: !ruby/sym debug
121
+ tags:
122
+ - debug
123
+ - completed_class
124
+ - main
125
+ message: "The container Stage[main] will propagate my refresh event"
126
+ source: Class[Main]
127
+ time: 2015-04-08 14:20:15.881477 +02:00
128
+ - !ruby/object:Puppet::Util::Log
129
+ level: !ruby/sym notice
130
+ tags:
131
+ - notice
132
+ - completed_stage
133
+ - main
134
+ message: "Would have triggered 'refresh' from 1 events"
135
+ source: Stage[main]
136
+ time: 2015-04-08 14:20:15.881685 +02:00
137
+ - !ruby/object:Puppet::Util::Log
138
+ level: !ruby/sym debug
139
+ tags:
140
+ - debug
141
+ message: "Finishing transaction 39170880"
142
+ source: Puppet
143
+ time: 2015-04-08 14:20:15.881819 +02:00
144
+ - !ruby/object:Puppet::Util::Log
145
+ level: !ruby/sym debug
146
+ tags:
147
+ - debug
148
+ message: "Storing state"
149
+ source: Puppet
150
+ time: 2015-04-08 14:20:15.881869 +02:00
151
+ - !ruby/object:Puppet::Util::Log
152
+ level: !ruby/sym debug
153
+ tags:
154
+ - debug
155
+ message: "Stored state in 0.07 seconds"
156
+ source: Puppet
157
+ time: 2015-04-08 14:20:15.947269 +02:00
158
+ - !ruby/object:Puppet::Util::Log
159
+ level: !ruby/sym notice
160
+ tags:
161
+ - notice
162
+ message: "Finished catalog run in 0.07 seconds"
163
+ source: Puppet
164
+ time: 2015-04-08 14:20:15.947363 +02:00
165
+ resource_statuses:
166
+ Schedule[daily]: !ruby/object:Puppet::Resource::Status
167
+ resource: Schedule[daily]
168
+ file:
169
+ line:
170
+ evaluation_time: 6.3343e-05
171
+ change_count: 0
172
+ out_of_sync_count: 0
173
+ tags:
174
+ - schedule
175
+ - daily
176
+ time: 2015-04-08 14:20:15.879283 +02:00
177
+ events: []
178
+ out_of_sync: false
179
+ changed: false
180
+ resource_type: Schedule
181
+ title: daily
182
+ skipped: false
183
+ failed: false
184
+ containment_path:
185
+ - Schedule[daily]
186
+ Schedule[monthly]: !ruby/object:Puppet::Resource::Status
187
+ resource: Schedule[monthly]
188
+ file:
189
+ line:
190
+ evaluation_time: 2.982e-05
191
+ change_count: 0
192
+ out_of_sync_count: 0
193
+ tags:
194
+ - schedule
195
+ - monthly
196
+ time: 2015-04-08 14:20:15.879428 +02:00
197
+ events: []
198
+ out_of_sync: false
199
+ changed: false
200
+ resource_type: Schedule
201
+ title: monthly
202
+ skipped: false
203
+ failed: false
204
+ containment_path:
205
+ - Schedule[monthly]
206
+ Schedule[hourly]: !ruby/object:Puppet::Resource::Status
207
+ resource: Schedule[hourly]
208
+ file:
209
+ line:
210
+ evaluation_time: 2.8972e-05
211
+ change_count: 0
212
+ out_of_sync_count: 0
213
+ tags:
214
+ - schedule
215
+ - hourly
216
+ time: 2015-04-08 14:20:15.879510 +02:00
217
+ events: []
218
+ out_of_sync: false
219
+ changed: false
220
+ resource_type: Schedule
221
+ title: hourly
222
+ skipped: false
223
+ failed: false
224
+ containment_path:
225
+ - Schedule[hourly]
226
+ "Notify[Notify of something]": !ruby/object:Puppet::Resource::Status
227
+ resource: "Notify[Notify of something]"
228
+ file: /home/ksuszynski/tmp/notify.pp
229
+ line: 1
230
+ evaluation_time: 0.000303028
231
+ change_count: 0
232
+ out_of_sync_count: 1
233
+ tags:
234
+ - notify
235
+ - class
236
+ time: 2015-04-08 14:20:15.880149 +02:00
237
+ events:
238
+ - !ruby/object:Puppet::Transaction::Event
239
+ audited: false
240
+ property: message
241
+ previous_value: !ruby/sym absent
242
+ desired_value: "Notify of something"
243
+ historical_value:
244
+ message: "current_value absent, should be Notify of something (noop)"
245
+ name: !ruby/sym message_changed
246
+ status: noop
247
+ time: 2015-04-08 14:20:15.880328 +02:00
248
+ out_of_sync: true
249
+ changed: false
250
+ resource_type: Notify
251
+ title: "Notify of something"
252
+ skipped: false
253
+ failed: false
254
+ containment_path:
255
+ - Stage[main]
256
+ - Main
257
+ - "Notify[Notify of something]"
258
+ Schedule[never]: !ruby/object:Puppet::Resource::Status
259
+ resource: Schedule[never]
260
+ file:
261
+ line:
262
+ evaluation_time: 3.8885e-05
263
+ change_count: 0
264
+ out_of_sync_count: 0
265
+ tags:
266
+ - schedule
267
+ - never
268
+ time: 2015-04-08 14:20:15.880708 +02:00
269
+ events: []
270
+ out_of_sync: false
271
+ changed: false
272
+ resource_type: Schedule
273
+ title: never
274
+ skipped: false
275
+ failed: false
276
+ containment_path:
277
+ - Schedule[never]
278
+ Filebucket[puppet]: !ruby/object:Puppet::Resource::Status
279
+ resource: Filebucket[puppet]
280
+ file:
281
+ line:
282
+ evaluation_time: 6.039e-05
283
+ change_count: 0
284
+ out_of_sync_count: 0
285
+ tags:
286
+ - filebucket
287
+ - puppet
288
+ time: 2015-04-08 14:20:15.880851 +02:00
289
+ events: []
290
+ out_of_sync: false
291
+ changed: false
292
+ resource_type: Filebucket
293
+ title: puppet
294
+ skipped: false
295
+ failed: false
296
+ containment_path:
297
+ - Filebucket[puppet]
298
+ Schedule[weekly]: !ruby/object:Puppet::Resource::Status
299
+ resource: Schedule[weekly]
300
+ file:
301
+ line:
302
+ evaluation_time: 3.1912e-05
303
+ change_count: 0
304
+ out_of_sync_count: 0
305
+ tags:
306
+ - schedule
307
+ - weekly
308
+ time: 2015-04-08 14:20:15.881031 +02:00
309
+ events: []
310
+ out_of_sync: false
311
+ changed: false
312
+ resource_type: Schedule
313
+ title: weekly
314
+ skipped: false
315
+ failed: false
316
+ containment_path:
317
+ - Schedule[weekly]
318
+ Schedule[puppet]: !ruby/object:Puppet::Resource::Status
319
+ resource: Schedule[puppet]
320
+ file:
321
+ line:
322
+ evaluation_time: 4.804e-05
323
+ change_count: 0
324
+ out_of_sync_count: 0
325
+ tags:
326
+ - schedule
327
+ - puppet
328
+ time: 2015-04-08 14:20:15.881147 +02:00
329
+ events: []
330
+ out_of_sync: false
331
+ changed: false
332
+ resource_type: Schedule
333
+ title: puppet
334
+ skipped: false
335
+ failed: false
336
+ containment_path:
337
+ - Schedule[puppet]
338
+ host: ksuszynski-gs70.suszynski.org
339
+ time: 2015-04-08 14:20:15.867589 +02:00
340
+ kind: apply
341
+ report_format: 4
342
+ puppet_version: "3.7.5"
343
+ configuration_version: 1428495615
344
+ transaction_uuid: "0b093272-e2f1-471b-8610-9f4e259a4436"
345
+ environment: production
346
+ status: unchanged