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
 | |
| 
 | 
