quixoten-puppetdb-terminus 2.0.0 → 2.1.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 63d1b44d864f009e45fe74dfd053ec9b0081bad6
4
- data.tar.gz: 94b6c795415596d826a110609a7d9dc123e7d876
3
+ metadata.gz: 6ec041c3332210b8491e8e7867f4a7c1b08e3c9d
4
+ data.tar.gz: a8ad9e389b33309ecd2b99e25b987283d0d84739
5
5
  SHA512:
6
- metadata.gz: 75ef2cfbec9fc27b048a4f24e4dd11239d0720ae17325c3526826320ddfe173de078412f8e113148f8f268691c20ac7f9194a7e2fbcd284471aed4add4e6ea01
7
- data.tar.gz: 36f2d1628d0413d1e8357d2c7820e99fa85ee18046c101854b8418059495b6c2d2df81547e430c74be243dde2aa38c86e6a425705e4a6379511a9c34a492d828
6
+ metadata.gz: e4d435e16b3d6aec80101b8020fce096b8f639056139f046d570bdbd1617ced6d79d2c1dde2c95597b0766db092bffb9932fc2321f7e370e115a884b10ab21fe
7
+ data.tar.gz: 39df67b4547a42b34c1af11429b64f9b587d767d2b9e5a51f70769972d4d41f22c4ffc1eedf946e32fafe083e72d20487c012bc6297c1ef6ae5f86801d994bb0
@@ -26,7 +26,7 @@ Puppet::Face.define(:node, '0.0.1') do
26
26
 
27
27
  args.map do |node|
28
28
  begin
29
- response = http.get("/v3/nodes/#{CGI.escape(node)}", headers)
29
+ response = http.get(Puppet::Util::Puppetdb.url_path("/v3/nodes/#{CGI.escape(node)}"), headers)
30
30
  if response.is_a? Net::HTTPSuccess
31
31
  result = JSON.parse(response.body)
32
32
  elsif response.is_a? Net::HTTPNotFound
@@ -17,7 +17,7 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
17
17
  profile "facts#save" do
18
18
  payload = profile "Encode facts command submission payload" do
19
19
  facts = request.instance.dup
20
- facts.values = facts.values.dup
20
+ facts.values = facts.strip_internal
21
21
  facts.stringify
