diff --git a/devops-service/db/mongo/models/project.rb b/devops-service/db/mongo/models/project.rb index d38e557..267d882 100644 --- a/devops-service/db/mongo/models/project.rb +++ b/devops-service/db/mongo/models/project.rb @@ -5,11 +5,17 @@ require "db/mongo/models/user" require "db/mongo/models/deploy_env/deploy_env_multi" require "db/mongo/models/mongo_model" require "json" +require "lib/project/handler/types_factory" module Devops module Model class Project < MongoModel + include Hooks + include Hooks::InstanceHooks + define_hook :before_create + define_hook :after_create + attr_accessor :id, :deploy_envs, :type, :archived, :description types :id => {:type => String, :empty => false}, @@ -25,9 +31,13 @@ module Devops def initialize p={} self.id = p["name"] #raise InvalidRecord.new "No deploy envirenments for project #{self.id}" if p["deploy_envs"].nil? or p["deploy_envs"].empty? - self.type = p["type"] + self.type = p["type"] || Devops::GenericType.name self.description = p["description"] self.archived = p["archived"] || false + + handler = Devops::TypesFactory.type self.type + handler.prepare(self) unless handler.nil? + env_class = ( self.multi? ? DeployEnvMulti : DeployEnvFactory ) unless p["deploy_envs"].nil? self.deploy_envs = [] @@ -90,12 +100,14 @@ module Devops raise InvalidRecord.new "Deploy environment(s) '#{non_uniq.join("', '")}' is/are not unique" unless non_uniq.empty? self.deploy_envs.each do |d| d.validate! +=begin unless self.multi? rn = "#{self.id}#{DevopsConfig.config[:role_separator] || "_"}#{d.identifier}" role = "role[#{rn}]" d.run_list = d.run_list - [rn, role] d.run_list.unshift(role) end +=end end true diff --git a/devops-service/lib/project/handler/generic_type.rb b/devops-service/lib/project/handler/generic_type.rb new file mode 100644 index 0000000..91b3db0 --- /dev/null +++ b/devops-service/lib/project/handler/generic_type.rb @@ -0,0 +1,55 @@ +require_relative "project_type" + +module Devops + class GenericType + + def self.name + "generic" + end + + include ProjectType + + def prepare project + project.before_create create_roles + end + + def create_roles + lambda { + log = DevopsLogger.logger + log.info "Create roles hook" + return {roles: nil} if self.multi? + roles = {:new => [], :error => [], :exist => []} + self.deploy_envs.each do |e| + next if e.use_json_file + role_name = KnifeCommands.role_name(self.id, e.identifier) + chef_env = e.chef_env + if roles[chef_env].nil? + roles[chef_env], r = KnifeCommands.roles(chef_env) + unless r + log.error "Can't get roles list form chef-#{chef_env}: #{roles[chef_env]}" + roles[chef_env] = nil + next + end + end + all_roles = roles[chef_env] + begin + if all_roles.include? role_name + roles[:exist].push role_name + e.run_list << "role[#{role_name}]" + else + KnifeCommands.create_role role_name, self.id, e.identifier, chef_env + roles[:new].push role_name + e.run_list << "role[#{role_name}]" + log.info "Role '#{role_name}' created" + end + rescue => er + roles[:error].push role_name + log.error "Role '#{role_name}' can not be created: #{er.message}" + end + end + {roles: roles} + } + end + + end +end diff --git a/devops-service/lib/project/handler/project_type.rb b/devops-service/lib/project/handler/project_type.rb new file mode 100644 index 0000000..af51ced --- /dev/null +++ b/devops-service/lib/project/handler/project_type.rb @@ -0,0 +1,21 @@ +module Devops + module ProjectType + + class << self + @@types = {} + def included mod + @@types[mod.name] = mod + puts "Project type '#{mod.name}' registered" + end + + def types + @@types + end + end + + def prepare project + + end + + end +end diff --git a/devops-service/lib/project/handler/types_factory.rb b/devops-service/lib/project/handler/types_factory.rb new file mode 100644 index 0000000..5f6773e --- /dev/null +++ b/devops-service/lib/project/handler/types_factory.rb @@ -0,0 +1,16 @@ +require_relative "project_type" +require_relative "generic_type" + +module Devops + class TypesFactory + + def self.type type + t = ProjectType.types + t[type].new + end + + def self.types_names + ProjectType.types.keys + end + end +end