diff --git a/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb b/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb index dc62b4d..a19abcc 100644 --- a/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb +++ b/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb @@ -11,28 +11,28 @@ module Devops module Model class CloudDeployEnv < DeployEnvBase - attr_accessor :flavor, :image, :subnets, :groups, :stack_template +# attr_accessor :flavor, :image, :subnets, :groups, :stack_template set_validators ::Validators::DeployEnv::Flavor, ::Validators::DeployEnv::Image, ::Validators::DeployEnv::Groups, ::Validators::DeployEnv::StackTemplate # set_validators ::Validators::DeployEnv::CloudParameters - set_field_validators :flavor, ::Validators::FieldValidator::Nil, + set_field_validators :flavor, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::Flavor - set_field_validators :image, ::Validators::FieldValidator::Nil, + ::Validators::FieldValidator::Flavor], order: 2 + set_field_validators :image, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::Image - set_field_validators :subnets, ::Validators::FieldValidator::Nil, - ::Validators::FieldValidator::FieldType::Array + ::Validators::FieldValidator::Image], order: 2 + set_field_validators :subnets, [::Validators::FieldValidator::Nil, + ::Validators::FieldValidator::FieldType::Array], order: 4 # ::Validators::FieldValidator::Subnets.new - set_field_validators :groups, ::Validators::FieldValidator::Nil, - ::Validators::FieldValidator::FieldType::Array + set_field_validators :groups, [::Validators::FieldValidator::Nil, + ::Validators::FieldValidator::FieldType::Array], order: 4 # ::Validators::FieldValidator::Groups.new - set_field_validators :stack_template, ::Validators::FieldValidator::Nil, + set_field_validators :stack_template, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::NotEmpty, + ::Validators::FieldValidator::NotEmpty], order: 2 # ::Validators::FieldValidator::StackTemplate.new def initialize d={} diff --git a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb index b5aec77..c832d20 100644 --- a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb +++ b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb @@ -8,27 +8,27 @@ module Devops include ModelWithProvider - attr_accessor :identifier, :run_list, :expires, :users +# attr_accessor :identifier, :run_list, :expires, :users set_validators ::Validators::DeployEnv::RunList, ::Validators::DeployEnv::Expiration, ::Validators::DeployEnv::Users - set_field_validators :identifier, ::Validators::FieldValidator::NotNil, + set_field_validators :identifier, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::Name + ::Validators::FieldValidator::Name] - set_field_validators :run_list, ::Validators::FieldValidator::NotNil, + set_field_validators :run_list, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::Array, - ::Validators::FieldValidator::RunList + ::Validators::FieldValidator::RunList] - set_field_validators :users, ::Validators::FieldValidator::NotNil, - ::Validators::FieldValidator::FieldType::Array + set_field_validators :users, [::Validators::FieldValidator::NotNil, + ::Validators::FieldValidator::FieldType::Array] - set_field_validators :expires, ::Validators::FieldValidator::Nil, + set_field_validators :expires, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::Expires + ::Validators::FieldValidator::Expires] def initialize d={} self.identifier = d["identifier"] diff --git a/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb b/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb index 5377a57..5e54ba0 100644 --- a/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb +++ b/devops-service/db/mongo/models/deploy_env/deploy_env_ec2.rb @@ -4,11 +4,11 @@ module Devops module Model class DeployEnvEc2 < CloudDeployEnv - attr_accessor :vpc_id +# attr_accessor :vpc_id - set_field_validators :vpc_id, ::Validators::FieldValidator::Nil, + set_field_validators :vpc_id, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::Vpc + ::Validators::FieldValidator::Vpc], order: 3 =begin @Deprecated types :identifier => {:type => String, :empty => false}, diff --git a/devops-service/db/mongo/models/image.rb b/devops-service/db/mongo/models/image.rb index 728a66a..5d68393 100644 --- a/devops-service/db/mongo/models/image.rb +++ b/devops-service/db/mongo/models/image.rb @@ -8,7 +8,7 @@ module Devops class Image < MongoModel include ModelWithProvider - attr_accessor :id, :remote_user, :name, :bootstrap_template +# attr_accessor :id, :remote_user, :name, :bootstrap_template =begin types :id => {:type => String, :empty => false}, :provider => {:type => String, :empty => false}, @@ -20,27 +20,27 @@ module Devops # set_validators ::Validators::Image::ImageInFilter, # ::Validators::Image::BootstrapTemplate - set_field_validators :id, ::Validators::FieldValidator::NotNil, + set_field_validators :id, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, ::Validators::FieldValidator::ImageName, - ::Validators::Image::ImageInFilter + ::Validators::Image::ImageInFilter] - set_field_validators :remote_user, ::Validators::FieldValidator::NotNil, + set_field_validators :remote_user, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::Name + ::Validators::FieldValidator::Name] - set_field_validators :name, ::Validators::FieldValidator::NotNil, + set_field_validators :name, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::ImageName + ::Validators::FieldValidator::ImageName] - set_field_validators :bootstrap_template, ::Validators::FieldValidator::Nil, + set_field_validators :bootstrap_template, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, ::Validators::FieldValidator::Name, - ::Validators::Image::BootstrapTemplate + ::Validators::Image::BootstrapTemplate] def validate! validate_id! diff --git a/devops-service/db/mongo/models/model_with_provider.rb b/devops-service/db/mongo/models/model_with_provider.rb index 850b7ee..b7a5d36 100644 --- a/devops-service/db/mongo/models/model_with_provider.rb +++ b/devops-service/db/mongo/models/model_with_provider.rb @@ -4,14 +4,19 @@ module Devops module Model module ModelWithProvider - attr_accessor :provider, :provider_account +# attr_accessor :provider, :provider_account def ModelWithProvider.included(mod) - mod.set_field_validators :provider, ::Validators::FieldValidator::NotNil, + mod.set_field_validators :provider, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::Provider + ::Validators::FieldValidator::Provider] + + mod.set_field_validators :provider_account, [::Validators::FieldValidator::Nil, + ::Validators::FieldValidator::FieldType::String, + ::Validators::FieldValidator::NotEmpty, + ::Validators::FieldValidator::ProviderAccount], order: 1 end def provider_instance diff --git a/devops-service/db/mongo/models/mongo_model.rb b/devops-service/db/mongo/models/mongo_model.rb index 3721a5c..894da96 100644 --- a/devops-service/db/mongo/models/mongo_model.rb +++ b/devops-service/db/mongo/models/mongo_model.rb @@ -68,15 +68,20 @@ module Devops def validate_fields! result = [] - self.class.field_validators.each do |field, validation_method| - begin - self.send(validation_method) - rescue InvalidRecord => e - result << {key: field, message: e.message} + orders = self.class.field_validators.keys.sort + orders.each do |order| + self.class.field_validators[order].each do |elem| + field = elem[:field] + validation_method = elem[:method] + begin + self.send(validation_method) + rescue InvalidRecord => e + result << {key: field, message: e.message} + end + end + unless result.empty? + raise InvalidRecord.new(error_data: result) end - end - unless result.empty? - raise InvalidRecord.new(error_data: result) end true end @@ -142,6 +147,12 @@ module Devops class << self attr_accessor :validators + + # hash: + # key - (integer) validators order + # value - (hash) validator params: + # field: (string) field name + # method: (string) field validator method attr_accessor :field_validators def inherited(subclass) @@ -159,14 +170,29 @@ module Devops # validate field value # if method validate! returns false, then stop validation without error - def set_field_validators field, *validators + # + # field - (string) field name to validate + # validators - (array) validators list + # options - (hash) options for validator + # order: integer - run validator in order with index order: + def set_field_validators field, validators, options={} + attr_accessor field method_name = "validate_" + field.to_s + "!" define_method(method_name) do validators.each do |validator| - break unless validator.new(self, send(field)).validate! + break unless validator.new(self, field).validate! end end - self.field_validators[field] = method_name + order = options[:order] || 0 + obj = { + field: field, + method: method_name + } + unless self.field_validators[order] + self.field_validators[order] = [obj] + else + self.field_validators[order] << obj + end end # private class methods diff --git a/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb b/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb index 3f2fb41..95117bb 100644 --- a/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/ec2_provider_account.rb @@ -4,15 +4,15 @@ module Devops module Model class Ec2ProviderAccount < ProviderAccount - attr_accessor :access_key_id, :availability_zone, :secret_access_key +# attr_accessor :access_key_id, :availability_zone, :secret_access_key - set_field_validators :access_key_id, ::Validators::FieldValidator::NotNil, + set_field_validators :access_key_id, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::NotEmpty + ::Validators::FieldValidator::NotEmpty] - set_field_validators :secret_access_key, ::Validators::FieldValidator::NotNil, + set_field_validators :secret_access_key, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::NotEmpty + ::Validators::FieldValidator::NotEmpty] def initialize a={} super(a) self.provider = Provider::Ec2::PROVIDER diff --git a/devops-service/db/mongo/models/provider_accounts/provider_account.rb b/devops-service/db/mongo/models/provider_accounts/provider_account.rb index 3a6fb59..d3c9c42 100644 --- a/devops-service/db/mongo/models/provider_accounts/provider_account.rb +++ b/devops-service/db/mongo/models/provider_accounts/provider_account.rb @@ -7,22 +7,22 @@ module Devops include ModelWithProvider - attr_accessor :account_name, :description, :ssh_key +# attr_accessor :account_name, :description, :ssh_key - set_field_validators :account_name, ::Validators::FieldValidator::NotNil, + set_field_validators :account_name, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::Name + ::Validators::FieldValidator::Name] - set_field_validators :description, ::Validators::FieldValidator::Nil, + set_field_validators :description, [::Validators::FieldValidator::Nil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::Description + ::Validators::FieldValidator::Description] - set_field_validators :ssh_key, ::Validators::FieldValidator::NotNil, + set_field_validators :ssh_key, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::NotEmpty, - ::Validators::FieldValidator::SshKey + ::Validators::FieldValidator::SshKey] ACCOUNT_FIELDS = { account_name: "Account name (id)", diff --git a/devops-service/db/mongo/models/user.rb b/devops-service/db/mongo/models/user.rb index b16e032..e13b4f1 100644 --- a/devops-service/db/mongo/models/user.rb +++ b/devops-service/db/mongo/models/user.rb @@ -12,20 +12,20 @@ module Devops PRIVILEGES = ["r", "w", "x"] PRIVILEGES_REGEX = /^r?w?x?$/ - attr_accessor :id, :password, :privileges, :email - types :id => {:type => String, :empty => false}, - :email => {:type => String, :empty => false}, - :password => {:type => String, :empty => true} +# attr_accessor :id, :password, :privileges, :email +# types :id => {:type => String, :empty => false}, +# :email => {:type => String, :empty => false}, +# :password => {:type => String, :empty => true} - set_field_validators :id, ::Validators::FieldValidator::NotNil, + set_field_validators :id, [::Validators::FieldValidator::NotNil, ::Validators::FieldValidator::FieldType::String, - ::Validators::FieldValidator::Name - set_field_validators :password, ::Validators::FieldValidator::NotNil, - ::Validators::FieldValidator::FieldType::String - set_field_validators :email, ::Validators::FieldValidator::NotNil, - ::Validators::FieldValidator::FieldType::String - set_field_validators :privileges, ::Validators::FieldValidator::NotNil, - ::Validators::FieldValidator::FieldType::Hash + ::Validators::FieldValidator::Name] + set_field_validators :password, [::Validators::FieldValidator::NotNil, + ::Validators::FieldValidator::FieldType::String] + set_field_validators :email, [::Validators::FieldValidator::NotNil, + ::Validators::FieldValidator::FieldType::String] + set_field_validators :privileges, [::Validators::FieldValidator::NotNil, + ::Validators::FieldValidator::FieldType::Hash] def initialize p={} self.id = p['username'] self.email = p['email'] diff --git a/devops-service/db/validators/field_validators/base.rb b/devops-service/db/validators/field_validators/base.rb index 8c60d57..c76395b 100644 --- a/devops-service/db/validators/field_validators/base.rb +++ b/devops-service/db/validators/field_validators/base.rb @@ -2,9 +2,10 @@ module Validators module FieldValidator class Base - def initialize model, value + def initialize model, field @model = model - @value = value + @field = field + @value = model.send(field) end def validate! diff --git a/devops-service/db/validators/field_validators/provider_account.rb b/devops-service/db/validators/field_validators/provider_account.rb new file mode 100644 index 0000000..3d56074 --- /dev/null +++ b/devops-service/db/validators/field_validators/provider_account.rb @@ -0,0 +1,17 @@ +require_relative "base" + +module Validators + module FieldValidator + class ProviderAccount < Base + + def valid? + accounts = AccountsFactory.accounts(@model.provider) + accounts.map{|a| a.account_name}.include?(@value) + end + + def message + "Account '#{@value}' for provider '#{@model.provider}' does not exist" + end + end + end +end diff --git a/devops-service/providers/accounts_factory.rb b/devops-service/providers/accounts_factory.rb index 7f212e9..07906e1 100644 --- a/devops-service/providers/accounts_factory.rb +++ b/devops-service/providers/accounts_factory.rb @@ -1,6 +1,14 @@ module Provider class AccountsFactory + class << self + + def accounts provider_name + Devops::Db.connector.provider_accounts(provider_name) + end + + end + def init config end @@ -22,7 +30,7 @@ module Provider end def accounts - Devops::Db.connector.provider_accounts(provider_name) + AccountsFactory.accounts(provider_name) end def create_account hash diff --git a/devops-service/providers/ec2.rb b/devops-service/providers/ec2.rb index af5e7fa..e593ad6 100644 --- a/devops-service/providers/ec2.rb +++ b/devops-service/providers/ec2.rb @@ -205,7 +205,7 @@ module Provider end def cloud_formation - @cloud_formation ||= Fog::AWS::CloudFormation.new(connection_options) + @cloud_formation ||= Fog::AWS::CloudFormation.new(connection_options) end def create_stack(stack, out)