puppet-lint-wmf_styleguide-check 1.0.0 → 1.0.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c6f25a5336a67bced26bf736edb5f6281848cf3
|
4
|
+
data.tar.gz: 2a94fc2862a3784a34c94423d30339860bd90268
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d97adb3bec7f26f5d8c4d1ff141c001ab65d96ca7e399ccc9c7f958bed52efe982fa0daf06a3b8b9f05204152675d6f736ffe46bd49c5e16dc8c35f0f1bb826
|
7
|
+
data.tar.gz: c9390bc0b776df8b3c578a5654cb0b597dce8a3287406a8097a01cdcb05fbbd50ba9a6afc143fcd7052c079c45174ee477e0313586b5259a6f7f7ba6ea6c50af
|
@@ -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,79 @@ 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
105
|
def hiera_calls
|
106
|
+
# Returns an array of all the tokens referencing calls to hiera
|
93
107
|
@resource[:tokens].select(&:hiera?)
|
94
108
|
end
|
95
109
|
|
96
110
|
def included_classes
|
111
|
+
# Returns an array of all the classes included (with require/include)
|
97
112
|
@resource[:tokens].map(&:included_class).compact
|
98
113
|
end
|
99
114
|
|
100
115
|
def declared_classes
|
116
|
+
# Returns an array of all the declared classes
|
101
117
|
@resource[:tokens].map(&:declared_class).compact
|
102
118
|
end
|
103
119
|
|
104
120
|
def declared_resources
|
121
|
+
# Returns an array of all the declared classes
|
105
122
|
@resource[:tokens].select(&:declared_type?)
|
106
123
|
end
|
107
124
|
|
108
125
|
def resource?(name)
|
126
|
+
# Arguments:
|
127
|
+
# name (string) Name of the resource we want to search
|
128
|
+
# Returns an array of all the defines of the specified resource
|
109
129
|
@resource[:tokens].select { |t| t.declared_type? && t.value.gsub(/^::/, '') == name }
|
110
130
|
end
|
111
131
|
end
|
@@ -116,18 +136,22 @@ class PuppetLint
|
|
116
136
|
class Token
|
117
137
|
# Extend the basic token with utility functions
|
118
138
|
def function?
|
139
|
+
# A function is something that has a name and is followed by a left parens
|
119
140
|
@type == :NAME && @next_code_token.type == :LPAREN
|
120
141
|
end
|
121
142
|
|
122
143
|
def hiera?
|
123
|
-
function
|
144
|
+
# A function call specifically calling hiera
|
145
|
+
function? && ['hiera', 'hiera_array', 'hiera_hash', 'lookup'].include?(@value)
|
124
146
|
end
|
125
147
|
|
126
148
|
def class_include?
|
149
|
+
# Object is either "include" or "require", and the next token is not a =>
|
127
150
|
@type == :NAME && ['include', 'require'].include?(@value) && @next_code_token.type != :FARROW
|
128
151
|
end
|
129
152
|
|
130
153
|
def included_class
|
154
|
+
# Fetch the token describing the included class
|
131
155
|
return unless class_include?
|
132
156
|
return @next_code_token.next_code_token if @next_code_token.type == :LPAREN
|
133
157
|
@next_code_token
|
@@ -141,6 +165,7 @@ class PuppetLint
|
|
141
165
|
end
|
142
166
|
|
143
167
|
def declared_type?
|
168
|
+
# The token is a name and the next token is a {, while the previous one is not "class"
|
144
169
|
@type == :NAME && @next_code_token.type == :LBRACE && @prev_code_token.type != :CLASS
|
145
170
|
end
|
146
171
|
|
@@ -149,6 +174,7 @@ class PuppetLint
|
|
149
174
|
end
|
150
175
|
|
151
176
|
def role_keyword?
|
177
|
+
# This is a function with name "role"
|
152
178
|
@type == :NAME && @value = 'role' && @next_code_token.type == :LPAREN
|
153
179
|
end
|
154
180
|
end
|
@@ -198,6 +224,7 @@ def check_define(define)
|
|
198
224
|
end
|
199
225
|
|
200
226
|
def hiera(klass)
|
227
|
+
# Searches for hiera calls inside classes and defines.
|
201
228
|
hiera_errors(klass.hiera_calls, klass)
|
202
229
|
end
|
203
230
|
|
@@ -216,6 +243,9 @@ def params_without_hiera_defaults(klass)
|
|
216
243
|
end
|
217
244
|
|
218
245
|
def hiera_not_in_params(klass)
|
246
|
+
# Checks if a hiera call is not in a parameter declaration. Used to check profiles
|
247
|
+
|
248
|
+
# Any hiera call that is not inside a parameter declaration is a violation
|
219
249
|
tokens = klass.hiera_calls.reject do |token|
|
220
250
|
maybe_param = token.prev_code_token.prev_code_token
|
221
251
|
klass.params.keys.include?(maybe_param.value)
|
@@ -224,7 +254,9 @@ def hiera_not_in_params(klass)
|
|
224
254
|
end
|
225
255
|
|
226
256
|
def hiera_errors(tokens, klass)
|
257
|
+
# Helper for printing hiera errors nicely
|
227
258
|
tokens.each do |token|
|
259
|
+
# hiera ( 'some::label' )
|
228
260
|
value = token.next_code_token.next_code_token.value
|
229
261
|
msg = {
|
230
262
|
message: "wmf-style: Found hiera call in #{klass.type} '#{klass.name}' for '#{value}'",
|
@@ -236,6 +268,9 @@ def hiera_errors(tokens, klass)
|
|
236
268
|
end
|
237
269
|
|
238
270
|
def profile_illegal_include(klass)
|
271
|
+
# Check if a profile includes any class that's not allowed there.
|
272
|
+
# Allowed are: any other profile, or a class from the passwords module,
|
273
|
+
# plus a couple parameter classes
|
239
274
|
modules_include_ok = ['profile', 'passwords']
|
240
275
|
classes_include_ok = ['lvs::configuration', 'network::constants']
|
241
276
|
klass.included_classes.each do |token|
|
@@ -253,6 +288,7 @@ def profile_illegal_include(klass)
|
|
253
288
|
end
|
254
289
|
|
255
290
|
def class_illegal_include(klass)
|
291
|
+
# A class should only include classes from the same module.
|
256
292
|
modules_include_ok = [klass.module_name]
|
257
293
|
klass.included_classes.each do |token|
|
258
294
|
class_name = token.value.gsub(/^::/, '')
|
@@ -268,6 +304,7 @@ def class_illegal_include(klass)
|
|
268
304
|
end
|
269
305
|
|
270
306
|
def include_not_profile(klass)
|
307
|
+
# Checks that a role only includes other roles, profiles and/or the special class "standard"
|
271
308
|
modules_include_ok = ['role', 'profile', 'standard']
|
272
309
|
klass.included_classes.each do |token|
|
273
310
|
class_name = token.value.gsub(/^::/, '')
|
@@ -312,6 +349,7 @@ def check_no_system_role(klass)
|
|
312
349
|
end
|
313
350
|
|
314
351
|
def check_system_role(klass)
|
352
|
+
# Check that a role does indeed declare system::role
|
315
353
|
return if klass.resource?('system::role').length == 1
|
316
354
|
msg = {
|
317
355
|
message: "wmf-style: role '#{klass.name}' should declare system::role once",
|
@@ -322,6 +360,7 @@ def check_system_role(klass)
|
|
322
360
|
end
|
323
361
|
|
324
362
|
def check_no_defines(klass)
|
363
|
+
# In a role, check if there is any define apart from one system::role call
|
325
364
|
return if klass.declared_resources == klass.resource?('system::role')
|
326
365
|
msg = {
|
327
366
|
message: "wmf-style: role '#{klass.name}' should not include defines",
|
@@ -331,6 +370,21 @@ def check_no_defines(klass)
|
|
331
370
|
notify :error, msg
|
332
371
|
end
|
333
372
|
|
373
|
+
def check_deprecations(resource)
|
374
|
+
# Check the resource for declarations of deprecated defines
|
375
|
+
deprecated_defines = ['base::service_unit']
|
376
|
+
deprecated_defines.each do |deprecated|
|
377
|
+
resource.resource?(deprecated).each do |token|
|
378
|
+
msg = {
|
379
|
+
message: "wmf-style: '#{resource.name}' should not include the deprecated define '#{token.value}'",
|
380
|
+
line: token.line,
|
381
|
+
column: token.column
|
382
|
+
}
|
383
|
+
notify :error, msg
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
334
388
|
# rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/CyclomaticComplexity
|
335
389
|
def check_node(node)
|
336
390
|
title = node[:title_tokens].map(&:value).join(', ')
|
@@ -355,7 +409,7 @@ def check_node(node)
|
|
355
409
|
line: token.line,
|
356
410
|
column: token.column
|
357
411
|
}
|
358
|
-
elsif token.declared_type?
|
412
|
+
elsif token.declared_type? && token.value != 'interface::add_ip6_mapped'
|
359
413
|
msg = {
|
360
414
|
message: "wmf-style: node '#{title}' declares #{token.value}",
|
361
415
|
line: token.line,
|
@@ -420,6 +474,7 @@ PuppetLint.new_check(:wmf_styleguide) do
|
|
420
474
|
else
|
421
475
|
check_class klass
|
422
476
|
end
|
477
|
+
check_deprecations klass
|
423
478
|
end
|
424
479
|
end
|
425
480
|
|
@@ -428,6 +483,7 @@ PuppetLint.new_check(:wmf_styleguide) do
|
|
428
483
|
defined_type_indexes.each do |df|
|
429
484
|
define = PuppetResource.new(df)
|
430
485
|
check_define define
|
486
|
+
check_deprecations define
|
431
487
|
end
|
432
488
|
node_indexes.each do |node|
|
433
489
|
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
|
@@ -21,7 +23,10 @@ class foo($t=hiera('foo::title')) {
|
|
21
23
|
EOF
|
22
24
|
|
23
25
|
profile_ok = <<-EOF
|
24
|
-
class profile::foobar (
|
26
|
+
class profile::foobar (
|
27
|
+
$test=hiera('profile::foobar::test'),
|
28
|
+
$foo=hiera_array('profile::foobar::foo')
|
29
|
+
) {
|
25
30
|
require ::profile::foo
|
26
31
|
include ::passwords::redis
|
27
32
|
class { '::bar': }
|
@@ -88,6 +93,12 @@ node 'fixme' {
|
|
88
93
|
}
|
89
94
|
EOF
|
90
95
|
|
96
|
+
deprecation_ko = <<-EOF
|
97
|
+
define test() {
|
98
|
+
base::service_unit{ 'test2': }
|
99
|
+
}
|
100
|
+
EOF
|
101
|
+
|
91
102
|
describe 'wmf_styleguide' do
|
92
103
|
context 'class correctly written' do
|
93
104
|
let(:code) { class_ok }
|
@@ -177,4 +188,11 @@ describe 'wmf_styleguide' do
|
|
177
188
|
expect(problems).to contain_error("wmf-style: node 'fixme' declares interface::mapped")
|
178
189
|
end
|
179
190
|
end
|
191
|
+
|
192
|
+
context 'defined type with deprecations' do
|
193
|
+
let(:code) { deprecation_ko }
|
194
|
+
it 'should not' do
|
195
|
+
expect(problems).to contain_error("wmf-style: 'test' should not include the deprecated define 'base::service_unit'")
|
196
|
+
end
|
197
|
+
end
|
180
198
|
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.0.
|
4
|
+
version: 1.0.2
|
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: 2018-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet-lint
|
@@ -30,14 +30,14 @@ dependencies:
|
|
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,14 +84,14 @@ dependencies:
|
|
84
84
|
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '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
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
@@ -118,6 +118,7 @@ description: |2
|
|
118
118
|
* Check for system::role calls outside of roles
|
119
119
|
* Check for cross-module class inclusion
|
120
120
|
* Check for the use of the include keyword in profiles
|
121
|
+
* Check for wmf-deprecated resources usage
|
121
122
|
email: lavagetto@gmail.com
|
122
123
|
executables: []
|
123
124
|
extensions: []
|
@@ -128,7 +129,7 @@ files:
|
|
128
129
|
- lib/puppet-lint/plugins/check_wmf_styleguide.rb
|
129
130
|
- spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
|
130
131
|
- spec/spec_helper.rb
|
131
|
-
homepage: https://github.com/
|
132
|
+
homepage: https://github.com/lavagetto/puppet-lint-wmf_styleguide-check
|
132
133
|
licenses:
|
133
134
|
- GPL-3.0
|
134
135
|
metadata: {}
|
@@ -148,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
149
|
version: '0'
|
149
150
|
requirements: []
|
150
151
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.5.2
|
152
|
+
rubygems_version: 2.5.2
|
152
153
|
signing_key:
|
153
154
|
specification_version: 4
|
154
155
|
summary: A puppet-lint plugin to check code adheres to the WMF coding guidelines
|