#750: add reserve and unreserve commands for stack

This commit is contained in:
Anton Chuchkalov 2015-09-24 15:06:02 +03:00
parent 762572553c
commit cdeecb02e4
8 changed files with 108 additions and 1 deletions

View File

@ -30,6 +30,10 @@ class Stack < Handler
output output
when :deploy when :deploy
deploy_handler deploy_handler
when :reserve
reserve_handler
when :unreserve
unreserve_handler
when :resources when :resources
resources_handler resources_handler
if @args[3] if @args[3]
@ -120,6 +124,18 @@ class Stack < Handler
puts response.inspect puts response.inspect
end end
def reserve_handler
stack_id = @args[2]
response = post "/stack/#{stack_id}/reserve"
puts response.inspect
end
def unreserve_handler
stack_id = @args[2]
response = post "/stack/#{stack_id}/unreserve"
puts response.inspect
end
private private
def provider_stacks(provider) def provider_stacks(provider)

View File

@ -2,7 +2,7 @@ require "devops-client/options/common_options"
class StackOptions < CommonOptions class StackOptions < CommonOptions
commands :create, :delete, :list, :show, :sync, :resources, :deploy commands :create, :delete, :list, :show, :sync, :resources, :deploy, :reserve, :unreserve
def initialize args, def_options def initialize args, def_options
super(args, def_options) super(args, def_options)
@ -14,6 +14,7 @@ class StackOptions < CommonOptions
self.sync_params = ["STACK"] self.sync_params = ["STACK"]
self.resources_params = ["STACK"] self.resources_params = ["STACK"]
self.deploy_params = ["STACK"] self.deploy_params = ["STACK"]
self.reserve_params = ["STACK"]
end end
def create_options def create_options

View File

@ -172,6 +172,38 @@ module Devops
[-10] [-10]
end end
def reserve_servers(stack_id)
stack = self.stack(stack_id)
user = parser.current_user
Devops::Db.connector.check_project_auth stack.project, stack.deploy_env, user
# check if none of servers are reserved by somebody else
servers = Devops::Db.connector.stack_servers(stack_id)
servers.each do |server|
if server.reserved_by.present? && server.reserved_by != user
raise ConflictException.new("Server '#{server.chef_node_name}' already reserved by #{server.reserved_by}")
end
end
# reserve them
servers.each do |server|
server.reserved_by = user
Devops::Db.connector.server_update(server)
end
end
def unreserve_servers(stack_id)
stack = self.stack(stack_id)
user = parser.current_user
Devops::Db.connector.check_project_auth stack.project, stack.deploy_env, user
servers = Devops::Db.connector.stack_servers(stack_id)
servers.each do |server|
server.reserved_by = nil
Devops::Db.connector.server_update(server)
end
end
end end
end end
end end

View File

@ -111,6 +111,42 @@ module Devops
end end
end end
# Reserve stack instances
#
# * *Request*
# - method : POST
# - headers :
# - Accept: application/json
# - Content-Type: application/json
#
# * *Returns* :
# 200 - OK
app.post_with_headers "/stack/:id/reserve", :headers => [:accept, :content_type] do |id|
check_privileges("stack", "r")
check_privileges("server", "w")
Devops::API2_0::Handler::Stack.new(request).reserve_servers(id)
create_response("Servers of stack '#{id}' has been reserved")
end
# Unreserve stack instances
#
# * *Request*
# - method : POST
# - headers :
# - Accept: application/json
# - Content-Type: application/json
#
# * *Returns* :
# 200 - OK
app.post_with_headers "/stack/:id/unreserve", :headers => [:accept, :content_type] do |id|
check_privileges("stack", "r")
check_privileges("server", "w")
Devops::API2_0::Handler::Stack.new(request).unreserve_servers(id)
create_response("Servers of stack '#{id}' has been unreserved")
end
hash = {} hash = {}
# Add tags to stack instances # Add tags to stack instances
# #

View File

@ -1,5 +1,7 @@
require "wisper" require "wisper"
require "lib/hash_ext" require "lib/hash_ext"
require "lib/nil_class_ext"
require "lib/string_ext"
require_relative "devops-loader" require_relative "devops-loader"
require_relative "devops-application" require_relative "devops-application"

View File

@ -0,0 +1,9 @@
class NilClass
def blank?
true
end
def present?
false
end
end

View File

@ -0,0 +1,9 @@
class String
def present?
!empty?
end
def blank?
empty?
end
end

View File

@ -18,6 +18,8 @@ class StackBootstrapWorker < Worker
call(provider_name) do |provider, out, file| call(provider_name) do |provider, out, file|
@out = out @out = out
without_bootstrap = stack_attrs.delete('without_bootstrap') without_bootstrap = stack_attrs.delete('without_bootstrap')
@out.puts "Received 'without_bootstrap' option" if without_bootstrap
report = save_report(file, stack_attrs) report = save_report(file, stack_attrs)
begin begin