class Object

Public Instance Methods

check() click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 530
def check
  check_classes
  defined_type_indexes.each do |df|
    define = PuppetResource.new(df)
    check_define define
    check_deprecations define
  end
  node_indexes.each do |node|
    check_node node
  end
end
check_class(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 227
def check_class(klass)
  # No lookup lookups allowed in a class.
  lookup klass
  # Cannot include or declare classes from other modules
  class_illegal_include klass
  illegal_class_declaration klass
  # System::role only goes in roles
  check_no_system_role klass
end
check_classes() click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PercievedComplexity

# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 516
def check_classes
  class_indexes.each do |cl|
    klass = PuppetResource.new(cl)
    if klass.profile?
      check_profile klass
    elsif klass.role?
      check_role klass
    else
      check_class klass
    end
    check_deprecations klass
  end
end
check_define(define) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 237
def check_define(define)
  # No lookup calls are admitted in defines. ever.
  lookup define
  # No class can be included in defines, like in classes
  class_illegal_include define
  # Non-profile defines should respect the rules for classes
  illegal_class_declaration define unless define.module_name == 'profile'
end
check_deprecations(resource) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 421
def check_deprecations(resource)
  # Check the resource for declarations of deprecated defines
  legacy_validate_errors resource
  legacy_hiera resource
  deprecated_defines = ['base::service_unit']
  deprecated_defines.each do |deprecated|
    resource.resource?(deprecated).each do |token|
      msg = {
        message: "wmf-style: '#{resource.name}' should not include the deprecated define '#{token.value}'",
        line: token.line,
        column: token.column
      }
      notify :error, msg
    end
  end
end
check_no_defines(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 410
def check_no_defines(klass)
  # In a role, check if there is any define apart from one system::role call
  return if klass.declared_resources == klass.resource?('system::role')
  msg = {
    message: "wmf-style: role '#{klass.name}' should not include defines",
    line: 1,
    column: 1
  }
  notify :error, msg
end
check_no_system_role(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 387
def check_no_system_role(klass)
  # The system::role define should only be used in roles
  klass.resource?('system::role').each do |token|
    msg = {
      message: "wmf-style: #{klass.type} '#{klass.name}' declares system::role, which should only be used in roles",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
check_node(node) click to toggle source

rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/CyclomaticComplexity

# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 439
def check_node(node)
  title = node[:title_tokens].map(&:value).join(', ')
  node[:tokens].each do |token|
    msg = nil
    if token.lookup?
      msg = {
        message: "wmf-style: node '#{title}' calls lookup function",
        line: token.line,
        column: token.column
      }
    elsif token.legacy_hiera?
      msg = {
        message: "wmf-style: node '#{title}' calls legacy #{token.value} function",
        line: token.line,
        column: token.column
      }
    elsif token.class_include?
      msg = {
        message: "wmf-style: node '#{title}' includes class #{token.included_class.value}",
        line: token.line,
        column: token.column
      }
    elsif token.declared_class
      msg = {
        message: "wmf-style: node '#{title}' declares class #{token.declared_class.value}",
        line: token.line,
        column: token.column
      }
    elsif token.declared_type? && token.value != 'interface::add_ip6_mapped'
      msg = {
        message: "wmf-style: node '#{title}' declares #{token.value}",
        line: token.line,
        column: token.column
      }
    end
    notify :error, msg if msg
  end
end
check_profile(klass) click to toggle source

Checks and functions

# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 205
def check_profile(klass)
  # All parameters of profiles should have a default value that is a lookup
  params_without_lookup_defaults klass
  # All lookup lookups should be in parameters
  lookup_not_in_params klass
  # Only a few selected classes should be included in a profile
  profile_illegal_include klass
  # System::role only goes in roles
  check_no_system_role klass
end
check_role(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 216
def check_role(klass)
  # Hiera lookups within a role are forbidden
  lookup klass
  # A role should only include profiles
  include_not_profile klass
  # A call, and only one, to system::role will be done
  check_system_role klass
  # No defines should be present in a role
  check_no_defines klass
end
check_system_role(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 399
def check_system_role(klass)
  # Check that a role does indeed declare system::role
  return if klass.resource?('system::role').length == 1
  msg = {
    message: "wmf-style: role '#{klass.name}' should declare system::role once",
    line: 1,
    column: 1
  }
  notify :error, msg
end
class_illegal_include(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 338
def class_illegal_include(klass)
  # A class should only include classes from the same module.
  modules_include_ok = [klass.module_name]
  klass.included_classes.each do |token|
    class_name = token.value.gsub(/^::/, '')
    module_name = class_name.split('::')[0]
    next if modules_include_ok.include? module_name
    msg = {
      message: "wmf-style: #{klass.type} '#{klass.name}' includes #{class_name} from another module",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
illegal_class_declaration(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 370
def illegal_class_declaration(klass)
  # Classes and defines should NEVER declare
  # classes from other modules.
  # If a class has multiple such occurrences, it should be a profile
  klass.declared_classes.each do |token|
    class_name = token.value.gsub(/^::/, '')
    module_name = class_name.split('::')[0]
    next if klass.module_name == module_name
    msg = {
      message: "wmf-style: #{klass.type} '#{klass.name}' declares class #{class_name} from another module",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
include_not_profile(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 354
def include_not_profile(klass)
  # Checks that a role only includes other roles and profiles
  modules_include_ok = ['role', 'profile']
  klass.included_classes.each do |token|
    class_name = token.value.gsub(/^::/, '')
    module_name = class_name.split('::')[0]
    next if modules_include_ok.include? module_name
    msg = {
      message: "wmf-style: role '#{klass.name}' includes #{class_name} which is neither a role nor a profile",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
legacy_hiera(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 251
def legacy_hiera(klass)
  # No calls to legacy hiera
  tokens = klass.legacy_hiera_calls
  tokens.each do |token|
    msg = {
      message: "wmf-style: Found deprecated function (#{token.value}) " \
               "in #{klass.type} '#{klass.name}', use lookup instead",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
legacy_validate_errors(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 306
def legacy_validate_errors(klass)
  # Helper for printing errors nicely
  klass.legacy_validate_calls.each do |token|
    msg = {
      message: "wmf-style: Found legacy function (#{token.value}) call in #{klass.type} '#{klass.name}'",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
lookup(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 246
def lookup(klass)
  # Searches for lookup calls inside classes and defines.
  lookup_errors(klass.lookup_calls, klass)
end
lookup_errors(tokens, klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 292
def lookup_errors(tokens, klass)
  # Helper for printing lookup errors nicely
  tokens.each do |token|
    # lookup ( 'some::label' )
    value = token.next_code_token.next_code_token.value
    msg = {
      message: "wmf-style: Found lookup call in #{klass.type} '#{klass.name}' for '#{value}'",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end
lookup_not_in_params(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 281
def lookup_not_in_params(klass)
  # Checks if a lookup call is not in a parameter declaration. Used to check profiles

  # Any lookup call that is not inside a parameter declaration is a violation
  tokens = klass.lookup_calls.reject do |token|
    maybe_param = token.prev_code_token.prev_code_token
    klass.params.keys.include?(maybe_param.value)
  end
  lookup_errors(tokens, klass)
end
node_indexes() click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 479
def node_indexes
  # Override the faulty "node_indexes" method from puppet-lint
  result = []
  in_node_def = false
  braces_level = nil
  start = 0
  title_tokens = []
  tokens.each_with_index do |token, i|
    if token.type == :NODE
      braces_level = 0
      start = i
      in_node_def = true
      next
    end
    # If we're not within a node definition, skip this token
    next unless in_node_def
    case token.type
    when :LBRACE
      title_tokens = tokens[start + 1..(i - 1)].select(&:node_def?) if braces_level.zero?
      braces_level += 1
    when :RBRACE
      braces_level -= 1
      if braces_level.zero?
        result << {
          start: start,
          end: i,
          tokens: tokens[start..i],
          title_tokens: title_tokens
        }
        in_node_def = false
      end
    end
  end
  result
end
params_without_lookup_defaults(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 265
def params_without_lookup_defaults(klass)
  # Finds parameters that have no lookup-defined default value.
  klass.params.each do |name, data|
    next unless data[:value].select(&:lookup?).empty?
    common = "wmf-style: Parameter '#{name}' of class '#{klass.name}'"
    message = if data[:value].select(&:legacy_hiera?).empty?
                "#{common} has no call to lookup"
              else
                "#{common} hiera is deprecated use lookup"
              end
    token = data[:param]
    msg = { message: message, line: token.line, column: token.column }
    notify :error, msg
  end
end
profile_illegal_include(klass) click to toggle source
# File lib/puppet-lint/plugins/check_wmf_styleguide.rb, line 318
def profile_illegal_include(klass)
  # Check if a profile includes any class that's not allowed there.
  # Allowed are: any other profile, or a class from the passwords module,
  # plus a couple parameter classes
  modules_include_ok = ['profile', 'passwords']
  classes_include_ok = ['lvs::configuration', 'network::constants']
  klass.included_classes.each do |token|
    class_name = token.value.gsub(/^::/, '')
    next if classes_include_ok.include? class_name
    module_name = class_name.split('::')[0]
    next if modules_include_ok.include? module_name
    msg = {
      message: "wmf-style: profile '#{klass.name}' includes non-profile class #{class_name}",
      line: token.line,
      column: token.column
    }
    notify :error, msg
  end
end