archived projects

This commit is contained in:
amartynov 2015-03-03 12:46:35 +03:00
parent 10d29624ba
commit d36f3347f1
7 changed files with 84 additions and 9 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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