linecook-gem 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: efefc44a8a55a01bdec87e306d230cb9619591e3
4
- data.tar.gz: 0191500a0c3afd6d77fe5993f25a98a3af0f7845
3
+ metadata.gz: 1abf2321c6f050ebebaff2cd97736d181c3438d3
4
+ data.tar.gz: e8482496017204409f513273352ac69b50d41295
5
5
  SHA512:
6
- metadata.gz: 594899c26bf5f2e4b65f204c3599d24c72d85ea7511b1df44fe3b78baafe459ff681eb62622935bcabe0bf38d8d2a86ed0d262e14d5628f96c1f9300d7d33f1c
7
- data.tar.gz: 0150a55af2e4973141ff36515526fed4815a7efe68dd81648253cbbb8162cac5c87ac29c8f8fdb2965447a451c6f6aceefcbe9f5d99f9dd485bc294d0a7ef73e
6
+ metadata.gz: 310b56ecc9861ab86f2ed209fe8d77b64571e3b9d664747f2f785754388595be636ca1d3fcabaaf620b5c62fc2bdd3c877e11a40dee8d4ea09af4d7fe03d47f0
7
+ data.tar.gz: b8a143904d6c6924cff355ebac678bae6abca2e0cac2de2ffd32698bfc58243c63b2fc73161b20d6601117ddfe977d9fd154cbb5ca5f9dc2ff2a8ff89f0e59aa
data/lib/linecook/cli.rb CHANGED
@@ -63,10 +63,16 @@ class Image < Thor
63
63
  puts Linecook::ImageManager.url(image, **opts)
64
64
  end
65
65
 
66
- desc 'package IMAGE', 'Package image'
67
- method_options image: :string
68
- def package(image)
69
- Linecook::Packager.package(image)
66
+ desc 'package', 'Package image'
67
+ method_option :name, type: :string, required: false, banner: 'NAME', desc: 'Name of the image to snapshot. Specify this, or --latest with a type', aliases: '-n'
68
+ method_option :latest, type: :boolean, default: false, desc: 'Use the latest build for type', aliases: '-l'
69
+ method_option :ami, type: :boolean, default: true, desc: 'Create an ami', aliases: '-a'
70
+ method_option :type, type: :string, required: false, banner: 'ID', desc: 'Type of image to snapshot', aliases: '-t'
71
+ def package
72
+ fail 'Must specify image name or use latest' unless options[:name] || options[:latest]
73
+ fail 'Must specify type if specifying latest' if options[:latest] && !options[:type]
74
+ name = options[:latest] ? Linecook::ImageManager.latest(options[:type]) : options[:name]
75
+ Linecook::Packager.package(name, type: options[:type], ami: options[:ami])
70
76
  end
71
77
  end
72
78
 
@@ -2,6 +2,7 @@ require 'net/http'
2
2
  require 'open-uri'
3
3
  require 'timeout'
4
4
  require 'tmpdir'
5
+ require 'securerandom'
5
6
 
6
7
  require 'linecook/util/ssh'
7
8
  require 'linecook/util/executor'
@@ -14,20 +15,24 @@ module Linecook
14
15
  class EBS
15
16
  include Executor
16
17
 
17
- def initialize(hvm: true, size: 10, region: 'us-east-1')
18
+ def initialize(hvm: true, size: 10, region: nil, copy_regions: [], account_ids: [])
18
19
  @hvm = hvm
19
20
  @size = size
20
21
  @region = region
22
+ @copy_regions = copy_regions
23
+ @account_ids = account_ids
21
24
  end
22
25
 
23
- def package(image, type: nil)
26
+ def package(image, type: nil, ami: nil)
24
27
  @image = image
28
+ @name = "#{File.basename(image).gsub('.squashfs', '').gsub('-decrypted', '')}-#{SecureRandom.hex(4)}"
25
29
  @type = type
26
30
  setup_remote unless instance_id
27
31
  prepare
28
32
  execute("tar -C #{@mountpoint} -cpf - . | sudo tar -C #{@root} -xpf -")
29
33
  finalize
30
34
  snapshot
35
+ create_ami if ami
31
36
  end
32
37
 
33
38
  private
@@ -44,7 +49,7 @@ module Linecook
44
49
  execute("echo \"UUID=\\\"$(blkid -o value -s UUID #{@rootdev})\\\" / ext4 defaults 1 2\" > /tmp/fstab")
45
50
  execute("mv /tmp/fstab #{@root}/etc/fstab")
46
51
  chroot_exec('apt-get update')
47
- chroot_exec('apt-get install -y --force-yes grub-pc grub-legacy-ec2')
52
+ chroot_exec('apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y --force-yes --no-upgrade install grub-pc grub-legacy-ec2')
48
53
  chroot_exec('update-grub')
49
54
  execute("grub-install --root-directory=#{@root} $(echo #{@rootdev} | sed \"s/[0-9]*//g\")") if @hvm
50
55
  end
@@ -83,10 +88,13 @@ module Linecook
83
88
  @availability_zone ||= metadata('placement/availability-zone')
84
89
  end
85
90
 
86
- def client
91
+ def client(region: nil)
92
+ @client = nil if region
87
93
  @client ||= begin
