vagrant-mos 0.9.24 → 0.9.26
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 +4 -4
- data/README.md +1 -0
- data/lib/vagrant-mos/action.rb +16 -0
- data/lib/vagrant-mos/action/package_instance.rb +204 -0
- data/lib/vagrant-mos/config.rb +8 -1
- data/lib/vagrant-mos/errors.rb +8 -0
- data/lib/vagrant-mos/version.rb +1 -1
- data/locales/en.yml +12 -0
- data/spec/vagrant-mos/config_spec.rb +2 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57be0c6f5eff6eefeb4afd72af71c74a7e6fc461
|
4
|
+
data.tar.gz: 300d5ec646c56cca793c29aea0eccc2f4ea85cae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9551652c353461ca1fa4ebcbb753e3747a69909081490d658fe6ea6f366ad20dbf86788a46cb77aaec31ddd012495698231dc5c008bc12e0071d81b5167843a
|
7
|
+
data.tar.gz: 2dc8807b52aa2ef982a299026fb6df6aadfb13667c8de4bc5b01a45f1e85bcf4cc1a58b6a591f2ea3659f71625bd709e71703cbffefb6671442c103c17d671e7
|
data/README.md
CHANGED
@@ -90,6 +90,7 @@ MOS provider设置了若干参数,主要参数说明如下:
|
|
90
90
|
* `data_disk` - 创建美团云主机的数据盘大小,单位为GB,例如100代表创建100G的数据盘
|
91
91
|
* `band_width` - 创建美团云主机的外网带宽大小,单位为Mbps,例如10代表选择10Mbps的外网带宽
|
92
92
|
* `instance_ready_timeout` - 等待MOS主机创建成功最长时间,单位为秒。默认为120s
|
93
|
+
* `instance_package_timeout` - 等待模板创建成功最长时间,单位为秒。默认为600s
|
93
94
|
* `instance_name` - 创建的MOS主机名称,例如 "ubuntu007"。
|
94
95
|
* `instance_type` - 创建的MOS主机类型,例如"C1_M1". 默认配置为 "C1_M2".
|
95
96
|
* `keypair_name` - 用户使用的秘钥名称。通过使用秘钥,用户登录该创建的主机时就不需要在输入繁琐的密码了
|
data/lib/vagrant-mos/action.rb
CHANGED
@@ -8,6 +8,21 @@ module VagrantPlugins
|
|
8
8
|
# Include the built-in modules so we can use them as top-level things.
|
9
9
|
include Vagrant::Action::Builtin
|
10
10
|
|
11
|
+
def self.action_package
|
12
|
+
Vagrant::Action::Builder.new.tap do |b|
|
13
|
+
b.use Call, IsCreated do |env, b2|
|
14
|
+
if !env[:result]
|
15
|
+
b2.use MessageNotCreated
|
16
|
+
next
|
17
|
+
end
|
18
|
+
|
19
|
+
# Connect to MOS and then Create a package from the server instance
|
20
|
+
b2.use ConnectMOS
|
21
|
+
b2.use PackageInstance
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
11
26
|
# This action is called to halt the remote machine.
|
12
27
|
def self.action_halt
|
13
28
|
Vagrant::Action::Builder.new.tap do |b|
|
@@ -188,6 +203,7 @@ module VagrantPlugins
|
|
188
203
|
autoload :TimedProvision, action_root.join("timed_provision") # some plugins now expect this action to exist
|
189
204
|
autoload :WaitForState, action_root.join("wait_for_state")
|
190
205
|
autoload :WarnNetworks, action_root.join("warn_networks")
|
206
|
+
autoload :PackageInstance, action_root.join("package_instance")
|
191
207
|
end
|
192
208
|
end
|
193
209
|
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require 'vagrant/util/template_renderer'
|
3
|
+
require 'vagrant-mos/util/timer'
|
4
|
+
require 'vagrant/action/general/package'
|
5
|
+
|
6
|
+
module VagrantPlugins
|
7
|
+
module MOS
|
8
|
+
module Action
|
9
|
+
# This action packages a running mos-based server into an
|
10
|
+
# mos-based vagrant box. It does so by burning the associated
|
11
|
+
# vagrant-mos server instance, into an template via fog. Upon
|
12
|
+
# successful template burning, the action will create a .box tarball
|
13
|
+
# writing a Vagrantfile with the fresh template id into it.
|
14
|
+
|
15
|
+
# Vagrant itself comes with a general package action, which
|
16
|
+
# this plugin action does call. The general action provides
|
17
|
+
# the actual packaging as well as other options such as
|
18
|
+
# --include for including additional files and --vagrantfile
|
19
|
+
# which is pretty much not useful here anyway.
|
20
|
+
|
21
|
+
# The virtualbox package plugin action was loosely used
|
22
|
+
# as a model for this class.
|
23
|
+
|
24
|
+
class PackageInstance < Vagrant::Action::General::Package
|
25
|
+
include Vagrant::Util::Retryable
|
26
|
+
|
27
|
+
def initialize(app, env)
|
28
|
+
@app = app
|
29
|
+
@logger = Log4r::Logger.new("vagrant_mos::action::package_instance")
|
30
|
+
env["package.include"] ||= []
|
31
|
+
env["package.output"] ||= "package.box"
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method :general_call, :call
|
35
|
+
|
36
|
+
def call(env)
|
37
|
+
# Initialize metrics if they haven't been
|
38
|
+
env[:metrics] ||= {}
|
39
|
+
|
40
|
+
# This block attempts to burn the server instance into an template
|
41
|
+
begin
|
42
|
+
# Get the server object for given machine
|
43
|
+
#server = env[:mos_compute].servers.get(env[:machine].id)
|
44
|
+
server = (env[:mos_compute].describe_instances([env[:machine].id]))["Instance"]
|
45
|
+
|
46
|
+
env[:ui].info(I18n.t("vagrant_mos.packaging_instance", :instance_id => server["instanceId"]))
|
47
|
+
|
48
|
+
|
49
|
+
env[:mos_compute].create_template(server["instanceId"], "template_name", "template_notes")
|
50
|
+
|
51
|
+
|
52
|
+
=begin
|
53
|
+
|
54
|
+
|
55
|
+
# Make the request to MOS to create an template from machine's instance
|
56
|
+
ami_response = server.service.create_image server.id, "#{server.tags["Name"]} Package - #{Time.now.strftime("%Y%m%d-%H%M%S")}", ""
|
57
|
+
|
58
|
+
# Find ami id
|
59
|
+
@ami_id = ami_response.data[:body]["imageId"]
|
60
|
+
|
61
|
+
# Attempt to burn the mos instance into an template within timeout
|
62
|
+
env[:metrics]["instance_ready_time"] = Util::Timer.time do
|
63
|
+
|
64
|
+
# Get the config, to set the ami burn timeout
|
65
|
+
region = env[:machine].provider_config.region
|
66
|
+
region_config = env[:machine].provider_config.get_region_config(region)
|
67
|
+
tries = region_config.instance_package_timeout / 2
|
68
|
+
|
69
|
+
env[:ui].info(I18n.t("vagrant_mos.burning_ami", :ami_id => @ami_id))
|
70
|
+
|
71
|
+
# Check the status of the template every 2 seconds until the ami burn timeout has been reached
|
72
|
+
begin
|
73
|
+
retryable(:on => Fog::Errors::TimeoutError, :tries => tries) do
|
74
|
+
# If we're interrupted don't worry about waiting
|
75
|
+
next if env[:interrupted]
|
76
|
+
|
77
|
+
# Need to update the ami_obj on each cycle
|
78
|
+
ami_obj = server.service.images.get(@ami_id)
|
79
|
+
|
80
|
+
# Wait for the server to be ready, raise error if timeout reached
|
81
|
+
server.wait_for(2) {
|
82
|
+
if ami_obj.state == "failed"
|
83
|
+
raise Errors::InstancePackageError,
|
84
|
+
ami_id: ami_obj.id,
|
85
|
+
err: ami_obj.state
|
86
|
+
return
|
87
|
+
else
|
88
|
+
# Successful template burn will result in true here
|
89
|
+
ami_obj.ready?
|
90
|
+
end
|
91
|
+
}
|
92
|
+
end
|
93
|
+
rescue Fog::Errors::TimeoutError
|
94
|
+
# Notify the user upon timeout
|
95
|
+
raise Errors::InstancePackageTimeout,
|
96
|
+
timeout: region_config.instance_package_timeout
|
97
|
+
end
|
98
|
+
end
|
99
|
+
env[:ui].info(I18n.t("vagrant_mos.packaging_instance_complete", :time_seconds => env[:metrics]["instance_ready_time"].to_i))
|
100
|
+
|
101
|
+
=end
|
102
|
+
rescue MOS::Error => e
|
103
|
+
raise Errors::MosError, :message => e.message
|
104
|
+
end
|
105
|
+
|
106
|
+
# Handles inclusions from --include and --vagrantfile options
|
107
|
+
setup_package_files(env)
|
108
|
+
|
109
|
+
# Setup the temporary directory for the tarball files
|
110
|
+
@temp_dir = env[:tmp_path].join(Time.now.to_i.to_s)
|
111
|
+
env["export.temp_dir"] = @temp_dir
|
112
|
+
FileUtils.mkpath(env["export.temp_dir"])
|
113
|
+
|
114
|
+
# Create the Vagrantfile and metadata.json files from templates to go in the box
|
115
|
+
create_vagrantfile(env)
|
116
|
+
create_metadata_file(env)
|
117
|
+
|
118
|
+
# Just match up a couple environmental variables so that
|
119
|
+
# the superclass will do the right thing. Then, call the
|
120
|
+
# superclass to actually create the tarball (.box file)
|
121
|
+
env["package.directory"] = env["export.temp_dir"]
|
122
|
+
general_call(env)
|
123
|
+
|
124
|
+
# Always call recover to clean up the temp dir
|
125
|
+
clean_temp_dir
|
126
|
+
end
|
127
|
+
|
128
|
+
protected
|
129
|
+
|
130
|
+
# Cleanup temp dir and files
|
131
|
+
def clean_temp_dir
|
132
|
+
if @temp_dir && File.exist?(@temp_dir)
|
133
|
+
FileUtils.rm_rf(@temp_dir)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# This method generates the Vagrantfile at the root of the box. Taken from
|
138
|
+
# VagrantPlugins::ProviderVirtualBox::Action::PackageVagrantfile
|
139
|
+
def create_vagrantfile env
|
140
|
+
File.open(File.join(env["export.temp_dir"], "Vagrantfile"), "w") do |f|
|
141
|
+
f.write(TemplateRenderer.render("vagrant-mos_package_Vagrantfile", {
|
142
|
+
region: env[:machine].provider_config.region,
|
143
|
+
ami: @ami_id,
|
144
|
+
template_root: template_root
|
145
|
+
}))
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# This method generates the metadata.json file at the root of the box.
|
150
|
+
def create_metadata_file env
|
151
|
+
File.open(File.join(env["export.temp_dir"], "metadata.json"), "w") do |f|
|
152
|
+
f.write(TemplateRenderer.render("metadata.json", {
|
153
|
+
template_root: template_root
|
154
|
+
}))
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Sets up --include and --vagrantfile files which may be added as optional
|
159
|
+
# parameters. Taken from VagrantPlugins::ProviderVirtualBox::Action::SetupPackageFiles
|
160
|
+
def setup_package_files(env)
|
161
|
+
files = {}
|
162
|
+
env["package.include"].each do |file|
|
163
|
+
source = Pathname.new(file)
|
164
|
+
dest = nil
|
165
|
+
|
166
|
+
# If the source is relative then we add the file as-is to the include
|
167
|
+
# directory. Otherwise, we copy only the file into the root of the
|
168
|
+
# include directory. Kind of strange, but seems to match what people
|
169
|
+
# expect based on history.
|
170
|
+
if source.relative?
|
171
|
+
dest = source
|
172
|
+
else
|
173
|
+
dest = source.basename
|
174
|
+
end
|
175
|
+
|
176
|
+
# Assign the mapping
|
177
|
+
files[file] = dest
|
178
|
+
end
|
179
|
+
|
180
|
+
if env["package.vagrantfile"]
|
181
|
+
# Vagrantfiles are treated special and mapped to a specific file
|
182
|
+
files[env["package.vagrantfile"]] = "_Vagrantfile"
|
183
|
+
end
|
184
|
+
|
185
|
+
# Verify the mapping
|
186
|
+
files.each do |from, _|
|
187
|
+
raise Vagrant::Errors::PackageIncludeMissing,
|
188
|
+
file: from if !File.exist?(from)
|
189
|
+
end
|
190
|
+
|
191
|
+
# Save the mapping
|
192
|
+
env["package.files"] = files
|
193
|
+
end
|
194
|
+
|
195
|
+
# Used to find the base location of mos-vagrant templates
|
196
|
+
def template_root
|
197
|
+
MOS.source_root.join("templates")
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
data/lib/vagrant-mos/config.rb
CHANGED
@@ -28,6 +28,11 @@ module VagrantPlugins
|
|
28
28
|
# @return [String]
|
29
29
|
attr_accessor :name
|
30
30
|
|
31
|
+
# The timeout to wait for an instance to successfully burn into an template.
|
32
|
+
#
|
33
|
+
# @return [Fixnum]
|
34
|
+
attr_accessor :instance_package_timeout
|
35
|
+
|
31
36
|
# The timeout to wait for an instance to become ready.
|
32
37
|
#
|
33
38
|
# @return [Fixnum]
|
@@ -85,6 +90,7 @@ module VagrantPlugins
|
|
85
90
|
@data_disk = UNSET_VALUE
|
86
91
|
@band_width = UNSET_VALUE
|
87
92
|
@instance_ready_timeout = UNSET_VALUE
|
93
|
+
@instance_package_timeout = UNSET_VALUE
|
88
94
|
@name = UNSET_VALUE
|
89
95
|
@instance_type = UNSET_VALUE
|
90
96
|
@keypair_name = UNSET_VALUE
|
@@ -182,7 +188,8 @@ module VagrantPlugins
|
|
182
188
|
# Set the default timeout for waiting for an instance to be ready
|
183
189
|
@instance_ready_timeout = 120 if @instance_ready_timeout == UNSET_VALUE
|
184
190
|
|
185
|
-
|
191
|
+
# Set the default timeout for waiting for an instance to burn into a template
|
192
|
+
@instance_package_timeout = 600 if @instance_package_timeout == UNSET_VALUE
|
186
193
|
# Default instance type is an C1_M2
|
187
194
|
@instance_type = "C1_M2" if @instance_type == UNSET_VALUE
|
188
195
|
# Keypair defaults to nil
|
data/lib/vagrant-mos/errors.rb
CHANGED
@@ -19,6 +19,14 @@ module VagrantPlugins
|
|
19
19
|
error_key(:instance_ready_timeout)
|
20
20
|
end
|
21
21
|
|
22
|
+
class InstancePackageError < VagrantMOSError
|
23
|
+
error_key(:instance_package_error)
|
24
|
+
end
|
25
|
+
|
26
|
+
class InstancePackageTimeout < VagrantMOSError
|
27
|
+
error_key(:instance_package_timeout)
|
28
|
+
end
|
29
|
+
|
22
30
|
class RsyncError < VagrantMOSError
|
23
31
|
error_key(:rsync_error)
|
24
32
|
end
|
data/lib/vagrant-mos/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -69,6 +69,18 @@ en:
|
|
69
69
|
set waiting for the instance to become ready is %{timeout} seconds.
|
70
70
|
Please verify that the machine properly boots. If you need more time
|
71
71
|
set the `instance_ready_timeout` configuration on the MOS provider.
|
72
|
+
|
73
|
+
instance_package_error: |-
|
74
|
+
There was an error packaging the instance. See details below for more info.
|
75
|
+
|
76
|
+
Template Id: %{template_id}
|
77
|
+
Error: %{err}
|
78
|
+
instance_package_timeout: |-
|
79
|
+
The Template failed to become "ready" in MOS. The timeout currently
|
80
|
+
set waiting for the instance to become ready is %{timeout} seconds. For
|
81
|
+
larger instances Template burning may take long periods of time. Please
|
82
|
+
ensure the timeout is set high enough, it can be changed by adjusting
|
83
|
+
the `instance_package_timeout` configuration on the MOS provider.
|
72
84
|
rsync_error: |-
|
73
85
|
There was an error when attempting to rsync a shared folder.
|
74
86
|
Please inspect the error message below for more info.
|
@@ -18,6 +18,7 @@ describe VagrantPlugins::MOS::Config do
|
|
18
18
|
its("access_key") { should be_nil }
|
19
19
|
its("template_id") { should be_nil }
|
20
20
|
its("instance_ready_timeout") { should == 120 }
|
21
|
+
its("instance_package_timeout") { should == 600 }
|
21
22
|
its("name") { should be_nil }
|
22
23
|
its("instance_type") { should == "C1_M2" }
|
23
24
|
its("keypair_name") { should be_nil }
|
@@ -34,7 +35,7 @@ describe VagrantPlugins::MOS::Config do
|
|
34
35
|
# each of these attributes to "foo" in isolation, and reads the value
|
35
36
|
# and asserts the proper result comes back out.
|
36
37
|
[:access_key, :template_id, :data_disk, :band_width, :instance_ready_timeout, :name,
|
37
|
-
|
38
|
+
:instance_package_timeout, :instance_type, :keypair_name, :ssh_host_attribute,
|
38
39
|
:region, :access_secret, :access_url,
|
39
40
|
:use_iam_profile].each do |attribute|
|
40
41
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-mos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yangcs2009
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mos-sdk
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- lib/vagrant-mos/action/message_already_created.rb
|
104
104
|
- lib/vagrant-mos/action/message_not_created.rb
|
105
105
|
- lib/vagrant-mos/action/message_will_not_destroy.rb
|
106
|
+
- lib/vagrant-mos/action/package_instance.rb
|
106
107
|
- lib/vagrant-mos/action/read_ssh_info.rb
|
107
108
|
- lib/vagrant-mos/action/read_state.rb
|
108
109
|
- lib/vagrant-mos/action/run_instance.rb
|