102 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			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 | ||
|  | 
 |