octocatalog-diff 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 42b664636f99089e0838f35914f5cd0a89a60fe6
4
- data.tar.gz: a6e77f9e6f1d50c6f9ea8219b580891574dbc31e
3
+ metadata.gz: 154a03508f5cbae0bafaedf90773e5dc82624a4e
4
+ data.tar.gz: 3dca1d51a606a0f31ee935eef370a7347a72af39
5
5
  SHA512:
6
- metadata.gz: 223c4d52d3d7e424d28c42fb52e5185fe1dac46d9ea2dea9be7eebbace60b7d13ae376367abc29e58341f3a82f2c84cf640e540c389badf0c9e4811065b9e2a4
7
- data.tar.gz: 0a821cf5bd95a83df9309de24141e21d3fadc21cb4d74b2344edcdb194c501bdb8c13bcd0db808d32ec07359fba5df6a559bdfc5c45077f7681e0d130d187b9c
6
+ metadata.gz: 961a4c0cf1677d9262010e17e88f7ca8387d548886c83ac7f34a86540d09fc864519d906a3172edaef8140f9505539a65437259f13d72257dfe1bd3f161561e2
7
+ data.tar.gz: 2f822d309b8ebbd39f923c15b6849b02dd836b3bf8cb6d5354cea0fe873828196fac73af1ed801c6f96460339ca9032a27341e1eda2d090d8fa7f2f71a373654
data/.version CHANGED
@@ -1 +1 @@
1
- 1.5.1
1
+ 1.5.2
@@ -8,6 +8,16 @@
8
8
  </tr>
9
9
  </thead><tbody>
10
10
 
11
+ <tr valign=top>
12
+ <td>1.5.2</td>
13
+ <td>2017-12-19</td>
14
+ <td>
15
+ <li><a href="https://github.com/github/octocatalog-diff/pull/169">#169</a>: (Enhancement) Puppet Enterprise RBAC token to authenticate to PuppetDB</li>
16
+ <li><a href="https://github.com/github/octocatalog-diff/pull/170">#170</a>: (Enhancement) Filter to treat an object the same as a single array containing that object</li>
17
+ <li><a href="https://github.com/github/octocatalog-diff/pull/165">#165</a>: (Bug Fix) Override of fact file via CLI now has precedence over value set in configuration file</li>
18
+ </td>
19
+ </tr>
20
+
11
21
  <tr valign=top>
12
22
  <td>1.5.1</td>
13
23
  <td>2017-11-16</td>
@@ -11,6 +11,7 @@ Here is the list of available filters and an explanation of each:
11
11
 
