puppet-lint-wmf_styleguide-check 1.0.0 → 1.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.
- checksums.yaml +5 -5
- data/lib/puppet-lint/plugins/check_wmf_styleguide.rb +145 -40
- data/spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb +86 -17
- data/spec/spec_helper.rb +2 -0
- metadata +29 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7980b85ac1476eb1cfd7107a024a8d01f56d3aaa13bc4adf6542b52edeb862a8
|
4
|
+
data.tar.gz: f5b71a6c23db3e26deec5d4f2a2d036ad4dbaeb26e0aa80d2049bf6e95e830eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 814e0b269f85a970e883534f42a12f201e0afaf530f47474e7bbfaf685dd0ae549a529de9c639768c6e34f11d53bb66425e7c31a4a25cf0d6bb6d60f9c614238
|
7
|
+
data.tar.gz: 8b85af51045fc558202c404ce87f20c0ca14dc76538ea30bde1abd68c3eac4ac154e1a77a309ff08b9e96ed93aca6945e870d117553259a68aa09d45d7b68b91
|
@@ -1,4 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Class to manage puppet resources.
|
4
|
+
# See how we extend PuppetLint::Lexer::Token below to understand how we filter
|
5
|
+
# tokens within a parsed resource.
|
2
6
|
class PuppetResource
|
3
7
|
attr_accessor :profile_module, :role_module
|
4
8
|
|
@@ -49,63 +53,89 @@ class PuppetResource
|
|
49
53
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
50
54
|
|
51
55
|
def params
|
56
|
+
# Lazy-load and return all the parameters of the resource
|
52
57
|
@params || parse_params
|
53
58
|
end
|
54
59
|
|
55
60
|
def profile_module
|
61
|
+
# Return the name of the module where profiles are located
|
56
62
|
@profile_module || 'profile'
|
57
63
|
end
|
58
64
|
|
59
65
|
def role_module
|
66
|
+
# Return the name of the module where roles are located
|
60
67
|
@role_module || 'role'
|
61
68
|
end
|
62
69
|
|
63
70
|
def class?
|
71
|
+
# True if this is a class,
|
64
72
|
@resource[:type] == :CLASS
|
65
73
|
end
|
66
74
|
|
67
75
|
def name
|
76
|
+
# Extract a normalized resource name (without the :: prefix if present)
|
68
77
|
@resource[:name_token].value.gsub(/^::/, '')
|
69
78
|
end
|
70
79
|
|
71
80
|
def path
|
81
|
+
# Path of the resource
|
72
82
|
@resource[:path]
|
73
83
|
end
|
74
84
|
|
75
85
|
def filename
|
76
|
-
|
86
|
+
# File name of the resource
|
77
87
|
@resource[:filename]
|
78
88
|
end
|
79
89
|
|
80
90
|
def module_name
|
91
|
+
# Module containing this resource
|
81
92
|
name.split('::')[0]
|
82
93
|
end
|
83
94
|
|
84
95
|
def profile?
|
96
|
+
# True if the resource is in the profile module
|
85
97
|
class? && (module_name == profile_module)
|
86
98
|
end
|
87
99
|
|
88
100
|
def role?
|
101
|
+
# True if the resource is in the role module
|
89
102
|
class? && (module_name == role_module)
|
90
103
|
end
|
91
104
|
|
92
|
-
def
|
93
|
-
|
105
|
+
def lookup_calls
|
106
|
+
# Returns an array of all the tokens referencing calls to lookup
|
107
|
+
@resource[:tokens].select(&:lookup?)
|
108
|
+
end
|
109
|
+
|
110
|
+
def legacy_hiera_calls
|
111
|
+
# Returns an array of all the tokens referencing calls to hiera
|
112
|
+
@resource[:tokens].select(&:legacy_hiera?)
|
113
|
+
end
|
114
|
+
|
115
|
+
def legacy_validate_calls
|
116
|
+
# Returns an array of all the tokens referencing calls to a stdlib legacy validate function
|
117
|
+
@resource[:tokens].select(&:legacy_validate?)
|
94
118
|
end
|
95
119
|
|
96
120
|
def included_classes
|
121
|
+
# Returns an array of all the classes included (with require/include)
|
97
122
|
@resource[:tokens].map(&:included_class).compact
|
98
123
|
end
|
99
124
|
|
100
125
|
def declared_classes
|
126
|
+
# Returns an array of all the declared classes
|
101
127
|
@resource[:tokens].map(&:declared_class).compact
|
102
128
|
end
|
103
129
|
|
104
130
|
def declared_resources
|
131
|
+
# Returns an array of all the declared classes
|
105
132
|
@resource[:tokens].select(&:declared_type?)
|
106
133
|
end
|
107
134
|
|
108
135
|
def resource?(name)
|
136
|
+
# Arguments:
|
137
|
+
# name (string) Name of the resource we want to search
|
138
|
+
# Returns an array of all the defines of the specified resource
|
109
139
|
@resource[:tokens].select { |t| t.declared_type? && t.value.gsub(/^::/, '') == name }
|
110
140
|
end
|
111
141
|
end
|
@@ -116,18 +146,32 @@ class PuppetLint
|
|
116
146
|
class Token
|
117
147
|
# Extend the basic token with utility functions
|
118
148
|
def function?
|
119
|
-
|
149
|
+
# A function is something that has a name and is followed by a left parens
|
150
|
+
[:NAME, :FUNCTION_NAME].include?(@type) && @next_code_token.type == :LPAREN
|
120
151
|
end
|
121
152
|
|
122
|
-
def
|
123
|
-
|
153
|
+
def legacy_hiera?
|
154
|
+
# Using old hiera call
|
155
|
+
function? && ['hiera', 'hiera_array', 'hiera_hash'].include?(@value)
|
156
|
+
end
|
157
|
+
|
158
|
+
def lookup?
|
159
|
+
# A function call specifically calling lookup
|
160
|
+
function? && ['lookup'].include?(@value)
|
161
|
+
end
|
162
|
+
|
163
|
+
def legacy_validate?
|
164
|
+
# A function calling one of the legacy stdlib validate functions
|
165
|
+
function? && @value.start_with?('validate_')
|
124
166
|
end
|
125
167
|
|
126
168
|
def class_include?
|
127
|
-
|
169
|
+
# Check for include-like objects
|
170
|
+
@type == :NAME && ['include', 'require', 'contain'].include?(@value) && @next_code_token.type != :FARROW
|
128
171
|
end
|
129
172
|
|
130
173
|
def included_class
|
174
|
+
# Fetch the token describing the included class
|
131
175
|
return unless class_include?
|
132
176
|
return @next_code_token.next_code_token if @next_code_token.type == :LPAREN
|
133
177
|
@next_code_token
|
@@ -141,6 +185,7 @@ class PuppetLint
|
|
141
185
|
end
|
142
186
|
|
143
187
|
def declared_type?
|
188
|
+
# The token is a name and the next token is a {, while the previous one is not "class"
|
144
189
|
@type == :NAME && @next_code_token.type == :LBRACE && @prev_code_token.type != :CLASS
|
145
190
|
end
|
146
191
|
|
@@ -149,6 +194,7 @@ class PuppetLint
|
|
149
194
|
end
|
150
195
|
|
151
196
|
def role_keyword?
|
197
|
+
# This is a function with name "role"
|
152
198
|
@type == :NAME && @value = 'role' && @next_code_token.type == :LPAREN
|
153
199
|
end
|
154
200
|
end
|
@@ -157,10 +203,10 @@ end
|
|
157
203
|
|
158
204
|
# Checks and functions
|
159
205
|
def check_profile(klass)
|
160
|
-
# All parameters of profiles should have a default value that is a
|
161
|
-
|
162
|
-
# All
|
163
|
-
|
206
|
+
# All parameters of profiles should have a default value that is a lookup
|
207
|
+
params_without_lookup_defaults klass
|
208
|
+
# All lookup lookups should be in parameters
|
209
|
+
lookup_not_in_params klass
|
164
210
|
# Only a few selected classes should be included in a profile
|
165
211
|
profile_illegal_include klass
|
166
212
|
# System::role only goes in roles
|
@@ -169,7 +215,7 @@ end
|
|
169
215
|
|
170
216
|
def check_role(klass)
|
171
217
|
# Hiera lookups within a role are forbidden
|
172
|
-
|
218
|
+
lookup klass
|
173
219
|
# A role should only include profiles
|
174
220
|
include_not_profile klass
|
175
221
|
# A call, and only one, to system::role will be done
|
@@ -179,8 +225,8 @@ def check_role(klass)
|
|
179
225
|
end
|
180
226
|
|
181
227
|
def check_class(klass)
|
182
|
-
# No
|
183
|
-
|
228
|
+
# No lookup lookups allowed in a class.
|
229
|
+
lookup klass
|
184
230
|
# Cannot include or declare classes from other modules
|
185
231
|
class_illegal_include klass
|
186
232
|
illegal_class_declaration klass
|
@@ -189,25 +235,26 @@ def check_class(klass)
|
|
189
235
|
end
|
190
236
|
|
191
237
|
def check_define(define)
|
192
|
-
# No
|
193
|
-
|
238
|
+
# No lookup calls are admitted in defines. ever.
|
239
|
+
lookup define
|
194
240
|
# No class can be included in defines, like in classes
|
195
241
|
class_illegal_include define
|
196
242
|
# Non-profile defines should respect the rules for classes
|
197
243
|
illegal_class_declaration define unless define.module_name == 'profile'
|
198
244
|
end
|
199
245
|
|
200
|
-
def
|
201
|
-
|
246
|
+
def lookup(klass)
|
247
|
+
# Searches for lookup calls inside classes and defines.
|
248
|
+
lookup_errors(klass.lookup_calls, klass)
|
202
249
|
end
|
203
250
|
|
204
|
-
def
|
205
|
-
#
|
206
|
-
klass.
|
207
|
-
|
208
|
-
token = data[:param]
|
251
|
+
def legacy_hiera(klass)
|
252
|
+
# No calls to legacy hiera
|
253
|
+
tokens = klass.legacy_hiera_calls
|
254
|
+
tokens.each do |token|
|
209
255
|
msg = {
|
210
|
-
message: "wmf-style:
|
256
|
+
message: "wmf-style: Found deprecated function (#{token.value}) " \
|
257
|
+
"in #{klass.type} '#{klass.name}', use lookup instead",
|
211
258
|
line: token.line,
|
212
259
|
column: token.column
|
213
260
|
}
|
@@ -215,19 +262,52 @@ def params_without_hiera_defaults(klass)
|
|
215
262
|
end
|
216
263
|
end
|
217
264
|
|
218
|
-
def
|
219
|
-
|
265
|
+
def params_without_lookup_defaults(klass)
|
266
|
+
# Finds parameters that have no lookup-defined default value.
|
267
|
+
klass.params.each do |name, data|
|
268
|
+
next unless data[:value].select(&:lookup?).empty?
|
269
|
+
common = "wmf-style: Parameter '#{name}' of class '#{klass.name}'"
|
270
|
+
message = if data[:value].select(&:legacy_hiera?).empty?
|
271
|
+
"#{common} has no call to lookup"
|
272
|
+
else
|
273
|
+
"#{common} hiera is deprecated use lookup"
|
274
|
+
end
|
275
|
+
token = data[:param]
|
276
|
+
msg = { message: message, line: token.line, column: token.column }
|
277
|
+
notify :error, msg
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def lookup_not_in_params(klass)
|
282
|
+
# Checks if a lookup call is not in a parameter declaration. Used to check profiles
|
283
|
+
|
284
|
+
# Any lookup call that is not inside a parameter declaration is a violation
|
285
|
+
tokens = klass.lookup_calls.reject do |token|
|
220
286
|
maybe_param = token.prev_code_token.prev_code_token
|
221
287
|
klass.params.keys.include?(maybe_param.value)
|
222
288
|
end
|
223
|
-
|
289
|
+
lookup_errors(tokens, klass)
|
224
290
|
end
|
225
291
|
|
226
|
-
def
|
292
|
+
def lookup_errors(tokens, klass)
|
293
|
+
# Helper for printing lookup errors nicely
|
227
294
|
tokens.each do |token|
|
295
|
+
# lookup ( 'some::label' )
|
228
296
|
value = token.next_code_token.next_code_token.value
|
229
297
|
msg = {
|
230
|
-
message: "wmf-style: Found
|
298
|
+
message: "wmf-style: Found lookup call in #{klass.type} '#{klass.name}' for '#{value}'",
|
299
|
+
line: token.line,
|
300
|
+
column: token.column
|
301
|
+
}
|
302
|
+
notify :error, msg
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
def legacy_validate_errors(klass)
|
307
|
+
# Helper for printing errors nicely
|
308
|
+
klass.legacy_validate_calls.each do |token|
|
309
|
+
msg = {
|
310
|
+
message: "wmf-style: Found legacy function (#{token.value}) call in #{klass.type} '#{klass.name}'",
|
231
311
|
line: token.line,
|
232
312
|
column: token.column
|
233
313
|
}
|
@@ -236,6 +316,9 @@ def hiera_errors(tokens, klass)
|
|
236
316
|
end
|
237
317
|
|
238
318
|
def profile_illegal_include(klass)
|
319
|
+
# Check if a profile includes any class that's not allowed there.
|
320
|
+
# Allowed are: any other profile, or a class from the passwords module,
|
321
|
+
# plus a couple parameter classes
|
239
322
|
modules_include_ok = ['profile', 'passwords']
|
240
323
|
classes_include_ok = ['lvs::configuration', 'network::constants']
|
241
324
|
klass.included_classes.each do |token|
|
@@ -253,6 +336,7 @@ def profile_illegal_include(klass)
|
|
253
336
|
end
|
254
337
|
|
255
338
|
def class_illegal_include(klass)
|
339
|
+
# A class should only include classes from the same module.
|
256
340
|
modules_include_ok = [klass.module_name]
|
257
341
|
klass.included_classes.each do |token|
|
258
342
|
class_name = token.value.gsub(/^::/, '')
|
@@ -268,7 +352,8 @@ def class_illegal_include(klass)
|
|
268
352
|
end
|
269
353
|
|
270
354
|
def include_not_profile(klass)
|
271
|
-
|
355
|
+
# Checks that a role only includes other roles and profiles
|
356
|
+
modules_include_ok = ['role', 'profile']
|
272
357
|
klass.included_classes.each do |token|
|
273
358
|
class_name = token.value.gsub(/^::/, '')
|
274
359
|
module_name = class_name.split('::')[0]
|
@@ -312,6 +397,7 @@ def check_no_system_role(klass)
|
|
312
397
|
end
|
313
398
|
|
314
399
|
def check_system_role(klass)
|
400
|
+
# Check that a role does indeed declare system::role
|
315
401
|
return if klass.resource?('system::role').length == 1
|
316
402
|
msg = {
|
317
403
|
message: "wmf-style: role '#{klass.name}' should declare system::role once",
|
@@ -322,6 +408,7 @@ def check_system_role(klass)
|
|
322
408
|
end
|
323
409
|
|
324
410
|
def check_no_defines(klass)
|
411
|
+
# In a role, check if there is any define apart from one system::role call
|
325
412
|
return if klass.declared_resources == klass.resource?('system::role')
|
326
413
|
msg = {
|
327
414
|
message: "wmf-style: role '#{klass.name}' should not include defines",
|
@@ -331,18 +418,40 @@ def check_no_defines(klass)
|
|
331
418
|
notify :error, msg
|
332
419
|
end
|
333
420
|
|
421
|
+
def check_deprecations(resource)
|
422
|
+
# Check the resource for declarations of deprecated defines
|
423
|
+
legacy_validate_errors resource
|
424
|
+
legacy_hiera resource
|
425
|
+
deprecated_defines = ['base::service_unit']
|
426
|
+
deprecated_defines.each do |deprecated|
|
427
|
+
resource.resource?(deprecated).each do |token|
|
428
|
+
msg = {
|
429
|
+
message: "wmf-style: '#{resource.name}' should not include the deprecated define '#{token.value}'",
|
430
|
+
line: token.line,
|
431
|
+
column: token.column
|
432
|
+
}
|
433
|
+
notify :error, msg
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
334
438
|
# rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/CyclomaticComplexity
|
335
439
|
def check_node(node)
|
336
440
|
title = node[:title_tokens].map(&:value).join(', ')
|
337
441
|
node[:tokens].each do |token|
|
338
442
|
msg = nil
|
339
|
-
if token.
|
443
|
+
if token.lookup?
|
340
444
|
msg = {
|
341
|
-
message: "wmf-style:
|
445
|
+
message: "wmf-style: node '#{title}' calls lookup function",
|
446
|
+
line: token.line,
|
447
|
+
column: token.column
|
448
|
+
}
|
449
|
+
elsif token.legacy_hiera?
|
450
|
+
msg = {
|
451
|
+
message: "wmf-style: node '#{title}' calls legacy #{token.value} function",
|
342
452
|
line: token.line,
|
343
453
|
column: token.column
|
344
454
|
}
|
345
|
-
|
346
455
|
elsif token.class_include?
|
347
456
|
msg = {
|
348
457
|
message: "wmf-style: node '#{title}' includes class #{token.included_class.value}",
|
@@ -355,18 +464,12 @@ def check_node(node)
|
|
355
464
|
line: token.line,
|
356
465
|
column: token.column
|
357
466
|
}
|
358
|
-
elsif token.declared_type?
|
467
|
+
elsif token.declared_type? && token.value != 'interface::add_ip6_mapped'
|
359
468
|
msg = {
|
360
469
|
message: "wmf-style: node '#{title}' declares #{token.value}",
|
361
470
|
line: token.line,
|
362
471
|
column: token.column
|
363
472
|
}
|
364
|
-
elsif token.role_keyword? && token.next_code_token.next_code_token.next_code_token.type != :RPAREN
|
365
|
-
msg = {
|
366
|
-
message: "wmf-style: node '#{title}' includes multiple roles",
|
367
|
-
line: token.line,
|
368
|
-
column: token.column
|
369
|
-
}
|
370
473
|
end
|
371
474
|
notify :error, msg if msg
|
372
475
|
end
|
@@ -420,6 +523,7 @@ PuppetLint.new_check(:wmf_styleguide) do
|
|
420
523
|
else
|
421
524
|
check_class klass
|
422
525
|
end
|
526
|
+
check_deprecations klass
|
423
527
|
end
|
424
528
|
end
|
425
529
|
|
@@ -428,6 +532,7 @@ PuppetLint.new_check(:wmf_styleguide) do
|
|
428
532
|
defined_type_indexes.each do |df|
|
429
533
|
define = PuppetResource.new(df)
|
430
534
|
check_define define
|
535
|
+
check_deprecations define
|
431
536
|
end
|
432
537
|
node_indexes.each do |node|
|
433
538
|
check_node node
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
class_ok = <<-EOF
|
@@ -12,16 +14,23 @@ EOF
|
|
12
14
|
|
13
15
|
class_ko = <<-EOF
|
14
16
|
class foo($t=hiera('foo::title')) {
|
15
|
-
$msg =
|
17
|
+
$msg = lookup( "foo::bar")
|
16
18
|
notice($msg)
|
17
19
|
notice($t)
|
18
20
|
include ::passwords::redis
|
19
21
|
class { 'bar': }
|
22
|
+
validate_foobar($param)
|
23
|
+
validate_re($param, '^.*$')
|
24
|
+
hiera('foobar')
|
25
|
+
hiera_hash('foobar')
|
26
|
+
hiera_array('foobar')
|
20
27
|
}
|
21
28
|
EOF
|
22
29
|
|
23
30
|
profile_ok = <<-EOF
|
24
|
-
class profile::foobar (
|
31
|
+
class profile::foobar (
|
32
|
+
$test=lookup('profile::foobar::test'),
|
33
|
+
) {
|
25
34
|
require ::profile::foo
|
26
35
|
include ::passwords::redis
|
27
36
|
class { '::bar': }
|
@@ -30,17 +39,19 @@ EOF
|
|
30
39
|
|
31
40
|
profile_ko = <<-EOF
|
32
41
|
class profile::fixme (
|
33
|
-
$
|
42
|
+
$test1,
|
43
|
+
$test2=hiera('profile::foobar::foo')
|
44
|
+
$test3=hiera_array('profile::foobar::foo')
|
45
|
+
$test4=hiera_hash('profile::foobar::foo')
|
34
46
|
) {
|
35
47
|
include ::apache2::common
|
36
|
-
$role =
|
48
|
+
$role = lookup('role')
|
37
49
|
system::role { $role: }
|
38
50
|
}
|
39
51
|
EOF
|
40
52
|
|
41
53
|
role_ok = <<-EOF
|
42
54
|
class role::fizzbuz {
|
43
|
-
include standard
|
44
55
|
include ::profile::base
|
45
56
|
include ::profile::bar
|
46
57
|
system::role { 'fizzbuzz': }
|
@@ -68,6 +79,11 @@ define_ko = <<-EOF
|
|
68
79
|
define foo::fixme ($a=hiera('something')) {
|
69
80
|
include ::foo
|
70
81
|
class { '::bar': }
|
82
|
+
validate_foobar($param)
|
83
|
+
validate_re($param, '^.*$')
|
84
|
+
hiera('foobar')
|
85
|
+
hiera_hash('foobar')
|
86
|
+
hiera_array('foobar')
|
71
87
|
}
|
72
88
|
EOF
|
73
89
|
|
@@ -79,12 +95,20 @@ EOF
|
|
79
95
|
|
80
96
|
node_ko = <<-EOF
|
81
97
|
node 'fixme' {
|
82
|
-
role(spare::system,
|
83
|
-
mediawiki::appserver)
|
84
98
|
include base::firewall
|
85
99
|
interface::mapped { 'eth0':
|
86
100
|
foo => 'bar'
|
87
101
|
}
|
102
|
+
lookup('foobar')
|
103
|
+
hiera('foobar')
|
104
|
+
hiera_array('foobar')
|
105
|
+
hiera_hash('foobar')
|
106
|
+
}
|
107
|
+
EOF
|
108
|
+
|
109
|
+
deprecation_ko = <<-EOF
|
110
|
+
define test() {
|
111
|
+
base::service_unit{ 'test2': }
|
88
112
|
}
|
89
113
|
EOF
|
90
114
|
|
@@ -112,28 +136,44 @@ describe 'wmf_styleguide' do
|
|
112
136
|
context 'class with errors' do
|
113
137
|
let(:code) { class_ko }
|
114
138
|
it 'should create errors for hiera declarations' do
|
115
|
-
expect(problems).to contain_error("wmf-style: Found hiera
|
116
|
-
expect(problems).to contain_error("wmf-style: Found
|
139
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in class 'foo', use lookup instead").on_line(1).in_column(14)
|
140
|
+
expect(problems).to contain_error("wmf-style: Found lookup call in class 'foo' for 'foo::bar'").on_line(2).in_column(15)
|
117
141
|
end
|
118
142
|
it 'should create errors for included classes' do
|
119
143
|
expect(problems).to contain_error("wmf-style: class 'foo' includes passwords::redis from another module").on_line(5).in_column(16)
|
120
144
|
expect(problems).to contain_error("wmf-style: class 'foo' declares class bar from another module").on_line(6).in_column(16)
|
121
145
|
end
|
146
|
+
it 'should create errors for validate_function' do
|
147
|
+
expect(problems).to contain_error("wmf-style: Found legacy function (validate_foobar) call in class 'foo'").on_line(7).in_column(8)
|
148
|
+
expect(problems).to contain_error("wmf-style: Found legacy function (validate_re) call in class 'foo'").on_line(8).in_column(8)
|
149
|
+
end
|
150
|
+
it 'should create errors for hiera function' do
|
151
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in class 'foo', use lookup instead").on_line(9).in_column(8)
|
152
|
+
end
|
153
|
+
it 'should create errors for hiera_hash function' do
|
154
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_hash) in class 'foo', use lookup instead").on_line(10).in_column(8)
|
155
|
+
end
|
156
|
+
it 'should create errors for hiera_array function' do
|
157
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_array) in class 'foo', use lookup instead").on_line(11).in_column(8)
|
158
|
+
end
|
122
159
|
end
|
123
160
|
|
124
161
|
context 'profile with errors' do
|
125
162
|
let(:code) { profile_ko }
|
126
163
|
it 'should create errors for parameters without hiera defaults' do
|
127
|
-
expect(problems).to contain_error("wmf-style: Parameter '
|
164
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test1' of class 'profile::fixme' has no call to lookup").on_line(2).in_column(7)
|
165
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test2' of class 'profile::fixme' hiera is deprecated use lookup").on_line(3).in_column(7)
|
166
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test3' of class 'profile::fixme' hiera is deprecated use lookup").on_line(4).in_column(7)
|
167
|
+
expect(problems).to contain_error("wmf-style: Parameter 'test4' of class 'profile::fixme' hiera is deprecated use lookup").on_line(5).in_column(7)
|
128
168
|
end
|
129
169
|
it 'should create errors for hiera calls in body' do
|
130
|
-
expect(problems).to contain_error("wmf-style: Found
|
170
|
+
expect(problems).to contain_error("wmf-style: Found lookup call in class 'profile::fixme' for 'role'").on_line(8).in_column(13)
|
131
171
|
end
|
132
172
|
it 'should create errors for use of system::role' do
|
133
|
-
expect(problems).to contain_error("wmf-style: class 'profile::fixme' declares system::role, which should only be used in roles").on_line(
|
173
|
+
expect(problems).to contain_error("wmf-style: class 'profile::fixme' declares system::role, which should only be used in roles").on_line(9).in_column(5)
|
134
174
|
end
|
135
175
|
it 'should create errors for non-explicit class inclusion' do
|
136
|
-
expect(problems).to contain_error("wmf-style: profile 'profile::fixme' includes non-profile class apache2::common").on_line(
|
176
|
+
expect(problems).to contain_error("wmf-style: profile 'profile::fixme' includes non-profile class apache2::common").on_line(7).in_column(13)
|
137
177
|
end
|
138
178
|
end
|
139
179
|
|
@@ -152,11 +192,24 @@ describe 'wmf_styleguide' do
|
|
152
192
|
context 'defined type with violations' do
|
153
193
|
let(:code) { define_ko }
|
154
194
|
it 'should not contain hiera calls' do
|
155
|
-
expect(problems).to contain_error("wmf-style: Found hiera
|
195
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in defined type 'foo::fixme', use lookup instead").on_line(1)
|
156
196
|
end
|
157
197
|
it 'should not include or define any class' do
|
158
198
|
expect(problems).to contain_error("wmf-style: defined type 'foo::fixme' declares class bar from another module").on_line(3)
|
159
199
|
end
|
200
|
+
it 'should create errors for validate_function' do
|
201
|
+
expect(problems).to contain_error("wmf-style: Found legacy function (validate_foobar) call in defined type 'foo::fixme'").on_line(4).in_column(8)
|
202
|
+
expect(problems).to contain_error("wmf-style: Found legacy function (validate_re) call in defined type 'foo::fixme'").on_line(5).in_column(8)
|
203
|
+
end
|
204
|
+
it 'should create errors for hiera function' do
|
205
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera) in defined type 'foo::fixme', use lookup instead").on_line(6).in_column(8)
|
206
|
+
end
|
207
|
+
it 'should create errors for hiera_hash function' do
|
208
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_hash) in defined type 'foo::fixme', use lookup instead").on_line(7).in_column(8)
|
209
|
+
end
|
210
|
+
it 'should create errors for hiera_array function' do
|
211
|
+
expect(problems).to contain_error("wmf-style: Found deprecated function (hiera_array) in defined type 'foo::fixme', use lookup instead").on_line(8).in_column(8)
|
212
|
+
end
|
160
213
|
end
|
161
214
|
|
162
215
|
context 'node with no errors' do
|
@@ -167,14 +220,30 @@ describe 'wmf_styleguide' do
|
|
167
220
|
end
|
168
221
|
context 'node with violations' do
|
169
222
|
let(:code) { node_ko }
|
170
|
-
it 'should not have multiple roles applied' do
|
171
|
-
expect(problems).to contain_error("wmf-style: node 'fixme' includes multiple roles").on_line(2)
|
172
|
-
end
|
173
223
|
it 'should not include classes directly' do
|
174
224
|
expect(problems).to contain_error("wmf-style: node 'fixme' includes class base::firewall")
|
175
225
|
end
|
176
226
|
it 'should not declare any defined type' do
|
177
227
|
expect(problems).to contain_error("wmf-style: node 'fixme' declares interface::mapped")
|
178
228
|
end
|
229
|
+
it 'should not call lookup' do
|
230
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls lookup function")
|
231
|
+
end
|
232
|
+
it 'should not call hiera' do
|
233
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls legacy hiera function")
|
234
|
+
end
|
235
|
+
it 'should not call hiera_array' do
|
236
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls legacy hiera_array function")
|
237
|
+
end
|
238
|
+
it 'should not call hiera_hash' do
|
239
|
+
expect(problems).to contain_error("wmf-style: node 'fixme' calls legacy hiera_hash function")
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context 'defined type with deprecations' do
|
244
|
+
let(:code) { deprecation_ko }
|
245
|
+
it 'should not' do
|
246
|
+
expect(problems).to contain_error("wmf-style: 'test' should not include the deprecated define 'base::service_unit'")
|
247
|
+
end
|
179
248
|
end
|
180
249
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-lint-wmf_styleguide-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Giuseppe Lavagetto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet-lint
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.4.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.4.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: git
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.3
|
33
|
+
version: '1.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.3
|
40
|
+
version: '1.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,16 +84,16 @@ dependencies:
|
|
84
84
|
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
89
|
+
version: '12.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
96
|
+
version: '12.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.49.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.17.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.17.1
|
111
125
|
description: |2
|
112
126
|
A puppet-lint plugin to check that the code adheres to the WMF coding guidelines:
|
113
127
|
|
@@ -118,6 +132,8 @@ description: |2
|
|
118
132
|
* Check for system::role calls outside of roles
|
119
133
|
* Check for cross-module class inclusion
|
120
134
|
* Check for the use of the include keyword in profiles
|
135
|
+
* Check for wmf-deprecated resources usage
|
136
|
+
* Check for deprecated validate_* functions
|
121
137
|
email: lavagetto@gmail.com
|
122
138
|
executables: []
|
123
139
|
extensions: []
|
@@ -128,7 +144,7 @@ files:
|
|
128
144
|
- lib/puppet-lint/plugins/check_wmf_styleguide.rb
|
129
145
|
- spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
|
130
146
|
- spec/spec_helper.rb
|
131
|
-
homepage: https://github.com/
|
147
|
+
homepage: https://github.com/lavagetto/puppet-lint-wmf_styleguide-check
|
132
148
|
licenses:
|
133
149
|
- GPL-3.0
|
134
150
|
metadata: {}
|
@@ -148,10 +164,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
164
|
version: '0'
|
149
165
|
requirements: []
|
150
166
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.
|
167
|
+
rubygems_version: 2.7.6.2
|
152
168
|
signing_key:
|
153
169
|
specification_version: 4
|
154
170
|
summary: A puppet-lint plugin to check code adheres to the WMF coding guidelines
|
155
171
|
test_files:
|
156
|
-
- spec/spec_helper.rb
|
157
172
|
- spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
|
173
|
+
- spec/spec_helper.rb
|