| Class | BoxGrinder::ApplianceParser |
| In: |
lib/boxgrinder-core/appliance-parser.rb
lib/boxgrinder-core/appliance-parser.rb |
| Parent: | Object |
# File lib/boxgrinder-core/appliance-parser.rb, line 27
27: def initialize(options = {})
28: @log = options[:log] || LogHelper.new
29: @schemas = {}
30: end
# File lib/boxgrinder-core/appliance-parser.rb, line 27
27: def initialize(options = {})
28: @log = options[:log] || LogHelper.new
29: @schemas = {}
30: end
# File lib/boxgrinder-core/appliance-parser.rb, line 32
32: def load_schemas
33: Dir.glob("#{File.dirname(__FILE__)}/schemas/{*.yaml,*.yml}").each do |f|
34: # DON'T use Kwalify::Yaml here!
35: # This will not treat '#' sign in schema files correctly
36: schema = YAML.load_file(f)
37: @schemas[schema['version']] = schema
38: end
39: end
# File lib/boxgrinder-core/appliance-parser.rb, line 32
32: def load_schemas
33: Dir.glob("#{File.dirname(__FILE__)}/schemas/{*.yaml,*.yml}").each do |f|
34: # DON'T use Kwalify::Yaml here!
35: # This will not treat '#' sign in schema files correctly
36: schema = YAML.load_file(f)
37: @schemas[schema['version']] = schema
38: end
39: end
# File lib/boxgrinder-core/appliance-parser.rb, line 73
73: def parse(schema_document, appliance_definition)
74: validator = ApplianceValidator.new(schema_document)
75: parser = Kwalify::Yaml::Parser.new(validator)
76: parser.data_binding = true
77:
78: begin
79: parsed = parser.parse(appliance_definition)
80: rescue Kwalify::KwalifyError => e
81: raise ApplianceValidationError, "The appliance definition couldn't be parsed. [line #{e.linenum}, col #{e.column}] [#{e.path}] Make sure you use correct indentation (don't use tabs). If indentation is correct and you try to specify partition mount point, please quote it: \"/foo\" instead of /foo." if e.message =~ /document end expected \(maybe invalid tab char found\)/
82: raise ApplianceValidationError, "The appliance definition couldn't be parsed. #{e}"
83: end
84:
85: [parsed, parser.errors]
86: end
# File lib/boxgrinder-core/appliance-parser.rb, line 73
73: def parse(schema_document, appliance_definition)
74: validator = ApplianceValidator.new(schema_document)
75: parser = Kwalify::Yaml::Parser.new(validator)
76: parser.data_binding = true
77:
78: begin
79: parsed = parser.parse(appliance_definition)
80: rescue Kwalify::KwalifyError => e
81: raise ApplianceValidationError, "The appliance definition couldn't be parsed. [line #{e.linenum}, col #{e.column}] [#{e.path}] Make sure you use correct indentation (don't use tabs). If indentation is correct and you try to specify partition mount point, please quote it: \"/foo\" instead of /foo." if e.message =~ /document end expected \(maybe invalid tab char found\)/
82: raise ApplianceValidationError, "The appliance definition couldn't be parsed. #{e}"
83: end
84:
85: [parsed, parser.errors]
86: end
# File lib/boxgrinder-core/appliance-parser.rb, line 41
41: def parse_definition(appliance_definition, file = true)
42: if file
43: @log.info "Validating appliance definition from #{appliance_definition} file..."
44: appliance_definition = File.read(appliance_definition)
45: else
46: @log.info "Validating appliance definition from string..."
47: end
48:
49: failures = {}
50: schema_versions = @schemas.keys.sort.reverse
51:
52: schema_versions.each do |schema_version|
53: @log.debug "Parsing definition using schema version #{schema_version}."
54: @schemas[schema_version].delete('version')
55: appliance_config, errors = parse(@schemas[schema_version], appliance_definition)
56:
57: if errors.empty?
58: @log.info "Appliance definition is valid."
59: return ApplianceTransformationHelper.new(schema_versions.first, :log => @log).transform(appliance_config, schema_version)
60: end
61:
62: failures[schema_version] = errors
63: end
64:
65: # If all schemas fail then we assume they are using the latest schema..
66: failures[schema_versions.first].each do |error|
67: @log.error "Error: [line #{error.linenum}, col #{error.column}] [#{error.path}] #{error.message}"
68: end
69:
70: raise ApplianceValidationError, "The appliance definition was invalid according to schema #{schema_versions.first}. See log for details."
71: end
# File lib/boxgrinder-core/appliance-parser.rb, line 41
41: def parse_definition(appliance_definition, file = true)
42: if file
43: @log.info "Validating appliance definition from #{appliance_definition} file..."
44: appliance_definition = File.read(appliance_definition)
45: else
46: @log.info "Validating appliance definition from string..."
47: end
48:
49: failures = {}
50: schema_versions = @schemas.keys.sort.reverse
51:
52: schema_versions.each do |schema_version|
53: @log.debug "Parsing definition using schema version #{schema_version}."
54: @schemas[schema_version].delete('version')
55: appliance_config, errors = parse(@schemas[schema_version], appliance_definition)
56:
57: if errors.empty?
58: @log.info "Appliance definition is valid."
59: return ApplianceTransformationHelper.new(schema_versions.first, :log => @log).transform(appliance_config, schema_version)
60: end
61:
62: failures[schema_version] = errors
63: end
64:
65: # If all schemas fail then we assume they are using the latest schema..
66: failures[schema_versions.first].each do |error|
67: @log.error "Error: [line #{error.linenum}, col #{error.column}] [#{error.path}] #{error.message}"
68: end
69:
70: raise ApplianceValidationError, "The appliance definition was invalid according to schema #{schema_versions.first}. See log for details."
71: end