diff --git a/devops-service/db/mongo/connectors/project.rb b/devops-service/db/mongo/connectors/project.rb index c6cfcd6..38ba200 100644 --- a/devops-service/db/mongo/connectors/project.rb +++ b/devops-service/db/mongo/connectors/project.rb @@ -22,10 +22,15 @@ module Connectors list end - def projects ids=nil, type=nil, fields=[] + def projects ids=nil, type=nil, fields=[], archived=false query = {} query['_id'] = {'$in' => ids} if ids query['type'] = 'multi' if type == :multi + if archived + query["archived"] = true + else + query["archived"] = {"$exists" => false} + end list(query, fields: fields) end @@ -74,6 +79,14 @@ module Connectors list('deploy_envs.users' => user) end + def archive_project id + @collection.update({"_id" => id}, {"$set" => {"archived" => true}}) + end + + def unarchive_project id + @collection.update({"_id" => id}, {"$unset" => {"archived" => ""}}) + end + def check_project_auth(project_id, env, user_id) project = show(project_id) raise InvalidPrivileges.new("User '#{user_id}' unauthorized to work with project '#{project_id}'") unless project.check_authorization(user_id, env) diff --git a/devops-service/db/mongo/models/project.rb b/devops-service/db/mongo/models/project.rb index 37429b7..cf38305 100644 --- a/devops-service/db/mongo/models/project.rb +++ b/devops-service/db/mongo/models/project.rb @@ -8,21 +8,24 @@ require "json" class Project < MongoModel - attr_accessor :id, :deploy_envs, :type + attr_accessor :id, :deploy_envs, :type, :archived, :description types :id => {:type => String, :empty => false}, - :deploy_envs => {:type => Array, :value_type => false, :empty => false} + :deploy_envs => {:type => Array, :value_type => false, :empty => false}, + :description => {:type => String, :empty => true, :nil => true} MULTI_TYPE = "multi" def self.fields - ["deploy_envs", "type"] + ["deploy_envs", "type", "description"] end def initialize p={} self.id = p["name"] #raise InvalidRecord.new "No deploy envirenments for project #{self.id}" if p["deploy_envs"].nil? or p["deploy_envs"].empty? self.type = p["type"] + self.description = p["description"] + self.archived = p["archived"] || false env_class = ( self.multi? ? DeployEnvMulti : DeployEnvFactory ) unless p["deploy_envs"].nil? self.deploy_envs = [] @@ -116,6 +119,8 @@ class Project < MongoModel def to_hash_without_id h = {} h["deploy_envs"] = self.deploy_envs.map {|e| e.to_hash} unless self.deploy_envs.nil? + h["archived"] = self.archived + h["description"] = self.description if self.multi? h["type"] = MULTI_TYPE end diff --git a/devops-service/devops-service.rb b/devops-service/devops-service.rb index 829079c..7d1115a 100644 --- a/devops-service/devops-service.rb +++ b/devops-service/devops-service.rb @@ -37,6 +37,14 @@ class DevopsService Devops::Routes.route "/sidekiq", Sidekiq::Web end + # steps: + # 1. init db + # 2. load application handlers + # 3. load plugins + # 4. load application routes + # 5. add plugins routes + # 6. init all routes classes + # 7. register routes for all classes def init # init database Devops::Db.init diff --git a/devops-service/routes/v2.0.rb b/devops-service/routes/v2.0.rb index 2367723..6af2287 100644 --- a/devops-service/routes/v2.0.rb +++ b/devops-service/routes/v2.0.rb @@ -76,8 +76,6 @@ module Devops settings.mongo.create_root_user ::Provider::ProviderFactory.init(config) #set_up_providers_keys!(::Provider::ProviderFactory.all, mongo) - Wisper::GlobalListeners.subscribe(TestSubscriber2.new) - Wisper.subscribe(TestSubscriber.new) end diff --git a/devops-service/routes/v2.0/handlers/project.rb b/devops-service/routes/v2.0/handlers/project.rb index 12a3b02..3497de3 100644 --- a/devops-service/routes/v2.0/handlers/project.rb +++ b/devops-service/routes/v2.0/handlers/project.rb @@ -22,7 +22,8 @@ module Devops fields.push k if params["fields"].include?(k) end end - json settings.mongo.projects(nil, nil, fields).map {|p| p.to_hash} + archived = params.include?("archived") + json settings.mongo.projects(nil, nil, fields, archived).map {|p| p.to_hash} } end @@ -199,12 +200,45 @@ module Devops } end + def self.archive_project + lambda { + check_privileges("project", "w") + project = settings.mongo.project(params[:project]) + if project.nil? + create_response("Project '#{params[:project]}' not found", nil, 404) + else + settings.mongo.archive_project(params[:project]) + info = "Project '#{params[:project]}' has been archived" + create_response(info) + end + } + end + + def self.unarchive_project + lambda { + check_privileges("project", "w") + project = settings.mongo.project(params[:project]) + if project.nil? + create_response("Project '#{params[:project]}' not found", nil, 404) + else + settings.mongo.unarchive_project(params[:project]) + info = "Project '#{params[:project]}' has been unarchived" + create_response(info) + end + } + end + def self.test_project lambda { check_privileges("project", "r") project = settings.mongo.project(params[:id]) env = project.deploy_env params[:env] logger.info "Test project '#{project.id}' and environment '#{env.identifier}'" + if env.provider == Provider::Static::PROVIDER + msg = "Can not test environment with provider '#{Provider::Static::PROVIDER}'" + Logger.warn msg + return [400, msg] + end dir = DevopsService.config[:report_dir_v2] uri = URI.parse(request.url) @@ -214,6 +248,7 @@ module Devops :user => request.env['REMOTE_USER'] } jid = ProjectTestWorker.perform_async(dir, p, DevopsService.config) + Worker.set_status jid, Worker::STATUS::IN_QUEUE logger.info "Job '#{jid}' has been created" uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid files = [uri.to_s] diff --git a/devops-service/routes/v2.0/handlers/server.rb b/devops-service/routes/v2.0/handlers/server.rb index 28e2c68..a74f6ad 100644 --- a/devops-service/routes/v2.0/handlers/server.rb +++ b/devops-service/routes/v2.0/handlers/server.rb @@ -120,6 +120,7 @@ module Devops h = s.to_hash h["options"] = s.options jid = CreateServerWorker.perform_async(dir, env.provider, h, request.env['REMOTE_USER'], DevopsService.config) + Worker.set_status jid, Worker::STATUS::IN_QUEUE logger.info "Job '#{jid}' has been started" uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid files.push uri.to_s @@ -163,7 +164,6 @@ module Devops else halt_response("Server with instance ID '#{s.id}' and node name '#{params[:node_name]}' can not be unpaused, It in state '#{r}'", 409) end - } end @@ -179,7 +179,6 @@ module Devops s.reserved_by = user settings.mongo.server_update(s) create_response("Server '#{params[:node_name]}' has been reserved") - } end @@ -262,6 +261,7 @@ module Devops h["options"] = s.options h["_id"] = s.id jid = BootstrapWorker.perform_async(dir, d.provider, h, request.env['REMOTE_USER'], DevopsService.config) + Worker.set_status jid, Worker::STATUS::IN_QUEUE logger.info "Job '#{jid}' has been started" uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid uri.query = nil diff --git a/devops-service/routes/v2.0/project.rb b/devops-service/routes/v2.0/project.rb index cb3b155..7a2eb1c 100644 --- a/devops-service/routes/v2.0/project.rb +++ b/devops-service/routes/v2.0/project.rb @@ -248,6 +248,22 @@ module Devops # * *Returns* : text stream app.post_with_headers "/project/:id/deploy", :headers => [:content_type], &Devops::Version2_0::Handler::Project.deploy_project + # Set project to archivated state + # + # * *Request* + # - method : POST + # - headers : + # - Content-Type: application/json + app.post_with_headers "/project/:project/archive", :headers => [:content_type], &Devops::Version2_0::Handler::Project.archive_project + + # Set project to normal state + # + # * *Request* + # - method : POST + # - headers : + # - Content-Type: application/json + app.post_with_headers "/project/:project/unarchive", :headers => [:content_type], &Devops::Version2_0::Handler::Project.unarchive_project + # Test project environment # # Run tests: