project types and hooks

This commit is contained in:
Anton Martynov 2015-07-01 17:14:23 +03:00
parent 817f627fa4
commit f5c3662b3d
4 changed files with 105 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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