12
12
  - [Absent File](/doc/advanced-filter.md#absent-file) - Ignore parameter changes of a file that is declared to be absent
13
13
  - [JSON](/doc/advanced-filter.md#json) - Ignore whitespace differences if JSON parses to the same object
14
+ - [SingleItemArray](/doc/advanced-filter.md#SingleItemArray) - Ignore differences between object and array containing only that object
14
15
  - [YAML](/doc/advanced-filter.md#yaml) - Ignore whitespace/comment differences if YAML parses to the same object
15
16
 
16
17
  ## Absent File
@@ -84,6 +85,28 @@ If a file resource has extension `.json` and a difference in its content is obse
84
85
 
85
86
  This allows you to ignore changes in whitespace, comments, etc., that are not meaningful to a machine parsing the file. Note that changes to files may still trigger Puppet to restart services even though these changes are not displayed in the octocatalog-diff output.
86
87
 
88
+ ## Single Item Array
89
+
90
+ #### Usage
91
+
92
+ ```
93
+ --filters SingleItemArray
94
+ ```
95
+
96
+ #### Description
97
+
98
+ When enabling the future parser or upgrading between certain versions of Puppet, the internal structure of the catalog for certain parameters can change as shown in the following example:
99
+
100
+ ```
101
+ Old: { "notify": "Service[foo]" }
102
+ New: { "notify": [ "Service[foo]" ] }
103
+ ```
104
+
105
+ This filter will suppress differences for the value of a parameter when:
106
+
107
+ - The value in one catalog is an object, AND
108
+ - The value in the other catalog is an array containing *only* that same object
109
+
87
110
  ## YAML
88
111
 
89
112
  #### Usage
@@ -36,6 +36,7 @@ The following settings can be used in a [configuration file](/doc/configuration.
36
36
  | `settings[:puppetdb_ssl_client_key]` | TEXT of the private key of the client SSL keypair used to authenticate to PuppetDB. Note: This variable is not set to a file path, which means you will likely want to use means you will likely want to use `File.read(...)` if you are configuring this to be read from a file. |
37
37
  | `settings[:puppetdb_ssl_client_pem]` | Concatenation of the text of `puppetdb_ssl_client_key` and `puppetdb_ssl_client_cert` as previously described. This is a good alternative if your certificate chain is complex and it's easier just to put everything in a single place. Note: this option is second in precedence; if `settings[:puppetdb_ssl_client_cert]` and `settings[:puppetdb_ssl_client_key]` are both set, this will be ignored. |
38
38
  | `settings[:puppetdb_ssl_client_password]` | Plain text string containing the password to unlock the private key. For keys generated by the Puppet Master CA, this is not required and should be left undefined. |
39
+ | `settings[:puppetdb_token]` | TEXT containing the PE RBAC token used to authenticate to PuppetDB. Note: This variable is not set to a file path, which means you will likely want to use `File.read(...)` if you are configuring this to be read from a file. |
39
40
 
40
41
  ## Supplying necessary information via the command line
41
42
 
@@ -48,6 +49,8 @@ The following arguments can be used on the command line.
48
49
  | --puppetdb-ssl-client-cert FILENAME | Path to the certificate of the client SSL keypair. |
49
50
  | --puppetdb-ssl-client-key FILENAME | Path to the private key of the client SSL keypair. |
50
51
  | --puppetdb-ssl-client-password PASSWORD_STRING | Plain text string containing the password to unlock the private key. For keys generated by the Puppet Master CA, this is not required. |
52
+ | --puppetdb-token STRING | String containing the PE RBAC token used to authenticate to PuppetDB. |
53
+ | --puppetdb-token-file FILENAME | Path to the PE RBAC token file used to authenticate to PuppetDB. |
51
54
 
52
55
  ## Supplying necessary information via the environment
53
56
 
@@ -87,6 +87,8 @@ Usage: octocatalog-diff [command line options]
87
87
  --to-puppet-binary STRING Full path to puppet binary for the to branch
88
88
  --from-puppet-binary STRING Full path to puppet binary for the from branch
89
89
  --facts-terminus STRING Facts terminus: one of yaml, facter
90
+ --puppetdb-token TOKEN Token to access the PuppetDB API
91
+ --puppetdb-token-file PATH Path containing token for PuppetDB API, relative or absolute
90
92
  --puppetdb-url URL PuppetDB base URL
91
93
  --puppetdb-ssl-ca FILENAME CA certificate that signed the PuppetDB certificate
92
94
  --puppetdb-ssl-client-cert FILENAME
@@ -1374,6 +1376,36 @@ the text of the password won't appear in the process list. (<a href="../lib/octo
1374
1376
  </td>
1375
1377
  </tr>
1376
1378
 
1379
+ <tr>
1380
+ <td valign=top>
1381
+ <pre><code>--puppetdb-token TOKEN</code></pre>
1382
+ </td>
1383
+ <td valign=top>
1384
+ Token to access the PuppetDB API
1385
+ </td>
1386
+ <td valign=top>
1387
+ Specify the PE RBAC token to access the PuppetDB API. Refer to
1388
+ https://puppet.com/docs/pe/latest/rbac/rbac_token_auth_intro.html#generate-a-token-using-puppet-access
1389
+ for details on generating and obtaining a token. Use this option to specify the text
1390
+ of the token. (Use --puppetdb-token-file to read the content of the token from a file.) (<a href="../lib/octocatalog-diff/cli/options/puppetdb_token.rb">puppetdb_token.rb</a>)
1391
+ </td>
1392
+ </tr>
1393
+
1394
+ <tr>
1395
+ <td valign=top>
1396
+ <pre><code>--puppetdb-token-file PATH</code></pre>
1397
+ </td>
1398
+ <td valign=top>
1399
+ Path containing token for PuppetDB API, relative or absolute
1400
+ </td>
1401
+ <td valign=top>
1402
+ Specify the PE RBAC token to access the PuppetDB API. Refer to
1403
+ https://puppet.com/docs/pe/latest/rbac/rbac_token_auth_intro.html#generate-a-token-using-puppet-access
1404
+ for details on generating and obtaining a token. Use this option to specify the text
1405
+ in a file, to read the content of the token from the file. (<a href="../lib/octocatalog-diff/cli/options/puppetdb_token_file.rb">puppetdb_token_file.rb</a>)
1406
+ </td>
1407
+ </tr>
1408
+
1377
1409
  <tr>
1378
1410
  <td valign=top>
1379
1411
  <pre><code>--puppetdb-url URL</code></pre>
@@ -2,6 +2,7 @@ require_relative '../api/v1/diff'
2
2
  require_relative 'filter/absent_file'
3
3
  require_relative 'filter/compilation_dir'
4
4
  require_relative 'filter/json'
5
+ require_relative 'filter/single_item_array'
5
6
  require_relative 'filter/yaml'
6
7
 
7
8
  require 'stringio'
@@ -13,7 +14,7 @@ module OctocatalogDiff
13
14
  attr_accessor :logger
14
15
 
15
16
  # List the available filters here (by class name) for use in the validator method.
16
- AVAILABLE_FILTERS = %w(AbsentFile CompilationDir JSON YAML).freeze
17
+ AVAILABLE_FILTERS = %w(AbsentFile CompilationDir JSON SingleItemArray YAML).freeze
17
18
 
18
19
  # Public: Determine whether a particular filter exists. This can be used to validate
19
20
  # a user-submitted filter.
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../filter'
4
+
5
+ module OctocatalogDiff
6
+ module CatalogDiff
7
+ class Filter
8
+ # Filter out changes in parameters when one catalog has a parameter that's an object and
9
+ # the other catalog has that same parameter as an array containing the same object.
10
+ # For example, under this filter, the following is not a change:
11
+ # catalog1: notify => "Service[foo]"
12
+ # catalog2: notify => ["Service[foo]"]
13
+ class SingleItemArray < OctocatalogDiff::CatalogDiff::Filter
14
+ # Public: Implement the filter for single-item arrays whose item exactly matches the
15
+ # item that's not in an array in the other catalog.
16
+ #
17
+ # @param diff [OctocatalogDiff::API::V1::Diff] Difference
18
+ # @param _options [Hash] Additional options (there are none for this filter)
19
+ # @return [Boolean] true if this should be filtered out, false otherwise
20
+ def filtered?(diff, _options = {})
21
+ # Skip additions or removals - focus only on changes
22
+ return false unless diff.change?
23
+ old_value = diff.old_value
24
+ new_value = diff.new_value
25
+
26
+ # Skip unless there is a single-item array under consideration
27
+ return false unless
28
+ (old_value.is_a?(Array) && old_value.size == 1) ||
29
+ (new_value.is_a?(Array) && new_value.size == 1)
30
+
31
+ # Skip if both the old value and new value are arrays
32
+ return false if old_value.is_a?(Array) && new_value.is_a?(Array)
33
+
34
+ # Do comparison
35
+ if old_value.is_a?(Array)
36
+ old_value.first == new_value
37
+ else
38
+ new_value.first == old_value
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -149,13 +149,13 @@ module OctocatalogDiff
149
149
  raise ArgumentError, 'Called install_fact_file without node, or with an empty node'
150
150
  end
151
151
 
152
- facts = if options[:fact_file]
152
+ facts = if options[:facts].is_a?(OctocatalogDiff::Facts)
153
+ options[:facts].dup
154
+ elsif options[:fact_file]
153
155
  raise Errno::ENOENT, "Fact file #{options[:fact_file]} does not exist" unless File.file?(options[:fact_file])
154
156
  fact_file_opts = { fact_file_string: File.read(options[:fact_file]) }
155
157
  fact_file_opts[:backend] = Regexp.last_match(1).to_sym if options[:fact_file] =~ /.*\.(\w+)$/
156
158
  OctocatalogDiff::Facts.new(fact_file_opts)
157
- elsif options[:facts].is_a?(OctocatalogDiff::Facts)
158
- options[:facts].dup
159
159
  else
160
160
  raise ArgumentError, 'No facts passed to "install_fact_file" method'
161
161
  end
@@ -23,7 +23,6 @@ module OctocatalogDiff
23
23
 
24
24
  # Define the Option class and newoption() method for use by cli/options/*.rb files
25
25
  class Option
26
- DEFAULT_WEIGHT = 999
27
26
  def self.has_weight(w) # rubocop:disable Style/PredicateName
28
27
  @weight = w
29
28
  end
@@ -38,7 +37,9 @@ module OctocatalogDiff
38
37
  elsif @weight
39
38
  @weight
40
39
  else
41
- DEFAULT_WEIGHT
40
+ # :nocov:
41
+ raise ArgumentError, "Option #{name} does not have a weight specified. Add 'has_weight NNN' to control ordering."
42
+ # :nocov:
42
43
  end
43
44
  end
44
45
 
@@ -12,7 +12,7 @@ OctocatalogDiff::Cli::Options::Option.newoption(:pe_enc_token_file) do
12
12
  def parse(parser, options)
13
13
  parser.on('--pe-enc-token-file PATH', 'Path containing token for PE node classifier, relative or absolute') do |x|
14
14
  proposed_token_path = x.start_with?('/') ? x : File.join(options[:basedir], x)
15
- raise Errno::ENOENT, "Provided token (#{proposed_token_path}) does not exist" unless File.file?(proposed_token_path)
15
+ raise Errno::ENOENT, "Provided PE ENC token (#{proposed_token_path}) does not exist" unless File.file?(proposed_token_path)
16
16
  options[:pe_enc_token] = File.read(proposed_token_path)
17
17
  end
18
18
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Specify the PE RBAC token to access the PuppetDB API. Refer to
4
+ # https://puppet.com/docs/pe/latest/rbac/rbac_token_auth_intro.html#generate-a-token-using-puppet-access
5
+ # for details on generating and obtaining a token. Use this option to specify the text
6
+ # of the token. (Use --puppetdb-token-file to read the content of the token from a file.)
7
+ # @param parser [OptionParser object] The OptionParser argument
8
+ # @param options [Hash] Options hash being constructed; this is modified in this method.
9
+ OctocatalogDiff::Cli::Options::Option.newoption(:puppetdb_token) do
10
+ has_weight 310
11
+
12
+ def parse(parser, options)
13
+ parser.on('--puppetdb-token TOKEN', 'Token to access the PuppetDB API') do |token|
14
+ options[:puppetdb_token] = token
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Specify the PE RBAC token to access the PuppetDB API. Refer to
4
+ # https://puppet.com/docs/pe/latest/rbac/rbac_token_auth_intro.html#generate-a-token-using-puppet-access
5
+ # for details on generating and obtaining a token. Use this option to specify the text
6
+ # in a file, to read the content of the token from the file.
7
+ # @param parser [OptionParser object] The OptionParser argument
8
+ # @param options [Hash] Options hash being constructed; this is modified in this method.
9
+ OctocatalogDiff::Cli::Options::Option.newoption(:puppetdb_token_file) do
10
+ has_weight 310
11
+
12
+ def parse(parser, options)
13
+ parser.on('--puppetdb-token-file PATH', 'Path containing token for PuppetDB API, relative or absolute') do |x|
14
+ proposed_token_path = x.start_with?('/') ? x : File.join(options[:basedir], x)
15
+ unless File.file?(proposed_token_path)
16
+ raise Errno::ENOENT, "Provided PuppetDB API token (#{proposed_token_path}) does not exist"
17
+ end
18
+ options[:puppetdb_token] = File.read(proposed_token_path)
19
+ end
20
+ end
21
+ end
@@ -42,6 +42,7 @@ module OctocatalogDiff
42
42
  # @param :puppetdb_ssl_client_p12 [String] pkcs12-encoded client key and certificate
43
43
  # @param :puppetdb_ssl_client_password [String] Path to file containing password for SSL client key (any format)
44
44
  # @param :puppetdb_ssl_client_auth [Boolean] Override the client-auth that is guessed from parameters
45
+ # @param :puppetdb_token [String] PE RBAC token to authenticate to PuppetDB API
45
46
  # @param :timeout [Integer] Connection timeout for PuppetDB (default=10)
46
47
  def initialize(options = {})
47
48
  @connections =
@@ -107,7 +108,10 @@ module OctocatalogDiff
107
108
  ].join('')
108
109
 
109
110
  begin
110
- more_options = { headers: { 'Accept' => 'application/json' }, timeout: @timeout }
111
+ headers = { 'Accept' => 'application/json' }
112
+ headers['X-Authentication'] = @options[:puppetdb_token] if @options[:puppetdb_token]
113
+ more_options = { headers: headers, timeout: @timeout }
114
+
111
115
  if connection[:username] || connection[:password]
112
116
  more_options[:basic_auth] = { username: connection[:username], password: connection[:password] }
113
117
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octocatalog-diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub, Inc.
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-11-16 00:00:00.000000000 Z
12
+ date: 2017-12-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: diffy
@@ -279,6 +279,7 @@ files:
279
279
  - lib/octocatalog-diff/catalog-diff/filter/absent_file.rb
280
280
  - lib/octocatalog-diff/catalog-diff/filter/compilation_dir.rb
281
281
  - lib/octocatalog-diff/catalog-diff/filter/json.rb
282
+ - lib/octocatalog-diff/catalog-diff/filter/single_item_array.rb
282
283
  - lib/octocatalog-diff/catalog-diff/filter/yaml.rb
283
284
  - lib/octocatalog-diff/catalog-util/bootstrap.rb
284
285
  - lib/octocatalog-diff/catalog-util/builddir.rb
@@ -363,6 +364,8 @@ files:
363
364
  - lib/octocatalog-diff/cli/options/puppetdb_ssl_client_key.rb
364
365
  - lib/octocatalog-diff/cli/options/puppetdb_ssl_client_password.rb
365
366
  - lib/octocatalog-diff/cli/options/puppetdb_ssl_client_password_file.rb
367
+ - lib/octocatalog-diff/cli/options/puppetdb_token.rb
368
+ - lib/octocatalog-diff/cli/options/puppetdb_token_file.rb
366
369
  - lib/octocatalog-diff/cli/options/puppetdb_url.rb
367
370
  - lib/octocatalog-diff/cli/options/quiet.rb
368
371
  - lib/octocatalog-diff/cli/options/retry_failed_catalog.rb