22
22
  {
23
23
  "name" => facts.name,
@@ -36,7 +36,7 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
36
36
  def find(request)
37
37
  profile "facts#find" do
38
38
  begin
39
- url = "/v3/nodes/#{CGI.escape(request.key)}/facts"
39
+ url = Puppet::Util::Puppetdb.url_path("/v3/nodes/#{CGI.escape(request.key)}/facts")
40
40
  response = profile "Query for nodes facts: #{url}" do
41
41
  http_get(request, url, headers)
42
42
  end
@@ -105,7 +105,7 @@ class Puppet::Node::Facts::Puppetdb < Puppet::Indirector::REST
105
105
  query_param = CGI.escape(query.to_json)
106
106
 
107
107
  begin
108
- url = "/v3/nodes?query=#{query_param}"
108
+ url = Puppet::Util::Puppetdb.url_path("/v3/nodes?query=#{query_param}")
109
109
  response = profile "Fact query request: #{URI.unescape(url)}" do
110
110
  http_get(request, url, headers)
111
111
  end
@@ -31,7 +31,7 @@ class Puppet::Resource::Puppetdb < Puppet::Indirector::REST
31
31
  query_param = CGI.escape(expr.to_json)
32
32
 
33
33
  begin
34
- url = "/v3/resources?query=#{query_param}"
34
+ url = Puppet::Util::Puppetdb.url_path("/v3/resources?query=#{query_param}")
35
35
  response = profile "Resources query: #{URI.unescape(url)}" do
36
36
  http_get(request, url, headers)
37
37
  end
@@ -15,52 +15,45 @@ Puppet::Reports.register_report(:puppetdb) do
15
15
  command.
16
16
  DESC
17
17
 
18
-
18
+ # Process the report by formatting it into a PuppetDB 'store report'
19
+ # command and submitting it.
20
+ #
21
+ # @return [void]
19
22
  def process
20
23
  profile "report#process" do
21
- submit_command(self.host, report_to_hash, CommandStoreReport, 3)
24
+ submit_command(self.host, report_to_hash, CommandStoreReport, 4)
22
25
  end
23
- end
24
26
 
25
- # TODO: It seems unfortunate that we have to access puppet_version and
26
- # report_format directly as instance variables. I've filed the following
27
- # ticket / pull req against puppet to expose them via accessors, which
28
- # seems more consistent and safer for the long-term. However, for reasons
29
- # relating to backwards compatibility we won't be able to switch over to
30
- # the accessors until version 3.x of puppet is our oldest supported version.
31
- #
32
- # This was resolved in puppet 3.x via ticket #16139 (puppet pull request #1073).
33
-
34
- # @api private
35
- def report_format
36
- @report_format
37
- end
38
-
39
- # @api private
40
- def puppet_version
41
- @puppet_version
27
+ nil
42
28
  end
43
29
 
44
30
  # Convert `self` (an instance of `Puppet::Transaction::Report`) to a hash
45
31
  # suitable for sending over the wire to PuppetDB
46
32
  #
33
+ # @return Hash[<String, Object>]
47
34
  # @api private
48
35
  def report_to_hash
49
36
  profile "Convert report to wire format hash" do
50
- add_v4_fields_to_report(
51
- {
52
- "certname" => host,
53
- "puppet-version" => puppet_version,
54
- "report-format" => report_format,
55
- "configuration-version" => configuration_version.to_s,
56
- "start-time" => Puppet::Util::Puppetdb.to_wire_time(time),
57
- "end-time" => Puppet::Util::Puppetdb.to_wire_time(time + run_duration),
58
- "resource-events" => build_events_list,
59
- "environment" => environment,
60
- })
37
+ if environment.nil?
38
+ raise Puppet::Error, "Environment is nil, unable to submit report. This may be due a bug with Puppet. Ensure you are running the latest revision, see PUP-2508 for more details."
39
+ end
40
+
41
+ {
42
+ "certname" => host,
43
+ "puppet-version" => puppet_version,
44
+ "report-format" => report_format,
45
+ "configuration-version" => configuration_version.to_s,
46
+ "start-time" => Puppet::Util::Puppetdb.to_wire_time(time),
47
+ "end-time" => Puppet::Util::Puppetdb.to_wire_time(time + run_duration),
48
+ "resource-events" => build_events_list,
49
+ "environment" => environment,
50
+ "transaction-uuid" => transaction_uuid,
51
+ "status" => status,
52
+ }
61
53
  end
62
54
  end
63
55
 
56
+ # @return Array[Hash]
64
57
  # @api private
65
58
  def build_events_list
66
59
  profile "Build events list (count: #{resource_statuses.count})" do
@@ -70,19 +63,13 @@ Puppet::Reports.register_report(:puppetdb) do
70
63
  events.concat(status.events.map { |event| event_to_hash(status, event) })
71
64
  elsif status.skipped
72
65
  events.concat([fabricate_event(status, "skipped")])
73
- elsif status.failed
74
- # PP-254:
75
- # We have to fabricate resource events here due to a bug/s in report providers
76
- # that causes them not to include events on a resource status that has failed.
77
- # When PuppetDB is able to make a hard break from older version of Puppet that
78
- # have this bug, we can remove this behavior.
79
- events.concat([fabricate_event(status, "failure")])
80
66
  end
81
67
  events
82
68
  end)
83
69
  end
84
70
  end
85
71
 
72
+ # @return Number
86
73
  # @api private
87
74
  def run_duration
88
75
  # TODO: this is wrong in puppet. I am consistently seeing reports where
@@ -97,71 +84,49 @@ Puppet::Reports.register_report(:puppetdb) do
97
84
  if metrics["time"] and metrics["time"]["total"]
98
85
  metrics["time"]["total"]
99
86
  else
100
- raise Puppet::Error, "Report from #{host} contained no metrics, which is often caused by a failed catalog compilation. Unable to process."
87
+ 0
101
88
  end
102
89
  end
103
90
 
104
91
  # Convert an instance of `Puppet::Transaction::Event` to a hash
