blackstack-deployer 1.2.15 → 1.2.18

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/blackstack-deployer.rb +95 -38
  3. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91adc0de4b1c7772630279b38655a021e3a96fd3e9717fbab2e454e93caafd10
4
- data.tar.gz: 85cdc1d5270cea1cfde7ac2287d23b4c623eebd221c7bc34b7d00e16c5773c49
3
+ metadata.gz: e1b14b1870b2b15b1f26f5b6087e4ceb672e375fce44d02ea7ae36d658d690c3
4
+ data.tar.gz: ff442f3dc4231513d28147431c859bc0791114a57d7085e90903e6aa7a09b7b2
5
5
  SHA512:
6
- metadata.gz: 42a56dee4a31ce5ad5daf30ffff2ba3fef9fed7e29cda55e535a465c6a43badf893963da1887542e0cacf18cd33e5e982fae3074e5036dbf7cb82d0856718700
7
- data.tar.gz: ba329544c91d5fb55c3f76cd12e49b1fad76a163bdd1fed9fd1cd419b47aa52d580b56add739f28419bc3155099dd1193d00f404b7379f0577845fdde77a22bc
6
+ metadata.gz: 1080f3ec0c42bd3d0d47405f988a7ce6d3173340026c570b1442e2cbcb83ad68169eecb8987f61317a3adfce36f23f5cbabd56d1341ac2c027a06841dff89824
7
+ data.tar.gz: d11e282d1b7653cdb69c567f865f23a82d1a6b147f2e0258bd5e1371b92cf5864f17173a81c505010384e95b923c7bcf208e69a06cb25905151170e39e05cbce
@@ -5,14 +5,25 @@ module BlackStack
5
5
  # Deployer is a library that can be used to deploy a cluster of nodes.
6
6
  module Deployer
7
7
  @@logger = BlackStack::BaseLogger.new(nil)
8
+ @@show_output = false
8
9
  @@nodes = []
9
10
  @@routines = []
10
11
 
12
+ # set show_output
13
+ def self.set_show_output(value)
14
+ @@show_output = value
15
+ end
16
+
11
17
  # set the logger
12
18
  def self.set_logger(i_logger)
13
19
  @@logger = i_logger
14
20
  end
15
21
 
22
+ # get show_output
23
+ def self.show_output
24
+ @@show_output
25
+ end
26
+
16
27
  # get the logger assigned to the module
17
28
  def self.logger
18
29
  @@logger
@@ -165,8 +176,8 @@ module BlackStack
165
176
  if h[:errors].size == 0
166
177
  #BlackStack::Deployer.logger.done
167
178
  else
168
- BlackStack::Deployer.logger.logf('error: ' + h.to_s)
169
- raise "Error running command: #{h.to_s}"
179
+ #BlackStack::Deployer.logger.logf('error: ' + h.to_s)
180
+ raise "Error running command:\n#{h[:errors].uniq.join("\n")}"
170
181
  end
171
182
  end
172
183
  ret
@@ -175,7 +186,7 @@ module BlackStack
175
186
 
176
187
  # define attributes and methods of a routine's command
177
188
  module CommandModule
178
- attr_accessor :command, :matches, :nomatches, :sudo
189
+ attr_accessor :command, :matches, :nomatches, :sudo, :background
179
190
 
180
191
  def self.descriptor_errors(c)
181
192
  errors = []
@@ -202,6 +213,9 @@ module BlackStack
202
213
  # validate: existis a routine with a the value c[:command].to_s on its :name key
203
214
  errors << "The routine with the name #{c[:command].to_s} does not exist" unless BlackStack::Deployer::deployment_routines.select { |r| r.name == c[:command].to_s }.size > 0
204
215
  end
216
+ else
217
+ # validate: each line of the :command value must finish with ;
218
+ errors << "Each line in the :command value must finish with `;`.\nCommand: #{c[:command]}.\nRefer https://github.com/leandrosardi/blackstack-deployer#67-running-commands-in-background for more details." unless c[:command].strip.split("\n").select { |l| l.strip[-1,1] != ';' }.size == 0
205
219
  end
