* Moved kwalify to puppetlabs-kwalify project

* Re-arranged tests in line with puppetlabs-stdlib
This commit is contained in:
Ken Barber 2011-08-05 08:46:38 +01:00
parent 681a1c7971
commit 1b73a66fc6
57 changed files with 1 additions and 302 deletions

View file

@ -20,29 +20,4 @@ Depending on the version of Puppet, you may need to restart the puppetmasterd (o
## Functions
### kwalify
This function allows you to validate Puppet data structures using Kwalify
schemas as documented here:
http://www.kuwata-lab.com/kwalify/ruby/users-guide.01.html
To validate, create a schema in Puppet:
$schema = {
'type' => 'seq',
'sequence' => [
{ 'type' => 'str' }
]
}
And create some content that you want validated:
$document = ['a', 'b', 'c']
And then use the function to validate:
kwalify($schema, $document)
The function will throw an error and list all validation errors if there is a
problem otherwise it succeeds silently.
TODO

View file

@ -1,9 +0,0 @@
$schema = {
'type' => 'seq',
'sequence' => [
{ 'type' => 'str', 'enum' => ['asdf','fdsa'] }
]
}
$document = ['a', 'b', 'c']
kwalify($schema, $document)

View file

@ -1,24 +0,0 @@
$schema = {
'type' => 'map',
'mapping' => {
'name' => {
'type' => 'str',
'required' => true,
},
'email' => {
'type' => 'str',
'pattern' => '/@/',
},
'age' => {
'type' => 'str',
'pattern' => '/^\d+$/',
},
}
}
$document = {
'name' => 'foo',
'email' => 'foo@mail.com',
'age' => 20,
}
kwalify($schema, $document)

View file

@ -1,23 +0,0 @@
define fooresource(
$color,
$type,
$somenumber,
$map
) {
validate_resource()
# ... do something ...
}
fooresource { "example1":
color => "blue",
type => "circle",
somenumber => 5,
map => {
a => 1,
b => 2,
c => 3,
}
}

View file

@ -1,39 +0,0 @@
type: map
mapping:
"title":
type: str
required: yes
"name":
type: str
required: yes
"caller_module_name":
type: str
required: yes
"module_name":
type: str
required: yes
"color":
type: str
required: yes
"type":
type: str
required: yes
"somenumber":
type: str
required: yes
pattern: /^\d+$/
"map":
type: map
mapping:
"a":
type: str
required: yes
pattern: /^\d+$/
"b":
type: str
required: yes
pattern: /^\d+$/
"c":
type: str
required: yes
pattern: /^\d+$/

View file

@ -1,17 +0,0 @@
class foo (
$a,
$b,
$c
) {
validate_resource()
# ... do something ...
}
class { "foo":
a => "1",
b => "foobaz",
c => ['a','b','c']
}

View file

@ -1,26 +0,0 @@
type: map
mapping:
"title":
type: str
required: yes
"name":
type: str
required: yes
"caller_module_name":
type: str
required: yes
"module_name":
type: str
required: yes
"a":
type: str
required: yes
"b":
type: str
required: yes
pattern: /^foo/
"c":
type: seq
required: yes
sequence:
- type: str

View file

@ -1,35 +0,0 @@
#
# kwalify.rb
#
module Puppet::Parser::Functions
newfunction(:kwalify, :type => :statement, :doc => <<-EOS
This function uses kwalify to validate Puppet data structures against Kwalify
schemas.
EOS
) do |args|
raise(Puppet::ParseError, "kwalify(): Wrong number of arguments " +
"given (#{args.size} for 2)") if args.size != 2
schema = args[0]
document = args[1]
require 'kwalify'
validator = Kwalify::Validator.new(schema)
errors = validator.validate(document)
if errors && !errors.empty?
error_out = []
for e in errors
error_out << "[#{e.path}] #{e.message}"
end
raise(Puppet::ParseError, "Failed kwalify schema validation:\n" + error_out.join("\n"))
end
end
end
# vim: set ts=2 sw=2 et :

View file

@ -1,41 +0,0 @@
#
# validate_resource
#
module Puppet::Parser::Functions
newfunction(:validate_resource, :type => :statement, :doc => <<-EOS
This function when placed at the beginning of a class, will go looking for a
valid kwalify schema by replacing the extension of the file with '.schema'.
It will then validate the arguments passed to the function using that kwalify
schema.
EOS
) do |arguments|
require 'kwalify'
if (arguments.size != 0) then
raise(Puppet::ParseError, "validate_resource(): Wrong number of arguments "+
"given #{arguments.size} for 0")
end
classhash = to_hash(recursive=false)
sourcepath = source.file
schemapath = sourcepath.gsub(/\.(rb|pp)$/, ".schema")
schema = Kwalify::Yaml.load_file(schemapath)
validator = Kwalify::Validator.new(schema)
errors = validator.validate(classhash)
if errors && !errors.empty?
error_output = "Resource validation failed:\n"
for e in errors
error_output += "[#{e.path}] #{e.message}\n"
end
raise(Puppet::ParseError, error_output)
end
end
end
# vim: set ts=2 sw=2 et :

View file

@ -1,62 +0,0 @@
#!/usr/bin/env rspec
require 'spec_helper'
describe "the kwalify function" do
before :all do
Puppet::Parser::Functions.autoloader.loadall
end
before :each do
@scope = Puppet::Parser::Scope.new
end
it "should exist" do
Puppet::Parser::Functions.function("kwalify").should == "function_kwalify"
end
it "should raise a ParseError if there is less than 2 arguments" do
lambda { @scope.function_kwalify([]) }.should( raise_error(Puppet::ParseError))
end
it "should validate a simple array schema" do
schema = {
'type' => 'seq',
'sequence' => [
{ 'type' => 'str' }
]
}
document = ['a','b','c']
@scope.function_kwalify([schema, document])
end
it "should not validate a simple array schema when invalid" do
schema = {
'type' => 'seq',
'sequence' => [
{ 'type' => 'str' }
]
}
document = ['a','b',{'a' => 'b'}]
lambda { @scope.function_kwalify([schema, document]) }.should(raise_error(Puppet::ParseError))
end
it "should validate a hash schema" do
schema = {
'type' => 'map',
'mapping' => {
'key1' => {
'type' => 'str',
},
'key2' => {
'type' => 'str',
},
}
}
document = {
'key1' => 'b',
'key2' => 'c',
}
@scope.function_kwalify([schema, document])
end
end