linecook-gem 0.7.28 → 0.7.29

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
  SHA1:
3
- metadata.gz: e413a2e2ec8ce58d8c7fde9d9afdeb71d8810582
4
- data.tar.gz: d8fdaf376b5b9eb91981e3a849614430261ea8ba
3
+ metadata.gz: 617b8b12b9c62eef6319df894542e2d3289e3fa7
4
+ data.tar.gz: d13c1fb336d86b22d6178b65e4debc747d3809e1
5
5
  SHA512:
6
- metadata.gz: 97eb01613ffa7720947736573252a85f6613b114b9514d8c05ca643e78214f990fb94a490ad606454bcff52f2e3ee8c2ed2159a32248f958c1c5d3193de986af
7
- data.tar.gz: 0fae50c55a20d434114db047f427d3ccc40b2e3618f9e7d1e601c2e4e990c820c64f6178e225d7425e25b0460de13b0841bd84190f4b32105e6d7766d49aff6c
6
+ metadata.gz: 79e827a474f67b01a23dd31c6d641021c68eb6bc251a1d453e92aa0dbbefd009fe0d912841280c979714b78147b1a103dfa0cbf3aa5007f420102b57633963f5
7
+ data.tar.gz: 86232a32f22ecb61c9fee1f7b04984dd82dbf67f4e339d2aa79640823c0d40305d090a5abd2e12c49318debdfbf27e75da78359a5060aa75789fc1d4f6f8ee77
@@ -4,6 +4,7 @@ require 'kitchen'
4
4
  require 'kitchen/command/test'
5
5
 
6
6
  require 'linecook-gem/image'
7
+ require 'linecook-gem/util/common'
7
8
  require 'linecook-gem/baker/docker'
8
9
 
9
10
  module Linecook
@@ -13,12 +14,9 @@ module Linecook
13
14
  def initialize(image, directory: nil)
14
15
  @directory = File.expand_path(directory || Dir.pwd)
15
16
  @image = image
16
-
17
- Dir.chdir(@directory) do
18
- load_config
19
- munge_config
20
- @driver = driver
21
- end
17
+ @config = load_config
18
+ munge_config
19
+ @driver = driver
22
20
 
23
21
  end
24
22
 
@@ -81,21 +79,6 @@ module Linecook
81
79
  end
82
80
  end
83
81
 
84
- def load_config
85
- @config ||= begin
86
-
87
- Kitchen::Config.new(
88
- kitchen_root: @directory,
89
- loader: Kitchen::Loader::YAML.new(
90
- project_config: ENV['KITCHEN_YAML'] || File.join(@directory, '.kitchen.yml'),
91
- local_config: ENV['KITCHEN_LOCAL_YAML'],
92
- global_config: ENV['KITCHEN_GLOBAL_YAML']
93
- )
94
- )
95
-
96
- end
97
- end
98
-
99
82
  def munge_config
100
83
  data = @config.send(:data).instance_variable_get(:@data)
101
84
  @is_chef = data[:provisioner][:name] =~ /chef/
@@ -50,13 +50,14 @@ class Image < Thor
50
50
 
51
51
  desc 'package', 'Package image'
52
52
  method_option :name, type: :string, required: true, banner: 'NAME', desc: 'Name of the image to package.', aliases: '-n'
53
+ method_option :directory, type: :string, required: false, banner: 'DIR', desc: 'Directory containing kitchen files', aliases: '-d'
53
54
  method_option :tag, type: :string, default: 'latest', banner: 'NAME', desc: 'Tag of the image to package.', aliases: '-t'
54
55
  method_option :group, type: :string, required: false, banner: 'ID', desc: 'Group of image to package', aliases: '-g'
55
56
  method_option :strategy, type: :string, default: 'packer', banner: 'STRATEGY', enum: ['packer', 'squashfs'], desc: 'Packaging strategy', aliases: '-s'
56
57
  def package
57
58
  opts = options.symbolize_keys
58
59
  image = Linecook::Image.new(opts[:name], opts[:group], opts[:tag])
59
- Linecook::Packager.package(image, name: opts[:strategy])
60
+ Linecook::Packager.package(image, name: opts[:strategy], directory: opts[:directory])
60
61
  end
61
62
 
62
63
  desc 'save', 'Save running build'
@@ -9,9 +9,9 @@ module Linecook
9
9
  module Packager
10
10
  extend self
11
11
 
12
- def package(image, name: 'packer')
12
+ def package(image, name: 'packer', directory: nil)
13
13
  image.fetch
14
- provider(name.to_sym).package(image)
14
+ provider(name.to_sym).package(image, directory)
15
15
  end
16
16
 
17
17
  private
@@ -9,6 +9,7 @@ require 'pty'
9
9
  require 'linecook-gem/image'
10
10
  require 'linecook-gem/util/downloader'
11
11
  require 'linecook-gem/util/locking'
12
+ require 'linecook-gem/util/common'
12
13
  require 'linecook-gem/packager/route53'
13
14
 
14
15
  module Linecook
@@ -21,44 +22,44 @@ module Linecook
21
22
  PACKER_VERSION = '0.12.0'
