dapp 0.6.1 → 0.6.2

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dapp +3 -3
  3. data/config/en/common.yml +19 -4
  4. data/config/en/net_status.yml +13 -4
  5. data/lib/dapp.rb +48 -16
  6. data/lib/dapp/application.rb +75 -40
  7. data/lib/dapp/application/path.rb +3 -2
  8. data/lib/dapp/application/stages.rb +59 -0
  9. data/lib/dapp/artifact.rb +22 -0
  10. data/lib/dapp/build/stage/after_install_artifact.rb +13 -0
  11. data/lib/dapp/build/stage/after_setup_artifact.rb +17 -0
  12. data/lib/dapp/build/stage/artifact_base.rb +80 -0
  13. data/lib/dapp/build/stage/artifact_default.rb +62 -0
  14. data/lib/dapp/build/stage/base.rb +47 -12
  15. data/lib/dapp/build/stage/before_install.rb +6 -5
  16. data/lib/dapp/build/stage/before_install_artifact.rb +13 -0
  17. data/lib/dapp/build/stage/before_setup.rb +7 -8
  18. data/lib/dapp/build/stage/before_setup_artifact.rb +13 -0
  19. data/lib/dapp/build/stage/build_artifact.rb +32 -0
  20. data/lib/dapp/build/stage/docker_instructions.rb +4 -22
  21. data/lib/dapp/build/stage/from.rb +7 -8
  22. data/lib/dapp/build/stage/ga_archive.rb +1 -1
  23. data/lib/dapp/build/stage/ga_archive_dependencies.rb +1 -1
  24. data/lib/dapp/build/stage/ga_artifact_patch.rb +21 -0
  25. data/lib/dapp/build/stage/ga_base.rb +6 -29
  26. data/lib/dapp/build/stage/ga_dependencies_base.rb +4 -13
  27. data/lib/dapp/build/stage/ga_latest_patch.rb +2 -2
  28. data/lib/dapp/build/stage/import_artifact.rb +69 -0
  29. data/lib/dapp/build/stage/install/ga_post_install_patch.rb +1 -1
  30. data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +1 -1
  31. data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +1 -7
  32. data/lib/dapp/build/stage/install/install.rb +12 -7
  33. data/lib/dapp/build/stage/mod/logging.rb +10 -7
  34. data/lib/dapp/build/stage/setup/chef_cookbooks.rb +3 -4
  35. data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +1 -1
  36. data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +2 -2
  37. data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +2 -8
  38. data/lib/dapp/build/stage/setup/setup.rb +12 -7
  39. data/lib/dapp/builder/base.rb +13 -1
  40. data/lib/dapp/builder/chef.rb +125 -79
  41. data/lib/dapp/builder/chef/cookbook_metadata.rb +1 -1
  42. data/lib/dapp/builder/shell.rb +2 -3
  43. data/lib/dapp/cli.rb +3 -3
  44. data/lib/dapp/cli/base.rb +0 -2
  45. data/lib/dapp/cli/bp.rb +0 -4
  46. data/lib/dapp/cli/build.rb +3 -7
  47. data/lib/dapp/cli/cleanup.rb +0 -2
  48. data/lib/dapp/cli/list.rb +0 -2
  49. data/lib/dapp/cli/mrproper.rb +22 -0
  50. data/lib/dapp/cli/push.rb +4 -3
  51. data/lib/dapp/cli/run.rb +0 -2
  52. data/lib/dapp/cli/spush.rb +0 -2
  53. data/lib/dapp/cli/stage_image.rb +24 -0
  54. data/lib/dapp/cli/stages.rb +7 -5
  55. data/lib/dapp/cli/stages/cleanup_local.rb +28 -0
  56. data/lib/dapp/cli/stages/cleanup_repo.rb +24 -0
  57. data/lib/dapp/cli/stages/{flush.rb → flush_local.rb} +4 -6
  58. data/lib/dapp/cli/stages/{cleanup.rb → flush_repo.rb} +4 -6
  59. data/lib/dapp/cli/stages/pull.rb +28 -0
  60. data/lib/dapp/cli/stages/push.rb +24 -0
  61. data/lib/dapp/config/application.rb +185 -44
  62. data/lib/dapp/config/artifact.rb +10 -50
  63. data/lib/dapp/config/directive/artifact.rb +77 -0
  64. data/lib/dapp/config/directive/build_dir.rb +9 -0
  65. data/lib/dapp/config/directive/chef.rb +95 -0
  66. data/lib/dapp/config/directive/docker/artifact.rb +26 -0
  67. data/lib/dapp/config/directive/docker/base.rb +91 -0
  68. data/lib/dapp/config/directive/git_artifact.rb +59 -0
  69. data/lib/dapp/config/directive/shell/artifact.rb +38 -0
  70. data/lib/dapp/config/directive/shell/base.rb +85 -0
  71. data/lib/dapp/config/directive/tmp_dir.rb +36 -0
  72. data/lib/dapp/config/main.rb +1 -7
  73. data/lib/dapp/core_ext/hash.rb +21 -0
  74. data/lib/dapp/docker_registry/base.rb +60 -5
  75. data/lib/dapp/docker_registry/mod/request.rb +2 -14
  76. data/lib/dapp/git_artifact.rb +32 -23
  77. data/lib/dapp/git_repo/base.rb +1 -1
  78. data/lib/dapp/image/argument.rb +3 -3
  79. data/lib/dapp/image/docker.rb +13 -16
  80. data/lib/dapp/image/scratch.rb +29 -0
  81. data/lib/dapp/image/stage.rb +33 -23
  82. data/lib/dapp/lock/base.rb +18 -11
  83. data/lib/dapp/lock/file.rb +18 -16
  84. data/lib/dapp/prctl.rb +1 -0
  85. data/lib/dapp/project.rb +22 -9
  86. data/lib/dapp/project/command/bp.rb +2 -5
  87. data/lib/dapp/project/command/build.rb +1 -2
  88. data/lib/dapp/project/command/cleanup.rb +9 -7
  89. data/lib/dapp/project/command/common.rb +37 -12
  90. data/lib/dapp/project/command/mrproper.rb +57 -0
  91. data/lib/dapp/project/command/push.rb +8 -2
  92. data/lib/dapp/project/command/run.rb +1 -1
  93. data/lib/dapp/project/command/stage_image.rb +15 -0
  94. data/lib/dapp/project/command/stages/cleanup_local.rb +100 -0
  95. data/lib/dapp/project/command/stages/cleanup_repo.rb +65 -0
  96. data/lib/dapp/project/command/stages/common.rb +48 -0
  97. data/lib/dapp/project/command/stages/flush_local.rb +24 -0
  98. data/lib/dapp/project/command/stages/flush_repo.rb +22 -0
  99. data/lib/dapp/project/command/stages/pull.rb +26 -0
  100. data/lib/dapp/project/command/stages/push.rb +22 -0
  101. data/lib/dapp/project/dappfile.rb +3 -1
  102. data/lib/dapp/project/deps/base.rb +52 -0
  103. data/lib/dapp/project/deps/gitartifact.rb +36 -0
  104. data/lib/dapp/project/lock.rb +20 -13
  105. data/lib/dapp/project/logging/base.rb +20 -3
  106. data/lib/dapp/project/logging/i18n.rb +25 -0
  107. data/lib/dapp/project/logging/paint.rb +47 -0
  108. data/lib/dapp/project/logging/process.rb +17 -10
  109. data/lib/dapp/project/shellout/base.rb +74 -0
  110. data/lib/dapp/project/shellout/streaming.rb +49 -0
  111. data/lib/dapp/project/shellout/system.rb +72 -0
  112. data/lib/dapp/project/ssh_agent.rb +8 -9
  113. data/lib/dapp/version.rb +1 -1
  114. metadata +48 -17
  115. data/lib/dapp/build/stage/artifact.rb +0 -40
  116. data/lib/dapp/build/stage/mod/artifact.rb +0 -79
  117. data/lib/dapp/config/chef.rb +0 -51
  118. data/lib/dapp/config/docker.rb +0 -82
  119. data/lib/dapp/config/git_artifact.rb +0 -51
  120. data/lib/dapp/config/shell.rb +0 -64
  121. data/lib/dapp/helper/i18n.rb +0 -20
  122. data/lib/dapp/helper/paint.rb +0 -27
  123. data/lib/dapp/helper/shellout.rb +0 -63
  124. data/lib/dapp/helper/streaming.rb +0 -47
  125. data/lib/dapp/project/command/stages_cleanup.rb +0 -72
  126. data/lib/dapp/project/command/stages_flush.rb +0 -20
  127. data/lib/dapp/project/paint.rb +0 -16
