require 'db/validators/run_list_array' class ProperNamedTasksFormatValidator < ActiveModel::Validator # should be an array of hashes like: # { # 'name' => 'restart', # 'run_list' => [ # 'role[restart_service]' # ] # } def validate(record) unless record.named_tasks record.errors.add :named_tasks, "Tasks should not be nil" return end record.named_tasks.each do |named_task| check_name!(named_task, record) check_run_list!(named_task, record) end end private def check_name!(task, record) unless task.key?('name') record.errors.add :named_tasks, "One of tasks doesn't have a name" end end def check_run_list!(task, record) RunListArrayValidator.validate_list(task['run_list']) rescue Devops::Exception::ValidationError => e if e.body[:elements] wrong_elements = e.body[:elements] record.errors.add :named_tasks, "Invalid run list elements: '#{wrong_elements.join(', ')}' for task #{task['name']}." else record.errors.add :named_tasks, "Task #{task['name']} has invalid run list." end end end