fuel-library/Rakefile
Alex Schultz e139e6fb59 Create Rakefile to execute lint and spec tasks
This change creates a top level Rakefile that can be used to run all of
the lint, syntax and spec tasks for the modules and files in this
repository.

This is needed to integrate with the openstack-infra puppet syntax and
unit test jobs.

This change disables the unit tests for l23network until they can be
fixed as part of bug 1507742.

Change-Id: I1f637f2f2fd91ce01ba2a92f6ea45499def5333d
Related-Bug: #1507751
Related-Bug: #1507742
2015-10-21 22:19:56 -05:00

232 lines
7.3 KiB
Ruby

###############################################################################
#
# Copyright 2015 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
###############################################################################
#
# Rakefile
# This file implements the lint and spec tasks for rake so that it will loop
# through all of the puppet modules in the deployment/puppet/ folder and run
# the respective lint or test tasks for each module. It will then return 0 if
# there are issues or return 1 if any of the modules fail.
#
# Author Alex Schultz <aschultz@mirantis.com>
#
require 'rake'
# Use puppet-syntax for the syntax tasks
require 'puppet-syntax/tasks/puppet-syntax'
PuppetSyntax.exclude_paths ||= []
PuppetSyntax.exclude_paths << "**/spec/fixtures/**/*"
PuppetSyntax.exclude_paths << "**/pkg/**/*"
PuppetSyntax.exclude_paths << "**/vendor/**/*"
# Main task list
task :spec => ["spec:gemfile"]
# TODO(aschultz): Use puppet-lint for the lint tasks
task :lint => ["lint:manual"]
task :syntax => ["syntax:manifests", "syntax:hiera", "syntax:files", "syntax:templates"]
namespace :common do
desc 'Task to generate a list of modules to skip'
task :modulelist, [:skip_file] do |t,args|
args.with_defaults(:skip_file => nil)
library_dir = Dir.pwd
skip_module_list = []
$module_directories = []
# TODO(aschultz): Fix all modules so they have tests and we no longer need
# this file to exclude bad module tests
if not args[:skip_file].nil? and File.exists?(args[:skip_file])
File.open(args[:skip_file], 'r').each_line { |line|
skip_module_list << line.chomp
}
end
Dir.glob('./deployment/puppet/*') do |mod|
next unless File.directory?(mod)
if skip_module_list.include?(File.basename(mod))
$stderr.puts "Skipping tests... modules.disable_rspec includes #{mod}"
next
end
$module_directories << mod
end
end
end
# our spec task to loop through the modules and run the tests
namespace :spec do
desc 'Run spec tasks via module bundler with Gemfile'
task :gemfile do |t|
Rake::Task["common:modulelist"].invoke('./utils/jenkins/modules.disable_rspec')
library_dir = Dir.pwd
status = true
ENV['GEM_HOME']="#{library_dir}/.bundled_gems"
system("gem install bundler --no-rdoc --no-ri --verbose")
$module_directories.each do |mod|
next unless File.exists?("#{mod}/Gemfile")
$stderr.puts '-'*80
$stderr.puts "Running tests for #{mod}"
$stderr.puts '-'*80
Dir.chdir(mod)
begin
result = system("bundle exec rake spec")
if !result
status = false
$stderr.puts "!"*80
$stderr.puts "Unit tests failed for #{mod}"
$stderr.puts "!"*80
end
rescue Exception => e
$stderr.puts "ERROR: Unable to run tests for #{mod}, #{e.message}"
status = false
end
Dir.chdir(library_dir)
end
fail unless status
end
end
# Our lint tasks
namespace :lint do
desc 'Find all the puppet files and run puppet-lint on them'
task :manual do |t|
Rake::Task["common:modulelist"].invoke('./utils/jenkins/modules.disable_rake-lint')
# lint checks to skip if no Gemfile or Rakefile
skip_checks = [ "--no-80chars-check",
"--no-autoloader_layout-check",
"--no-nested_classes_or_defines-check",
"--no-only_variable_string-check",
"--no-2sp_soft_tabs-check",
"--no-trailing_whitespace-check",
"--no-hard_tabs-check",
"--no-class_inherits_from_params_class-check",
"--with-filename"]
library_dir = Dir.pwd
status = true
ENV['GEM_HOME']="#{library_dir}/.bundled_gems"
system("gem install bundler --no-rdoc --no-ri --verbose")
$module_directories.each do |mod|
# TODO(aschultz): uncomment this when :rakefile works
#next if File.exists?("#{mod}/Rakefile")
$stderr.puts '-'*80
$stderr.puts "Running lint for #{mod}"
$stderr.puts '-'*80
Dir.chdir(mod)
begin
result = true
Dir.glob("**/**.pp") do |puppet_file|
result = false unless system("puppet-lint #{skip_checks.join(" ")} #{puppet_file}")
end
if !result
status = false
$stderr.puts "!"*80
$stderr.puts "puppet-lint failed for #{mod}"
$stderr.puts "!"*80
end
rescue Exception => e
$stderr.puts "ERROR: Unable to run lint for #{mod}, #{e.message}"
status = false
end
Dir.chdir(library_dir)
end
fail unless status
end
# TODO(aschultz): fix all the modules with Rakefiles to make sure they work
# then include this task
desc 'Run lint tasks from modules with an existing Gemfile/Rakefile'
task :rakefile do |t|
Rake::Task["common:modulelist"].invoke('./utils/jenkins/modules.disable_rake-lint')
library_dir = Dir.pwd
status = true
ENV['GEM_HOME']="#{library_dir}/.bundled_gems"
system("gem install bundler --no-rdoc --no-ri --verbose")
$module_directories.each do |mod|
next unless File.exists?("#{mod}/Rakefile")
$stderr.puts '-'*80
$stderr.puts "Running lint for #{mod}"
$stderr.puts '-'*80
Dir.chdir(mod)
begin
result = system("bundle exec rake lint > /dev/null")
$stderr.puts result
if !result
status = false
$stderr.puts "!"*80
$stderr.puts "rake lint failed for #{mod}"
$stderr.puts "!"*80
end
rescue Exception => e
$stderr.puts "ERROR: Unable to run lint for #{mod}, #{e.message}"
status = false
end
Dir.chdir(library_dir)
end
fail unless status
end
end
# Our syntax checking jobs
# The tasks here are an extension on top of the existing puppet helper ones.
namespace :syntax do
desc 'Syntax check for files/ folder'
task :files do |t|
$stderr.puts '---> syntax:files'
status = true
Dir.glob('./files/**/*') do |ocf_file|
next if File.directory?(ocf_file)
mime_type =`file --mime --brief #{ocf_file}`
begin
case mime_type.to_s
when /shellscript/
result = system("bash -n #{ocf_file}")
when /ruby/
result = system("ruby -c #{ocf_file}")
when /python/
result = system("python -m py_compile #{ocf_file}")
when /perl/
result = system("perl -c #{ocf_file}")
else
result = true
$stderr.puts "Unknown file format, skipping syntax check for #{ocf_file}"
end
rescue Exception => e
result = false
$stderr.puts "Checking #{ocf_file} failed with #{e.message}"
end
if !result
status = false
$stderr.puts "!"*80
$stderr.puts "Syntax check failed for #{ocf_file}"
$stderr.puts "!"*80
end
end
fail unless status
end
end