fixed role name new field validators without validate fields types fixed error with user parser todo: project tests returned some tests, users fixed some more tests: filters images tests network tests keys tests test generator fixed run_list validator
228 lines
6.9 KiB
Ruby
228 lines
6.9 KiB
Ruby
require "db/mongo/models/deploy_env/deploy_env_factory"
|
|
require "db/mongo/models/user"
|
|
require "db/mongo/models/deploy_env/deploy_env_multi"
|
|
require "db/mongo/models/mongo_model"
|
|
require "json"
|
|
require "hooks"
|
|
require "lib/project/type/types_factory"
|
|
require "db/validators/deploy_env/deploy_envs"
|
|
|
|
module Devops
|
|
module Model
|
|
class Project < MongoModel
|
|
|
|
include Hooks
|
|
include Hooks::InstanceHooks
|
|
define_hook :before_create
|
|
define_hook :after_create
|
|
|
|
define_hook :before_delete
|
|
define_hook :after_delete
|
|
|
|
#define_hook :after_add_deploy_env
|
|
|
|
attr_accessor :id, :deploy_envs, :type, :archived, :description, :run_list
|
|
|
|
types :id => {:type => String, :empty => false},
|
|
:deploy_envs => {:type => Array, :value_type => false, :empty => false},
|
|
:description => {:type => String, :empty => true, :nil => true},
|
|
:run_list => {:type => Array, :value_type => String, :empty => true, :nil => false}
|
|
|
|
MULTI_TYPE = "multi"
|
|
|
|
set_validators ::Validators::DeployEnv::RunList,
|
|
::Validators::DeployEnv::DeployEnvs
|
|
|
|
def self.fields
|
|
["deploy_envs", "type", "description"]
|
|
end
|
|
|
|
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"] || Devops::GenericType.name
|
|
self.description = p["description"]
|
|
self.archived = p["archived"] || false
|
|
self.run_list = p["run_list"] || []
|
|
|
|
@handler = Devops::TypesFactory.type self.type
|
|
@handler.prepare(self)
|
|
|
|
env_class = ( self.multi? ? DeployEnvMulti : DeployEnvFactory )
|
|
unless p["deploy_envs"].nil?
|
|
self.deploy_envs = []
|
|
p["deploy_envs"].each do |e|
|
|
env = env_class.create(e)
|
|
self.deploy_envs.push env
|
|
end
|
|
end
|
|
end
|
|
|
|
def deploy_env env
|
|
de = self.deploy_envs.detect {|e| e.identifier == env}
|
|
raise RecordNotFound.new("Project '#{self.id}' does not have deploy environment '#{env}'") if de.nil?
|
|
de
|
|
end
|
|
|
|
def add_deploy_env deploy_env
|
|
res = deploy_env.create_role(self.id)
|
|
Devops::Db.connector.add_deploy_env_to_project self.id, deploy_env
|
|
Project.create_roles_response(res)
|
|
end
|
|
|
|
def add_authorized_user user, env=nil
|
|
return if user.nil?
|
|
new_users = ( user.is_a?(Array) ? user : [ user ] )
|
|
if env.nil?
|
|
self.deploy_envs.each do |e|
|
|
return unless e.users.is_a?(Array)
|
|
e.add_users new_users
|
|
Devops::Db.connector.set_project_deploy_env_field(self.id, e.identifier, "users", e.users)
|
|
end
|
|
else
|
|
e = self.deploy_env(env)
|
|
return unless e.users.is_a?(Array)
|
|
e.add_users new_users
|
|
Devops::Db.connector.set_project_deploy_env_field(self.id, e.identifier, "users", e.users)
|
|
end
|
|
end
|
|
|
|
def remove_authorized_user user, env=nil
|
|
return if user.nil?
|
|
users = ( user.is_a?(Array) ? user : [ user ] )
|
|
if env.nil?
|
|
self.deploy_envs.each do |e|
|
|
return unless e.users.is_a?(Array)
|
|
e.users = e.users - users
|
|
Devops::Db.connector.set_project_deploy_env_field(self.id, e.identifier, "users", e.users)
|
|
end
|
|
else
|
|
e = self.deploy_env(env)
|
|
return unless e.users.is_a?(Array)
|
|
e.users = e.users - users
|
|
Devops::Db.connector.set_project_deploy_env_field(self.id, e.identifier, "users", e.users)
|
|
end
|
|
end
|
|
|
|
def check_authorization user_id, env
|
|
e = self.deploy_env(env)
|
|
return true if user_id == User::ROOT_USER_NAME
|
|
return e.users.include? user_id
|
|
rescue RecordNotFound => e
|
|
return false
|
|
end
|
|
|
|
=begin
|
|
def validate!
|
|
super
|
|
check_name_value(self.id)
|
|
|
|
true
|
|
rescue InvalidRecord, ArgumentError => e
|
|
raise InvalidRecord.new "Project '#{self.id}'. #{e.message}"
|
|
end
|
|
=end
|
|
|
|
def delete_deploy_env env
|
|
self.deploy_envs.delete_if {|e| e.identifier == env}
|
|
Devops::Db.connector.remove_deploy_env_from_project self.id, env
|
|
end
|
|
|
|
=begin
|
|
def add_env env
|
|
raise InvalidRecord.new "Deploy environment '#{env.identifier}' for project '#{self.id}' already exist" unless self.deploy_env(env.identifier).nil?
|
|
self.deploy_envs.push env
|
|
end
|
|
=end
|
|
|
|
def to_hash
|
|
h = self.to_hash_without_id
|
|
h["name"] = self.id
|
|
h
|
|
end
|
|
|
|
def to_hash_list
|
|
{
|
|
name: self.id,
|
|
description: self.description
|
|
}
|
|
end
|
|
|
|
def deploy_info deploy_env, build_number
|
|
{
|
|
"use_json_file" => true,
|
|
# "run_list" => Set.new.merge(self.run_list).merge(deploy_env.run_list).to_a,
|
|
"project" => self.id,
|
|
"project_info" => {
|
|
"project" => self.id,
|
|
"deploy_env" => deploy_env.identifier,
|
|
"deployers" => deploy_env.users
|
|
}
|
|
}
|
|
end
|
|
|
|
def to_hash_without_id
|
|
h = {}
|
|
h["deploy_envs"] = self.deploy_envs.map {|e| e.to_hash} unless self.deploy_envs.nil?
|
|
h["archived"] = self.archived if self.archived
|
|
h["description"] = self.description
|
|
h["run_list"] = self.run_list
|
|
if self.multi?
|
|
h["type"] = MULTI_TYPE
|
|
end
|
|
h
|
|
end
|
|
|
|
def multi?
|
|
self.type == MULTI_TYPE
|
|
end
|
|
|
|
def create
|
|
res = {}
|
|
res[:before] = self.run_hook :before_create
|
|
Devops::Db.connector.project_insert self
|
|
res[:after] = self.run_hook :after_create
|
|
res
|
|
end
|
|
|
|
def delete
|
|
res = {}
|
|
res[:before] = self.run_hook :before_delete
|
|
Devops::Db.connector.project_delete self.id
|
|
res[:after] = self.run_hook :after_delete
|
|
res
|
|
end
|
|
|
|
def extract_servers env, params
|
|
@handler.extract_servers(self, env, params)
|
|
end
|
|
|
|
def self.build_from_bson p
|
|
p["name"] = p["_id"]
|
|
Project.new p
|
|
end
|
|
|
|
#TODO: create validator
|
|
def validate_components
|
|
raise InvalidRecord.new "Components is not a hash" unless self.components.is_a?(Hash)
|
|
self.components.each do |id, c|
|
|
raise InvalidRecord.new "Component '#{id}' has no attribute 'filename'" unless c.key?("filename")
|
|
end
|
|
end
|
|
|
|
def self.create_roles_response roles
|
|
if roles.is_a?(String)
|
|
roles
|
|
else
|
|
info = ""
|
|
info += " Project roles '#{roles[:new].join("', '")}' have been automaticaly created" unless roles[:new].nil?
|
|
info += " Project roles '#{roles[:exist].join("', '")}' weren't created because they exist" unless roles[:exist].nil?
|
|
info += " Project roles '#{roles[:error].join("', '")}' weren't created because of internal error" unless roles[:error].nil?
|
|
info
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|