@@ -16,7 +16,7 @@ module Dapp
16
16
  end
17
17
 
18
18
  def next_g_a_stage
19
- next_stage # GALatestPatch
19
+ next_stage.next_stage
20
20
  end
21
21
  end # GAPostSetupPatch
22
22
  end
@@ -12,11 +12,11 @@ module Dapp
12
12
  end
13
13
 
14
14
  def prev_g_a_stage
15
- super.prev_stage # GAPostInstallPatch
15
+ super.prev_stage.prev_stage # GAPostInstallPatch
16
16
  end
17
17
 
18
18
  def next_g_a_stage
19
- super.next_stage # GAPostSetupPatch
19
+ super.next_stage # GAPostSetupPatch || GAArtifactPatch
20
20
  end
21
21
  end # GAPrePatch
22
22
  end
@@ -7,18 +7,12 @@ module Dapp
7
7
  include Mod::Group
8
8
 
9
9
  def initialize(application, next_stage)
10
- @prev_stage = BeforeSetup.new(application, self)
10
+ @prev_stage = BeforeSetupArtifact.new(application, self)
11
11
  super
12
12
  end
13
13
 
14
14
  def dependencies
15
- [setup_dependencies_files_checksum, application.builder.setup_checksum]
16
- end
17
-
18
- private
19
-
20
- def setup_dependencies_files_checksum
21
- @setup_files_checksum ||= dependencies_files_checksum(application.config._setup_dependencies)
15
+ next_stage.next_stage.context # Setup
22
16
  end
