From 73f4d4d540c38c8bb9bb233aa6d57429e4f58160 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Wed, 26 Nov 2014 17:59:46 +0400 Subject: [PATCH] add run list validator --- .gitignore | 1 + .../db/mongo/models/deploy_env_base.rb | 8 +------- devops-service/db/validators/all.rb | 8 ++++++++ devops-service/db/validators/base.rb | 18 +++++++++++++++++ .../db/validators/deploy_env/run_list.rb | 20 +++++++++++++++++++ .../db/validators/helpers/run_list.rb | 15 ++++++++++++++ devops-service/devops-service.rb | 1 + devops-service/routes/v2.0/server.rb | 4 ++-- 8 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 devops-service/db/validators/all.rb create mode 100644 devops-service/db/validators/base.rb create mode 100644 devops-service/db/validators/deploy_env/run_list.rb create mode 100644 devops-service/db/validators/helpers/run_list.rb diff --git a/.gitignore b/.gitignore index 9279688..98dda23 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ devops-service/tests/features/support/config.yml +.devops_files/ diff --git a/devops-service/db/mongo/models/deploy_env_base.rb b/devops-service/db/mongo/models/deploy_env_base.rb index 9882171..cdc9914 100644 --- a/devops-service/db/mongo/models/deploy_env_base.rb +++ b/devops-service/db/mongo/models/deploy_env_base.rb @@ -20,8 +20,7 @@ class DeployEnvBase < MongoModel def validate! super - e = DeployEnvBase.validate_run_list(self.run_list) - raise InvalidRecord.new "Invalid run list elements: '#{e.join("', '")}'" unless e.empty? + Validators::DeployEnv::RunList.new(self).validate! unless self.expires.nil? check_expires!(self.expires) @@ -39,9 +38,4 @@ class DeployEnvBase < MongoModel } end - def self.validate_run_list list - rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/ - list.select {|l| (rl =~ l).nil?} - end - end diff --git a/devops-service/db/validators/all.rb b/devops-service/db/validators/all.rb new file mode 100644 index 0000000..6f9ac20 --- /dev/null +++ b/devops-service/db/validators/all.rb @@ -0,0 +1,8 @@ +module Validators + class Helpers; end + class DeployEnv; end +end + +require "db/validators/base" +require "db/validators/helpers/run_list" +require "db/validators/deploy_env/run_list" diff --git a/devops-service/db/validators/base.rb b/devops-service/db/validators/base.rb new file mode 100644 index 0000000..74323a8 --- /dev/null +++ b/devops-service/db/validators/base.rb @@ -0,0 +1,18 @@ +class Validators::Base + + def initialize(model) + @model = model + end + + def validate! + raise InvalidRecord.new(message) unless valid? + end + + def valid? + raise 'override me' + end + + def message + raise 'override me' + end +end \ No newline at end of file diff --git a/devops-service/db/validators/deploy_env/run_list.rb b/devops-service/db/validators/deploy_env/run_list.rb new file mode 100644 index 0000000..dba7c18 --- /dev/null +++ b/devops-service/db/validators/deploy_env/run_list.rb @@ -0,0 +1,20 @@ +# Use helper to avoid code duplication: we have run_list validation in server routes, +# not only in deploy env model + +module Validators + class DeployEnv::RunList < Base + + def initialize(model) + super(model) + @helper_validator = Helpers::RunList.new(@model.run_list) + end + + def valid? + @helper_validator.valid? + end + + def message + @helper_validator.message + end + end +end \ No newline at end of file diff --git a/devops-service/db/validators/helpers/run_list.rb b/devops-service/db/validators/helpers/run_list.rb new file mode 100644 index 0000000..e9f73ac --- /dev/null +++ b/devops-service/db/validators/helpers/run_list.rb @@ -0,0 +1,15 @@ +module Validators + class Helpers::RunList < Base + + def valid? + rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/ + @invalid_elements = @model.select {|l| (rl =~ l).nil?} + @invalid_elements.empty? + end + + def message + invalid_elements_as_string = @invalid_elements.join("', '") + "Invalid run list elements: '#{invalid_elements_as_string}'. Each element should be role or recipe." + end + end +end \ No newline at end of file diff --git a/devops-service/devops-service.rb b/devops-service/devops-service.rb index c352e72..d985f13 100644 --- a/devops-service/devops-service.rb +++ b/devops-service/devops-service.rb @@ -9,6 +9,7 @@ $:.push File.dirname(__FILE__) require "db/exceptions/invalid_record" require "db/exceptions/record_not_found" require "db/mongo/mongo_connector" +require "db/validators/all" require "providers/provider_factory" require "routes/v2.0" diff --git a/devops-service/routes/v2.0/server.rb b/devops-service/routes/v2.0/server.rb index d8732e5..49430b8 100644 --- a/devops-service/routes/v2.0/server.rb +++ b/devops-service/routes/v2.0/server.rb @@ -396,8 +396,8 @@ module Version2_0 name = check_string(body["name"], "Parameter 'name' should be a not empty string", true) rl = check_array(body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true) unless rl.nil? - e = DeployEnv.validate_run_list(rl) - halt_response("Invalid run list elements: '#{e.join("', '")}'") unless e.empty? + validator = Validators::Helpers::RunList.new(rl) + halt_response(validator.message) unless validator.valid? end t = check_string(body["bootstrap_template"], "Parameter 'bootstrap_template' should be a not empty string", true) s = BaseRoutes.mongo.server_by_instance_id(id)