206
220
 
207
221
  # if c[:matches] exists
@@ -229,6 +243,12 @@ module BlackStack
229
243
  end # each
230
244
  end # if c[:matches].is_a?(Array)
231
245
  end # if :matches exists
246
+
247
+ # if c[:background] exists, it must be a boolean
248
+ if c.has_key?(:background)
249
+ errors << "The value of the key :background is not a boolean" unless c[:background].is_a?(TrueClass) || c[:background].is_a?(FalseClass)
250
+ end
251
+
232
252
  #
233
253
  errors.uniq
234
254
  end # def self.descriptor_error(h)
@@ -257,7 +277,12 @@ module BlackStack
257
277
  self.nomatches << BlackStack::Deployer::NoMatch.new(m)
258
278
  end
259
279
  end
260
- end
280
+ end
281
+ if h.has_key?(:background)
282
+ self.background = h[:background]
283
+ else
284
+ self.background = false
285
+ end
261
286
  end # def initialize(h)
262
287
 
263
288
  def to_hash
@@ -275,52 +300,84 @@ module BlackStack
275
300
  h
276
301
  end # def to_hash
277
302
 
303
+ # return the code to exectute the command,
304
+ # after applying modifications requested by
305
+ # some parameters like `:show_outut` or `:background`.
306
+ def code(node)
307
+ ret = self.command
308
+ # replacing parameters
309
+ ret.scan(/%[a-zA-Z0-9\_]+%/).each do |p|
310
+ if p == '%eth0_ip%' # reserved parameter
311
+ # TODO: move the method eth0_ip to the blackstack-nodes library
312
+ ret.gsub!(p, node.eth0_ip)
313
+ elsif p == '%timestamp%' # reserved parameter
314
+ # TODO: move this to a timestamp function on blackstack-core
315
+ ret.gsub!(p, Time.now.to_s.gsub(/\D/, ''))
316
+ else
317
+ if node.parameters.has_key?(p.gsub(/%/, '').to_sym)
318
+ ret.gsub!(p, node.parameters[p.gsub(/%/, '').to_sym].to_s)
319
+ else
320
+ raise "The parameter #{p} does not exist in the node descriptor #{node.parameters.to_s}"
321
+ end
322
+ end
323
+ end
324
+ # if the command is configured to run in background, and the flag show_ouput is off, then modify the ret to run in background
325
+ if self.background && !BlackStack::Deployer.show_output
326
+ lines = ret.strip.lines
327
+ total = lines.size
328
+ i = 0
329
+ lines.each { |l|
330
+ i += 1
331
+ if i == total
332
+ l.gsub!(/;$/, ' > /dev/null 2>&1 &')
333
+ else
334
+ l.gsub!(/;$/, ' > /dev/null 2>&1;')
335
+ end
336
+ }
337
+ ret = lines.join("\n")
338
+ end
339
+ # apply modifications due the sudo flag
340
+ # return the code
341
+ ret = node.code(ret, self.sudo)
342
+ # return
343
+ ret
344
+ end
345
+
278
346
  def run(node)
347
+ l = BlackStack::Deployer.logger
279
348
  errors = []
280
- code = self.command
281
349
  output = nil
350
+ s = self.code(node)
282
351
 
283
- # if code is a symbol
284
- if code.is_a?(Symbol)
352
+ # if self.command is a symbol
353
+ if self.command.is_a?(Symbol)
285
354
 
286
- # if code is equel than :reboot
287
- if code == :reboot
355
+ # if self.command is equel than :reboot
356
+ if self.command == :reboot
288
357
  # call the node reboot method
289
358
  node.reboot
290
359
  else
291
360
  # look for a routine with this name
292
- r = BlackStack::Deployer.routines.select { |r| r.name == code.to_s }.first
361
+ r = BlackStack::Deployer.routines.select { |r| r.name == self.command.to_s }.first
293
362
  if !r.nil?