22
23
  PACKER_PATH = File.join(Linecook::Config::LINECOOK_HOME, 'bin', 'packer')
23
24
 
25
+ PRE_MOUNT_COMMANDS = [
26
+ 'parted -s {{.Device}} mklabel msdos',
27
+ 'parted -s {{.Device}} mkpart primary ext2 0% 100%',
28
+ 'mkfs.ext4 {{.Device}}1',
29
+ 'tune2fs -L cloudimg-rootfs {{.Device}}1',
30
+ ]
31
+
32
+ POST_MOUNT_COMMANDS = [
33
+ 'tar -C {{.MountPath}} -xpf {{ user `source_image_path` }}',
34
+ 'cp /etc/resolv.conf {{.MountPath}}/etc',
35
+ 'echo "LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0" > {{.MountPath}}/etc/fstab',
36
+ 'grub-install --root-directory={{.MountPath}} {{.Device}}',
37
+ 'rm -rf {{.MountPath}}/etc/network',
38
+ 'cp -r /etc/network {{.MountPath}}/etc/',
39
+ ]
40
+
41
+ ROOT_DEVICE_MAP = {
42
+ device_name: 'xvda',
43
+ delete_on_termination: true
44
+ }
45
+
24
46
  BUILDER_CONFIG = {
25
47
  type: 'amazon-chroot',
26
48
  access_key: '{{ user `aws_access_key` }}',
27
49
  secret_key: '{{ user `aws_secret_key` }}',
28
- source_ami: "{{user `source_ami`}}",
29
50
  ami_name: 'packer-image.{{ user `image_name` }} {{timestamp}}',
30
- device_path: '/dev/{{ user `ebs_device` }}'
51
+ from_scratch: true,
52
+ root_device_name: ROOT_DEVICE_MAP[:device_name],
53
+ ami_block_device_mappings: [ ROOT_DEVICE_MAP ],
54
+ pre_mount_commands: PRE_MOUNT_COMMANDS,
55
+ post_mount_commands: POST_MOUNT_COMMANDS,
31
56
  }.freeze
32
57
 
33
- PROVISIONER_COMMANDS = [
34
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/proc/sys/fs/binfmt_misc',
35
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/proc',
36
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/sys',
37
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/dev/pts',
38
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/dev',
39
- 'mv /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/etc/network /tmp/{{ user `ebs_device`}}-network',
40
- 'umount /dev/{{ user `ebs_device` }}1',
41
- 'mkfs.ext4 /dev/{{ user `ebs_device` }}1',
42
- 'tune2fs -L cloudimg-rootfs /dev/{{ user `ebs_device` }}1',
43
- 'mkdir -p /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}',
44
- 'mount /dev/{{ user `ebs_device` }}1 /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}',
45
- 'tar -C /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }} -xpf {{ user `source_image_path` }}',
46
- 'cp /etc/resolv.conf /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/etc',
47
- 'echo "LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0" > /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/etc/fstab',
48
- 'mount -t proc none /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/proc',
49
- 'mount -o bind /sys /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/sys',
50
- 'mount -o bind /dev /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/dev',
51
- # Sadly we need to install grub inside the image, and this implementation is Ubunut specific. This can be patched eventually when needed
52
- 'chroot /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }} apt-get update',
53
- 'chroot /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }} apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --force-yes --no-upgrade install grub-pc grub-legacy-ec2',
54
- 'chroot /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }} update-grub',
55
- 'grub-install --root-directory=/mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }} /dev/{{ user `ebs_device` }}',
56
- 'rm -rf /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/etc/network',
57
- 'mv /tmp/{{ user `ebs_device`}}-network /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/etc/network',
58
- 'rm -f /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/etc/init/fake-container-events.conf', # HACK
59
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/proc',
60
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/sys',
61
- 'umount /mnt/packer-amazon-chroot-volumes/{{ user `ebs_device` }}/dev'
58
+ CHROOT_COMMANDS = [
59
+ 'apt-get update',
60
+ 'apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --force-yes --no-upgrade install grub-pc grub-legacy-ec2',
61
+ 'update-grub',
62
+ 'rm -f /etc/init/fake-container-events.conf', # HACK
62
63
  ]
63
64
 
64
65
  def initialize(config)
@@ -68,14 +69,18 @@ module Linecook
68
69
  @region = config[:region] || 'us-east-1'
69
70
  @copy_regions = config[:copy_regions] || []
70
71
  @accounts = config[:account_ids] || []
71
- @source_ami = config[:source_ami] || find_ami
72
72
  @write_txt = Linecook.config[:packager] && Linecook.config[:packager][:ami] && Linecook.config[:packager][:ami][:update_txt]
73
73
  end
74
74
 
75
- def package(image)
75
+ def package(image, directory)
76
76
  @image = image
77
+ kitchen_config = load_config(directory).send(:data).instance_variable_get(:@data)
78
+ image_config = kitchen_config[:suites].find{ |x| x[:name] == image.name }
79
+ if image_config && image_config[:packager]
80
+ packager = image_config[:packager] || {}
81
+ end
77
82
  conf_file = Tempfile.new("#{@image.id}-packer.json")
78
- config = generate_config
83
+ config = generate_config(packager)
79
84
  conf_file.write(config)
80
85
  conf_file.close
81
86
  output = []
@@ -111,13 +116,12 @@ module Linecook
111
116
  # amis = `grep "amazon-ebs,artifact,0,id" packer.log`.chomp.split(',')[5].split('%!(PACKER_COMMA)')
112
117
  # route53 TXT record integration
113
118
 
114
- def generate_config
119
+ def generate_config(packager)
120
+ packager ||= {}
115
121
  config = {
116
122
  variables: {
117
123
  aws_access_key: Linecook.config[:aws][:access_key],
118
124
  aws_secret_key: Linecook.config[:aws][:secret_key],
119
- ebs_device: free_device,
120
- source_ami: @source_ami,
121
125
  image_name: "linecook-#{@image.id}",
122
126
  source_image_path: @image.path
123
127
  },
@@ -127,22 +131,24 @@ module Linecook
127
131
  ami_regions: @copy_regions,
128
132
  ami_virtualization_type: virt_type,
129
133
  root_volume_size: @root_size
130
- )
134
+ ).deep_merge(packager[:builder] || {})
131
135
  ],
