fluke/devops-service/app/api2/handlers/project.rb

295 lines
11 KiB
Ruby
Raw Normal View History

2014-12-22 14:22:04 +03:00
require "commands/status"
require "db/mongo/models/project"
require "workers/project_test_worker"
2015-07-30 15:37:43 +03:00
require "app/api2/parsers/project"
2015-07-31 15:08:40 +03:00
require "lib/project/type/types_factory"
2015-07-27 18:27:52 +03:00
require_relative "../helpers/version_2.rb"
2015-07-27 15:40:10 +03:00
require_relative "request_handler"
2014-12-22 14:22:04 +03:00
module Devops
2015-07-27 15:40:10 +03:00
module API2_0
2014-12-22 14:22:04 +03:00
module Handler
2015-07-27 15:40:10 +03:00
class Project < RequestHandler
2015-07-30 15:37:43 +03:00
set_parser Devops::API2_0::Parser::ProjectParser
2015-07-27 18:27:52 +03:00
include Devops::API2_0::Helpers
2014-12-22 14:22:04 +03:00
extend StatusCommands
2015-07-31 15:08:40 +03:00
def project_types
Devops::TypesFactory.types_names
end
2015-07-27 15:40:10 +03:00
def projects
2015-08-03 15:09:04 +03:00
Devops::Db.connector.projects(nil, nil, parser.projects, parser.archived_projects)
2014-12-22 14:22:04 +03:00
end
2015-07-27 15:40:10 +03:00
def project id
Devops::Db.connector.project(id)
2014-12-22 14:22:04 +03:00
end
def project_deploy_envs(id)
project = Devops::Db.connector.project(id)
project.deploy_envs
end
def project_deploy_env(project_id, env)
project = Devops::Db.connector.project(project_id)
project.deploy_env(env)
end
2015-07-27 15:40:10 +03:00
def project_servers id
Devops::Db.connector.project(id)
2015-07-30 15:37:43 +03:00
Devops::Db.connector.servers(id, parser.project_servers)
2014-12-22 14:22:04 +03:00
end
2015-07-27 18:27:52 +03:00
def project_stacks id
# check if project exists
Devops::Db.connector.project(id)
2015-07-30 15:37:43 +03:00
options = {project: id}
deploy_env = parser.project_stacks
options[:deploy_env] = deploy_env if deploy_env
2015-07-27 18:27:52 +03:00
Devops::Db.connector.stacks(options)
end
2015-07-30 15:37:43 +03:00
def create_project
p = parser.create_project
2015-07-27 18:27:52 +03:00
raise InvalidRecord.new("Project '#{p.id}' already exist") if Devops::Db.connector.is_project_exists?(p)
2015-07-30 15:37:43 +03:00
p.add_authorized_user [parser.current_user]
2015-07-27 15:40:10 +03:00
p.create
if p.multi?
"Project '#{p.id}' with type 'multi' created"
else
#roles = create_roles p.id, p.deploy_envs
"Project '#{p.id}' created. "# + create_roles_response(roles)
2015-07-27 15:40:10 +03:00
end
2014-12-22 14:22:04 +03:00
end
2015-09-14 17:47:11 +03:00
def set_project_components id
body = parser.set_project_components
2015-09-14 17:51:24 +03:00
project = Devops::Db.connector..project(id)
2015-09-14 17:47:11 +03:00
project.components = body["components"]
project.validate_components
Devops::Db.connector.project_update id, "components", body["components"]
"Updated project '#{project.id}' with components '#{body["components"].inspect}'"
end
2015-09-11 16:18:20 +03:00
def add_or_update_deploy_env id, deploy_env
project = Devops::Db.connector.project(id)
2015-09-11 16:18:20 +03:00
env = parser.add_or_update_deploy_env
begin
db_env = project.deploy_env(deploy_env)
2015-09-11 16:26:41 +03:00
servers = Devops::Db.connector.servers_by_project_and_deploy_env(id, deploy_env)
raise InvalidRecord.new("Can not update environment '#{deploy_env}', there are #{servers.size} servers on it") unless servers.empty?
2015-09-11 16:18:20 +03:00
begin
project.deploy_env(env.identifier)
raise InvalidRecord.new("Can not change environment '#{deploy_env}' to '#{env.identifier}', environment '#{env.identifier}' already exist") unless deploy_env == env.identifier
rescue RecordNotFound => e
end
project.delete_deploy_env(deploy_env)
project.add_deploy_env(env)
"Deploy environment '#{deploy_env}' has been updated in project '#{project.id}'"
rescue RecordNotFound => e
env.identifier = deploy_env
project.add_deploy_env env
"Deploy environment '#{env.identifier}' has been added to project '#{project.id}'"
end
end
2015-07-30 15:37:43 +03:00
def update_project id
project = parser.update
2015-07-27 15:40:10 +03:00
project.id = id
old_project = Devops::Db.connector.project id
Devops::Db.connector.project_update project
# roles = create_new_roles(old_project, project)
# create_roles_response(roles)
2014-12-22 14:22:04 +03:00
end
# TODO: multi project
2015-07-30 15:37:43 +03:00
def update_project_users id
deploy_env, users = parser.project_users
2015-07-27 15:40:10 +03:00
project = Devops::Db.connector.project(id)
dbusers = Devops::Db.connector.users(users).map{|u| u.id}
buf = dbusers - users
project.add_authorized_user users, deploy_env
Devops::Db.connector.project_update(project)
info = "Users '#{dbusers.join("', '")}' has been added to '#{id}' project's authorized users"
info << ", invalid users: '#{buf.join("', '")}'" unless buf.empty?
info
2014-12-22 14:22:04 +03:00
end
# TODO: multi project
2015-07-30 15:37:43 +03:00
def delete_project_users id
deploy_env, users = parser.project_users
2015-07-27 15:40:10 +03:00
project = Devops::Db.connector.project(id)
project.remove_authorized_user users, deploy_env
Devops::Db.connector.project_update project
"Users '#{users.join("', '")}' have been removed from '#{id}' project's authorized users"
2014-12-22 14:22:04 +03:00
end
2015-08-04 12:36:10 +03:00
def set_project_run_list id
list = parser.run_list
project = Devops::Db.connector.project(id)
Devops::Db.connector.set_project_run_list id, list
"Updated project with run_list '#{list.inspect}'"
end
2015-07-30 15:37:43 +03:00
def set_project_env_run_list id, deploy_env
list = parser.run_list
2015-07-27 15:40:10 +03:00
project = Devops::Db.connector.project(id)
env = project.deploy_env deploy_env
2015-08-04 12:36:10 +03:00
Devops::Db.connector.set_project_env_run_list id, deploy_env, list
"Updated environment '#{env.identifier}' with run_list '#{list.inspect}' in project '#{project.id}'"
2015-07-27 15:40:10 +03:00
end
2015-07-30 15:37:43 +03:00
def delete_project id
deploy_env = parser.delete
2015-07-27 15:40:10 +03:00
servers = Devops::Db.connector.servers id
raise DependencyError.new "Deleting #{id} is forbidden: Project has servers" if !servers.empty?
project = Devops::Db.connector.project(id)
info = if deploy_env.nil?
project.delete
"Project '#{id}' is deleted"
else
2015-09-11 16:18:20 +03:00
project.delete_deploy_env(deploy_env)
2015-07-27 15:40:10 +03:00
"Project '#{id}'. Deploy environment '#{deploy_env}' has been deleted"
end
2014-12-22 14:22:04 +03:00
end
2015-07-30 15:37:43 +03:00
def deploy_project_stream out, id
deploy_env, servers = parser.deploy
2015-07-27 15:40:10 +03:00
keys = {}
dbserver = servers(id, deploy_env, servers)
out << (dbservers.empty? ? "No reserved servers to deploy\n" : "Deploy servers: '#{dbservers.map{|s| s.chef_node_name}.join("', '")}'\n")
status = []
servers.each do |s|
project = begin
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
2015-07-27 15:40:10 +03:00
rescue InvalidPrivileges, RecordNotFound => e
out << e.message + "\n"
status.push 2
next
2014-12-22 14:22:04 +03:00
end
deploy_info = project.deploy_info(s.deploy_env, nil)
status.push(Devops::Executor::ServerExecutor.new(s, out).deploy_server(deploy_info))
2015-07-27 15:40:10 +03:00
end
status
end
2015-07-30 15:37:43 +03:00
def deploy_project id
deploy_env, servers = parser.deploy
2015-07-27 15:40:10 +03:00
files = []
servers(id, deploy_env, servers).each do |s|
2015-09-02 11:38:58 +03:00
begin
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
2015-07-27 15:40:10 +03:00
rescue InvalidPrivileges, RecordNotFound => e
next
end
2015-09-02 11:38:58 +03:00
project_model = project(s.project)
deploy_env_model = project_model.deploy_env(deploy_env)
puts '!!! WARNING !!!'
puts 'build_number is set to empty string'
build_number = ''
deploy_info = project_model.deploy_info(deploy_env_model, build_number)
uri = Worker.start_async(DeployWorker, @request,
server_attrs: s.to_hash,
owner: parser.current_user,
tags: [],
deploy_info: deploy_info
)
files.push uri
2015-07-27 15:40:10 +03:00
end
files
2014-12-22 14:22:04 +03:00
end
2015-07-27 15:40:10 +03:00
def servers project_id, deploy_env, servers
project = Devops::Db.connector.project(project_id)
dbservers = Devops::Db.connector.servers(project_id, deploy_env, servers, true)
2014-12-22 14:22:04 +03:00
end
2015-07-27 15:40:10 +03:00
def archive_project id
project = Devops::Db.connector.project(id)
Devops::Db.connector.archive_project(id)
"Project '#{id}' has been archived"
2015-03-03 12:46:35 +03:00
end
2015-07-27 15:40:10 +03:00
def unarchive_project id
project = Devops::Db.connector.project(id)
Devops::Db.connector.unarchive_project(id)
"Project '#{id}' has been unarchived"
2015-03-03 12:46:35 +03:00
end
2015-07-27 15:40:10 +03:00
def test_project id, deploy_env
project = Devops::Db.connector.project(id)
env = project.deploy_env deploy_env
2015-07-30 15:37:43 +03:00
DevopsLogger.logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
2015-07-27 15:40:10 +03:00
if env.provider == ::Provider::Static::PROVIDER
msg = "Can not test environment with provider '#{::Provider::Static::PROVIDER}'"
Logger.warn msg
raise InvalidRecord.new(msg)
end
2014-12-22 14:22:04 +03:00
2015-09-03 17:03:47 +03:00
uri = Worker.start_async(ProjectTestWorker, @request,
project: project.id,
deploy_env: env.identifier,
user: @request.env['REMOTE_USER']
)
2015-07-27 15:40:10 +03:00
sleep 1
2015-09-03 17:03:47 +03:00
return [uri]
2014-12-22 14:22:04 +03:00
end
2015-09-11 16:18:20 +03:00
=begin
2015-07-30 15:37:43 +03:00
def create_roles project_id, envs
all_roles = KnifeFactory.instance.roles
2014-12-22 14:22:04 +03:00
return " Can't get roles list" if all_roles.nil?
roles = {:new => [], :error => [], :exist => []}
envs.each do |e|
role_name = KnifeCommands.role_name(project_id, e.identifier)
begin
if all_roles.include? role_name
roles[:exist].push role_name
else
KnifeCommands.create_role role_name, project_id, e.identifier
roles[:new].push role_name
2015-07-30 15:37:43 +03:00
DevopsLogger.logger.info "Role '#{role_name}' created"
2014-12-22 14:22:04 +03:00
end
rescue => er
roles[:error].push role_name
2015-07-30 15:37:43 +03:00
DevopsLogger.logger.error "Role '#{role_name}' can not be created: #{er.message}"
2014-12-22 14:22:04 +03:00
end
end
roles
end
2015-07-30 15:37:43 +03:00
def create_new_roles old_project, new_project
2014-12-22 14:22:04 +03:00
old_project.deploy_envs.each do |e|
2015-09-11 16:18:20 +03:00
new_project.deploy_envs.delete_if {|env| e.identifier == env.identifier}
2014-12-22 14:22:04 +03:00
end
2015-07-30 15:37:43 +03:00
create_roles new_project.id, new_project.deploy_envs
2014-12-22 14:22:04 +03:00
end
2015-07-27 15:40:10 +03:00
def create_roles_response roles
2014-12-22 14:22:04 +03:00
if roles.is_a?(String)
roles
else
info = ""
info += " Project roles '#{roles[:new].join("', '")}' have been automaticaly created" unless roles[:new].empty?
info += " Project roles '#{roles[:exist].join("', '")}' weren't created because they exist" unless roles[:exist].empty?
info += " Project roles '#{roles[:error].join("', '")}' weren't created because of internal error" unless roles[:error].empty?
info
end
end
2015-09-11 16:18:20 +03:00
=end
2014-12-22 14:22:04 +03:00
end
end
end
end