covalence 0.8.4 → 0.9.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22fc1079779bb74dfe1aba91513a57884fb10bae4ef263a044bda6396ca0edde
4
- data.tar.gz: 4e49429ce0b27d3217b865ac65459e49cb598e9b6810bda2031708a741d01bc4
3
+ metadata.gz: 01a6df525586ec948c89317d69451a4f8acc3e46bc80fb09b55833f6b91e9ba2
4
+ data.tar.gz: b20fd2249962484525305bc11f0fdf796276126c26a074e97322358b6da76622
5
5
  SHA512:
6
- metadata.gz: d771183f719a23e05b0f3419bfc3ca6f3b3b102596bbe96406fb1024bf38801b2cf0b40a4a3c14ca00c751cb099f4c82e4276da2b695b9ba5fded504b888a3f1
7
- data.tar.gz: ccb613d38810d5fbbcde0ac12cdbef1bc55adbf7ca0da7b1be44d00c4cc2269837795be14af7e59472383a4d298c7713bc7821ef7755110acc74ccfdcddf3d51
6
+ metadata.gz: 57f06cc073babb01bda236615fec3ef042b9f20165870b6468a2b9c1d9c9f25dcd1288ccbc21e78c38ed03bd703af79205fef1f83ed8fa03907516e184fda83c
7
+ data.tar.gz: 98ebbed71d2a26b88cc97784bc0006270ad211ef6e5398ac506cd78119e8d46f90067a415e6fe287ec5fcc38bc99596a5601bbe6d25e27276e051208461f7b0b
@@ -1,7 +1,15 @@
1
- ## Unreleased
2
- * Add ability to toggle primary state store
3
- * Add environment variable interpolation for input variables
4
- * Add support for sops encryption / decryption of hierarchy data
1
+ ## 0.9.1 (Aug 11, 2019)
2
+
3
+ BACKWARDS INCOMPATIBILITIES:
4
+ - The legacy Atlas Artifact backend is no longer supported.
5
+
6
+ IMPROVEMENTS:
7
+ * Ability to toggle primary state store
8
+ * Environment variable interpolation for input variables
9
+ * Support for sops encryption / decryption of hierarchy data
10
+ * Support for Terraform 0.12
11
+ * Support for parallel execution of process.
12
+ * A tool [prefixout](https://github.com/unifio/prefixout/releases/tag/v0.1.0) was added for additional logging.
5
13
 
6
14
  ## 0.7.8 (May 9, 2018)
7
15
  IMPROVEMENTS:
data/README.md CHANGED
@@ -406,16 +406,6 @@ Module for interacting with the Terraform Enterprise backend.
406
406
 
407
407
  ### Usage
408
408
 
409
- Artifacts:
410
-
411
- ```yaml
412
- ami:
413
- type: 'atlas.artifact'
414
- slug: 'unifio/app/amazon.ami'
415
- version: 'latest'
416
- key: 'region.us-east-1'
417
- ```
418
-
419
409
  State Outputs:
420
410
 
421
411
  ```yaml
@@ -508,6 +498,7 @@ You will probably need the following packages installed locally
508
498
  - Terraform
509
499
  - Packer
510
500
  - Sops
501
+ - [prefixout](https://github.com/unifio/prefixout/releases/tag/v0.1.0)
511
502
 
512
503
  Execute the following to build the gem:
513
504
 
@@ -1,6 +1,7 @@
1
1
  require "covalence/version"
2
2
  require "logger"
3
3
  require 'active_support/core_ext/object/blank'
4
+ require 'etc'
4
5
 
5
6
  if %w(development test).include?(ENV['RAKE_ENV'])
6
7
  require 'byebug'
@@ -43,4 +44,7 @@ module Covalence
43
44
  LOGGER = Logger.new(STDOUT)
44
45
  LOG_LEVEL = String(ENV['COVALENCE_LOG'] || "warn").upcase
45
46
  LOGGER.level = Logger.const_get(LOG_LEVEL)
47
+
48
+ # worker count
49
+ WORKER_COUNT = ENV.has_key?('WORKER_COUNT') ? ENV['WORKER_COUNT'].to_i : Etc.nprocessors
46
50
  end
@@ -13,13 +13,14 @@ module Covalence
13
13
  stderr_io: STDERR,
14
14
  debug: Covalence::DEBUG_CLI,
15
15
  dry_run: false,
16
- ignore_exitcode: false)
16
+ ignore_exitcode: false,
17
+ workdir: nil)
17
18
 
18
19
  # TODO: implement path prefix for the docker runs, see @tf_cmd
19
20
  cmd_string = [*cmds]
20
21
  # TODO: cmd escape issues with -var.
21
22
  cmd_string += [*args] unless args.blank?
22
- cmd_string << path unless path.blank?
23
+ cmd_string << path unless workdir
23
24
 
24
25
  #TODO debug command string maybe
25
26
  #TODO debug command args maybe
@@ -34,12 +35,27 @@ module Covalence
34
35
  return 0 unless HighLine.new.agree('Execute? [y/n]')
35
36
  end
36
37
 
37
- spawn_subprocess(ENV, run_cmd, {
38
- stdin_io: stdin_io,
39
- stdout_io: stdout_io,
40
- stderr_io: stderr_io,
41
- ignore_exitcode: ignore_exitcode
42
- })
38
+ if workdir
39
+ spawn_subprocess(ENV, run_cmd,
40
+ stdin_io: stdin_io,
41
+ stdout_io: stdout_io,
42
+ stderr_io: stderr_io,
43
+ ignore_exitcode: ignore_exitcode,
44
+ path: path,
45
+ workdir: workdir)
46
+ else
47
+ spawn_subprocess(ENV, run_cmd,
48
+ stdin_io: stdin_io,
49
+ stdout_io: stdout_io,
50
+ stderr_io: stderr_io,
51
+ ignore_exitcode: ignore_exitcode,
52
+ path: path)
53
+ end
54
+
55
+ end
56
+
57
+ def logger
58
+ Covalence::LOGGER
43
59
  end
44
60
 
45
61
  private
@@ -49,21 +65,27 @@ module Covalence
49
65
  end
50
66
 
51
67
  def spawn_subprocess(env, run_cmd,
52
- stdin_io: STDIN,
53
- stdout_io: STDOUT,
54
- stderr_io: STDERR,
55
- ignore_exitcode: false)
56
- Signal.trap("INT") {} #Disable parent process from exiting, orphaning the child fork below
68
+ stdin_io: STDIN,
69
+ stdout_io: STDOUT,
70
+ stderr_io: STDERR,
71
+ ignore_exitcode: false,
72
+ path: Dir.pwd,
73
+ workdir: Dir.pwd)
74
+ logger.info "path: #{path} workdir: #{workdir} run_cmd: #{run_cmd}"
75
+ ## TODO one thing we can try is to use
76
+ # Prctl.call(Prctl::PR_SET_PDEATHSIG, Signal.list['TERM'], 0, 0, 0)
77
+ # so when the parent dies, child will know to terminate itself.
78
+ Signal.trap("INT") { logger.info "Trapped Ctrl-c. Disable parent process from exiting, orphaning the child fork below which may or may not work" }
57
79
  wait_thread = nil
58
-
59
- Open3.popen3(env, run_cmd) do |stdin, stdout, stderr, wait_thr|
80
+ prefix=path.gsub(/^\/workspace*/,'')
81
+ whole_cmd=['prefixout', '-p', "#{prefix} ", '--'].concat(run_cmd.split)
82
+ Open3.popen3(env, *whole_cmd, :chdir=>workdir) do |stdin, stdout, stderr, wait_thr|
60
83
  mappings = { stdin_io => stdin, stdout => stdout_io, stderr => stderr_io }
61
84
  wait_thread = wait_thr
62
85
 
63
86
  Signal.trap("INT") {
64
87
  Process.kill("INT", wait_thr.pid)
65
88
  Process.wait(wait_thr.pid, Process::WNOHANG)
66
-
67
89
  exit(wait_thr.value.exitstatus)
68
90
  } # let SIGINT drop into the child process
69
91
 
@@ -34,24 +34,68 @@ module Covalence
34
34
  end
35
35
 
36
36
  def self.terraform_check_style(path)
37
- output, status = Open3.capture2e(ENV, Covalence::TERRAFORM_CMD, "fmt", "-write=false", path)
38
- return false unless status.success?
39
- output = output.split("\n")
40
- (output.size == 0)
37
+ cmd = [Covalence::TERRAFORM_CMD, "fmt", "-check"]
38
+
39
+ output = PopenWrapper.run(
40
+ cmd,
41
+ path,
42
+ '',
43
+ ignore_exitcode: false)
44
+ (output == 0)
41
45
  end
42
46
 
43
- def self.terraform_init(path='', args: '', ignore_exitcode: false)
47
+ def self.terraform_init(path: '', workdir: Dir.pwd, args: '', ignore_exitcode: false)
44
48
  if ENV['TF_PLUGIN_LOCAL'] == 'true'
45
- cmd = [Covalence::TERRAFORM_CMD, "init", "-get=false", "-input=false", "-plugin-dir=#{Covalence::TERRAFORM_PLUGIN_CACHE}"]
49
+ cmd = [Covalence::TERRAFORM_CMD, "init", "-get-plugins=false", "-get=false", "-input=false", "-plugin-dir=#{Covalence::TERRAFORM_PLUGIN_CACHE}"]
46
50
  else
47
- cmd = [Covalence::TERRAFORM_CMD, "init", "-get=false", "-input=false"]
51
+ cmd = [Covalence::TERRAFORM_CMD, "init", "-get-plugins=false", "-get=false", "-input=false"]
48
52
  end
49
53
 
50
54
  output = PopenWrapper.run(
51
55
  cmd,
52
56
  path,
53
57
  args,
54
- ignore_exitcode: ignore_exitcode)
58
+ ignore_exitcode: ignore_exitcode,
59
+ workdir: workdir)
60
+ (output == 0)
61
+ end
62
+
63
+ def self.terraform_get(path=Dir.pwd, workdir=Dir.pwd, args: '', ignore_exitcode: false)
64
+ cmd = [Covalence::TERRAFORM_CMD, "get", path]
65
+
66
+ output = PopenWrapper.run(
67
+ cmd,
68
+ path,
69
+ args,
70
+ ignore_exitcode: ignore_exitcode,
71
+ workdir: workdir)
72
+
73
+ (output == 0)
74
+ end
75
+
76
+ def self.terraform_plan(path: '', workdir: Dir.pwd, args: '', ignore_exitcode: false)
77
+ cmd = [Covalence::TERRAFORM_CMD, "plan"]
78
+
79
+ output = PopenWrapper.run(
80
+ cmd,
81
+ path,
82
+ args,
83
+ ignore_exitcode: ignore_exitcode,
84
+ workdir: workdir)
85
+
86
+ (output == 0)
87
+ end
88
+
89
+ def self.terraform_validate(path, workdir, args: '', ignore_exitcode: false)
90
+ cmd = [Covalence::TERRAFORM_CMD, "validate"]
91
+
92
+ output = PopenWrapper.run(
93
+ cmd,
94
+ path,
95
+ args,
96
+ ignore_exitcode: ignore_exitcode,
97
+ workdir: workdir)
98
+
55
99
  (output == 0)
56
100
  end
57
101
 
@@ -79,6 +123,9 @@ module Covalence
79
123
  raise "TODO: implement me"
80
124
  end
81
125
 
126
+ def self.logger
127
+ Covalence::LOGGER
128
+ end
82
129
 
83
130
  class << self
84
131
  private
@@ -83,13 +83,27 @@ module Covalence
83
83
 
84
84
  # :reek:FeatureEnvy
85
85
  def parse_type(input)
86
+ Covalence::LOGGER.debug("parse_type input=#{input.inspect}")
87
+
86
88
  if input.stringify_keys.has_key?('type')
87
89
  type = input.stringify_keys.fetch('type')
88
90
 
91
+ # HACK This only pays attention to the first element in:
92
+ # - map(string) -> ["map", "string"]
93
+ # - list(string) -> ["list", "string"]
94
+ # But then again, this is exactly how Terraform 0.11.x forced
95
+ # us to handle it, so eh, yolo.
96
+ if type.respond_to?('each')
97
+ type = type[0]
98
+ end
99
+
89
100
  local_types = %w(
90
101
  list
102
+ set
91
103
  map
92
104
  string
105
+ number
106
+ tuple
93
107
  )
94
108
 
95
109
  if local_types.any? {|local_type| type == local_type }
@@ -41,14 +41,14 @@ module Covalence
41
41
  "#{environment_name}-#{name}"
42
42
  end
43
43
 
44
- def materialize_cmd_inputs
44
+ def materialize_cmd_inputs(path)
45
45
  if type == "terraform"
46
46
  config = ""
47
47
  inputs.values.map(&:to_command_option).each do |input|
48
48
  config += input + "\n"
49
49
  end
50
- logger.info "\nStack inputs:\n\n#{config}"
51
- File.open('covalence-inputs.tfvars','w') {|f| f.write(config)}
50
+ logger.info "#{module_path} \nStack inputs:\n\n#{config}"
51
+ File.open("#{path}/covalence-inputs.tfvars",'w') {|f| f.write(config)}
52
52
  elsif type == "packer"
53
53
  config = Hash.new
54
54
  inputs.each do |name, input|
@@ -25,7 +25,7 @@ module Covalence
25
25
  Dir.chdir(tmpdir) do
26
26
  logger.info "In #{tmpdir}:"
27
27
 
28
- stack.materialize_cmd_inputs
28
+ stack.materialize_cmd_inputs(tmpdir)
29
29
  args = collect_args(stack.args,
30
30
  additional_args,
31
31
  "-var-file=covalence-inputs.json")
@@ -52,7 +52,7 @@ module Covalence
52
52
  Dir.chdir(tmpdir) do
53
53
  logger.info "In #{tmpdir}:"
54
54
 
55
- stack.materialize_cmd_inputs
55
+ stack.materialize_cmd_inputs(tmpdir)
56
56
  args = collect_args(stack.args,
57
57
  additional_args,
58
58
  "-var-file=covalence-inputs.json")
@@ -26,27 +26,50 @@ module Covalence
26
26
  end
27
27
 
28
28
  # :reek:TooManyStatements
29
- def stack_verify
29
+ def stack_shell
30
30
  Dir.mktmpdir do |tmpdir|
31
31
  populate_workspace(tmpdir)
32
32
  Dir.chdir(tmpdir) do
33
33
  logger.info "In #{tmpdir}:"
34
34
 
35
+ stack.materialize_state_inputs
35
36
  TerraformCli.terraform_get(@path)
36
37
  TerraformCli.terraform_init
37
38
 
38
- stack.materialize_cmd_inputs
39
- args = collect_args("-input=false",
40
- stack.args,
41
- "-var-file=covalence-inputs.tfvars")
42
-
43
- TerraformCli.terraform_validate(args: args)
39
+ stack.materialize_cmd_inputs(tmpdir)
44
40
 
45
- TerraformCli.terraform_plan(args: args)
41
+ shell = ENV.fetch('SHELL', 'sh')
42
+ system(shell)
46
43
  end
47
44
  end
48
45
  end
49
46
 
47
+ # :reek:TooManyStatements
48
+ def stack_verify(tmpdir)
49
+ return false if !TerraformCli.terraform_check_style(@path)
50
+
51
+ return false if !TerraformCli.terraform_get(path=@path, workdir=tmpdir)
52
+ populate_workspace(tmpdir)
53
+
54
+ return false if !TerraformCli.terraform_init(path: @path, workdir: tmpdir)
55
+ stack.materialize_cmd_inputs(tmpdir)
56
+ args = collect_args("-input=false",
57
+ stack.args,
58
+ "-var-file=#{tmpdir}/covalence-inputs.tfvars")
59
+
60
+ tf_vers = Gem::Version.new(Covalence::TERRAFORM_VERSION)
61
+
62
+ if tf_vers >= Gem::Version.new('0.12.0')
63
+ # >= 0.12 does *not* support validating input vars
64
+ return false if !TerraformCli.terraform_validate(path=tmpdir, workdir=tmpdir, args: stack.args)
65
+ else
66
+ # < 0.12 supports validating input vars
67
+ return false if !TerraformCli.terraform_validate(path=tmpdir, workdir=tmpdir, args: args)
68
+ end
69
+
70
+ TerraformCli.terraform_plan(path: @path , workdir: tmpdir, args: args)
71
+ end
72
+
50
73
  # :reek:TooManyStatements
51
74
  def stack_refresh
52
75
  Dir.mktmpdir do |tmpdir|
@@ -60,7 +83,12 @@ module Covalence
60
83
  TerraformCli.terraform_get(@path)
61
84
  TerraformCli.terraform_init
62
85
 
63
- TerraformCli.terraform_refresh
86
+ stack.materialize_cmd_inputs(tmpdir)
87
+ args = collect_args("-input=false",
88
+ stack.args,
89
+ "-var-file=covalence-inputs.tfvars")
90
+
91
+ TerraformCli.terraform_refresh(args: args)
64
92
  end
65
93
  end
66
94
  end
@@ -79,6 +107,8 @@ module Covalence
79
107
  TerraformCli.terraform_init
80
108
 
81
109
  stack.state_stores.drop(1).each do |store|
110
+ Covalence::LOGGER.debug("Stack: #{store.inspect}")
111
+
82
112
  stack.materialize_state_inputs(store: store)
83
113
  TerraformCli.terraform_init("-force-copy")
84
114
  end
@@ -99,13 +129,13 @@ module Covalence
99
129
  TerraformCli.terraform_get(@path)
100
130
  TerraformCli.terraform_init
101
131
 
102
- stack.materialize_cmd_inputs
132
+ stack.materialize_cmd_inputs(tmpdir)
103
133
  args = collect_args("-input=false",
104
134
  stack.args,
105
135
  additional_args,
106
136
  "-var-file=covalence-inputs.tfvars")
107
137
 
108
- TerraformCli.terraform_plan(args: args)
138
+ TerraformCli.terraform_plan(path: @path, workdir: tmpdir, args: args)
109
139
  end
110
140
  end
111
141
  end
@@ -123,7 +153,7 @@ module Covalence
123
153
  TerraformCli.terraform_get(@path)
124
154
  TerraformCli.terraform_init
125
155
 
126
- stack.materialize_cmd_inputs
156
+ stack.materialize_cmd_inputs(tmpdir)
127
157
  args = collect_args("-destroy",
128
158
  "-input=false",
129
159
  stack.args,
@@ -148,7 +178,7 @@ module Covalence
148
178
  TerraformCli.terraform_get(@path)
149
179
  TerraformCli.terraform_init
150
180
 
151
- stack.materialize_cmd_inputs
181
+ stack.materialize_cmd_inputs(tmpdir)
152
182
  args = collect_args("-input=false",
153
183
  "-auto-approve=true",
154
184
  stack.args,
@@ -173,7 +203,7 @@ module Covalence
173
203
  TerraformCli.terraform_get(@path)
174
204
  TerraformCli.terraform_init
175
205
 
176
- stack.materialize_cmd_inputs
206
+ stack.materialize_cmd_inputs(tmpdir)
177
207
  args = collect_args("-input=false",
178
208
  "-auto-approve=true",
179
209
  stack.args,
@@ -194,7 +224,6 @@ module Covalence
194
224
 
195
225
  # Copy any dependencies to the workspace
196
226
  @stack.dependencies.each do |dep|
197
- logger.info "Copying '#{dep}' dependency to #{workspace}"
198
227
  dep_path = File.expand_path(File.join(Covalence::TERRAFORM, dep))
199
228
  FileUtils.cp_r dep_path, workspace
200
229
  end
@@ -53,11 +53,19 @@ module Covalence
53
53
  end
54
54
 
55
55
  # Determine whether the document is a Terraform state file
56
- tf_state = true if parsed.has_key?('modules')
56
+ tf_state = true if parsed.has_key?('terraform_version')
57
57
 
58
58
  # Return ID for the key specified
59
59
  if tf_state
60
- outputs = parsed.fetch('modules')[0].fetch('outputs')
60
+ tf_vers = Gem::Version.new(parsed.fetch('terraform_version'))
61
+
62
+ if tf_vers >= Gem::Version.new('0.12.0')
63
+ root = parsed
64
+ else
65
+ root = parsed.fetch('modules')[0]
66
+ end
67
+
68
+ outputs = root.fetch('outputs')
61
69
  return outputs.fetch(name)
62
70
  end
63
71
  return parsed.fetch(name) if parsed.has_key?(name)
@@ -98,9 +106,9 @@ CONF
98
106
  end
99
107
  end
100
108
 
101
- params.delete('name')
102
-
103
109
  params.each do |k,v|
110
+ next if k == 'name'
111
+
104
112
  v = Covalence::Helpers::ShellInterpolation.parse_shell(v) if v.to_s.include?("$(")
105
113
  config += " #{k} = \"#{v}\"\n"
106
114
  end
@@ -156,7 +156,13 @@ module Covalence
156
156
  desc "Verify the #{stack_name} stack of the #{environment_name} environment"
157
157
  # Maybe verify_local to highlight that it skips pulling in remote state
158
158
  task generate_rake_taskname(environment_name, stack_name, "verify") do
159
- tf_tasks.stack_verify
159
+ _tmp_dir = Dir.mktmpdir
160
+ tf_tasks.stack_verify(_tmp_dir)
161
+ end
162
+
163
+ desc "Shell into the #{stack_name} stack of the #{environment_name} environment"
164
+ task generate_rake_taskname(environment_name, stack_name, "shell") do
165
+ tf_tasks.stack_shell
160
166
  end
161
167
  end
162
168
 
@@ -5,71 +5,35 @@ module Covalence
5
5
  TEST_ENVS.include?(environ.name.to_s)
6
6
  end
7
7
 
8
+ jobs = Queue.new
9
+ # populate the job queue
8
10
  environments.each do |environment|
9
11
  environment.stacks.each do |stack|
10
12
  EnvironmentRepository.populate_stack(stack)
11
- case stack.type
12
- when 'terraform'
13
- tf_tasks = TerraformStackTasks.new(stack)
14
- when 'packer'
15
- packer_tasks = PackerStackTasks.new(stack)
16
- end
17
-
18
- path = File.expand_path(File.join(TERRAFORM, stack.module_path))
19
-
20
- describe "Verify #{environment.name}:#{stack.name}" do
21
-
22
- if stack.type == 'terraform'
23
-
24
- it 'passes style check' do
25
- expect {
26
- expect(TerraformCli.terraform_check_style(path)).to be true
27
- }.to_not raise_error
28
- end
29
-
30
- it 'passes validation' do
31
- tmp_dir = Dir.mktmpdir
32
- # Copy module to the workspace
33
- FileUtils.copy_entry path, tmp_dir
34
-
35
- # Copy any dependencies to the workspace
36
- stack.dependencies.each do |dep|
37
- dep_path = File.expand_path(File.join(Covalence::TERRAFORM, dep))
38
- FileUtils.cp_r dep_path, tmp_dir
39
- end
40
-
41
- Dir.chdir(tmp_dir) do
42
- expect {
43
- expect(TerraformCli.terraform_get(path)).to be true
44
- }.to_not raise_error
45
-
46
- expect {
47
- expect(TerraformCli.terraform_init).to be true
48
- }.to_not raise_error
49
-
50
- stack.materialize_cmd_inputs
51
-
52
- expect {
53
- expect(TerraformCli.terraform_validate("-input=false -var-file=covalence-inputs.tfvars")).to be true
54
- }.to_not raise_error
55
- end
56
- end
57
-
58
- it 'passes execution' do
59
- expect {
60
- expect(tf_tasks.stack_verify).to be true
61
- }.to_not raise_error
62
- end
63
-
64
- elsif stack.type == 'packer'
65
-
66
- it 'passes validation' do
67
- expect {
68
- expect(packer_tasks.context_validate(stack.contexts.first.to_packer_command_options)).to be true
69
- }.to_not raise_error
13
+ jobs.push(stack)
14
+ end
15
+ end
16
+ Covalence::LOGGER.info "jobs.length: #{jobs.length}"
17
+
18
+ # start the workers
19
+ myworkers = (Covalence::WORKER_COUNT).times.map do
20
+ Thread.new do
21
+ begin
22
+ while stack = jobs.pop(true)
23
+ case stack.type
24
+ when 'terraform'
25
+ _tmp_dir = Dir.mktmpdir
26
+ tf_tasks = TerraformStackTasks.new(stack)
27
+ exit false if !tf_tasks.stack_verify(_tmp_dir)
28
+ when 'packer'
29
+ packer_tasks = PackerStackTasks.new(stack)
30
+ exit false if !packer_tasks.context_validate(stack.contexts.first.to_packer_command_options)
70
31
  end
71
32
  end
33
+ rescue ThreadError => e
72
34
  end
73
35
  end
74
36
  end
37
+ myworkers.map(&:join)
75
38
  end
39
+
@@ -1,3 +1,3 @@
1
1
  module Covalence
2
- VERSION = "0.8.4"
2
+ VERSION = "0.9.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: covalence
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Unif.io
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-01 00:00:00.000000000 Z
11
+ date: 2019-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -318,6 +318,20 @@ dependencies:
318
318
  - - "~>"
319
319
  - !ruby/object:Gem::Version
320
320
  version: 0.16.1
321
+ - !ruby/object:Gem::Dependency
322
+ name: solargraph
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
321
335
  description:
322
336
  email:
323
337
  - support@unif.io
@@ -383,7 +397,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
383
397
  version: '0'
384
398
  requirements: []
385
399
  rubyforge_project:
386
- rubygems_version: 2.7.7
400
+ rubygems_version: 2.7.6.2
387
401
  signing_key:
388
402
  specification_version: 4
389
403
  summary: A tool for the management and orchestration of data used by HashiCorp infrastructure