95 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require_relative 'category' | ||
|  | 
 | ||
|  | module Devops | ||
|  |   module Model | ||
|  |     class Environment | ||
|  | 
 | ||
|  |       include ActiveModel::Validations | ||
|  | 
 | ||
|  |       attr_accessor :id, :categories, :run_list, :expires, :users | ||
|  | 
 | ||
|  |       MAX_ID_LEN = 100
 | ||
|  |       NAME_REGEX = /\A[\w\-\.]{1,#{MAX_ID_LEN}}\z/ | ||
|  | 
 | ||
|  | #      validates_presence_of :id, message: "'id' is undefined" | ||
|  |       validates_length_of :id, minimum: 1, maximum: MAX_ID_LEN | ||
|  |       validates_format_of :id, with: NAME_REGEX, message: "invalid id, it should contains 'a-zA-Z0-9-.' symbols" | ||
|  | 
 | ||
|  |       validates :expires, format: { with: /\A[0-9]+[smhdw]\z/, message: "Valid format is '[0-9]+[smhdw]'" }, allow_nil: true | ||
|  |       validates :users, usersArray: true | ||
|  |       validates :run_list, runListArray: true | ||
|  |       validates :categories, categoriesArray: true | ||
|  | 
 | ||
|  |       def get_category category | ||
|  |         self.categories.detect{|e| e.id == category} | ||
|  |       end | ||
|  | 
 | ||
|  |       def get_category!(category) | ||
|  |         c = get_category(category) | ||
|  |         raise Devops::Exception::RecordNotFound.new("Environment '#{self.id}' doesn't have category '#{category}'") unless c | ||
|  |         c | ||
|  |       end | ||
|  | 
 | ||
|  |       def initialize d | ||
|  |         raise InvalidRecord.new("Parameter 'id' is not a string") unless d["id"].is_a?(String) | ||
|  |         raise InvalidRecord.new("Parameter 'users' is not an array") unless d["users"].is_a?(Array) or d["users"].nil? | ||
|  |         raise InvalidRecord.new("Parameter 'run_list' is not an array") unless d["run_list"].is_a?(Array) or d["run_list"].nil? | ||
|  |         raise InvalidRecord.new("Parameter 'categories' is not an array") unless d["categories"].is_a?(Array) or d["categories"].nil? | ||
|  |         self.id = d["id"] | ||
|  |         self.expires = d["expires"] | ||
|  |         self.users = (d["users"] || []).uniq | ||
|  |         self.categories = (d["categories"] || []).map{|cat| Category.new(cat)} | ||
|  |         self.run_list = (d["run_list"] || []).uniq | ||
|  |       end | ||
|  | 
 | ||
|  |       def validate! | ||
|  |         raise Devops::Exception::ValidationError.create_from_messages(self.errors.messages) unless self.valid? | ||
|  |       end | ||
|  | 
 | ||
|  |       def to_hash | ||
|  |         { | ||
|  |           "id" => self.id, | ||
|  |           "run_list" => self.run_list, | ||
|  |           "expires" => self.expires, | ||
|  |           "users" => self.users, | ||
|  |           "categories" => self.categories.map{|c| c.to_hash} | ||
|  |         } | ||
|  |       end | ||
|  | 
 | ||
|  |       def add_users users | ||
|  |         self.users = (self.users + users).uniq | ||
|  |       end | ||
|  | 
 | ||
|  |       # not reimplemented yet; | ||
|  |       def rename project_id, new_name | ||
|  |         old_name = self.id | ||
|  |         self.id = new_name | ||
|  |         self.validate_id! | ||
|  |         begin | ||
|  |           project = Devops::Db.connector.project(project_id) | ||
|  |           project.deploy_env(self.id) | ||
|  |           raise InvalidRecord.new("Environment with id '#{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, {"id" => new_name, "run_list" => self.run_list}) | ||
|  |           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.id, {field => value}) | ||
|  |       end | ||
|  | 
 | ||
|  |     end | ||
|  |   end | ||
|  | end |