#376: updated logic, UI
This commit is contained in:
parent
b37ada2ecd
commit
aea5c94219
|
@ -57,11 +57,32 @@ ActiveAdmin.register NodeInstruction do
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
member_action :force, method: :patch do
|
sidebar 'Actions', only: :index do
|
||||||
if NodeInstruction::STATUSES.include?(params[:state])
|
locked = NodeInstruction.all_locked?
|
||||||
resource.send(params[:state])
|
span(class: "status_tag #{locked ? 'red' : 'green'}") do
|
||||||
flash[:info] = 'Action added to queue successfully'
|
if locked
|
||||||
|
link_to 'Unlock instructions', unlock_all_admin_node_instructions_path, method: :post
|
||||||
|
else
|
||||||
|
link_to 'Lock instructions', lock_all_admin_node_instructions_path, method: :post
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
collection_action :lock_all, method: :post do
|
||||||
|
NodeInstruction.lock_all
|
||||||
|
flash[:info] = 'Locked successfully'
|
||||||
|
redirect_to admin_node_instructions_path
|
||||||
|
end
|
||||||
|
|
||||||
|
collection_action :unlock_all, method: :post do
|
||||||
|
NodeInstruction.unlock_all
|
||||||
|
flash[:info] = 'Unlocked successfully'
|
||||||
|
redirect_to admin_node_instructions_path
|
||||||
|
end
|
||||||
|
|
||||||
|
member_action :force, method: :patch do
|
||||||
|
resource.send(params[:state])
|
||||||
|
flash[:info] = 'Updated successfully'
|
||||||
redirect_to admin_node_instruction_path(resource)
|
redirect_to admin_node_instruction_path(resource)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ class RestartNodesJob
|
||||||
@queue = :low
|
@queue = :low
|
||||||
|
|
||||||
def self.perform
|
def self.perform
|
||||||
|
return if NodeInstruction.all_locked?
|
||||||
available_nodes = RpmBuildNode.all.map{ |n| n.user_id }.compact.uniq
|
available_nodes = RpmBuildNode.all.map{ |n| n.user_id }.compact.uniq
|
||||||
NodeInstruction.where(status: NodeInstruction::READY).
|
NodeInstruction.where(status: NodeInstruction::READY).
|
||||||
where('user_id NOT IN (?)', available_nodes).find_each(&:restart)
|
where('user_id NOT IN (?)', available_nodes).find_each(&:restart)
|
||||||
|
|
|
@ -6,6 +6,8 @@ class NodeInstruction < ActiveRecord::Base
|
||||||
FAILED = 'failed'
|
FAILED = 'failed'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
LOCK_KEY = 'NodeInstruction::lock-key'
|
||||||
|
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
|
||||||
attr_encrypted :instruction, key: APP_CONFIG['keys']['node_instruction_secret_key']
|
attr_encrypted :instruction, key: APP_CONFIG['keys']['node_instruction_secret_key']
|
||||||
|
@ -21,7 +23,9 @@ class NodeInstruction < ActiveRecord::Base
|
||||||
|
|
||||||
state_machine :status, initial: :ready do
|
state_machine :status, initial: :ready do
|
||||||
|
|
||||||
after_transition on: :restart, do: :perform_restart
|
after_transition(on: :restart) do |instruction, transition|
|
||||||
|
instruction.perform_restart
|
||||||
|
end
|
||||||
|
|
||||||
event :ready do
|
event :ready do
|
||||||
transition %i(ready restarting disabled failed) => :ready
|
transition %i(ready restarting disabled failed) => :ready
|
||||||
|
@ -41,6 +45,8 @@ class NodeInstruction < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def perform_restart
|
def perform_restart
|
||||||
|
restart_failed if NodeInstruction.all_locked?
|
||||||
|
|
||||||
success = false
|
success = false
|
||||||
output = ''
|
output = ''
|
||||||
instruction.lines.each do |command|
|
instruction.lines.each do |command|
|
||||||
|
@ -62,4 +68,16 @@ class NodeInstruction < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
later :perform_restart, queue: :low
|
later :perform_restart, queue: :low
|
||||||
|
|
||||||
|
def self.all_locked?
|
||||||
|
Redis.current.get(LOCK_KEY).present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.lock_all
|
||||||
|
Redis.current.set(LOCK_KEY, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.unlock_all
|
||||||
|
Redis.current.del(LOCK_KEY)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Admin::NodeInstructionsController do
|
||||||
|
it_should_behave_like 'an admin controller'
|
||||||
|
end
|
Loading…
Reference in New Issue