23
17
  end # GAPreSetupPatchDependencies
24
18
  end
@@ -12,17 +12,22 @@ module Dapp
12
12
  end
13
13
 
14
14
  def empty?
15
- super && !application.builder.setup?
15
+ !application.builder.setup?
16
16
  end
17
17
 
18
- def dependencies
19
- prev_stage.prev_stage.dependencies # GAPreSetupPatchDependencies
18
+ def context
19
+ [setup_dependencies_files_checksum, application.builder.setup_checksum]
20
20
  end
21
21
 
22
- def image
23
- super do |image|
24
- application.builder.setup(image)
25
- end
22
+ def prepare_image
23
+ super
24
+ application.builder.setup(image)
25
+ end
26
+
27
+ private
28
+
29
+ def setup_dependencies_files_checksum
30
+ @setup_files_checksum ||= dependencies_files_checksum(application.config._setup_dependencies)
26
31
  end
27
32
  end # Setup
28
33
  end
@@ -8,7 +8,7 @@ module Dapp
8
8
  @application = application
9
9
  end
10
10
 
11
- def before_application_export
11
+ def before_application_should_be_built_check
12
12
  end
13
13
 
14
14
  def before_install?
@@ -59,6 +59,18 @@ module Dapp
59
59
  raise
60
60
  end
61
61
 
62
+ def build_artifact?
63
+ false
64
+ end
65
+
66
+ def build_artifact(_image)
67
+ raise
68
+ end
69
+
70
+ def build_artifact_checksum
71
+ raise
72
+ end
73
+
62
74
  def chef_cookbooks(_image)
63
75
  end
64
76
 
@@ -11,31 +11,24 @@ module Dapp
11
11
 
12
12
  DEFAULT_CHEFDK_IMAGE = 'dappdeps/chefdk:0.17.3-1'.freeze # TODO: config, DSL, DEFAULT_CHEFDK_IMAGE
13
13
 
