cookstyle 5.4.13 → 5.5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/cookstyle.yml +231 -129
- data/lib/cookstyle.rb +1 -0
- data/lib/cookstyle/version.rb +1 -1
- data/lib/rubocop/chef/cookbook_helpers.rb +67 -0
- data/lib/rubocop/cop/chef/correctness/block_guard_clause_string_only.rb +34 -31
- data/lib/rubocop/cop/chef/correctness/cb_depends_on_self.rb +16 -14
- data/lib/rubocop/cop/chef/correctness/default_maintainer_metadata.rb +22 -20
- data/lib/rubocop/cop/chef/correctness/insecure_cookbook_url.rb +32 -30
- data/lib/rubocop/cop/chef/correctness/invalid_license_string.rb +454 -453
- data/lib/rubocop/cop/chef/correctness/invalid_platform_metadata.rb +57 -57
- data/lib/rubocop/cop/chef/correctness/metadata_missing_name.rb +18 -16
- data/lib/rubocop/cop/chef/correctness/name_property_and_required.rb +61 -59
- data/lib/rubocop/cop/chef/correctness/node_normal.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/node_save.rb +46 -0
- data/lib/rubocop/cop/chef/correctness/ohai_default_recipe.rb +47 -0
- data/lib/rubocop/cop/chef/correctness/property_with_default_and_required.rb +35 -33
- data/lib/rubocop/cop/chef/correctness/property_with_name_attribute.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/resource_sets_internal_properties.rb +52 -0
- data/lib/rubocop/cop/chef/correctness/resource_sets_name_property.rb +51 -0
- data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +52 -0
- data/lib/rubocop/cop/chef/correctness/service_resource.rb +26 -24
- data/lib/rubocop/cop/chef/correctness/tmp_path.rb +30 -28
- data/lib/rubocop/cop/chef/deprecation/attribute_metadata.rb +22 -21
- data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +56 -0
- data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +58 -0
- data/lib/rubocop/cop/chef/deprecation/conflicts_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +21 -19
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +17 -15
- data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +17 -15
- data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +39 -37
- data/lib/rubocop/cop/chef/deprecation/easy_install.rb +15 -13
- data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +24 -22
- data/lib/rubocop/cop/chef/deprecation/erl_call.rb +15 -13
- data/lib/rubocop/cop/chef/deprecation/launchd_deprecated_hash_property.rb +55 -0
- data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +24 -22
- data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +45 -0
- data/lib/rubocop/cop/chef/deprecation/long_description_metadata.rb +21 -19
- data/lib/rubocop/cop/chef/deprecation/node_methods_not_attributes.rb +55 -53
- data/lib/rubocop/cop/chef/deprecation/node_set.rb +27 -25
- data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +27 -25
- data/lib/rubocop/cop/chef/deprecation/provides_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/replaces_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/require_recipe.rb +23 -21
- data/lib/rubocop/cop/chef/deprecation/suggests_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/use_inline_resources.rb +56 -0
- data/lib/rubocop/cop/chef/deprecation/user_supports_property.rb +53 -0
- data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +51 -0
- data/lib/rubocop/cop/chef/deprecation/yum_dnf_compat_recipe.rb +51 -0
- data/lib/rubocop/cop/chef/effortless/data_bags.rb +13 -11
- data/lib/rubocop/cop/chef/effortless/search_used.rb +13 -11
- data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +22 -20
- data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +31 -29
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +27 -25
- data/lib/rubocop/cop/chef/modernize/defines_chefspec_matchers.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +19 -17
- data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +27 -25
- data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +41 -0
- data/lib/rubocop/cop/chef/modernize/minitest_handler_usage.rb +21 -19
- data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +48 -0
- data/lib/rubocop/cop/chef/modernize/powershell_install_package.rb +51 -0
- data/lib/rubocop/cop/chef/modernize/powershell_install_windowsfeature.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/resource_set_or_return.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/resource_with_allowed_actions.rb +77 -0
- data/lib/rubocop/cop/chef/modernize/resource_with_attributes.rb +37 -35
- data/lib/rubocop/cop/chef/modernize/respond_to_metadata.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/respond_to_provides.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/respond_to_resource_name.rb +26 -24
- data/lib/rubocop/cop/chef/{effortless/node_save.rb → modernize/seven_zip_archive.rb} +16 -16
- data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +59 -0
- data/lib/rubocop/cop/chef/modernize/whyrun_supported_true.rb +20 -18
- data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +23 -21
- data/lib/rubocop/cop/chef/modernize/windows_version_helper.rb +20 -18
- data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +15 -13
- data/lib/rubocop/cop/chef/style/attribute_keys.rb +59 -57
- data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +14 -12
- data/lib/rubocop/cop/chef/style/comments_copyright_format.rb +65 -63
- data/lib/rubocop/cop/chef/style/comments_format.rb +48 -45
- data/lib/rubocop/cop/chef/style/file_mode.rb +32 -30
- metadata +24 -9
- data/lib/rubocop/cop/chef/deprecation/respond_to_metadata.rb +0 -53
- data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +0 -45
- data/lib/rubocop/cop/chef/modernize/resource_with_allowed_action.rb +0 -75
- data/lib/rubocop/cop/chef/modernize/use_inline_resources.rb +0 -54
- data/lib/rubocop/cop/chef/modernize/xml_ruby_recipe.rb +0 -49
- data/lib/rubocop/cop/chef/modernize/yum_dnf_compat_recipe.rb +0 -49
@@ -18,73 +18,73 @@
|
|
18
18
|
module RuboCop
|
19
19
|
module Cop
|
20
20
|
module Chef
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
module ChefCorrectness
|
22
|
+
# metadata.rb supports methods should contain valid platforms.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# supports 'darwin'
|
28
|
+
# supports 'mswin'
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# supports 'mac_os_x'
|
32
|
+
# supports 'windows'
|
33
|
+
#
|
34
|
+
class InvalidPlatformMetadata < Cop
|
35
|
+
COMMON_TYPOS = {
|
36
|
+
"aws": nil,
|
37
|
+
"archlinux": 'arch',
|
38
|
+
"amazonlinux": 'amazon',
|
39
|
+
"darwin": 'mac_os_x',
|
40
|
+
"debuan": nil,
|
41
|
+
"mingw32": 'windows',
|
42
|
+
"mswin": 'windows',
|
43
|
+
"macos": 'mac_os_x',
|
44
|
+
"macosx": 'mac_os_x',
|
45
|
+
"mac_os_x_server": 'mac_os_x',
|
46
|
+
"mint": 'linuxmint',
|
47
|
+
"linux": nil,
|
48
|
+
"oel": 'oracle',
|
49
|
+
"oraclelinux": 'oracle',
|
50
|
+
"rhel": 'redhat',
|
51
|
+
"schientific": 'scientific',
|
52
|
+
"scientificlinux": 'scientific',
|
53
|
+
"sles": 'suse',
|
54
|
+
"solaris": 'solaris2',
|
55
|
+
"ubundu": 'ubuntu',
|
56
|
+
"ubunth": 'ubuntu',
|
57
|
+
"ubunutu": 'ubuntu',
|
58
|
+
"windwos": 'windows',
|
59
|
+
"xcp": nil,
|
60
|
+
}.freeze
|
34
61
|
|
35
|
-
|
36
|
-
COMMON_TYPOS = {
|
37
|
-
"aws": nil,
|
38
|
-
"archlinux": 'arch',
|
39
|
-
"amazonlinux": 'amazon',
|
40
|
-
"darwin": 'mac_os_x',
|
41
|
-
"debuan": nil,
|
42
|
-
"mingw32": 'windows',
|
43
|
-
"mswin": 'windows',
|
44
|
-
"macos": 'mac_os_x',
|
45
|
-
"macosx": 'mac_os_x',
|
46
|
-
"mac_os_x_server": 'mac_os_x',
|
47
|
-
"mint": 'linuxmint',
|
48
|
-
"linux": nil,
|
49
|
-
"oel": 'oracle',
|
50
|
-
"oraclelinux": 'oracle',
|
51
|
-
"rhel": 'redhat',
|
52
|
-
"schientific": 'scientific',
|
53
|
-
"scientificlinux": 'scientific',
|
54
|
-
"sles": 'suse',
|
55
|
-
"solaris": 'solaris2',
|
56
|
-
"ubundu": 'ubuntu',
|
57
|
-
"ubunth": 'ubuntu',
|
58
|
-
"ubunutu": 'ubuntu',
|
59
|
-
"windwos": 'windows',
|
60
|
-
"xcp": nil,
|
61
|
-
}.freeze
|
62
|
+
MSG = 'metadata.rb "supports" platform is invalid'.freeze
|
62
63
|
|
63
|
-
|
64
|
+
def_node_matcher :supports?, '(send nil? :supports $str ...)'
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
add_offense(plat, location: :expression, message: MSG, severity: :refactor)
|
66
|
+
def on_send(node)
|
67
|
+
supports?(node) do |plat|
|
68
|
+
if COMMON_TYPOS[plat.str_content.to_sym]
|
69
|
+
add_offense(plat, location: :expression, message: MSG, severity: :refactor)
|
70
|
+
end
|
71
71
|
end
|
72
72
|
end
|
73
|
-
end
|
74
73
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
def autocorrect(node)
|
75
|
+
correct_string = autocorrect_license_string(node.str_content)
|
76
|
+
if correct_string
|
77
|
+
lambda do |corrector|
|
78
|
+
corrector.replace(node.loc.expression, "'#{correct_string}'")
|
79
|
+
end
|
80
80
|
end
|
81
81
|
end
|
82
|
-
end
|
83
82
|
|
84
|
-
|
83
|
+
# private
|
85
84
|
|
86
|
-
|
87
|
-
|
85
|
+
def autocorrect_license_string(bad_string)
|
86
|
+
COMMON_TYPOS[bad_string.delete(',').downcase.to_sym]
|
87
|
+
end
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -25,29 +25,31 @@ module RuboCop
|
|
25
25
|
# # good
|
26
26
|
# name 'foo'
|
27
27
|
#
|
28
|
-
|
29
|
-
|
28
|
+
module ChefCorrectness
|
29
|
+
class MetadataMissingName < Cop
|
30
|
+
include RangeHelp
|
30
31
|
|
31
|
-
|
32
|
+
MSG = 'metadata.rb needs to include the name method'.freeze
|
32
33
|
|
33
|
-
|
34
|
-
|
34
|
+
def investigate(processed_source)
|
35
|
+
return if processed_source.blank?
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
# Using range similar to RuboCop::Cop::Naming::Filename (file_name.rb)
|
38
|
+
range = source_range(processed_source.buffer, 1, 0)
|
38
39
|
|
39
|
-
|
40
|
-
|
40
|
+
add_offense(nil, location: range, message: MSG, severity: :refactor) unless cb_name(processed_source.ast).any?
|
41
|
+
end
|
41
42
|
|
42
|
-
|
43
|
+
def_node_search :cb_name, '(send nil? :name str ...)'
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
def autocorrect(_node)
|
46
|
+
lambda do |_corrector|
|
47
|
+
path = processed_source.path
|
48
|
+
cb_name = File.basename(File.dirname(path))
|
48
49
|
|
49
|
-
|
50
|
-
|
50
|
+
metadata = IO.read(path)
|
51
|
+
IO.write(path, "name '#{cb_name}'\n" + metadata)
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
end
|
@@ -17,75 +17,77 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# When using properties in a custom resource you shouldn't set a property to
|
22
|
+
# be both required and a name_property. Name properties are a way to optionally
|
23
|
+
# override the name given to the resource block in cookbook code. In your resource
|
24
|
+
# code you use the name_property and if the user doesn't pass in anything to that
|
25
|
+
# property its value will be populated with resource block's name. This
|
26
|
+
# allows users to provide more friendly resource names for logging that give
|
27
|
+
# additional context on the change being made.
|
28
|
+
#
|
29
|
+
# How about a nice example! Here we have a resource called ntp_config that has a
|
30
|
+
# name_property of config_file. All throughout the code of this resource we'd
|
31
|
+
# use new_resource.config_file when referencing the path to the config.
|
32
|
+
#
|
33
|
+
# We can use a friendly name for the block and specific a value to config_file
|
34
|
+
# ntp_config 'Configure the main config file' do
|
35
|
+
# config_file '/etc/ntp/ntp.conf'
|
36
|
+
# action :create
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# We can also just set the config path as the resource block and Chef will
|
40
|
+
# make sure to pass this in as new_resource.config_file as well.
|
41
|
+
# ntp_config '/etc/ntp/ntp.conf' do
|
42
|
+
# action :create
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# The core tenant of the name property feature is that these properties are optional
|
46
|
+
# and making them required effectively turns off the functionality provided by name
|
47
|
+
# properties. If the goal is to always require the user to pass the config_file property
|
48
|
+
# then it should just be made a required property and not a name_property.
|
49
|
+
#
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
#
|
53
|
+
#
|
54
|
+
# # bad
|
55
|
+
# property :config_file, String, required: true, name_property: true
|
56
|
+
#
|
57
|
+
# # good
|
58
|
+
# property :config_file, String, required: true
|
59
|
+
#
|
60
|
+
class NamePropertyIsRequired < Cop
|
61
|
+
MSG = 'Resource properties marked as name properties should not also be required properties'.freeze
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
63
|
+
def on_send(node)
|
64
|
+
if required_property?(node) && property_is_name_property?(node)
|
65
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
66
|
+
end
|
65
67
|
end
|
66
|
-
end
|
67
68
|
|
68
|
-
|
69
|
+
private
|
69
70
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
def property_is_name_property?(node)
|
72
|
+
if node.method_name == :property
|
73
|
+
node.arguments.each do |arg|
|
74
|
+
if arg.type == :hash
|
75
|
+
return true if arg.source.match?(/name_property:\s*true/)
|
76
|
+
end
|
75
77
|
end
|
78
|
+
false # no required: true found
|
76
79
|
end
|
77
|
-
false # no required: true found
|
78
80
|
end
|
79
|
-
end
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
def required_property?(node)
|
83
|
+
if node.method_name == :property
|
84
|
+
node.arguments.each do |arg|
|
85
|
+
if arg.type == :hash
|
86
|
+
return true if arg.source.match?(/required:\s*true/)
|
87
|
+
end
|
86
88
|
end
|
89
|
+
false # no default: found
|
87
90
|
end
|
88
|
-
false # no default: found
|
89
91
|
end
|
90
92
|
end
|
91
93
|
end
|
@@ -16,35 +16,37 @@
|
|
16
16
|
module RuboCop
|
17
17
|
module Cop
|
18
18
|
module Chef
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
19
|
+
module ChefCorrectness
|
20
|
+
# Normal attributes are discouraged since their semantics differ importantly from the
|
21
|
+
# default and override levels. Their values persist in the node object even after
|
22
|
+
# all code referencing them has been deleted, unlike default and override.
|
23
|
+
#
|
24
|
+
# Code should be updated to use default or override levels, but this will change
|
25
|
+
# attribute merging behavior so needs to be validated manually and force_default or
|
26
|
+
# force_override levels may need to be used in recipe code.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
#
|
30
|
+
# # bad
|
31
|
+
# node.normal['foo'] = true
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# node.default['foo'] = true
|
35
|
+
# node.override['foo'] = true
|
36
|
+
# node.force_default['foo'] = true
|
37
|
+
# node.force_override['foo'] = true
|
38
|
+
#
|
39
|
+
class NodeNormal < Cop
|
40
|
+
MSG = 'Do not use node.normal. Replace with default/override/force_default/force_override attribute levels.'.freeze
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
def_node_matcher :node_normal?, <<-PATTERN
|
43
|
+
(send (send _ :node) :normal)
|
44
|
+
PATTERN
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
def on_send(node)
|
47
|
+
node_normal?(node) do
|
48
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -16,35 +16,37 @@
|
|
16
16
|
module RuboCop
|
17
17
|
module Cop
|
18
18
|
module Chef
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
19
|
+
module ChefCorrectness
|
20
|
+
# Normal attributes are discouraged since their semantics differ importantly from the
|
21
|
+
# default and override levels. Their values persist in the node object even after
|
22
|
+
# all code referencing them has been deleted, unlike default and override.
|
23
|
+
#
|
24
|
+
# Code should be updated to use default or override levels, but this will change
|
25
|
+
# attribute merging behavior so needs to be validated manually and force_default or
|
26
|
+
# force_override levels may need to be used in recipe code.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
#
|
30
|
+
# # bad
|
31
|
+
# node.normal_unless['foo'] = true
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# node.default_unless['foo'] = true
|
35
|
+
# node.override_unless['foo'] = true
|
36
|
+
# node.force_default_unless['foo'] = true
|
37
|
+
# node.force_override_unless['foo'] = true
|
38
|
+
#
|
39
|
+
class NodeNormalUnless < Cop
|
40
|
+
MSG = 'Do not use node.normal_unless. Replace with default/override/force_default/force_override attribute levels.'.freeze
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
def_node_matcher :node_normal_unless?, <<-PATTERN
|
43
|
+
(send (send _ :node) :normal_unless)
|
44
|
+
PATTERN
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
def on_send(node)
|
47
|
+
node_normal_unless?(node) do
|
48
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
module ChefCorrectness
|
21
|
+
# Don't use node.save to save partial node data to the Chef Infra Server mid-run unless it's
|
22
|
+
# absolutely necessary. Node.save can result in failed Chef Infra runs appearing in search and
|
23
|
+
# increases load on the Chef Infra Server."
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# node.save
|
29
|
+
#
|
30
|
+
class CookbookUsesNodeSave < Cop
|
31
|
+
MSG = "Don't use node.save to save partial node data to the Chef Infra Server mid-run unless it's absolutely necessary. Node.save can result in failed Chef Infra runs appearing in search and increases load on the Chef Infra Server.".freeze
|
32
|
+
|
33
|
+
def_node_matcher :node_save?, <<-PATTERN
|
34
|
+
(send (send nil? :node) :save)
|
35
|
+
PATTERN
|
36
|
+
|
37
|
+
def on_send(node)
|
38
|
+
node_save?(node) do
|
39
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|