fluke/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb

131 lines
4.8 KiB
Ruby
Raw Normal View History

2014-06-24 13:40:52 +04:00
require "db/mongo/models/mongo_model"
2015-02-12 13:01:05 +03:00
require "providers/provider_factory"
2015-08-04 12:36:10 +03:00
require "db/mongo/models/model_with_provider"
2014-06-24 13:40:52 +04:00
2015-03-06 12:20:30 +03:00
module Devops
module Model
class DeployEnvBase < MongoModel
2014-06-24 13:40:52 +04:00
2015-08-04 12:36:10 +03:00
include ModelWithProvider
2014-06-24 13:40:52 +04:00
2015-11-19 14:09:38 +03:00
# attr_accessor :identifier, :run_list, :expires, :users
set_validators ::Validators::DeployEnv::RunList,
::Validators::DeployEnv::Expiration,
::Validators::DeployEnv::Users
2014-06-24 13:40:52 +04:00
2015-11-19 14:09:38 +03:00
set_field_validators :identifier, [::Validators::FieldValidator::NotNil,
::Validators::FieldValidator::FieldType::String,
::Validators::FieldValidator::NotEmpty,
2015-11-19 14:09:38 +03:00
::Validators::FieldValidator::Name]
2015-11-19 14:09:38 +03:00
set_field_validators :run_list, [::Validators::FieldValidator::NotNil,
::Validators::FieldValidator::FieldType::Array,
2015-11-19 14:09:38 +03:00
::Validators::FieldValidator::RunList]
2015-11-19 14:09:38 +03:00
set_field_validators :users, [::Validators::FieldValidator::NotNil,
::Validators::FieldValidator::FieldType::Array]
2015-11-19 14:09:38 +03:00
set_field_validators :expires, [::Validators::FieldValidator::Nil,
::Validators::FieldValidator::FieldType::String,
2015-11-19 14:09:38 +03:00
::Validators::FieldValidator::Expires]
2016-02-12 21:13:09 +03:00
set_field_validators :chef_client_options, [::Validators::FieldValidator::Nil,
::Validators::FieldValidator::FieldType::String,
::Validators::FieldValidator::NotEmpty]
2015-03-06 12:20:30 +03:00
def initialize d={}
self.identifier = d["identifier"]
set_provider(d)
2015-03-06 12:20:30 +03:00
b = d["run_list"] || []
self.run_list = b.uniq
2015-03-06 12:20:30 +03:00
self.expires = d["expires"]
b = d["users"] || []
self.users = b.uniq
2016-02-12 21:13:09 +03:00
self.chef_client_options = d["chef_client_options"]
2015-03-06 12:20:30 +03:00
end
2014-06-24 13:40:52 +04:00
2015-03-06 12:20:30 +03:00
def to_hash
{
"identifier" => self.identifier,
"run_list" => self.run_list,
"expires" => self.expires,
2016-02-12 21:13:09 +03:00
"users" => self.users,
"chef_client_options" => self.chef_client_options
}.merge(provider_hash)
2015-03-06 12:20:30 +03:00
end
2014-06-24 13:40:52 +04:00
2015-09-22 14:30:52 +03:00
def add_users users
self.users = (self.users + users).uniq
end
def rename project_id, new_name
old_name = self.identifier
self.identifier = new_name
self.validate_identifier!
begin
project = Devops::Db.connector.project(project_id)
project.deploy_env(self.identifier)
raise InvalidRecord.new("Environment with identifier '#{new_name}' already exist in project '#{project_id}'")
rescue RecordNotFound => e
res = create_role(project_id)
knife = knife_instance
old_role_name = knife.role_name(project_id, old_name)
self.run_list.delete("role[#{old_role_name}]")
role = res[:new] || res[:exist]
self.run_list << "role[#{role[0]}]" unless role.nil?
Devops::Db.connector.set_project_deploy_env_field(project_id, old_name, {"identifier" => new_name, "run_list" => self.run_list})
2015-11-03 11:46:54 +03:00
msg = "Project '#{project_id}': environment '#{old_name}' has been renamed to '#{new_name}'." + ::Devops::Model::Project.create_roles_response(res)
DevopsLogger.logger.info(msg)
msg
end
end
def update_field project_id, field, value
self.send(field + "=", value)
self.send("validate_" + field + "!")
Devops::Db.connector.set_project_deploy_env_field(project_id, self.identifier, {field => value})
end
2015-03-06 12:20:30 +03:00
def build_error_message(message)
"Deploy environment '#{self.identifier}'. " + message
end
2015-02-12 13:01:05 +03:00
2015-10-05 14:54:47 +03:00
def create_role project_id
knife = knife_instance
2015-10-05 14:54:47 +03:00
if knife.nil?
DevopsLogger.logger.error "Can not get knife instance"
return nil
end
all_roles = knife.roles
info = {}
if all_roles.nil?
msg = "Can't get roles list from chef"
DevopsLogger.logger.error msg
return {error: [msg]}
2015-10-05 14:54:47 +03:00
end
role_name = knife.role_name(project_id, self.identifier)
begin
if all_roles.include? role_name
info[:exist] = [role_name]
2015-10-05 14:54:47 +03:00
else
knife.create_role role_name, project_id, self.identifier
info[:new] = [role_name]
2015-10-05 14:54:47 +03:00
DevopsLogger.logger.info "Role '#{role_name}' created"
end
self.run_list << "role[#{role_name}]"
rescue => er
info[:error] = [role_name]
2015-10-05 14:54:47 +03:00
DevopsLogger.logger.error "Role '#{role_name}' can not be created: #{er.message}"
end
info
end
def knife_instance
KnifeFactory.instance
end
2015-03-06 12:20:30 +03:00
end
end
2014-06-24 13:40:52 +04:00
end