105
92
  # suitable for sending over the wire to PuppetDB
106
93
  #
94
+ # @return Hash[<String, Object>]
107
95
  # @api private
108
96
  def event_to_hash(resource_status, event)
109
- add_v4_fields_to_event(resource_status,
110
- {
111
- "status" => event.status,
112
- "timestamp" => Puppet::Util::Puppetdb.to_wire_time(event.time),
113
- "resource-type" => resource_status.resource_type,
114
- "resource-title" => resource_status.title,
115
- "property" => event.property,
116
- "new-value" => event.desired_value,
117
- "old-value" => event.previous_value,
118
- "message" => event.message,
119
- "file" => resource_status.file,
120
- "line" => resource_status.line
121
- })
97
+ {
98
+ "status" => event.status,
99
+ "timestamp" => Puppet::Util::Puppetdb.to_wire_time(event.time),
100
+ "resource-type" => resource_status.resource_type,
101
+ "resource-title" => resource_status.title.to_s,
102
+ "property" => event.property,
103
+ "new-value" => event.desired_value,
104
+ "old-value" => event.previous_value,
105
+ "message" => event.message,
106
+ "file" => resource_status.file,
107
+ "line" => resource_status.line,
108
+ "containment-path" => resource_status.containment_path,
109
+ }
122
110
  end
123
111
 
124
- # Given an instance of `Puppet::Resource::Status` and a status string,
125
- # this method fabricates a PuppetDB event object with the provided
126
- # `"status"`.
112
+ # Given an instance of `Puppet::Resource::Status` and a status
113
+ # string, this method fabricates a PuppetDB event object with the
114
+ # provided `"status"`.
127
115
  #
128
116
  # @api private
129
117
  def fabricate_event(resource_status, event_status)
130
- add_v4_fields_to_event(resource_status,
131
- {
132
- "status" => event_status,
133
- "timestamp" => Puppet::Util::Puppetdb.to_wire_time(resource_status.time),
134
- "resource-type" => resource_status.resource_type,
135
- "resource-title" => resource_status.title,
136
- "property" => nil,
137
- "new-value" => nil,
138
- "old-value" => nil,
139
- "message" => nil,
140
- "file" => resource_status.file,
141
- "line" => resource_status.line
142
- })
143
- end
144
-
145
- # Backwards compatibility with versions of Puppet prior to report format 4
146
- #
147
- # @api private
148
- def add_v4_fields_to_report(report_hash)
149
- if report_format >= 4
150
- report_hash.merge("transaction-uuid" => transaction_uuid)
151
- else
152
- report_hash.merge("transaction-uuid" => nil)
153
- end
154
- end
155
-
156
- # Backwards compatibility with versions of Puppet prior to report format 4
157
- #
158
- # @api private
159
- def add_v4_fields_to_event(resource_status, event_hash)
160
- if report_format >= 4
161
- event_hash.merge("containment-path" => resource_status.containment_path)
162
- else
163
- event_hash.merge("containment-path" => nil)
164
- end
118
+ {
119
+ "status" => event_status,
120
+ "timestamp" => Puppet::Util::Puppetdb.to_wire_time(resource_status.time),
121
+ "resource-type" => resource_status.resource_type,
122
+ "resource-title" => resource_status.title.to_s,
123
+ "property" => nil,
124
+ "new-value" => nil,
125
+ "old-value" => nil,
126
+ "message" => nil,
127
+ "file" => resource_status.file,
128
+ "line" => resource_status.line,
129
+ }
165
130
  end
166
131
 
167
132
  # Filter out blacklisted events, if we're configured to do so
@@ -9,7 +9,7 @@ class Puppet::Util::Puppetdb::Command
9
9
  include Puppet::Util::Puppetdb
10
10
  include Puppet::Util::Puppetdb::CommandNames
11
11
 
12
- Url = "/v3/commands"
12
+ CommandsUrl = "/v3/commands"
13
13
 
14
14
  # Public instance methods
15
15
 
@@ -45,7 +45,8 @@ class Puppet::Util::Puppetdb::Command
45
45
  begin
46
46
  response = profile "Submit command HTTP post" do
