From cdeecb02e4c0578b91c1c77f43191a0270798002 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Thu, 24 Sep 2015 15:06:02 +0300 Subject: [PATCH] #750: add reserve and unreserve commands for stack --- .../lib/devops-client/handler/stack.rb | 16 +++++++++ .../devops-client/options/stack_options.rb | 3 +- devops-service/app/api2/handlers/stack.rb | 32 +++++++++++++++++ devops-service/app/api2/routes/stack.rb | 36 +++++++++++++++++++ devops-service/core/devops-service.rb | 2 ++ devops-service/lib/nil_class_ext.rb | 9 +++++ devops-service/lib/string_ext.rb | 9 +++++ .../workers/stack_bootstrap_worker.rb | 2 ++ 8 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 devops-service/lib/nil_class_ext.rb create mode 100644 devops-service/lib/string_ext.rb diff --git a/devops-client/lib/devops-client/handler/stack.rb b/devops-client/lib/devops-client/handler/stack.rb index eaabb1d..b32b4b8 100644 --- a/devops-client/lib/devops-client/handler/stack.rb +++ b/devops-client/lib/devops-client/handler/stack.rb @@ -30,6 +30,10 @@ class Stack < Handler output when :deploy deploy_handler + when :reserve + reserve_handler + when :unreserve + unreserve_handler when :resources resources_handler if @args[3] @@ -120,6 +124,18 @@ class Stack < Handler puts response.inspect 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 def provider_stacks(provider) diff --git a/devops-client/lib/devops-client/options/stack_options.rb b/devops-client/lib/devops-client/options/stack_options.rb index b8742c2..2bfd266 100644 --- a/devops-client/lib/devops-client/options/stack_options.rb +++ b/devops-client/lib/devops-client/options/stack_options.rb @@ -2,7 +2,7 @@ require "devops-client/options/common_options" 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 super(args, def_options) @@ -14,6 +14,7 @@ class StackOptions < CommonOptions self.sync_params = ["STACK"] self.resources_params = ["STACK"] self.deploy_params = ["STACK"] + self.reserve_params = ["STACK"] end def create_options diff --git a/devops-service/app/api2/handlers/stack.rb b/devops-service/app/api2/handlers/stack.rb index cbdac96..abf5637 100644 --- a/devops-service/app/api2/handlers/stack.rb +++ b/devops-service/app/api2/handlers/stack.rb @@ -172,6 +172,38 @@ module Devops [-10] 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 diff --git a/devops-service/app/api2/routes/stack.rb b/devops-service/app/api2/routes/stack.rb index b45cbd9..37f3413 100644 --- a/devops-service/app/api2/routes/stack.rb +++ b/devops-service/app/api2/routes/stack.rb @@ -111,6 +111,42 @@ module Devops 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 = {} # Add tags to stack instances # diff --git a/devops-service/core/devops-service.rb b/devops-service/core/devops-service.rb index a47ceeb..cd33364 100644 --- a/devops-service/core/devops-service.rb +++ b/devops-service/core/devops-service.rb @@ -1,5 +1,7 @@ require "wisper" require "lib/hash_ext" +require "lib/nil_class_ext" +require "lib/string_ext" require_relative "devops-loader" require_relative "devops-application" diff --git a/devops-service/lib/nil_class_ext.rb b/devops-service/lib/nil_class_ext.rb new file mode 100644 index 0000000..5f7aa50 --- /dev/null +++ b/devops-service/lib/nil_class_ext.rb @@ -0,0 +1,9 @@ +class NilClass + def blank? + true + end + + def present? + false + end +end \ No newline at end of file diff --git a/devops-service/lib/string_ext.rb b/devops-service/lib/string_ext.rb new file mode 100644 index 0000000..ce2e9ca --- /dev/null +++ b/devops-service/lib/string_ext.rb @@ -0,0 +1,9 @@ +class String + def present? + !empty? + end + + def blank? + empty? + end +end \ No newline at end of file diff --git a/devops-service/workers/stack_bootstrap_worker.rb b/devops-service/workers/stack_bootstrap_worker.rb index 3bd95c6..5375735 100644 --- a/devops-service/workers/stack_bootstrap_worker.rb +++ b/devops-service/workers/stack_bootstrap_worker.rb @@ -18,6 +18,8 @@ class StackBootstrapWorker < Worker call(provider_name) do |provider, out, file| @out = out without_bootstrap = stack_attrs.delete('without_bootstrap') + @out.puts "Received 'without_bootstrap' option" if without_bootstrap + report = save_report(file, stack_attrs) begin