mirror of
https://github.com/inspec/inspec
synced 2024-11-11 15:37:09 +00:00
feature: run tests from cli
Signed-off-by: Dominik Richter <dominik.richter@gmail.com>
This commit is contained in:
parent
f6509b7f81
commit
33043dd6a1
8 changed files with 103 additions and 102 deletions
12
bin/vulcano
12
bin/vulcano
|
@ -4,7 +4,6 @@
|
||||||
require 'thor'
|
require 'thor'
|
||||||
require 'json'
|
require 'json'
|
||||||
require_relative '../lib/vulcano'
|
require_relative '../lib/vulcano'
|
||||||
require_relative '../lib/verify'
|
|
||||||
|
|
||||||
class VulcanoCLI < Thor
|
class VulcanoCLI < Thor
|
||||||
|
|
||||||
|
@ -13,6 +12,7 @@ class VulcanoCLI < Thor
|
||||||
option :print, aliases: :p, type: :boolean
|
option :print, aliases: :p, type: :boolean
|
||||||
option :id, type: :string
|
option :id, type: :string
|
||||||
def json(*paths)
|
def json(*paths)
|
||||||
|
require_relative '../lib/verify'
|
||||||
paths.each do |path|
|
paths.each do |path|
|
||||||
Vulcano::Profiles.new.valid_folder? path unless options[:print]
|
Vulcano::Profiles.new.valid_folder? path unless options[:print]
|
||||||
vc = Vulcano::Profiles.new({ quiet: options[:print], id: options[:id] })
|
vc = Vulcano::Profiles.new({ quiet: options[:print], id: options[:id] })
|
||||||
|
@ -34,6 +34,7 @@ class VulcanoCLI < Thor
|
||||||
|
|
||||||
desc "check PATH", "check all tests in PATH"
|
desc "check PATH", "check all tests in PATH"
|
||||||
def check(*paths)
|
def check(*paths)
|
||||||
|
require_relative '../lib/verify'
|
||||||
paths.each do |path|
|
paths.each do |path|
|
||||||
puts "#{path}"
|
puts "#{path}"
|
||||||
Vulcano::Profiles.new.valid_folder? path
|
Vulcano::Profiles.new.valid_folder? path
|
||||||
|
@ -41,5 +42,14 @@ class VulcanoCLI < Thor
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc "exec PATHS", "run all test files"
|
||||||
|
option :id, type: :string
|
||||||
|
def exec(*files)
|
||||||
|
runner = Vulcano::Runner.new(options[:id])
|
||||||
|
files.each do |file|
|
||||||
|
runner.add_file(file)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
VulcanoCLI.start(ARGV)
|
VulcanoCLI.start(ARGV)
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
# encoding: utf-8
|
|
||||||
# copyright: 2015, Dominik Richter
|
|
||||||
# license: All rights reserved
|
|
||||||
|
|
||||||
require 'serverspec'
|
|
||||||
|
|
||||||
# Run spec on an ssh target
|
|
||||||
if ENV['SSH_SPEC']
|
|
||||||
|
|
||||||
require 'pathname'
|
|
||||||
require 'net/ssh'
|
|
||||||
|
|
||||||
set :backend, :ssh
|
|
||||||
if ENV['USE_SUDO'] == "false"
|
|
||||||
set :disable_sudo, true
|
|
||||||
end
|
|
||||||
if ENV['SUDO_OPTIONS'].to_s != ""
|
|
||||||
set :sudo_options, ENV['SUDO_OPTIONS']
|
|
||||||
end
|
|
||||||
|
|
||||||
set :request_pty, true
|
|
||||||
|
|
||||||
RSpec.configure do |c|
|
|
||||||
options = {}
|
|
||||||
c.sudo_password = ENV['SUDO_PASSWORD'] || ENV['sudo_password']
|
|
||||||
c.host = ENV['TARGET_HOST']
|
|
||||||
options[:port] = ( ENV['LOGIN_PORT'] || 22 ).to_i
|
|
||||||
options[:auth_methods] = ["none"]
|
|
||||||
options[:user_known_hosts_file ] = "/dev/null"
|
|
||||||
options[:global_known_hosts_file ] = "/dev/null"
|
|
||||||
options[:number_of_password_prompts] = 0
|
|
||||||
|
|
||||||
options[:user] = ENV['LOGIN_USERNAME'] || ENV['user'] || Etc.getlogin
|
|
||||||
if options[:user].nil?
|
|
||||||
raise 'specify a user for login via env LOGIN_USERNAME= or by adding user='
|
|
||||||
end
|
|
||||||
|
|
||||||
options[:password] = ENV['LOGIN_PASSWORD'] || ENV['password']
|
|
||||||
if !options[:password].nil?
|
|
||||||
options[:auth_methods].push("password")
|
|
||||||
end
|
|
||||||
|
|
||||||
if !ENV['LOGIN_KEY'].nil?
|
|
||||||
options[:keys] = [ENV['LOGIN_KEY']]
|
|
||||||
options[:keys_only] = true
|
|
||||||
options[:auth_methods].push("publickey")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Local alternative: use configuration from .ssh/config
|
|
||||||
# for the given host.
|
|
||||||
# ssh_conf = Net::SSH::Config.for(c.host)
|
|
||||||
# options.merge(ssh_conf)
|
|
||||||
c.ssh_options = options
|
|
||||||
end
|
|
||||||
|
|
||||||
# Run spec on Windows via WinRM
|
|
||||||
elsif ENV['WINRM_SPEC']
|
|
||||||
|
|
||||||
require 'winrm'
|
|
||||||
|
|
||||||
set :backend, :winrm
|
|
||||||
set :os, :family => 'windows'
|
|
||||||
|
|
||||||
user = ENV['LOGIN_USERNAME']
|
|
||||||
pass = ENV['LOGIN_PASSWORD']
|
|
||||||
host = ENV['TARGET_HOST']
|
|
||||||
port = ENV['LOGIN_PORT']
|
|
||||||
|
|
||||||
# check if we should use ssl
|
|
||||||
ssl = ENV['WINRM_SSL']
|
|
||||||
if (ssl)
|
|
||||||
scheme = "https"
|
|
||||||
port = port || '5986'
|
|
||||||
else
|
|
||||||
scheme = "http"
|
|
||||||
port = port || '5985'
|
|
||||||
end
|
|
||||||
|
|
||||||
# deactivate certificate check if requested, default is on
|
|
||||||
accept_self_signed = false
|
|
||||||
if (ENV['WINRM_SELF_SIGNED_CERT'])
|
|
||||||
accept_self_signed = true
|
|
||||||
end
|
|
||||||
|
|
||||||
endpoint = "#{scheme}://#{host}:#{port}/wsman"
|
|
||||||
|
|
||||||
winrm = ::WinRM::WinRMWebService.new(endpoint, :ssl, :user => user, :pass => pass, :basic_auth_only => true, :no_ssl_peer_verification => accept_self_signed)
|
|
||||||
Specinfra.configuration.winrm = winrm
|
|
||||||
|
|
||||||
# Run spec on local machine
|
|
||||||
else
|
|
||||||
require 'serverspec'
|
|
||||||
set :backend, :exec
|
|
||||||
end
|
|
|
@ -32,8 +32,12 @@ module Vulcano
|
||||||
end
|
end
|
||||||
|
|
||||||
# DSL methods
|
# DSL methods
|
||||||
def __register_rule r
|
def __register_rule r, &block
|
||||||
src = __get_block_source(&r.instance_variable_get(:@__block))
|
if block_given?
|
||||||
|
src = __get_block_source(&block)
|
||||||
|
else
|
||||||
|
src = __get_block_source(&r.instance_variable_get(:@__block))
|
||||||
|
end
|
||||||
r.instance_variable_set(:@__code, src)
|
r.instance_variable_set(:@__code, src)
|
||||||
fid = VulcanoBaseRule.full_id r, @profile_id
|
fid = VulcanoBaseRule.full_id r, @profile_id
|
||||||
if @rules[fid].nil?
|
if @rules[fid].nil?
|
||||||
|
|
|
@ -8,12 +8,11 @@ Encoding.default_internal = Encoding::UTF_8
|
||||||
libdir = File.dirname(__FILE__)
|
libdir = File.dirname(__FILE__)
|
||||||
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
|
||||||
|
|
||||||
require 'utils/spec_helper'
|
|
||||||
|
|
||||||
require 'vulcano/version'
|
require 'vulcano/version'
|
||||||
require 'vulcano/resource'
|
require 'vulcano/resource'
|
||||||
require 'vulcano/rule'
|
|
||||||
require 'vulcano/rspec_json_formatter'
|
require 'vulcano/rspec_json_formatter'
|
||||||
|
require 'vulcano/rule'
|
||||||
|
require 'vulcano/runner'
|
||||||
|
|
||||||
require 'resources/resources'
|
require 'resources/resources'
|
||||||
require 'matchers/matchers'
|
require 'matchers/matchers'
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
# copyright: 2015, Dominik Richter
|
# copyright: 2015, Dominik Richter
|
||||||
# license: All rights reserved
|
# license: All rights reserved
|
||||||
require 'vulcano/base_rule'
|
require 'vulcano/base_rule'
|
||||||
|
require 'serverspec'
|
||||||
|
|
||||||
module Vulcano
|
module Vulcano
|
||||||
class Rule < VulcanoBaseRule
|
class Rule < VulcanoBaseRule
|
||||||
|
@ -31,6 +32,15 @@ module Vulcano::DSL
|
||||||
__register_rule Vulcano::Rule.new(id, opts, &block)
|
__register_rule Vulcano::Rule.new(id, opts, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def describe *args, &block
|
||||||
|
@auto_id_cnt ||= 0
|
||||||
|
@auto_id_cnt += 1
|
||||||
|
rule = Vulcano::Rule.new(@auto_id_cnt.to_s, {}) do
|
||||||
|
describe *args, &block
|
||||||
|
end
|
||||||
|
__register_rule rule, &block
|
||||||
|
end
|
||||||
|
|
||||||
def skip_rule id
|
def skip_rule id
|
||||||
__unregister_rule id
|
__unregister_rule id
|
||||||
end
|
end
|
||||||
|
@ -165,7 +175,10 @@ end
|
||||||
module Vulcano
|
module Vulcano
|
||||||
class ProfileContext
|
class ProfileContext
|
||||||
|
|
||||||
|
include Serverspec::Helper::Type
|
||||||
|
extend Serverspec::Helper::Type
|
||||||
include Vulcano::DSL
|
include Vulcano::DSL
|
||||||
|
|
||||||
def initialize profile_id, profile_registry, only_ifs
|
def initialize profile_id, profile_registry, only_ifs
|
||||||
@profile_id = profile_id
|
@profile_id = profile_id
|
||||||
@rules = profile_registry
|
@rules = profile_registry
|
||||||
|
|
69
lib/vulcano/runner.rb
Normal file
69
lib/vulcano/runner.rb
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
# copyright: 2015, Dominik Richter
|
||||||
|
# license: All rights reserved
|
||||||
|
|
||||||
|
require 'rspec'
|
||||||
|
require 'rspec/its'
|
||||||
|
require 'specinfra'
|
||||||
|
require 'specinfra/helper'
|
||||||
|
require 'specinfra/helper/set'
|
||||||
|
require 'serverspec/helper'
|
||||||
|
require 'serverspec/matcher'
|
||||||
|
require 'serverspec/subject'
|
||||||
|
require 'vulcano/rspec_json_formatter'
|
||||||
|
|
||||||
|
module Vulcano
|
||||||
|
|
||||||
|
class Runner
|
||||||
|
def initialize(profile_id)
|
||||||
|
@rules = []
|
||||||
|
@profile_id = profile_id
|
||||||
|
# RSpec.configuration.output_stream = $stdout
|
||||||
|
# RSpec.configuration.error_stream = $stderr
|
||||||
|
RSpec.configuration.add_formatter(:json)
|
||||||
|
|
||||||
|
# specinfra
|
||||||
|
Specinfra::Backend::Cmd.send(:include, Specinfra::Helper::Set)
|
||||||
|
Specinfra.configuration.backend = :exec
|
||||||
|
Specinfra.configuration.os = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_file(path)
|
||||||
|
ctx = Vulcano::ProfileContext.new(@profile_id, {}, [])
|
||||||
|
|
||||||
|
# read the test file
|
||||||
|
apath = File::expand_path(path)
|
||||||
|
raw = File::read(apath)
|
||||||
|
|
||||||
|
# evaluate all tests
|
||||||
|
ctx.instance_eval(raw, apath, 0)
|
||||||
|
|
||||||
|
# process the resulting rules
|
||||||
|
rules = ctx.instance_variable_get(:@rules)
|
||||||
|
rules.each do |rule_id, rule|
|
||||||
|
#::Vulcano::DSL.execute_rule(rule, profile_id)
|
||||||
|
checks = rule.instance_variable_get(:@checks)
|
||||||
|
checks.each do |m,a,b|
|
||||||
|
example = RSpec::Core::ExampleGroup.describe(*a, &b)
|
||||||
|
set_rspec_ids(example, rule_id)
|
||||||
|
RSpec.world.register(example)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
rspec_runner = RSpec::Core::Runner.new(nil)
|
||||||
|
rspec_runner.run_specs(RSpec.world.ordered_example_groups)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_rspec_ids(example, id)
|
||||||
|
example.metadata[:id] = id
|
||||||
|
example.filtered_examples.each do |e|
|
||||||
|
e.metadata[:id] = id
|
||||||
|
end
|
||||||
|
example.children.each do |child|
|
||||||
|
set_rspec_ids(child, id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in a new issue