image_optimize 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ creds
2
+ .secrets
3
+ pkg
4
+ textmate.tmproj
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ -fs
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p448
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ CHANGELOG
2
+ =========
3
+
4
+ 1.0.1 - initial release for Ubuntu 12.04 on EC2
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'right_api_provision'
7
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ image_optimize (1.0.1)
5
+ mime-types (= 2.0)
6
+ right_api_client (= 1.5.15)
7
+ trollop (= 2.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ coderay (1.1.0)
13
+ diff-lcs (1.2.5)
14
+ json (1.8.1)
15
+ method_source (0.8.2)
16
+ mime-types (2.0)
17
+ pry (0.9.12.6)
18
+ coderay (~> 1.0)
19
+ method_source (~> 0.8)
20
+ slop (~> 3.4)
21
+ rake (10.3.0)
22
+ rest-client (1.6.7)
23
+ mime-types (>= 1.16)
24
+ right_api_client (1.5.15)
25
+ json
26
+ rest-client (~> 1.6)
27
+ right_api_provision (0.2.1)
28
+ right_api_client (= 1.5.15)
29
+ rspec (2.14.1)
30
+ rspec-core (~> 2.14.0)
31
+ rspec-expectations (~> 2.14.0)
32
+ rspec-mocks (~> 2.14.0)
33
+ rspec-core (2.14.8)
34
+ rspec-expectations (2.14.5)
35
+ diff-lcs (>= 1.1.3, < 2.0)
36
+ rspec-mocks (2.14.6)
37
+ slop (3.5.0)
38
+ trollop (2.0)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ image_optimize!
45
+ pry
46
+ rake
47
+ right_api_provision
48
+ rspec (~> 2.14)
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2014 RightScale, Inc.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,128 @@
1
+ Image Optimizer
2
+ ===============
3
+
4
+ Bundle a running VM into a new image for use on next launch.
5
+
6
+ Useful for drastically reducing boot times in your auto-scaling tier.
7
+
8
+ Basic Workflow
9
+ --------------
10
+ 1. Launch a EC2 instance from a base OS image.
11
+ 2. Converge system into whatever you want it to be (i.e. application server)
12
+ 3. Prepare the system for snapshotting. (see [clean_for_rebundle](https://github.com/caryp/clean_for_rebundle) project)
13
+ 3. Install and run image_optimize
14
+ 4. Next launch will be optimized!!
15
+
16
+ Requirements
17
+ ------------
18
+ * EC2 Cloud only
19
+ * VMs must be launched via the [RightScale Platform](www.rightscale.com)
20
+
21
+ Usage
22
+ -----
23
+
24
+ image_optimize [options]
25
+
26
+ where [options] are:
27
+
28
+ --verbose, -v: If set will enable debug logging. WARNING: will write ec2 creds to log if set!!
29
+ --prefix, -r <s>: Prefix to add to the optimized image name. Helps when searching for your optimized images. (Default: optimized-image)
30
+ --description, -d <s>: Description to add to optimized images (default: Cached image)
31
+ --api-user, -u <s>: RightScale Dashboard User email. Not needed if API_USER_EMAIL environment variable is set.
32
+ --api-password, -p <s>: RightScale Dashboard User email. Not needed if API_USER_PASSWORD environment variable is set.
33
+ --cleanup, --no-cleanup, -c: Don't do any cleanup on VM before snapshotting. Useful for debugging. (Default: true)
34
+ --aws-access-key, -k: EC2 Account Access Key. Not needed if AWS_ACCESS_KEY environment variable is set.
35
+ --aws-secret-key, -s: EC2 Account Secret. Not needed if AWS_SECRET_KEY environment variable is set.
36
+ --aws-account-number, -a: EC2 Account ID. Not needed if AWS_ACCOUNT_NUMBER environment variable is set. Required for S3 images only.
37
+ --aws-image-type, -w <s>: The type of image to create from this VM. Must be either 'EBS' or 'S3'. (default: EBS)
38
+ --aws-kernel-id, -e <s>: Kernel to use instead of what the VM is running. i.e. 'aki-fc8f11cc'. For a current list of IDs see http://goo.gl/dOS0mB.
39
+ --aws-s3-key-path, -y <s>: location to file containing EC2 account key. S3 images only. (Default: /tmp/certs/x509.key)
40
+ --aws-s3-cert-path, -t <s>: location to file containing EC2 account cert. S3 images only. (Default: /tmp/certs/x509.cert)
41
+ --aws-s3-image-bucket, -i <s>: The bucket name for optimized S3 images (must be url safe). S3 images only (default: optimized-images)
42
+ --aws-s3-bundle-directory, -b <s>: The local directory where the image bundle will be stored before uploading to S3. NOTE: this must have enough free space to hold
43
+ the image bundle. (Default: /mnt/ephemeral/bundle)
44
+ --aws-s3-bundle-no-filter, -n: If set, will disable the default filtering used by the ec2-bundle-vol command. WARNING: setting this option could leave ssh keys or
45
+ other secrets on your
46
+ --version, -o: Print version and exit
47
+ --help, -h: Show this message
48
+
49
+
50
+ Known Limitations
51
+ ------------------
52
+ * When creating S3 backed (instance store) images on AWS, the `--aws-s3-image-bucket` will not be created -- make sure it exists.
53
+ * Currently will only map up to 4 ephemeral drives to EBS image. Some EC2 instance-types support up to 24.
54
+ * Only tested on Ubuntu 12.04"
55
+
56
+
57
+ Development
58
+ -----------
59
+ To run this locally, setup the required environment prerequisites:
60
+
61
+ > ./setup.sh
62
+
63
+ Run the spec tests:
64
+
65
+ > bundle exec rake spec
66
+
67
+ Setup a `.secrets/creds` file in the root of the project that defines:
68
+
69
+ export API_USER_EMAIL=you@example.com
70
+ export API_USER_PASSWORD=your_rightscale_password
71
+
72
+ export AWS_SECRET_KEY=yoursecretkey
73
+ export AWS_ACCESS_KEY=youraccesskey
74
+
75
+ # needed for S3 (instance store) images only
76
+ export AWS_ACCOUNT_NUMBER=your_account_number
77
+ export AWS_S3_IMAGE_BUCKET=my_image_bucket
78
+
79
+ Then add your credentials to the environment and run the script using the system's ruby interpreter:
80
+
81
+ > source .secrets/creds
82
+ > bundle exec ruby bin/image_optimize
83
+
84
+
85
+ Integration Testing
86
+ -------------------
87
+ Follow the "development" directions (above), then rsync this project to VM:
88
+
89
+ > rsync -avz --exclude=.git . root@<ip_addr>:/usr/local/src/image_optimize
90
+
91
+ Where `<ip_addr>` is the IP address of the VM you plan to test on.
92
+ SSH into the VM and run the setup script to install package prerequisites:
93
+
94
+ > sudo -i
95
+ > cd /usr/local/src/image_optimize
96
+ > source ./setup
97
+
98
+ On the VM, run the tests
99
+
100
+ > export IMAGE_TYPE=<type> ; bundle exec rake test
101
+
102
+ Where `<type>` is either `EBS` or `S3` images.
103
+
104
+
105
+ Future
106
+ ------
107
+ * automate integration testing on EBS and S3 instances
108
+ * break out rightscale specific calls into 'manager' interface to support different management platforms
109
+ * break out system command calls into 'platform' interface to enable multi-distro support
110
+
111
+
112
+ License
113
+ -------
114
+ Author: cary@rightscale.com
115
+ Copyright 2014 RightScale, Inc.
116
+
117
+ Licensed under the Apache License, Version 2.0 (the "License");
118
+ you may not use this file except in compliance with the License.
119
+ You may obtain a copy of the License at
120
+
121
+ http://www.apache.org/licenses/LICENSE-2.0
122
+
123
+ Unless required by applicable law or agreed to in writing, software
124
+ distributed under the License is distributed on an "AS IS" BASIS,
125
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126
+ See the License for the specific language governing permissions and
127
+ limitations under the License.
128
+
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ # Author: cary@rightscale.com
2
+ # Copyright 2014 RightScale, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "bundler/gem_tasks"
18
+
19
+ begin
20
+ require 'rspec/core/rake_task'
21
+
22
+ task :default => :spec
23
+
24
+ desc "Run all unit tests in spec directory"
25
+ RSpec::Core::RakeTask.new(:spec) do |t|
26
+ t.pattern = 'spec/**/*_spec.rb'
27
+ end
28
+
29
+ desc "Run all integration tests in spec directory"
30
+ RSpec::Core::RakeTask.new(:test) do |t|
31
+ t.pattern = 'test/**/*_test.rb'
32
+ end
33
+
34
+ rescue LoadError
35
+ STDERR.puts "\n*** RSpec not available. (sudo) gem install rspec to run unit tests. ***\n\n"
36
+ end
37
+
38
+ desc "Create a tarball for non-gem distribution"
39
+ task :tarball do |t|
40
+ version = File.open("VERSION", "r") { |f| f.read }
41
+ filename = "image_optimize_#{version}.tar"
42
+ puts "Creating tarball #{filename}"
43
+ puts `mkdir ./pkg ; tar cvf pkg/image_optimize-#{version}.tar bin/ lib/ VERSION Gemfile Gemfile.lock`
44
+ puts "success!"
45
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.1
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Author: cary@rightscale.com
4
+ # Copyright 2014 RightScale, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'rubygems'
20
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'app', 'image_optimizer'))
21
+
22
+ optimizer = ImageOptimize::Optimizer.new.run
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ gem = Gem::Specification.new do |gem|
6
+ gem.name = 'image_optimize'
7
+ gem.version = File.open("VERSION", "r") { |f| f.read }
8
+ gem.authors = ['caryp']
9
+ gem.email = ['cary@rightscale.com']
10
+ gem.description = %q{Bundle a running server into a new image that will be used on next launch}
11
+ gem.summary = %q{Bundle a running server into a new image that will be used on next launch}
12
+ gem.homepage = ''
13
+
14
+ gem.files = `git ls-files -z`.split("\x0")
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ['lib']
18
+ gem.add_dependency 'mime-types', '2.0'
19
+ gem.add_dependency 'right_api_client', '1.5.15'
20
+ gem.add_dependency 'trollop', '2.0'
21
+ gem.add_development_dependency 'rake'
22
+ gem.add_development_dependency 'rspec', '~>2.14'
23
+ gem.add_development_dependency 'pry'
24
+ end
@@ -0,0 +1,86 @@
1
+ # Author: cary@rightscale.com
2
+ # Copyright 2014 RightScale, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'right_api_client'
18
+ require 'logger'
19
+
20
+ module RightScale
21
+
22
+ # Create an instance facing or user base API client
23
+ class ApiClient15
24
+
25
+ def initialize
26
+ @log ||= Logger.new(STDOUT)
27
+ parse_user_data
28
+ end
29
+
30
+ def log(logger)
31
+ @log = logger
32
+ end
33
+
34
+ def get_client(type, user=nil, password=nil)
35
+ case type
36
+ when :instance
37
+ configure_instance_api_client()
38
+ when :user
39
+ configure_full_api_client(user, password)
40
+ else
41
+ raise "FATAL: ApiClient of #{type} not supported. You must specify either :user or :instance."
42
+ end
43
+ end
44
+
45
+ # make connection to API v1.5 with 'instance' role
46
+ def configure_instance_api_client
47
+ options = {
48
+ :account_id => @account_id,
49
+ :instance_token => @instance_token,
50
+ :api_url => @api_url
51
+ }
52
+ instance_client = create_client(options)
53
+ instance_client.log(@log)
54
+ instance_client
55
+ end
56
+
57
+ # make connection to RightScale API v1.5 with a specific user's roles
58
+ def configure_full_api_client(user, password)
59
+ options = {:email => user, :password => password, :account_id => @account_id }
60
+ api_client = create_client(options)
61
+ api_client.log(@log)
62
+ api_client
63
+ end
64
+
65
+ protected
66
+
67
+ def parse_user_data
68
+ begin
69
+ require '/var/spool/cloud/user-data.rb'
70
+ rescue LoadError => e
71
+ puts "FATAL: not a RightScale managed VM, or you already cleaned up your user-data file."
72
+ exit 1
73
+ end
74
+
75
+ @api_token = ENV['RS_API_TOKEN']
76
+ raise 'RightScale API token environment variable RS_API_TOKEN is unset' unless @api_token
77
+ @account_id, @instance_token = @api_token.split /:/
78
+ @api_url = "https://#{ENV['RS_SERVER']}"
79
+ end
80
+
81
+ def create_client(options)
82
+ RightApi::Client.new options
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,195 @@
1
+ #
2
+ # Author: cary@rightscale.com
3
+ # Copyright 2014 RightScale, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ libdir = File.join(File.dirname(__FILE__), '..')
19
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
20
+
21
+ require 'trollop'
22
+ require 'api_client_15'
23
+ require 'image_bundle'
24
+ require 'mixins/command'
25
+
26
+ module ImageOptimize
27
+
28
+ class Optimizer
29
+
30
+ include ImageOptimize::Command
31
+
32
+ def run
33
+ parse_args
34
+ setup_logging
35
+ configure
36
+
37
+ # "cleaning" should wipe user-data and meta-data which will only allow this script
38
+ # to be run once. Default to false to so we can run this multiple times to make
39
+ # debugging more efficient.
40
+ # XXX: this probably should be done by the manager class
41
+ prepare_image if @args[:do_cleanup]
42
+
43
+ # generate unique image name and description for our image
44
+ name = unique_name(@args[:image_prefix])
45
+ description = @args[:image_description]
46
+
47
+ # snapshot and register new image
48
+ @log.info "Snapshot instance..."
49
+ @image_util.snapshot_instance(name, description)
50
+ @log.info "Register image..."
51
+ @image_util.register_image(name, description)
52
+ @log.info "Add image to next instance..."
53
+ @image_util.add_image_to_next_instance
54
+ @log.info "SUCCESS!"
55
+ end
56
+
57
+ def configure
58
+
59
+ @log.debug("Config Parameters: #{@args}")
60
+
61
+ # check for AWS credentials set
62
+ raise 'Environment variable AWS_SECRET_KEY must be set' unless @args[:aws_secret_key]
63
+ raise 'Environment variable AWS_ACCESS_KEY must be set' unless @args[:aws_access_key]
64
+
65
+ # XXX: The fact that we're using two API clients should be hidden
66
+ # inside a RightScale 'manager' class.
67
+ api_helper = RightScale::ApiClient15.new
68
+ api_helper.log(@log)
69
+ @instance_client = api_helper.get_client(:instance)
70
+ @api_client = api_helper.get_client(:user, @args[:api_user], @args[:api_password])
71
+
72
+ if @args[:aws_image_type] == "EBS" # XXX: use an image bundle factory instead of if-else
73
+ @log.debug("Creating ImageBundleEc2EBS object")
74
+ @image_util =
75
+ ImageBundleEc2EBS.new(
76
+ @instance_client, # XXX: instead of passing two api handles, just pass a manager class
77
+ @api_client,
78
+ @args[:aws_access_key],
79
+ @args[:aws_secret_key],
80
+ @args[:aws_kernel_id]
81
+ )
82
+ else
83
+ @log.debug("Creating ImageBundleEc2S3 object")
84
+
85
+ # check for credentials set in environment
86
+ raise 'Environment variable AWS_S3_IMAGE_BUCKET must be set' unless @args[:aws_s3_image_bucket]
87
+ raise 'Environment variable AWS_ACCOUNT_NUMBER must be set' unless @args[:aws_account_number]
88
+
89
+ @image_util =
90
+ ImageBundleEc2S3.new(
91
+ @instance_client,
92
+ @api_client,
93
+ @args[:aws_access_key],
94
+ @args[:aws_secret_key],
95
+ @args[:aws_account_number],
96
+ @args[:aws_s3_key_path],
97
+ @args[:aws_s3_cert_path],
98
+ @args[:aws_s3_image_bucket],
99
+ @args[:aws_s3_bundle_directory],
100
+ @args[:aws_s3_bundle_no_filter],
101
+ @args[:aws_kernel_id]
102
+ )
103
+ end
104
+
105
+ @image_util.log(@log)
106
+
107
+ end
108
+
109
+ def parse_args
110
+ version = File.open("VERSION", "r") { |f| f.read }
111
+
112
+ @args = Trollop::options do
113
+ version "image_optimize #{version} (c) 2014 RightScale, Inc."
114
+ banner <<-EOS
115
+
116
+ Bundle a running VM into a new image that will be used on next launch
117
+
118
+ Usage:
119
+ image_optimize [options]
120
+ where [options] are:
121
+ EOS
122
+ opt :verbose, "If set will enable debug logging. WARNING: will write ec2 creds to log if set!!",
123
+ :long => "--verbose", :default => false
124
+
125
+ opt :image_prefix, "Prefix to add to the optimized image name. Helps when searching for your optimized images.",
126
+ :default => "optimized-image", :long => "--prefix", :type => String
127
+ opt :image_description, "Description to add to optimized images",
128
+ :default => "Cached image", :long => "--description", :type => String
129
+
130
+ # Mangement platform API Creds
131
+ opt :api_user, "RightScale Dashboard User email. Not needed if API_USER_EMAIL environment variable is set.",
132
+ :default => ENV['API_USER_EMAIL'], :long => "--api-user", :short => "-u", :type => String
133
+ opt :api_password, "RightScale Dashboard User email. Not needed if API_USER_PASSWORD environment variable is set.",
134
+ :default => ENV['API_USER_PASSWORD'], :long => "--api-password", :short => "-p", :type => String
135
+ opt :do_cleanup, "Don't do any cleanup on VM before snapshotting. Useful for debugging.", :long => "--cleanup", :default => true
136
+
137
+ # EC2 Creds
138
+ opt :aws_access_key, "EC2 Account Access Key. Not needed if AWS_ACCESS_KEY environment variable is set.",
139
+ :default => ENV['AWS_ACCESS_KEY'], :long => "--aws-access-key", :short => "-k"
140
+ opt :aws_secret_key, "EC2 Account Secret. Not needed if AWS_SECRET_KEY environment variable is set.",
141
+ :default => ENV['AWS_SECRET_KEY'], :long => "--aws-secret-key", :short => "-s"
142
+ opt :aws_account_number, "EC2 Account ID. Not needed if AWS_ACCOUNT_NUMBER environment variable is set. Required for S3 images only.",
143
+ :default => ENV['AWS_ACCOUNT_NUMBER'], :long => "--aws-account-number"
144
+
145
+ # EC2 Image type
146
+ opt :aws_image_type, "The type of image to create from this VM. Must be either 'EBS' or 'S3'. ",
147
+ :default => 'EBS', :long => "--aws-image-type", :type => String
148
+ opt :aws_kernel_id, "Kernel to use instead of what the VM is running. i.e. 'aki-fc8f11cc'. For a current list of IDs see http://goo.gl/dOS0mB.",
149
+ :default => nil, :long => "--aws-kernel-id", :type => String
150
+
151
+ # EC2 Instance Store Parameters
152
+ opt :aws_s3_key_path, "location to file containing EC2 account key. S3 images only.",
153
+ :default => '/tmp/certs/x509.key', :long => "--aws-s3-key-path"
154
+ opt :aws_s3_cert_path, "location to file containing EC2 account cert. S3 images only.",
155
+ :default => '/tmp/certs/x509.cert', :long => "--aws-s3-cert-path"
156
+ opt :aws_s3_image_bucket, "The bucket name for optimized S3 images (must be url safe). S3 images only",
157
+ :default => "optimized-images", :long => "--aws-s3-image-bucket"
158
+ opt :aws_s3_bundle_directory, "The local directory where the image bundle will be stored before uploading to S3. NOTE: this must have enough free space to hold the image bundle.",
159
+ :default => "/mnt/ephemeral/bundle", :long => "--aws-s3-bundle-directory"
160
+ opt :aws_s3_bundle_no_filter, "If set, will disable the default filtering used by the ec2-bundle-vol command. WARNING: setting this option could leave ssh keys or other secrets on your",
161
+ :default => false, :long => "--aws-s3-bundle-no-filter"
162
+ end
163
+ end
164
+
165
+ private
166
+
167
+ # create an image name using prefix and VM name
168
+ #
169
+ # Returns: [String] image name
170
+ def unique_name(prefix)
171
+ image_name = "#{@instance_client.get_instance.name} #{Time.new.to_s}"
172
+ image_name = "#{prefix} #{image_name}" if prefix
173
+ image_name.gsub(/[^0-9A-Za-z.\-]/, '-') # sanitize it!
174
+ end
175
+
176
+ # clean image for snapshoting
177
+ # taken from http://cpenniman.blogspot.com/2012/09/cleaning-up-rightimage-before.html
178
+ def prepare_image
179
+ @log.info "Prepare image"
180
+ cmd = "rm -rf /var/spool/cloud /var/lib/rightscale/right_link/*.js ; rm -f /opt/rightscale/var/lib/monit/monit.state ; rm -f /opt/rightscale/var/run/monit.pid ; sync"
181
+ execute(cmd)
182
+ end
183
+
184
+ # configure logging
185
+ def setup_logging
186
+ @log = Logger.new(STDOUT)
187
+ @log.level = Logger::INFO
188
+ @log.level = Logger::DEBUG if @args[:verbose]
189
+ @log.formatter = proc do |serverity, time, progname, msg|
190
+ "#{msg}\n"
191
+ end
192
+ end
193
+
194
+ end
195
+ end