14
- def before_application_export
15
- super
16
-
17
- %i(before_install install before_setup setup chef_cookbooks).each do |stage|
18
- raise ::Dapp::Error::Application, code: :cookbooks_stage_checksum_not_caclculated,
19
- data: { stage: stage } unless stage_cookbooks_checksum_path(stage).exist?
14
+ %i(before_install install before_setup setup build_artifact).each do |stage|
15
+ define_method("#{stage}_checksum") do
16
+ application.hashsum [stage_cookbooks_checksum(stage),
17
+ stage_attributes_raw(stage),
18
+ *stage_cookbooks_runlist(stage)]
20
19
  end
21
- end
22
-
23
- %i(before_install install before_setup setup).each do |stage|
24
- define_method("#{stage}_checksum") { stage_cookbooks_checksum(stage) }
25
20
 
26
21
  define_method("#{stage}?") { !stage_empty?(stage) }
27
22
 
28
23
  define_method(stage.to_s) do |image|
29
24
  unless stage_empty?(stage)
30
25
  image.add_volumes_from(chefdk_container)
31
- image.add_command 'export PATH=/.dapp/deps/chefdk/bin:$PATH',
32
- "export DAPP_BUILD_STAGE=#{stage}"
33
-
34
26
  image.add_volume "#{stage_build_path(stage)}:#{container_stage_build_path(stage)}:ro"
35
- image.add_command ['chef-solo',
27
+ image.add_command ['/.dapp/deps/chefdk/bin/chef-solo',
36
28
  '--legacy-mode',
37
- "-c #{container_stage_config_path(stage)}",
38
- "-o #{stage_cookbooks_runlist(stage).join(',')}"].join(' ')
29
+ "--config #{container_stage_config_path(stage)}",
30
+ "--json-attributes #{container_stage_json_attributes_path(stage)}",
31
+ "--override-runlist #{stage_cookbooks_runlist(stage).join(',')}"].join(' ')
39
32
  end
40
33
  end
41
34
  end
@@ -45,14 +38,23 @@ module Dapp
45
38
  end
46
39
 
47
40
  def chef_cookbooks(image)
