Giuseppe Lavagetto has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/382649 )

Change subject: Add checks for nodes
......................................................................


Add checks for nodes

* No hiera call in nodes
* No define or class inclusion/declaration
* one role per node definition

Change-Id: I796af8acb8a981b9a42bb739a43d4d075ef96b8e
---
M lib/puppet-lint/plugins/check_wmf_styleguide.rb
M spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
2 files changed, 130 insertions(+), 2 deletions(-)

Approvals:
  Giuseppe Lavagetto: Looks good to me, approved
  jenkins-bot: Verified
  Volans: Looks good to me, but someone else must approve



diff --git a/lib/puppet-lint/plugins/check_wmf_styleguide.rb 
b/lib/puppet-lint/plugins/check_wmf_styleguide.rb
index 11a2529..a5d243e 100644
--- a/lib/puppet-lint/plugins/check_wmf_styleguide.rb
+++ b/lib/puppet-lint/plugins/check_wmf_styleguide.rb
@@ -143,6 +143,14 @@
       def declared_type?
         @type == :NAME && @next_code_token.type == :LBRACE && 
@prev_code_token.type != :CLASS
       end
+
+      def node_def?
+        [:SSTRING, :STRING, :NAME, :REGEX].include?(@type)
+      end
+
+      def role_keyword?
+        @type == :NAME && @value = 'role' && @next_code_token.type == :LPAREN
+      end
     end
   end
 end
@@ -323,9 +331,86 @@
   notify :error, msg
 end
 
+# rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, 
Metrics/AbcSize, Metrics/CyclomaticComplexity
+def check_node(node)
+  title = node[:title_tokens].map(&:value).join(', ')
+  node[:tokens].each do |token|
+    msg = nil
+    if token.hiera?
+      msg = {
+        message: "wmf-style: Found hiera call in node '#{title}'",
+        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?
+      msg = {
+        message: "wmf-style: node '#{title}' declares #{token.value}",
+        line: token.line,
+        column: token.column
+      }
+    elsif token.role_keyword? && 
token.next_code_token.next_code_token.next_code_token.type != :RPAREN
+      msg = {
+        message: "wmf-style: node '#{title}' includes multiple roles",
+        line: token.line,
+        column: token.column
+      }
+    end
+    notify :error, msg if msg
+  end
+end
+
 PuppetLint.new_check(:wmf_styleguide) do
-  def check
-    # Modules whose classes can be included elsewhere
+  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
+  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, 
Metrics/PercievedComplexity
+
+  def check_classes
     class_indexes.each do |cl|
       klass = PuppetResource.new(cl)
       if klass.profile?
@@ -336,9 +421,16 @@
         check_class klass
       end
     end
+  end
+
+  def check
+    check_classes
     defined_type_indexes.each do |df|
       define = PuppetResource.new(df)
       check_define define
     end
+    node_indexes.each do |node|
+      check_node node
+    end
   end
 end
diff --git a/spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb 
b/spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
index d848458..d6a0aad 100644
--- a/spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
+++ b/spec/puppet-lint/plugins/check_wmf_styleguide_check_spec.rb
@@ -71,6 +71,23 @@
 }
 EOF
 
+node_ok = <<-EOF
+node /^test1.*\.example\.com$/ {
+     role(spare::system)
+}
+EOF
+
+node_ko = <<-EOF
+node 'fixme' {
+     role(spare::system,
+          mediawiki::appserver)
+     include base::firewall
+     interface::mapped { 'eth0':
+        foo => 'bar'
+     }
+}
+EOF
+
 describe 'wmf_styleguide' do
   context 'class correctly written' do
     let(:code) { class_ok }
@@ -141,4 +158,23 @@
       expect(problems).to contain_error("wmf-style: defined type 'foo::fixme' 
declares class bar from another module").on_line(3)
     end
   end
+
+  context 'node with no errors' do
+    let(:code) { node_ok }
+    it 'should not detect any problems' do
+      expect(problems).to have(0).problems
+    end
+  end
+  context 'node with violations' do
+    let(:code) { node_ko }
+    it 'should not have multiple roles applied' do
+      expect(problems).to contain_error("wmf-style: node 'fixme' includes 
multiple roles").on_line(2)
+    end
+    it 'should not include classes directly' do
+      expect(problems).to contain_error("wmf-style: node 'fixme' includes 
class base::firewall")
+    end
+    it 'should not declare any defined type' do
+      expect(problems).to contain_error("wmf-style: node 'fixme' declares 
interface::mapped")
+    end
+  end
 end

-- 
To view, visit https://gerrit.wikimedia.org/r/382649
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I796af8acb8a981b9a42bb739a43d4d075ef96b8e
Gerrit-PatchSet: 2
Gerrit-Project: operations/puppet-lint/wmf_styleguide-check
Gerrit-Branch: master
Gerrit-Owner: Giuseppe Lavagetto <glavage...@wikimedia.org>
Gerrit-Reviewer: Giuseppe Lavagetto <glavage...@wikimedia.org>
Gerrit-Reviewer: Volans <rcocci...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to