diff --git a/devops-service/app/api2/handlers/project.rb b/devops-service/app/api2/handlers/project.rb index 93ec9c6..80f4b01 100644 --- a/devops-service/app/api2/handlers/project.rb +++ b/devops-service/app/api2/handlers/project.rb @@ -80,6 +80,20 @@ module Devops "Updated project '#{project.id}' with components '#{body["components"].inspect}'" end + def add_deploy_env id + project = Devops::Db.connector.project(id) + env = parser.add_deploy_env + env.add_users [parser.current_user] + env.validate! + begin + db_env = project.deploy_env(env.identifier) + raise InvalidRecord.new("Can not add new environment for project '#{id}'. Environment '#{env.identifier}' already exist") + rescue RecordNotFound => e + res = project.add_deploy_env env + return "Deploy environment '#{env.identifier}' has been added to project '#{project.id}'." + res, env + end + end + def add_or_update_deploy_env id, deploy_env project = Devops::Db.connector.project(id) env = parser.add_or_update_deploy_env diff --git a/devops-service/app/api2/parsers/project.rb b/devops-service/app/api2/parsers/project.rb index 5138fc9..e300977 100644 --- a/devops-service/app/api2/parsers/project.rb +++ b/devops-service/app/api2/parsers/project.rb @@ -45,6 +45,11 @@ module Devops c end + def add_deploy_env + body = create_object_from_json_body + Devops::Model::DeployEnvFactory.create(body) + end + def add_or_update_deploy_env body = create_object_from_json_body rl = check_array(body["run_list"], "Parameter 'run_list' should be an array of string", String, false, true) diff --git a/devops-service/app/api2/routes/project.rb b/devops-service/app/api2/routes/project.rb index 7d33349..973bbc4c 100644 --- a/devops-service/app/api2/routes/project.rb +++ b/devops-service/app/api2/routes/project.rb @@ -211,6 +211,18 @@ module Devops json Devops::API2_0::Handler::Project.new(request).project_deploy_envs(project) end + # Add project deploy environment + # + # * *Request* + # - method : POST + # - headers : + # - Accept: application/json + app.post_with_headers "/project/:project/deploy_env", :headers => [:accept, :content_type] do |project| + check_privileges("project", "w") + res, env = Devops::API2_0::Handler::Project.new(request).add_deploy_env(project) + create_response(res, {environment: env.to_hash}, 200) + end + deploy_env_hash = {} # Get project deploy environment # diff --git a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb index 5fecd43..4d8eb29 100644 --- a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb +++ b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb @@ -45,6 +45,36 @@ module Devops "Deploy environment '#{self.identifier}'. " + message end + def create_role project_id + knife = KnifeFactory.instance + 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 + return {error: msg} + end + role_name = knife.role_name(project_id, self.identifier) + begin + if all_roles.include? role_name + info[:exist] = role_name + else + knife.create_role role_name, project_id, self.identifier + 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 + end end end diff --git a/devops-service/db/mongo/models/project.rb b/devops-service/db/mongo/models/project.rb index fb67c8f..f8a51e7 100644 --- a/devops-service/db/mongo/models/project.rb +++ b/devops-service/db/mongo/models/project.rb @@ -19,6 +19,8 @@ module Devops define_hook :before_delete define_hook :after_delete + #define_hook :after_add_deploy_env + attr_accessor :id, :deploy_envs, :type, :archived, :description, :run_list types :id => {:type => String, :empty => false}, @@ -63,8 +65,9 @@ module Devops end def add_deploy_env deploy_env + res = deploy_env.create_role(self.id) Devops::Db.connector.add_deploy_env_to_project self.id, deploy_env - "" + create_roles_response(res) end def add_authorized_user user, env=nil @@ -207,6 +210,18 @@ module Devops end end + def create_roles_response roles + if roles.is_a?(String) + roles + else + info = "" + info += " Project roles '#{roles[:new].join("', '")}' have been automaticaly created" unless roles[:new].empty? + info += " Project roles '#{roles[:exist].join("', '")}' weren't created because they exist" unless roles[:exist].empty? + info += " Project roles '#{roles[:error].join("', '")}' weren't created because of internal error" unless roles[:error].empty? + info + end + end + end end end