48
- image.add_volume "#{cookbooks_vendor_path}:#{application.container_dapp_path('chef_cookbooks')}"
41
+ image.add_volume "#{cookbooks_vendor_path(chef_cookbooks_stage: true)}:#{application.container_dapp_path('chef_cookbooks')}"
49
42
  image.add_command(
50
- 'mkdir -p /usr/share/dapp/chef_repo',
51
- ["cp -a #{application.container_dapp_path('chef_cookbooks')} ",
43
+ "#{application.project.mkdir_path} -p /usr/share/dapp/chef_repo",
44
+ ["#{application.project.cp_path} -a #{application.container_dapp_path('chef_cookbooks')} ",
52
45
  '/usr/share/dapp/chef_repo/cookbooks'].join
53
46
  )
54
47
  end
55
48
 
49
+ def before_application_should_be_built_check
50
+ super
51
+
52
+ %i(before_install install before_setup setup build_artifact chef_cookbooks).each do |stage|
53
+ raise ::Dapp::Error::Application, code: :cookbooks_stage_checksum_not_calculated,
54
+ data: { stage: stage } unless stage_cookbooks_checksum_path(stage).exist?
55
+ end
56
+ end
57
+
56
58
  private
57
59
 
58
60
  def enabled_modules
@@ -63,6 +65,14 @@ module Dapp
63
65
  application.config._chef._recipes
64
66
  end
65
67
 
68
+ def stage_attributes(stage)
69
+ application.config._chef.send("_#{stage}_attributes")
70
+ end
71
+
72
+ def stage_attributes_raw(stage)
73
+ JSON.dump stage_attributes(stage)
74
+ end
75
+
66
76
  def project_name
67
77
  cookbook_metadata.name
68
78
  end
@@ -84,7 +94,12 @@ module Dapp
84
94
  end
85
95
 
86
96
  def cookbook_metadata
87
- @cookbook_metadata ||= CookbookMetadata.new(cookbook_metadata_path)
97
+ @cookbook_metadata ||= CookbookMetadata.new(cookbook_metadata_path).tap do |metadata|
98
+ metadata.depends.each do |dependency|
99
+ raise Error, code: :mdapp_dependency_in_metadata_forbidden,
100
+ data: { dependency: dependency } if dependency.start_with? 'mdapp-'
101
+ end
102
+ end
88
103
  end
89
104
 
90
105
  def berksfile_lock_checksum
@@ -100,11 +115,11 @@ module Dapp
100
115
  stage_cookbooks_checksum_path(stage).read.strip
101
116
  else
102
117
  checksum = if stage == :chef_cookbooks
103
- paths = Dir[cookbooks_vendor_path('**/*')].map(&Pathname.method(:new))
118
+ paths = Dir[cookbooks_vendor_path('**/*', chef_cookbooks_stage: true)].map(&Pathname.method(:new))
104
119
 
105
120
  application.hashsum [
106
121
  application.paths_content_hashsum(paths),
107
- *paths.map { |p| p.relative_path_from(cookbooks_vendor_path).to_s }.sort
122
+ *paths.map { |p| p.relative_path_from(cookbooks_vendor_path(chef_cookbooks_stage: true)).to_s }.sort
108
123
  ]
109
124
  else
110
125
  paths = Dir[stage_cookbooks_path(stage, '**/*')].map(&Pathname.method(:new))
@@ -112,7 +127,6 @@ module Dapp
112
127
  application.hashsum [
113
128
  application.paths_content_hashsum(paths),
114
129
  *paths.map { |p| p.relative_path_from(stage_cookbooks_path(stage)).to_s }.sort,
115
- *enabled_modules,
116
130
  stage == :before_install ? chefdk_image : nil
117
131
  ].compact
118
132
  end
@@ -158,8 +172,8 @@ module Dapp
158
172
  def chefdk_container
159
173
  @chefdk_container ||= begin
160
174
  if application.project.shellout("docker inspect #{chefdk_container_name}").exitstatus.nonzero?
161
- application.project.log_secondary_process(application.project.t(code: 'process.chefdk_loading'), short: true) do
162
- application.project.shellout(
175
+ application.project.log_secondary_process(application.project.t(code: 'process.chefdk_container_loading'), short: true) do
176
+ application.project.shellout!(
163
177
  ['docker create',
164
178
  "--name #{chefdk_container_name}",
165
179
  "--volume /.dapp/deps/chefdk #{chefdk_image}"].join(' ')
@@ -172,14 +186,19 @@ module Dapp
172
186
  end
173
187
 
174
188
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
175
- def install_cookbooks
176
- volumes_from = chefdk_container
177
- application.project.log_secondary_process(application.project.t(code: 'process.berks_vendor')) do
189
+ def install_cookbooks(dest_path, chef_cookbooks_stage: false)
190
+ volumes_from = [application.project.base_container, chefdk_container]
191
+ process_code = [
192
+ 'process',
193
+ chef_cookbooks_stage ? 'chef_cookbooks_stage_berks_vendor' : 'berks_vendor'
194
+ ].compact.join('.')
195
+
196
+ application.project.log_secondary_process(application.project.t(code: process_code)) do
178
197
  before_vendor_commands = [].tap do |commands|
179
- unless application.project.cli_options[:dev]
198
+ unless application.project.cli_options[:dev] || chef_cookbooks_stage
180
199
  commands.push(
181
200
  ['if [ ! -f Berksfile.lock ] ; then ',
182
- 'echo "Berksfile.lock not found" 1>&2 ; ',
201
+ "#{application.project.echo_path} \"Berksfile.lock not found\" 1>&2 ; ",
183
202
  'exit 1 ; ',
184
203
  'fi'].join
185
204
  )
@@ -189,14 +208,15 @@ module Dapp
189
208
  after_vendor_commands = [].tap do |commands|
190
209
  if application.project.cli_options[:dev]
191
210
  commands.push(
192
- ["install -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a Berksfile.lock) ",
211
+ ["#{application.project.install_path} -o #{Process.uid} -g #{Process.gid} ",
212
+ "--mode $(#{application.project.stat_path} -c %a Berksfile.lock) ",
193
213
  "Berksfile.lock #{berksfile_lock_path}"].join
194
214
  )
195
- else
215
+ elsif !chef_cookbooks_stage
196
216
  commands.push(
197
- "export LOCKDIFF=$(diff -u1 Berksfile.lock #{berksfile_lock_path})",
217
+ "export LOCKDIFF=$(#{application.project.diff_path} -u1 Berksfile.lock #{berksfile_lock_path})",
198
218
  ['if [ "$LOCKDIFF" != "" ] ; then ',
199
- 'echo -e "Bad Berksfile.lock\n$LOCKDIFF" 1>&2 ; ',
219
+ "#{application.project.echo_path} -e \"Bad Berksfile.lock\n$LOCKDIFF\" 1>&2 ; ",
200
220
  'exit 1 ; ',
201
221
  'fi'].join
202
222
  )
@@ -204,50 +224,62 @@ module Dapp
204
224
  end
205
225
 
206
226
  vendor_commands = [
207
- 'mkdir -p ~/.ssh',
208
- 'echo "Host *" >> ~/.ssh/config',
209
- 'echo " StrictHostKeyChecking no" >> ~/.ssh/config',
227
+ "#{application.project.mkdir_path} -p ~/.ssh",
228
+ "#{application.project.echo_path} \"Host *\" >> ~/.ssh/config",
229
+ "#{application.project.echo_path} \" StrictHostKeyChecking no\" >> ~/.ssh/config",
210
230
  *berksfile.local_cookbooks
211
231
  .values
212
- .map { |cookbook| "rsync --archive --relative #{cookbook[:path]} /tmp/local_cookbooks" },
232
+ .map { |cookbook| "#{application.project.rsync_path} --archive --relative #{cookbook[:path]} /tmp/local_cookbooks" },
213
233
  "cd /tmp/local_cookbooks/#{berksfile_path.parent}",
214
234
  *before_vendor_commands,
215
235
  '/.dapp/deps/chefdk/bin/berks vendor /tmp/cookbooks',
216
236
  *after_vendor_commands,
217
- ["find /tmp/cookbooks -type d -exec bash -ec '",
218
- "install -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a {}) -d ",
219
- "#{_cookbooks_vendor_path}/$(echo {} | sed -e \"s/^\\/tmp\\/cookbooks//\")' \\;"].join,
220
- ["find /tmp/cookbooks -type f -exec bash -ec '",
221
- "install -o #{Process.uid} -g #{Process.gid} --mode $(stat -c %a {}) {} ",
222
- "#{_cookbooks_vendor_path}/$(echo {} | sed -e \"s/\\/tmp\\/cookbooks//\")' \\;"].join,
223
- "install -o #{Process.uid} -g #{Process.gid} --mode 0644 <(date +%s.%N) #{_cookbooks_vendor_path.join('.created_at')}"
237
+ ["#{application.project.find_path} /tmp/cookbooks -type d -exec #{application.project.bash_path} -ec '",
238
+ "#{application.project.install_path} -o #{Process.uid} -g #{Process.gid} --mode $(#{application.project.stat_path} -c %a {}) -d ",
239
+ "#{dest_path}/$(#{application.project.echo_path} {} | #{application.project.sed_path} -e \"s/^\\/tmp\\/cookbooks//\")' \\;"].join,
240
+ ["#{application.project.find_path} /tmp/cookbooks -type f -exec #{application.project.bash_path} -ec '",
241
+ "#{application.project.install_path} -o #{Process.uid} -g #{Process.gid} --mode $(#{application.project.stat_path} -c %a {}) {} ",
242
+ "#{dest_path}/$(#{application.project.echo_path} {} | #{application.project.sed_path} -e \"s/\\/tmp\\/cookbooks//\")' \\;"].join,
243
+ "#{application.project.install_path} -o #{Process.uid} -g #{Process.gid} --mode 0644 <(#{application.project.date_path} +%s.%N) #{dest_path.join('.created_at')}"
224
244
  ]
225
245
 
226
246
  application.project.shellout!(
227
247
  ['docker run --rm',
228
- "--volumes-from #{volumes_from}",
248
+ volumes_from.map { |container| "--volumes-from #{container}" }.join(' '),
229
249
  *berksfile.local_cookbooks
230
250
  .values
231
251
  .map { |cookbook| "--volume #{cookbook[:path]}:#{cookbook[:path]}" },
232
252
  ("--volume #{application.project.ssh_auth_sock}:#{application.project.ssh_auth_sock}" if application.project.ssh_auth_sock),
233
- "--volume #{_cookbooks_vendor_path.tap(&:mkpath)}:#{_cookbooks_vendor_path}",
253
+ "--volume #{dest_path.tap(&:mkpath)}:#{dest_path}",
234
254
  ("--env SSH_AUTH_SOCK=#{application.project.ssh_auth_sock}" if application.project.ssh_auth_sock),
235
- "dappdeps/berksdeps:0.1.0 bash -ec '#{application.project.shellout_pack(vendor_commands.join(' && '))}'"].compact.join(' '),
236
- log_verbose: application.project.log_verbose?
255
+ ('--env DAPP_CHEF_COOKBOOKS_VENDORING=1' if chef_cookbooks_stage),
256
+ "dappdeps/berksdeps:0.1.0 #{application.project.bash_path} -ec '#{application.project.shellout_pack(vendor_commands.join(' && '))}'"].compact.join(' '),
257
+ log_verbose: application.project.log_verbose?
237
258
  )
238
259
  end
239
260
  end
240
261
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
241
262
 
242
- def _cookbooks_vendor_path
243
- application.build_path.join('cookbooks', cookbooks_checksum)
263
+ def _cookbooks_vendor_path(chef_cookbooks_stage: false)
264
+ application.build_path.join(
265
+ ['cookbooks', chef_cookbooks_stage ? 'chef_cookbooks_stage' : nil].compact.join('.'),
266
+ cookbooks_checksum
267
+ )
244
268
  end
245
269
 
246
- def cookbooks_vendor_path(*path)
247
- _cookbooks_vendor_path.tap do |cookbooks_path|
248
- application.project.lock("#{application.config._basename}.cookbooks.#{cookbooks_checksum}", default_timeout: 120) do
249
- @install_cookbooks ||= begin
250
- install_cookbooks unless _cookbooks_vendor_path.join('.created_at').exist? && !application.project.cli_options[:dev]
270
+ def cookbooks_vendor_path(*path, chef_cookbooks_stage: false)
271
+ _cookbooks_vendor_path(chef_cookbooks_stage: chef_cookbooks_stage).tap do |_cookbooks_path|
272
+ lock_name = [
273
+ application.config._basename,
274
+ 'cookbooks',
275
+ chef_cookbooks_stage ? 'chef_cookbooks_stage' : nil,
276
+ cookbooks_checksum
277
+ ].compact.join('.')
278
+
279
+ application.project.lock(lock_name, default_timeout: 120) do
280
+ @install_cookbooks ||= {}
281
+ @install_cookbooks[chef_cookbooks_stage] ||= begin
282
+ install_cookbooks(_cookbooks_path, chef_cookbooks_stage: chef_cookbooks_stage) unless _cookbooks_path.join('.created_at').exist? && !application.project.cli_options[:dev]
251
283
  true
252
284
  end
253
285
  end
@@ -256,13 +288,11 @@ module Dapp
256
288
 
257
289
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
258
290
  def install_stage_cookbooks(stage)
259
- select_existing_paths = ->(cookbook_path, paths) do
291
+ select_existing_paths = proc do |cookbook_path, paths|
260
292
  paths.select { |from, _| cookbook_path.join(from).exist? }
261
293
  end
262
294
 
263
- common_paths = [['metadata.json', 'metadata.json'],
264
- ["files/#{stage}", 'files/default'],
265
- ["templates/#{stage}", 'templates/default']]
295
+ common_paths = [['metadata.json', 'metadata.json']]
266
296
 
267
297
  install_paths = Dir[cookbooks_vendor_path('*')]
268
298
  .map(&Pathname.method(:new))
@@ -274,35 +304,39 @@ module Dapp
274
304
  mdapp_enabled = is_mdapp && enabled_modules.include?(mdapp_name)
275
305
 
276
306
  paths = if is_project
307
+ common_dapp_paths = select_existing_paths.call(cookbook_path, [
308
+ *common_paths,
309
+ ["files/#{stage}/common", 'files/default'],
310
+ ["templates/#{stage}/common", 'templates/default'],
311
+ *enabled_recipes.flat_map do |recipe|
312
+ [["files/#{stage}/#{recipe}", 'files/default'],
313
+ ["templates/#{stage}/#{recipe}", 'templates/default']]
314
+ end
315
+ ])
316
+
277
317
  recipe_paths = enabled_recipes.map { |recipe| ["recipes/#{stage}/#{recipe}.rb", "recipes/#{recipe}.rb"] }
278
318
  .select { |from, _| cookbook_path.join(from).exist? }
279
-
280
- common_project_paths = select_existing_paths.call(
281
- cookbook_path, [*common_paths,
282
- ['attributes/common', 'attributes'],
283
- ["attributes/#{stage}", 'attributes']]
284
- )
285
-
286
319
  if recipe_paths.any?
287
- [*recipe_paths, *common_project_paths]
320
+ [*recipe_paths, *common_dapp_paths]
288
321
  else
289
- [nil, *common_project_paths]
322
+ [nil, *common_dapp_paths]
290
323
  end
291
324
  elsif is_mdapp && mdapp_enabled
292
- recipe_path = "recipes/#{stage}.rb"
293
-
294
- common_mdapp_paths = select_existing_paths.call(
295
- cookbook_path, [*common_paths,
296
- ['attributes/common.rb', 'attributes/common.rb'],
297
- ["attributes/#{stage}.rb", "attributes/#{stage}.rb"]]
298
- )
325
+ common_mdapp_paths = select_existing_paths.call(cookbook_path, [
326
+ *common_paths,
327
+ ["files/#{stage}", 'files/default'],
328
+ ['files/common', 'files/default'],
329
+ ["templates/#{stage}", 'templates/default'],
330
+ ['templates/common', 'templates/default']
331
+ ])
299
332
 
333
+ recipe_path = "recipes/#{stage}.rb"
300
334
  if cookbook_path.join(recipe_path).exist?
301
335
  [[recipe_path, recipe_path], *common_mdapp_paths]
302
336
  else
303
337
  [nil, *common_mdapp_paths]
304
338
  end
305
- else
339
+ elsif !is_mdapp
306
340
  [['.', '.']]
307
341
  end
308
342
 
@@ -351,11 +385,11 @@ module Dapp
351
385
  @stage_cookbooks_runlist[stage] ||= begin
352
386
  res = []
353
387
 
354
- does_entry_exist = lambda do |cookbook, entrypoint|
388
+ does_entry_exist = proc do |cookbook, entrypoint|
355
389
  stage_cookbooks_path(stage, cookbook, 'recipes', "#{entrypoint}.rb").exist?
356
390
  end
357
391
 
358
- format_entry = lambda do |cookbook, entrypoint|
392
+ format_entry = proc do |cookbook, entrypoint|
359
393
  entrypoint = 'void' if entrypoint.nil?
360
394
  "#{cookbook}::#{entrypoint}"
361
395
  end
@@ -418,6 +452,18 @@ module Dapp
418
452
  container_stage_build_path(stage, 'config.rb', *path)
419
453
  end
420
454
 
455
+ def install_json_attributes(stage)
456
+ @install_json_attributes ||= {}
457
+ @install_json_attributes[stage] ||= true.tap do
458
+ stage_build_path(stage, 'attributes.json').write "#{stage_attributes_raw(stage)}\n"
459
+ end
460
+ end
461
+
462
+ def container_stage_json_attributes_path(stage, *path)
463
+ install_json_attributes(stage)
464
+ container_stage_build_path(stage, 'attributes.json', *path)
465
+ end
466
+
421
467
  def stage_build_path(stage, *path)
422
468
  application.tmp_path(application.config._name, stage).join(*path)
423
469
  end