294
363
  r.run(node)
295
364
  else
296
- raise "The routine #{code.to_s} does not exist"
365
+ raise "The routine #{self.command.to_s} does not exist"
297
366
  end
298
367
  end
299
368
 
300
- # if code is a string
301
- elsif code.is_a?(String)
302
- # replacing parameters
303
- code.scan(/%[a-zA-Z0-9\_]+%/).each do |p|
304
- if p == '%eth0_ip%' # reserved parameter
305
- # TODO: move the method eth0_ip to the blackstack-nodes library
306
- code.gsub!(p, node.eth0_ip)
307
- elsif p == '%timestamp%' # reserved parameter
308
- # TODO: move this to a timestamp function on blackstack-core
309
- code.gsub!(p, Time.now.to_s.gsub(/\D/, ''))
310
- else
311
- if node.parameters.has_key?(p.gsub(/%/, '').to_sym)
312
- code.gsub!(p, node.parameters[p.gsub(/%/, '').to_sym].to_s)
313
- else
314
- raise "The parameter #{p} does not exist in the node descriptor #{node.parameters.to_s}"
315
- end
316
- end
317
- end
369
+ # if self.command is a string
370
+ elsif self.command.is_a?(String)
318
371
 
319
372
  # running the command
320
- output = node.exec(code, self.sudo)
373
+ l.logs "Show command output... " if BlackStack::Deployer.show_output
374
+ l.log "\n\nCommand:\n--------\n\n#{s} " if BlackStack::Deployer.show_output
375
+ output = node.exec(s, false) # false: I already evaluated the :sudo parameter in the code method above.
376
+ l.log "\n\nOutput:\n-------\n\n#{output}" if BlackStack::Deployer.show_output
377
+ l.logf('done tracing.') if BlackStack::Deployer.show_output
321
378
 
322
379
  # validation: at least one of the matches should happen
323
- if self.matches.size > 0
380
+ if self.matches.size > 0 && !self.background
324
381
  i = 0
325
382
  self.matches.each do |m|
326
383
  if m.validate(output).size == 0 # no errors
@@ -339,7 +396,7 @@ module BlackStack
339
396
  # return a hash descriptor of the command result
340
397
  {
341
398
  :command => self.command,
342
- :code => code,
399
+ :code => s,
343
400
  :output => output,
344
401
  :errors => errors,
345
402
  }
@@ -514,19 +571,19 @@ module BlackStack
514
571
  raise "The routine #{routine_name} cannot be run on the node #{node_name}: #{errors.uniq.join(".\n")}" if errors.length > 0
515
572
 
516
573
  # connect the node
517
- self.logger.logs "Connecting to node #{n.name}... "
574
+ #self.logger.logs "Connecting to node #{n.name}... "
518
575
  n.connect
519
- self.logger.done
576
+ #self.logger.done
520
577
 
521
578
  # run the routine
522
- self.logger.logs "Running routine #{r.name}... "
579
+ #self.logger.logs "Running routine #{r.name}... "
523
580
  r.run(n)
524
- self.logger.done
581
+ #self.logger.done
525
582
 
526
583
  # disconnect the node
527
- self.logger.logs "Disconnecting from node #{n.name}... "
584
+ #self.logger.logs "Disconnecting from node #{n.name}... "
528
585
  n.disconnect
529
- self.logger.done
586
+ #self.logger.done
530
587
 
531
588
  end # def
532
589
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blackstack-deployer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.15
4
+ version: 1.2.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leandro Daniel Sardi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-16 00:00:00.000000000 Z
11
+ date: 2022-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: blackstack-nodes
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.2.8
19
+ version: 1.2.9
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.2.8
22
+ version: 1.2.9
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: 1.2.8
29
+ version: 1.2.9
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.2.8
32
+ version: 1.2.9
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: pg
35
35
  requirement: !ruby/object:Gem::Requirement