forked from pangea-project/pangea-tooling
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jenkins_maintenance.rb
executable file
·138 lines (114 loc) · 3.36 KB
/
jenkins_maintenance.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env ruby
# frozen_string_literal: true
#
# Copyright (C) 2016 Harald Sitter <[email protected]>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) version 3, or any
# later version accepted by the membership of KDE e.V. (or its
# successor approved by the membership of KDE e.V.), which shall
# act as a proxy defined in Section 6 of version 3 of the license.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
require 'logger'
require 'logger/colors'
require_relative 'ci-tooling/lib/jenkins'
require_relative 'ci-tooling/lib/optparse'
# A Jenkins node.
class Node
ONLINE = :online
OFFLINE = :offline
class << self
def states
[ONLINE, OFFLINE]
end
attr_accessor :target_state
end
def initialize(name, client)
@name = name
@client = client
end
def skip?
master? || filtered? || already_target_state?
end
def toggle!
@client.toggle_temporarilyOffline(@name, 'Maintenance')
end
private
def target_state
self.class.target_state
end
def master?
@name == 'master'
end
def filtered?
false # Can be used to filter out specific names
end
def state
@client.is_offline?(@name) ? OFFLINE : ONLINE
end
def already_target_state?
target_state == state
end
def to_s
@name
end
end
ci_configs = []
parser = OptionParser.new do |opts|
opts.banner = <<EOF
Usage: #{opts.program_name} --config CONFIG1 --config CONFIG2
Set jenkins instances into maintenance by setting all their slaves offline.
This does not put the instances into maintenance mode, nor does it wait for
the queue to clear!
EOF
opts.separator('')
opts.on('-s STATE', '--state STATE', Node.states,
'Which state to switch to',
'EXPECTED') do |v|
Node.target_state = v.to_sym
end
opts.on('-c CONFIG', '--config CONFIG',
'The Pangea jenkins config to load to create api client instances.',
'These live in $HOME/.config/ usually but can be anywhere.',
'EXPECTED') do |v|
ci_configs << v
end
end
parser.parse!
unless parser.missing_expected.empty?
puts "Missing expected arguments: #{parser.missing_expected.join(', ')}\n\n"
abort parser.help
end
@log = Logger.new(STDOUT).tap do |l|
l.progname = 'maintenance'
l.level = Logger::INFO
end
cis = ci_configs.collect do |config|
JenkinsApi::Client.new(config_file: config)
end
cis.each do |ci|
if Node.target_state == Node::OFFLINE
@log.info "Setting system #{ci.server_ip} into maintenance mode."
ci.system.quiet_down
end
node_client = ci.node
node_client.list.each do |name|
node = Node.new(name, node_client)
next if node.skip?
@log.info "Taking #{node} on #{ci.server_ip} #{Node.target_state}"
node.toggle!
end
if Node.target_state == Node::ONLINE
@log.info "Taking system #{ci.server_ip} out of maintenance mode."
ci.system.cancel_quiet_down
end
end