47
47
  http = Puppet::Network::HttpPool.http_instance(config.server, config.port)
48
- http.post(Url + "?checksum=#{checksum}", payload, headers)
48
+ http.post(Puppet::Util::Puppetdb.url_path(CommandsUrl + "?checksum=#{checksum}"),
49
+ payload, headers)
49
50
  end
50
51
 
51
52
  Puppet::Util::Puppetdb.log_x_deprecation_header(response)
@@ -11,6 +11,7 @@ class Config
11
11
  defaults = {
12
12
  :server => "puppetdb",
13
13
  :port => 8081,
14
+ :url_prefix => "",
14
15
  :soft_write_failure => false,
15
16
  :ignore_blacklisted_events => true,
16
17
  }
@@ -52,11 +53,12 @@ class Config
52
53
  main_section = main_section.inject({}) {|h, (k,v)| h[k.to_sym] = v ; h}
53
54
  # merge with defaults but filter out anything except the legal settings
54
55
  config_hash = defaults.merge(main_section).reject do |k, v|
55
- !([:server, :port, :ignore_blacklisted_events, :soft_write_failure].include?(k))
56
+ !([:server, :port, :url_prefix, :ignore_blacklisted_events, :soft_write_failure].include?(k))
56
57
  end
57
58
 
58
59
  config_hash[:server] = config_hash[:server].strip
59
60
  config_hash[:port] = config_hash[:port].to_i
61
+ config_hash[:url_prefix] = normalize_url_prefix(config_hash[:url_prefix].strip)
60
62
  config_hash[:ignore_blacklisted_events] =
61
63
  Puppet::Util::Puppetdb.to_bool(config_hash[:ignore_blacklisted_events])
62
64
  config_hash[:soft_write_failure] =
@@ -84,6 +86,10 @@ class Config
84
86
  config[:port]
85
87
  end
86
88
 
89
+ def url_prefix
90
+ config[:url_prefix]
91
+ end
92
+
87
93
  def ignore_blacklisted_events?
88
94
  config[:ignore_blacklisted_events]
89
95
  end
@@ -96,6 +102,17 @@ class Config
96
102
  config[:soft_write_failure]
97
103
  end
98
104
 
105
+ # @!group Private class methods
106
+ def self.normalize_url_prefix(prefix)
107
+ if prefix == ""
108
+ prefix
109
+ elsif prefix.start_with?("/")
110
+ prefix
111
+ else
112
+ "/" + prefix
113
+ end
114
+ end
115
+
99
116
  # @!group Private instance methods
100
117
 
101
118
  # @!attribute [r] count
@@ -19,6 +19,13 @@ module Puppet::Util::Puppetdb
19
19
  config.port
20
20
  end
21
21
 
22
+ def self.url_path(path)
23
+ unless path.start_with?("/")
24
+ path = "/" + path
25
+ end
26
+ config.url_prefix + path
27
+ end
28
+
22
29
  def self.config
23
30
  @config ||= Puppet::Util::Puppetdb::Config.load
24
31
  @config
@@ -68,6 +75,7 @@ module Puppet::Util::Puppetdb
68
75
  # @param payload [String] payload
69
76
  # @param command_name [String] name of command
70
77
  # @param version [Number] version number of command
78
+ # @return [Hash <String, String>]
71
79
  def submit_command(certname, payload, command_name, version)
72
80
  profile "Submitted command '#{command_name}' version '#{version}'" do
73
81
  command = Puppet::Util::Puppetdb::Command.new(command_name, version, certname, payload)
@@ -1,5 +1,5 @@
1
1
  module PuppetDB
2
2
  module Terminus
3
- VERSION = "2.0.0"
3
+ VERSION = "2.1.0.rc1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quixoten-puppetdb-terminus
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Devin Christensen
@@ -87,9 +87,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
87
  version: '0'
88
88
  required_rubygems_version: !ruby/object:Gem::Requirement
89
89
  requirements:
90
- - - ">="
90
+ - - ">"
91
91
  - !ruby/object:Gem::Version
92
- version: '0'
92
+ version: 1.3.1
93
93
  requirements: []
94
94
  rubyforge_project:
95
95
  rubygems_version: 2.2.2