| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2015-08-13 15:49:37 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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, | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |                                         ::Validators::FieldValidator::FieldType::String, | 
					
						
							|  |  |  |                                         ::Validators::FieldValidator::NotEmpty, | 
					
						
							| 
									
										
										
										
											2015-11-19 14:09:38 +03:00
										 |  |  |                                         ::Validators::FieldValidator::Name] | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-19 14:09:38 +03:00
										 |  |  |       set_field_validators :run_list, [::Validators::FieldValidator::NotNil, | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |                                       ::Validators::FieldValidator::FieldType::Array, | 
					
						
							| 
									
										
										
										
											2015-11-19 14:09:38 +03:00
										 |  |  |                                       ::Validators::FieldValidator::RunList] | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-19 14:09:38 +03:00
										 |  |  |       set_field_validators :users, [::Validators::FieldValidator::NotNil, | 
					
						
							|  |  |  |                                    ::Validators::FieldValidator::FieldType::Array] | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-19 14:09:38 +03:00
										 |  |  |       set_field_validators :expires, [::Validators::FieldValidator::Nil, | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |                                      ::Validators::FieldValidator::FieldType::String, | 
					
						
							| 
									
										
										
										
											2015-11-19 14:09:38 +03:00
										 |  |  |                                      ::Validators::FieldValidator::Expires] | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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"] | 
					
						
							| 
									
										
										
										
											2015-10-27 12:01:21 +03:00
										 |  |  |         set_provider(d) | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         b = d["run_list"] || [] | 
					
						
							| 
									
										
										
										
											2015-08-13 15:49:37 +03:00
										 |  |  |         self.run_list = b.uniq | 
					
						
							| 
									
										
										
										
											2015-03-06 12:20:30 +03:00
										 |  |  |         self.expires = d["expires"] | 
					
						
							|  |  |  |         b = d["users"] || [] | 
					
						
							| 
									
										
										
										
											2015-08-13 15:49:37 +03:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2015-10-27 12:01:21 +03:00
										 |  |  |         }.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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |       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) | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |           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 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |           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 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |             info[:exist] = [role_name] | 
					
						
							| 
									
										
										
										
											2015-10-05 14:54:47 +03:00
										 |  |  |           else | 
					
						
							|  |  |  |             knife.create_role role_name, project_id, self.identifier | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |             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 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |           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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |       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 |