project types and hooks
This commit is contained in:
parent
817f627fa4
commit
f5c3662b3d
@ -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
|
||||
|
||||
55
devops-service/lib/project/handler/generic_type.rb
Normal file
55
devops-service/lib/project/handler/generic_type.rb
Normal 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
|
||||
21
devops-service/lib/project/handler/project_type.rb
Normal file
21
devops-service/lib/project/handler/project_type.rb
Normal 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
|
||||
16
devops-service/lib/project/handler/types_factory.rb
Normal file
16
devops-service/lib/project/handler/types_factory.rb
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user