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/deploy_env/deploy_env_multi"
|
||||||
require "db/mongo/models/mongo_model"
|
require "db/mongo/models/mongo_model"
|
||||||
require "json"
|
require "json"
|
||||||
|
require "lib/project/handler/types_factory"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module Model
|
module Model
|
||||||
class Project < MongoModel
|
class Project < MongoModel
|
||||||
|
|
||||||
|
include Hooks
|
||||||
|
include Hooks::InstanceHooks
|
||||||
|
define_hook :before_create
|
||||||
|
define_hook :after_create
|
||||||
|
|
||||||
attr_accessor :id, :deploy_envs, :type, :archived, :description
|
attr_accessor :id, :deploy_envs, :type, :archived, :description
|
||||||
|
|
||||||
types :id => {:type => String, :empty => false},
|
types :id => {:type => String, :empty => false},
|
||||||
@ -25,9 +31,13 @@ module Devops
|
|||||||
def initialize p={}
|
def initialize p={}
|
||||||
self.id = p["name"]
|
self.id = p["name"]
|
||||||
#raise InvalidRecord.new "No deploy envirenments for project #{self.id}" if p["deploy_envs"].nil? or p["deploy_envs"].empty?
|
#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.description = p["description"]
|
||||||
self.archived = p["archived"] || false
|
self.archived = p["archived"] || false
|
||||||
|
|
||||||
|
handler = Devops::TypesFactory.type self.type
|
||||||
|
handler.prepare(self) unless handler.nil?
|
||||||
|
|
||||||
env_class = ( self.multi? ? DeployEnvMulti : DeployEnvFactory )
|
env_class = ( self.multi? ? DeployEnvMulti : DeployEnvFactory )
|
||||||
unless p["deploy_envs"].nil?
|
unless p["deploy_envs"].nil?
|
||||||
self.deploy_envs = []
|
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?
|
raise InvalidRecord.new "Deploy environment(s) '#{non_uniq.join("', '")}' is/are not unique" unless non_uniq.empty?
|
||||||
self.deploy_envs.each do |d|
|
self.deploy_envs.each do |d|
|
||||||
d.validate!
|
d.validate!
|
||||||
|
=begin
|
||||||
unless self.multi?
|
unless self.multi?
|
||||||
rn = "#{self.id}#{DevopsConfig.config[:role_separator] || "_"}#{d.identifier}"
|
rn = "#{self.id}#{DevopsConfig.config[:role_separator] || "_"}#{d.identifier}"
|
||||||
role = "role[#{rn}]"
|
role = "role[#{rn}]"
|
||||||
d.run_list = d.run_list - [rn, role]
|
d.run_list = d.run_list - [rn, role]
|
||||||
d.run_list.unshift(role)
|
d.run_list.unshift(role)
|
||||||
end
|
end
|
||||||
|
=end
|
||||||
end
|
end
|
||||||
|
|
||||||
true
|
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