mtncd 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +40 -26
- data/bin/mtncd +99 -9
- data/lib/mtncd/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTdlM2MyNjlmODkxYjdlZDk4YjZmNzc5NWIxOWVkZGFhMTA3Njg2Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
M2FlZWM0OGJjY2Y3MWJlYzA2ODAyNWFhZmZjNzU5OGVlNzg4OGI3Yg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTlkNGQ1ZmEyZDI1ZDgzMWM5NTllMTA4Y2E0MWY0YmJhYTgxOTAzMjIwYTE3
|
10
|
+
ZGVmMzlmOTY4M2Q0MGQyZmU1OWMwOTQwNGIyMzMyYjI3NzZiYzk5YWZiNWFh
|
11
|
+
YWJjOTcxNmZhMDk3YWEyOTNhMTE2NDlkY2Q4OTVhMDU1ODBiNmE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjM4ZTBkZWIzMzlhOTFlODJlYjg1NGZlNTJlYmU5OWZlMmNmNWY4NzAyNGJh
|
14
|
+
NTY4MDdkYmYwYzcwYTIxY2M1MDI5Y2FjZjMyODM4NjZmOTA1ODgxYTVmZDU1
|
15
|
+
MzU5NzI1NTNjMmVmNmVkNDVhNzQ0YWQ4NTQxMmU3ZmYyMDdmZWY=
|
data/README.md
CHANGED
@@ -1,27 +1,41 @@
|
|
1
|
-
# Example
|
1
|
+
# Example json config file (.cicdconfig)
|
2
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
|
-
|
3
|
+
{
|
4
|
+
"role": "central",
|
5
|
+
"default_exclude": "mtn\-aws2",
|
6
|
+
"base_path": "/opt/mtn_cicd",
|
7
|
+
"chef": {
|
8
|
+
"promote_knife": "/root/.chef/tools/promote_knife.rb",
|
9
|
+
"server": "https://private-chef.mtnsatcloud.com/organizations/mtn-pipelines",
|
10
|
+
"node_name": "serf-central.mtnsatcloud.com",
|
11
|
+
"client_key": "/etc/chef/client.pem",
|
12
|
+
"environment_chain": {"integration":"staging","staging":"prod"},
|
13
|
+
"first_environment": "integration",
|
14
|
+
"sandbox": "sandbox"
|
15
|
+
},
|
16
|
+
"resque": {
|
17
|
+
"redis_ip": "127.0.0.1",
|
18
|
+
"redis_port": 6379,
|
19
|
+
"redis_db": 0,
|
20
|
+
"queue": "central",
|
21
|
+
"secondary_queue": "central",
|
22
|
+
"job_timeout": 7200,
|
23
|
+
"worker_count": 10,
|
24
|
+
"deploy_timeout": 7200
|
25
|
+
},
|
26
|
+
"hipchat": {
|
27
|
+
"room": "hipchat room",
|
28
|
+
"token": "your token"
|
29
|
+
},
|
30
|
+
"serf": {
|
31
|
+
"global" : {
|
32
|
+
"rpc_ip": "172.16.24.154",
|
33
|
+
"rpc_port": 7373,
|
34
|
+
"rpc_auth": "YOURSECRET",
|
35
|
+
"node_name": "cicd"
|
36
|
+
}
|
37
|
+
},
|
38
|
+
"ship": {
|
39
|
+
"deployment_data": "/opt/mtn_cicd/deployments"
|
40
|
+
}
|
41
|
+
}
|
data/bin/mtncd
CHANGED
@@ -29,12 +29,7 @@ command :deploy do |deploy|
|
|
29
29
|
deploy.command :start do |start|
|
30
30
|
|
31
31
|
start.desc 'deploy starting with environment'
|
32
|
-
start.
|
33
|
-
start.flag :env, :must_match => {
|
34
|
-
'integ' => 'integration',
|
35
|
-
'stage' => 'staging',
|
36
|
-
'prod' => 'prod'
|
37
|
-
}
|
32
|
+
start.flag :env
|
38
33
|
|
39
34
|
start.desc 'use deployment id'
|
40
35
|
start.default_value SecureRandom.hex(4)
|
@@ -58,13 +53,23 @@ command :deploy do |deploy|
|
|
58
53
|
start.switch :single
|
59
54
|
|
60
55
|
start.action do |global_options,options,args|
|
61
|
-
|
62
56
|
event_options_hash = {
|
63
57
|
'id' => "#{options[:id]}",
|
64
58
|
'single' => options[:single],
|
65
59
|
}
|
66
60
|
event_options_hash['exclusion'] = options[:exclude].nil? ? $config['default_exclude'] : options[:exclude]
|
61
|
+
|
67
62
|
event_options_hash['env'] = options[:env] unless options[:env].nil?
|
63
|
+
unless options[:env].nil?
|
64
|
+
if $config['chef']['environment_chain'][options[:env]].nil?
|
65
|
+
if $config['chef']['environment_chain'].key(options[:env]).nil?
|
66
|
+
if $config['chef']['sandbox'] != options[:env]
|
67
|
+
raise "Unknown environment #{options[:env]}!"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
68
73
|
event_options_hash['shipcodes'] = options[:ships].split(",") unless options[:ships].nil?
|
69
74
|
|
70
75
|
serf_options_hash = {
|
@@ -224,6 +229,76 @@ command :system do |system|
|
|
224
229
|
end
|
225
230
|
end
|
226
231
|
|
232
|
+
desc 'Reachability times'
|
233
|
+
command :ping do |ping|
|
234
|
+
ping.desc 'json output'
|
235
|
+
ping.default_value false
|
236
|
+
ping.switch :json
|
237
|
+
|
238
|
+
ping.desc 'local or global cluster command'
|
239
|
+
ping.default_value 'global'
|
240
|
+
ping.flag :cluster, :must_match => {
|
241
|
+
'global' => 'global',
|
242
|
+
'local' => 'local'
|
243
|
+
}
|
244
|
+
|
245
|
+
ping.desc 'timeout in seconds'
|
246
|
+
ping.default_value 60
|
247
|
+
ping.flag :timeout
|
248
|
+
|
249
|
+
ping.action do |global_options,options,args|
|
250
|
+
begin
|
251
|
+
puts "This might take up to #{options[:timeout]} seconds" unless options[:json]
|
252
|
+
|
253
|
+
members = nil
|
254
|
+
Serfx.connect(host: $config['serf'][options[:cluster]]['rpc_ip'], port: $config['serf'][options[:cluster]]['rpc_port'], authkey:$config['serf'][options[:cluster]]['rpc_auth']) do |conn|
|
255
|
+
members = conn.members.body['Members']
|
256
|
+
end
|
257
|
+
|
258
|
+
# build serf command string
|
259
|
+
command_string = "serf query --format=json -timeout=\"#{options[:timeout]}s\" "
|
260
|
+
members.each do |member|
|
261
|
+
if member['Status'] != 'left'
|
262
|
+
command_string += " -node=#{member['Name']}"
|
263
|
+
end
|
264
|
+
end
|
265
|
+
command_string += " -rpc-addr=#{$config['serf'][options[:cluster]]['rpc_ip']}:#{$config['serf'][options[:cluster]]['rpc_port']}"
|
266
|
+
command_string += " -rpc-auth=#{$config['serf'][options[:cluster]]['rpc_auth']}" unless $config['serf'][options[:cluster]]['rpc_auth'].nil?
|
267
|
+
|
268
|
+
start_time = Time.now.to_i
|
269
|
+
command_string += " ping #{start_time}"
|
270
|
+
|
271
|
+
serf_output = nil
|
272
|
+
Open3.popen3(command_string) do |stdin, stdout, stderr, wait_thr|
|
273
|
+
exitstatus = wait_thr.value
|
274
|
+
raise "Failed to send the ping query" unless exitstatus == 0
|
275
|
+
serf_output = JSON.parse(stdout.read)
|
276
|
+
end
|
277
|
+
|
278
|
+
if serf_output['Responses'].length < members.length
|
279
|
+
serf_output['Error'] = "expecting #{members.length} responses, got #{serf_output['Responses'].length} responses"
|
280
|
+
end
|
281
|
+
|
282
|
+
serf_output['Responses'].each do |node,time|
|
283
|
+
serf_output['Responses'][node] = serf_output['Responses'][node].to_i - start_time
|
284
|
+
end
|
285
|
+
|
286
|
+
if options[:json]
|
287
|
+
puts JSON.pretty_generate(serf_output)
|
288
|
+
else
|
289
|
+
puts "\033[31mFailure: #{serf_output['Error']}\033[0m" unless serf_output['Error'].nil?
|
290
|
+
|
291
|
+
serf_output['Responses'].each do |node,time|
|
292
|
+
puts "Node #{node} ack in #{time} seconds"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
rescue Serfx::RPCError => e
|
297
|
+
raise "Could not connect to #{options[:cluster]} cluster"
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
227
302
|
desc 'resque information'
|
228
303
|
command :resque do |resque|
|
229
304
|
resque.desc 'resque information'
|
@@ -254,6 +329,19 @@ command :resque do |resque|
|
|
254
329
|
puts "Worker #{worker.to_s} processing job #{worker.job}"
|
255
330
|
}
|
256
331
|
end
|
332
|
+
end
|
333
|
+
|
334
|
+
resque.desc 'resque errors'
|
335
|
+
resque.command :errors do |errors|
|
336
|
+
errors.action do |global_options,options,args|
|
337
|
+
Resque.redis = "#{$config['resque']['redis_ip']}:#{$config['resque']['redis_port']}/#{$config['resque']['redis_db']}"
|
338
|
+
|
339
|
+
puts "All failures:"
|
340
|
+
Resque::Failure.all(0, Resque::Failure.count - 1).each { |failure|
|
341
|
+
puts "#{failure["exception"]}:\n #{failure["backtrace"]}"
|
342
|
+
puts '--------------------'
|
343
|
+
}
|
344
|
+
end
|
257
345
|
end
|
258
346
|
|
259
347
|
resque.desc 'flush redis (destructive)'
|
@@ -276,11 +364,13 @@ pre do |global,command,options,args|
|
|
276
364
|
$config = JSON.parse(File.read(File.join(Dir.home, '.cicdconfig')))
|
277
365
|
|
278
366
|
if $config['role'] == 'sled' && options[:cluster] == 'global'
|
279
|
-
|
367
|
+
puts 'global commands are not available on sled nodes. forcing \'--cluster=local\''
|
368
|
+
options[:cluster] = 'local'
|
280
369
|
end
|
281
370
|
|
282
371
|
if $config['role'] == 'central' && options[:cluster] == 'local'
|
283
|
-
|
372
|
+
puts 'local commands are not available on central nodes. forcing \'--cluster=global\''
|
373
|
+
options[:cluster] = 'global'
|
284
374
|
end
|
285
375
|
|
286
376
|
true
|
data/lib/mtncd/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mtncd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MTN Satellite Communications
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: resque
|