94
+ region ||= @region
95
+ puts "Using AWS region #{region} for following request"
88
96
  credentials = Aws::Credentials.new(Linecook.config[:aws][:access_key], Linecook.config[:aws][:secret_key])
89
- Aws::EC2::Client.new(region: @region, credentials: credentials)
97
+ Aws::EC2::Client.new(region: region, credentials: credentials)
90
98
  end
91
99
  end
92
100
 
@@ -125,11 +133,77 @@ module Linecook
125
133
  wait_for_state('available', 120) do
126
134
  client.describe_volumes(volume_ids: [@volume_id]).volumes.first.state
127
135
  end
128
- resp = client.create_snapshot(volume_id: @volume_id, description: "Snapshot of #{File.basename(@image)}")
129
- tag(resp.snapshot_id, Name: 'Linecook snapshot', image: File.basename(@image), hvm: @hvm.to_s)
136
+ resp = client.create_snapshot(volume_id: @volume_id, description: "Snapshot of #{@name}")
137
+ @snapshot_id = resp.snapshot_id
138
+ tag(@snapshot_id, Name: 'Linecook snapshot', image: @name, hvm: @hvm.to_s)
130
139
  client.delete_volume(volume_id: @volume_id)
131
140
  end
132
141
 
142
+ def create_ami
143
+
144
+ puts "Waiting for snapshot #{@snapshot_id} to be completed"
145
+ wait_for_state('completed', 900) do
146
+ client.describe_snapshots(snapshot_ids: [@snapshot_id]).snapshots.first.state
147
+ end
148
+
149
+ puts "Registering an AMI with for #{@name}"
150
+ options = {
151
+ name: @name,
152
+ virtualization_type: @hvm ? 'hvm' : 'paravirtual',
153
+ architecture: 'x86_64', # fixme
154
+ root_device_name: '/dev/sda1', # fixme when does this need to be sda?
155
+ block_device_mappings: [{
156
+ device_name: '/dev/sda1',
157
+ ebs: {
158
+ snapshot_id: @snapshot_id,
159
+ volume_size: @size,
160
+ volume_type: @hvm ? 'gp2' : 'standard', # fixme: support iops?
161
+ delete_on_termination: true,
162
+ }
163
+ }]
164
+ }
165
+ options.merge!({sriov_net_support: 'simple'}) if @hvm
166
+
167
+ resp = client.register_image(**options)
168
+ @ami_id = resp.image_id
169
+
170
+ wait_for_state('available', 300) do
171
+ client.describe_images(image_ids: [@ami_id]).images.first.state
172
+ end
173
+
174
+ amis = {
175
+ @region => @ami_id
176
+ }
177
+
178
+ @copy_regions.each do |region|
179
+ puts "Copying #{@ami_id} to #{region}"
180
+ resp = client(region: region).copy_image({
181
+ source_region: @region,
182
+ source_image_id: @ami_id,
183
+ name: @name,
184
+ description: "Copy of #{@name}",
185
+ })
186
+ ami = resp.image_id
187
+ puts "Waiting for #{ami} to become available in #{region}"
188
+ wait_for_state('available', 1800) do
189
+ client.describe_images(image_ids: [ami]).images.first.state
190
+ end
191
+ amis[region] = ami
192
+ end
193
+
194
+ unless @account_ids.empty?
195
+ amis.each do |region, ami|
196
+ puts "Updating account permissions for #{ami} in #{region}"
197
+ client(region: region).modify_image_attribute({
198
+ operation_type: 'add',
199
+ attribute: 'launchPermission',
200
+ image_id: ami,
201
+ user_ids: @account_ids
202
+ })
203
+ end
204
+ end
205
+ end
206
+
133
207
  def free_device
134
208
  prefix = device_prefix
135
209
  ('f'..'zzz').to_a.each do |suffix|
@@ -4,8 +4,8 @@ module Linecook
4
4
  module Packager
5
5
  extend self
6
6
 
7
- def package(image, type: type)
8
- provider.package(image, type: type)
7
+ def package(image, type: type, **args)
8
+ provider.package(image, type: type, **args)
9
9
  end
10
10
 
11
11
  private
@@ -58,7 +58,9 @@ module Linecook
58
58
  ebs: {
59
59
  hvm: true,
60
60
  size: 10,
61
- region: 'us-east-1'
61
+ region: 'us-east-1',
62
+ copy_regions: [],
63
+ account_ids: []
62
64
  }
63
65
  },
64
66
  roles: {
@@ -1,3 +1,3 @@
1
1
  module Linecook
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
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.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Hamel
@@ -192,6 +192,34 @@ dependencies:
192
192
  - - '='
193
193
  - !ruby/object:Gem::Version
194
194
  version: 1.1.7
195
+ - !ruby/object:Gem::Dependency
196
+ name: rbnacl
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '='
200
+ - !ruby/object:Gem::Version
201
+ version: 3.2.0
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '='
207
+ - !ruby/object:Gem::Version
208
+ version: 3.2.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: rbnacl-libsodium
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '='
214
+ - !ruby/object:Gem::Version
215
+ version: 1.0.7
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 1.0.7
195
223
  - !ruby/object:Gem::Dependency
196
224
  name: rake
197
225
  requirement: !ruby/object:Gem::Requirement