132
- provisioners: build_provisioner(PROVISIONER_COMMANDS)
136
+ provisioners: build_provisioner(CHROOT_COMMANDS)
133
137
  }
138
+
139
+ unless config[:builders].first[:ami_block_device_mappings].find { |x| x[:device_name] == ROOT_DEVICE_MAP[:device_name] }
140
+ config[:builders].first[:ami_block_device_mappings].prepend ROOT_DEVICE_MAP
141
+ end
134
142
  JSON.pretty_generate(config)
135
143
  end
136
144
 
137
- def build_provisioner(commands)
138
- provisioner = []
139
- commands.each do |cmd|
140
- provisioner << {
141
- type: 'shell-local',
142
- command: cmd
145
+ def build_provisioner(chroot_commands)
146
+ provisioner = [
147
+ {
148
+ type: 'shell',
149
+ inline: chroot_commands
143
150
  }
144
- end
145
- provisioner
151
+ ]
146
152
  end
147
153
 
148
154
  def packer_path
@@ -168,39 +174,6 @@ module Linecook
168
174
  PACKER_PATH
169
175
  end
170
176
 
171
- def free_device
172
- lock('device_scan')
173
- free = nil
174
- prefix = device_prefix
175
- ('f'..'zzz').to_a.each do |suffix|
176
- device = "#{prefix}#{suffix}"
177
- if free_device?(device)
178
- lock(device)
179
- at_exit do
180
- clear_lock(device)
181
- end
182
- free = device
183
- break
184
- end
185
- end
186
- unlock('device_scan')
187
- return free
188
- end
189
-
190
- def free_device?(device)
191
- !File.exists?("/dev/#{device}") && !File.exists?(lock_path(device))
192
- end
193
-
194
- def device_prefix
195
- prefixes = ['xvd']
196
- `sudo ls -1 /sys/block`.lines.each do |dev| # FIXME
197
- prefixes.each do |prefix|
198
- return prefix if dev =~ /^#{prefix}/
199
- end
200
- end
201
- return prefixes.first
202
- end
203
-
204
177
  def extract_amis_from_output(output)
205
178
  amis = output.grep(/amazon-chroot,artifact,0,id/).first.chomp.split(',')[5].split('%!(PACKER_COMMA)')
206
179
  amis.each do |info_str|
@@ -216,15 +189,5 @@ module Linecook
216
189
  @hvm ? 'hvm' : 'paravirtual'
217
190
  end
218
191
 
219
- def find_ami
220
- url = "http://uec-images.ubuntu.com/query/trusty/server/released.current.txt"
221
- data = open(url).read.split("\n").map{|l| l.split}.detect do |ary|
222
- ary[4] == 'ebs' &&
223
- ary[5] == 'amd64' &&
224
- ary[6] == @region &&
225
- ary.last == virt_type
226
- end
227
- data[7]
228
- end
229
192
  end
230
193
  end
@@ -1,3 +1,23 @@
1
+ require 'kitchen'
2
+
3
+ def load_config(directory)
4
+ @config ||= begin
5
+ Dir.chdir(directory) do
6
+ Kitchen::Config.new(
7
+ kitchen_root: Dir.pwd,
8
+ loader: Kitchen::Loader::YAML.new(
9
+ project_config: ENV['KITCHEN_YAML'] || File.join(Dir.pwd, '.kitchen.yml'),
10
+ local_config: ENV['KITCHEN_LOCAL_YAML'],
11
+ global_config: ENV['KITCHEN_GLOBAL_YAML']
12
+ )
13
+ )
14
+
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+
1
21
  def with_retries(retries, sleep_duration: 5, &block)
2
22
  attempts = 0
3
23
  while attempts < retries
@@ -1,3 +1,3 @@
1
1
  module Linecook
2
- VERSION = '0.7.28'
2
+ VERSION = '0.7.29'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linecook-gem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.28
4
+ version: 0.7.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Hamel