fluke/devops-service/db/mongo/models/environment/category.rb
Tim Lianov 03dc3d8d99 v3
2018-04-04 22:44:39 +03:00

102 lines
3.4 KiB
Ruby

require_relative 'configuration_management/chef'
module Devops
module Model
class Category
include ActiveModel::Validations
attr_accessor :id, :provider, :cm_tool
MAX_LEN = 100
ID_REGEX = /\A[\w\-\.]{1,#{MAX_LEN}}\z/
# validates_presence_of :id, message: "'id' is undefined"
validates_length_of :id, minimum: 1, maximum: MAX_LEN
validates_format_of :id, with: ID_REGEX, message: "invalid id, it should contains 'a-zA-Z0-9-.' symbols"
# validates_presence_of :provider, message: "'provider' is undefined"
# validates_presence_of :cm_tool, message: "'cm_tool' is undefined"
def initialize hash
raise InvalidRecord.new("Parameter 'id' is not a string") unless hash["id"].is_a?(String)
raise InvalidRecord.new("Parameter 'provider' is not an object") unless hash["provider"].is_a?(Hash)
raise InvalidRecord.new("Parameter 'cm_tool' is not an object") unless hash["cm_tool"].is_a?(Hash)
self.id = hash["id"]
self.provider = Provider.create_category_provider(hash["provider"])
self.cm_tool = ConfigurationManagement::Chef.new(hash["cm_tool"])
end
def to_hash
{
"id" => self.id,
"provider" => self.provider.to_hash,
"cm_tool" => self.cm_tool.to_hash
}
end
def validate!
raise Devops::Exception::ValidationError.create_from_messages(self.errors.messages) unless self.valid?
end
def create_role(project_id, env_id)
return {} if cm_tool.use_json_file?
knife = knife_instance(project_id, env_id)
create_roles_unless_exist(project_id, env_id, knife)
end
def knife_instance(project_id, env_id)
knife = KnifeFactory.instance(self.cm_tool.chef_env)
if knife.nil?
msg = "Unknown chef_env '#{cm_tool.chef_env}' for project '#{project_id}/#{env_id}/#{id}'"
DevopsLogger.logger.error msg
raise msg
end
knife
end
def self.present_created_roles(roles)
return "error in creating roles" unless roles
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
private
def create_roles_unless_exist(project_id, env_id, knife)
info = {}
begin
role_name = knife.role_name(project_id, env_id, self.id)
if fetch_roles(knife).include?(role_name)
info[:exist] = [role_name]
else
knife.create_role role_name, project_id, env_id
info[:new] = [role_name]
DevopsLogger.logger.info "Role '#{role_name}' created"
end
self.run_list << "role[#{role_name}]"
rescue => er
info[:error] = [role_name]
DevopsLogger.logger.error "Role '#{role_name}' can not be created: #{er.message}"
end
info
end
def fetch_roles(knife)
roles = knife.roles
unless roles
msg = "Can't get roles list from chef env '#{cm_tool.chef_env}'"
DevopsLogger.logger.error msg
raise msg
end
roles
end
end
end
end