vagrant-google 0.1.5 → 0.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -3
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +201 -0
- data/CHANGELOG.md +14 -0
- data/README.md +45 -22
- data/example_boxes/gce/Vagrantfile +23 -0
- data/example_boxes/gce-test/Vagrantfile +30 -0
- data/lib/vagrant-google/action/connect_google.rb +10 -14
- data/lib/vagrant-google/action/is_terminated.rb +31 -0
- data/lib/vagrant-google/action/run_instance.rb +58 -35
- data/lib/vagrant-google/action/start_instance.rb +90 -0
- data/lib/vagrant-google/action/stop_instance.rb +48 -0
- data/lib/vagrant-google/action/warn_networks.rb +2 -1
- data/lib/vagrant-google/action.rb +62 -12
- data/lib/vagrant-google/config.rb +56 -11
- data/lib/vagrant-google/errors.rb +13 -5
- data/lib/vagrant-google/version.rb +1 -1
- data/lib/vagrant-google.rb +3 -3
- data/locales/en.yml +33 -4
- data/tasks/acceptance.rake +20 -1
- data/tasks/lint.rake +3 -0
- data/tasks/test.rake +1 -0
- data/test/acceptance/provider/multi_instance_spec.rb +31 -0
- data/test/acceptance/provider/preemptible_spec.rb +26 -0
- data/test/acceptance/provider/scopes_spec.rb +29 -0
- data/test/acceptance/skeletons/multi_instance/Vagrantfile +29 -0
- data/test/acceptance/skeletons/preemptible/Vagrantfile +17 -0
- data/test/acceptance/skeletons/scopes/Vagrantfile +18 -0
- data/test/unit/base.rb +1 -1
- data/test/unit/common/config_test.rb +62 -13
- data/vagrant-google.gemspec +4 -3
- data/vagrant-spec.config.rb +2 -2
- data/vagrantfile_examples/Vagrantfile.multiple_machines +93 -0
- data/vagrantfile_examples/Vagrantfile.provision_single +48 -0
- data/vagrantfile_examples/Vagrantfile.simple +29 -0
- data/vagrantfile_examples/Vagrantfile.zone_config +40 -0
- metadata +39 -8
- data/lib/vagrant-google/action/sync_folders.rb +0 -104
@@ -0,0 +1,90 @@
|
|
1
|
+
# Copyright 2015 Google Inc. All Rights Reserved.
|
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.
|
14
|
+
require 'log4r'
|
15
|
+
require 'vagrant/util/retryable'
|
16
|
+
require 'vagrant-google/util/timer'
|
17
|
+
|
18
|
+
module VagrantPlugins
|
19
|
+
module Google
|
20
|
+
module Action
|
21
|
+
# This starts a stopped instance.
|
22
|
+
class StartInstance
|
23
|
+
include Vagrant::Util::Retryable
|
24
|
+
|
25
|
+
def initialize(app, env)
|
26
|
+
@app = app
|
27
|
+
@logger = Log4r::Logger.new("vagrant_google::action::start_instance")
|
28
|
+
end
|
29
|
+
|
30
|
+
def call(env)
|
31
|
+
# Initialize metrics if they haven't been
|
32
|
+
env[:metrics] ||= {}
|
33
|
+
|
34
|
+
server = env[:google_compute].servers.get(env[:machine].id, env[:machine].provider_config.zone)
|
35
|
+
|
36
|
+
env[:ui].info(I18n.t("vagrant_google.starting"))
|
37
|
+
|
38
|
+
begin
|
39
|
+
server.start
|
40
|
+
|
41
|
+
# Wait for the instance to be ready first
|
42
|
+
env[:metrics]["instance_ready_time"] = Util::Timer.time do
|
43
|
+
|
44
|
+
tries = env[:machine].provider_config.instance_ready_timeout / 2
|
45
|
+
|
46
|
+
env[:ui].info(I18n.t("vagrant_google.waiting_for_ready"))
|
47
|
+
begin
|
48
|
+
retryable(:on => Fog::Errors::TimeoutError, :tries => tries) do
|
49
|
+
# If we're interrupted don't worry about waiting
|
50
|
+
next if env[:interrupted]
|
51
|
+
|
52
|
+
# Wait for the server to be ready
|
53
|
+
server.wait_for(2) { ready? }
|
54
|
+
end
|
55
|
+
rescue Fog::Errors::TimeoutError
|
56
|
+
# Notify the user
|
57
|
+
raise Errors::InstanceReadyTimeout,
|
58
|
+
timeout: env[:machine].provider_config.instance_ready_timeout
|
59
|
+
end
|
60
|
+
end
|
61
|
+
rescue Fog::Compute::Google::Error => e
|
62
|
+
raise Errors::FogError, :message => e.message
|
63
|
+
end
|
64
|
+
|
65
|
+
@logger.info("Time to instance ready: #{env[:metrics]["instance_ready_time"]}")
|
66
|
+
|
67
|
+
if !env[:interrupted]
|
68
|
+
env[:metrics]["instance_ssh_time"] = Util::Timer.time do
|
69
|
+
# Wait for SSH to be ready.
|
70
|
+
env[:ui].info(I18n.t("vagrant_google.waiting_for_ssh"))
|
71
|
+
while true
|
72
|
+
# If we're interrupted then just back out
|
73
|
+
break if env[:interrupted]
|
74
|
+
break if env[:machine].communicate.ready?
|
75
|
+
sleep 2
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
@logger.info("Time for SSH ready: #{env[:metrics]["instance_ssh_time"]}")
|
80
|
+
|
81
|
+
# Ready and booted!
|
82
|
+
env[:ui].info(I18n.t("vagrant_google.ready"))
|
83
|
+
end
|
84
|
+
|
85
|
+
@app.call(env)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright 2015 Google Inc. All Rights Reserved.
|
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.
|
14
|
+
require 'log4r'
|
15
|
+
require 'vagrant/util/retryable'
|
16
|
+
require 'vagrant-google/util/timer'
|
17
|
+
|
18
|
+
module VagrantPlugins
|
19
|
+
module Google
|
20
|
+
module Action
|
21
|
+
|
22
|
+
# This stops the running instance.
|
23
|
+
class StopInstance
|
24
|
+
|
25
|
+
include Vagrant::Util::Retryable
|
26
|
+
|
27
|
+
def initialize(app, env)
|
28
|
+
@app = app
|
29
|
+
@logger = Log4r::Logger.new("vagrant_google::action::stop_instance")
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(env)
|
33
|
+
server = env[:google_compute].servers.get(env[:machine].id, env[:machine].provider_config.zone)
|
34
|
+
|
35
|
+
if env[:machine].state.id == :TERMINATED
|
36
|
+
env[:ui].info(I18n.t("vagrant_google.already_status", :status => env[:machine].state.id))
|
37
|
+
else
|
38
|
+
env[:ui].info(I18n.t("vagrant_google.stopping"))
|
39
|
+
operation = server.stop
|
40
|
+
operation.wait_for() { ready? }
|
41
|
+
end
|
42
|
+
|
43
|
+
@app.call(env)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -20,7 +20,8 @@ module VagrantPlugins
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def call(env)
|
23
|
-
|
23
|
+
# Default SSH forward always exists so "> 1"
|
24
|
+
if env[:machine].config.vm.networks.length > 1
|
24
25
|
env[:ui].warn(I18n.t("vagrant_google.warn_networks"))
|
25
26
|
end
|
26
27
|
|
@@ -19,14 +19,35 @@ module VagrantPlugins
|
|
19
19
|
# Include the built-in modules so we can use them as top-level things.
|
20
20
|
include Vagrant::Action::Builtin
|
21
21
|
|
22
|
+
# This action is called to halt the remote machine.
|
23
|
+
def self.action_halt
|
24
|
+
Vagrant::Action::Builder.new.tap do |b|
|
25
|
+
b.use ConfigValidate
|
26
|
+
b.use Call, IsCreated do |env, b2|
|
27
|
+
if !env[:result]
|
28
|
+
b2.use MessageNotCreated
|
29
|
+
next
|
30
|
+
end
|
31
|
+
b2.use ConnectGoogle
|
32
|
+
b2.use StopInstance
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
22
37
|
# This action is called to terminate the remote machine.
|
23
38
|
def self.action_destroy
|
24
39
|
Vagrant::Action::Builder.new.tap do |b|
|
25
40
|
b.use Call, DestroyConfirm do |env, b2|
|
26
41
|
if env[:result]
|
27
42
|
b2.use ConfigValidate
|
28
|
-
b2.use
|
29
|
-
|
43
|
+
b2.use Call, IsCreated do |env2, b3|
|
44
|
+
if !env2[:result]
|
45
|
+
b3.use MessageNotCreated
|
46
|
+
next
|
47
|
+
end
|
48
|
+
b3.use ConnectGoogle
|
49
|
+
b3.use TerminateInstance
|
50
|
+
end
|
30
51
|
else
|
31
52
|
b2.use MessageWillNotDestroy
|
32
53
|
end
|
@@ -45,7 +66,7 @@ module VagrantPlugins
|
|
45
66
|
end
|
46
67
|
|
47
68
|
b2.use Provision
|
48
|
-
b2.use
|
69
|
+
b2.use SyncedFolders
|
49
70
|
end
|
50
71
|
end
|
51
72
|
end
|
@@ -106,17 +127,44 @@ module VagrantPlugins
|
|
106
127
|
Vagrant::Action::Builder.new.tap do |b|
|
107
128
|
b.use HandleBox
|
108
129
|
b.use ConfigValidate
|
130
|
+
b.use BoxCheckOutdated
|
109
131
|
b.use ConnectGoogle
|
110
|
-
b.use Call, IsCreated do |
|
111
|
-
if
|
112
|
-
|
132
|
+
b.use Call, IsCreated do |env1, b1|
|
133
|
+
if env1[:result]
|
134
|
+
b1.use Call, IsTerminated do |env2, b2|
|
135
|
+
if env2[:result]
|
136
|
+
b2.use Provision
|
137
|
+
b2.use SyncedFolders
|
138
|
+
b2.use WarnNetworks
|
139
|
+
b2.use StartInstance
|
140
|
+
else
|
141
|
+
# TODO: Impement better messages for different states
|
142
|
+
b2.use MessageAlreadyCreated
|
143
|
+
end
|
144
|
+
end
|
145
|
+
else
|
146
|
+
b1.use Provision
|
147
|
+
b1.use SyncedFolders
|
148
|
+
b1.use WarnNetworks
|
149
|
+
b1.use RunInstance
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.action_reload
|
156
|
+
Vagrant::Action::Builder.new.tap do |b|
|
157
|
+
b.use ConfigValidate
|
158
|
+
b.use ConnectGoogle
|
159
|
+
b.use Call, IsCreated do |env1, b1|
|
160
|
+
if !env1[:result]
|
161
|
+
b1.use MessageNotCreated
|
113
162
|
next
|
114
163
|
end
|
115
164
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
b2.use RunInstance
|
165
|
+
# TODO: Think about implementing through server.reboot
|
166
|
+
b1.use action_halt
|
167
|
+
b1.use action_up
|
120
168
|
end
|
121
169
|
end
|
122
170
|
end
|
@@ -125,16 +173,18 @@ module VagrantPlugins
|
|
125
173
|
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
126
174
|
autoload :ConnectGoogle, action_root.join("connect_google")
|
127
175
|
autoload :IsCreated, action_root.join("is_created")
|
176
|
+
autoload :IsTerminated, action_root.join("is_terminated")
|
128
177
|
autoload :MessageAlreadyCreated, action_root.join("message_already_created")
|
129
178
|
autoload :MessageNotCreated, action_root.join("message_not_created")
|
130
179
|
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
|
131
180
|
autoload :ReadSSHInfo, action_root.join("read_ssh_info")
|
132
181
|
autoload :ReadState, action_root.join("read_state")
|
133
182
|
autoload :RunInstance, action_root.join("run_instance")
|
134
|
-
autoload :
|
183
|
+
autoload :StartInstance, action_root.join("start_instance")
|
184
|
+
autoload :StopInstance, action_root.join("stop_instance")
|
185
|
+
autoload :TerminateInstance, action_root.join("terminate_instance")
|
135
186
|
autoload :TimedProvision, action_root.join("timed_provision")
|
136
187
|
autoload :WarnNetworks, action_root.join("warn_networks")
|
137
|
-
autoload :TerminateInstance, action_root.join("terminate_instance")
|
138
188
|
end
|
139
189
|
end
|
140
190
|
end
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
require "vagrant"
|
15
|
+
require "securerandom"
|
15
16
|
|
16
17
|
module VagrantPlugins
|
17
18
|
module Google
|
@@ -81,7 +82,7 @@ module VagrantPlugins
|
|
81
82
|
# @return [Array]
|
82
83
|
attr_accessor :tags
|
83
84
|
|
84
|
-
#
|
85
|
+
# whether to enable ip forwarding
|
85
86
|
#
|
86
87
|
# @return Boolean
|
87
88
|
attr_accessor :can_ip_forward
|
@@ -91,28 +92,49 @@ module VagrantPlugins
|
|
91
92
|
# @return String
|
92
93
|
attr_accessor :external_ip
|
93
94
|
|
94
|
-
#
|
95
|
+
# whether to autodelete disk on instance delete
|
95
96
|
#
|
96
97
|
# @return Boolean
|
97
98
|
attr_accessor :autodelete_disk
|
98
99
|
|
100
|
+
# Availability policy
|
101
|
+
# whether to run instance as preemptible
|
102
|
+
#
|
103
|
+
# @return Boolean
|
104
|
+
attr_accessor :preemptible
|
105
|
+
|
106
|
+
# Availability policy
|
107
|
+
# whether to have instance restart on failures
|
108
|
+
#
|
109
|
+
# @return Boolean
|
110
|
+
attr_accessor :auto_restart
|
111
|
+
|
112
|
+
# Availability policy
|
113
|
+
# specify what to do when infrastructure maintenance events occur
|
114
|
+
# Options: MIGRATE, TERMINATE
|
115
|
+
# The default is MIGRATE.
|
116
|
+
#
|
117
|
+
# @return String
|
118
|
+
attr_accessor :on_host_maintenance
|
119
|
+
|
99
120
|
# The timeout value waiting for instance ready
|
100
121
|
#
|
101
122
|
# @return [Int]
|
102
123
|
attr_accessor :instance_ready_timeout
|
103
124
|
|
104
|
-
# The tags for the machine.
|
105
|
-
# TODO(erjohnso): not supported in fog
|
106
|
-
#
|
107
|
-
# @return [Hash<String, String>]
|
108
|
-
#attr_accessor :tags
|
109
|
-
|
110
125
|
# The zone to launch the instance into. If nil, it will
|
111
126
|
# use the default us-central1-f.
|
112
127
|
#
|
113
128
|
# @return [String]
|
114
129
|
attr_accessor :zone
|
115
130
|
|
131
|
+
# The list of access controls for service accounts.
|
132
|
+
#
|
133
|
+
# @return [Array]
|
134
|
+
attr_accessor :service_accounts
|
135
|
+
alias_method :scopes, :service_accounts
|
136
|
+
alias_method :scopes=, :service_accounts=
|
137
|
+
|
116
138
|
def initialize(zone_specific=false)
|
117
139
|
@google_client_email = UNSET_VALUE
|
118
140
|
@google_key_location = UNSET_VALUE
|
@@ -130,8 +152,12 @@ module VagrantPlugins
|
|
130
152
|
@can_ip_forward = UNSET_VALUE
|
131
153
|
@external_ip = UNSET_VALUE
|
132
154
|
@autodelete_disk = UNSET_VALUE
|
155
|
+
@preemptible = UNSET_VALUE
|
156
|
+
@auto_restart = UNSET_VALUE
|
157
|
+
@on_host_maintenance = UNSET_VALUE
|
133
158
|
@instance_ready_timeout = UNSET_VALUE
|
134
159
|
@zone = UNSET_VALUE
|
160
|
+
@service_accounts = UNSET_VALUE
|
135
161
|
|
136
162
|
# Internal state (prefix with __ so they aren't automatically
|
137
163
|
# merged)
|
@@ -225,9 +251,10 @@ module VagrantPlugins
|
|
225
251
|
@disk_type = "pd-standard" if @disk_type == UNSET_VALUE
|
226
252
|
|
227
253
|
# Instance name defaults to a new datetime value (hour granularity)
|
228
|
-
|
229
|
-
|
230
|
-
|
254
|
+
if @name == UNSET_VALUE
|
255
|
+
t = Time.now
|
256
|
+
@name = "i-#{t.strftime("%Y%m%d%H")}-" + SecureRandom.hex(4)
|
257
|
+
end
|
231
258
|
# Network defaults to 'default'
|
232
259
|
@network = "default" if @network == UNSET_VALUE
|
233
260
|
|
@@ -243,9 +270,21 @@ module VagrantPlugins
|
|
243
270
|
# external_ip defaults to nil
|
244
271
|
@external_ip = nil if @external_ip == UNSET_VALUE
|
245
272
|
|
273
|
+
# preemptible defaults to false
|
274
|
+
@preemptible = false if @preemptible == UNSET_VALUE
|
275
|
+
|
276
|
+
# auto_restart defaults to true
|
277
|
+
@auto_restart = true if @auto_restart == UNSET_VALUE
|
278
|
+
|
279
|
+
# on_host_maintenance defaults to MIGRATE
|
280
|
+
@on_host_maintenance = "MIGRATE" if @on_host_maintenance == UNSET_VALUE
|
281
|
+
|
246
282
|
# Default instance_ready_timeout
|
247
283
|
@instance_ready_timeout = 20 if @instance_ready_timeout == UNSET_VALUE
|
248
284
|
|
285
|
+
# Default service_accounts
|
286
|
+
@service_accounts = nil if @service_accounts == UNSET_VALUE
|
287
|
+
|
249
288
|
# Compile our zone specific configurations only within
|
250
289
|
# NON-zone-SPECIFIC configurations.
|
251
290
|
if !@__zone_specific
|
@@ -288,6 +327,12 @@ module VagrantPlugins
|
|
288
327
|
errors << I18n.t("vagrant_google.config.google_key_location_required") if \
|
289
328
|
config.google_key_location.nil? and config.google_json_key_location.nil?
|
290
329
|
|
330
|
+
if config.preemptible
|
331
|
+
errors << I18n.t("vagrant_google.config.auto_restart_invalid_on_preemptible") if \
|
332
|
+
config.auto_restart
|
333
|
+
errors << I18n.t("vagrant_google.config.on_host_maintenance_invalid_on_preemptible") unless \
|
334
|
+
config.on_host_maintenance == "TERMINATE"
|
335
|
+
end
|
291
336
|
end
|
292
337
|
|
293
338
|
errors << I18n.t("vagrant_google.config.image_required") if config.image.nil?
|
@@ -20,11 +20,7 @@ module VagrantPlugins
|
|
20
20
|
error_namespace("vagrant_google.errors")
|
21
21
|
end
|
22
22
|
|
23
|
-
class
|
24
|
-
error_key(:external_ip_error)
|
25
|
-
end
|
26
|
-
|
27
|
-
class DiskTypeError <VagrantGoogleError
|
23
|
+
class DiskTypeError < VagrantGoogleError
|
28
24
|
error_key(:disk_type_error)
|
29
25
|
end
|
30
26
|
|
@@ -32,6 +28,18 @@ module VagrantPlugins
|
|
32
28
|
error_key(:fog_error)
|
33
29
|
end
|
34
30
|
|
31
|
+
class ExternalIpInUseError < VagrantGoogleError
|
32
|
+
error_key(:external_ip_error)
|
33
|
+
end
|
34
|
+
|
35
|
+
class ExternalIpDoesNotExistError < VagrantGoogleError
|
36
|
+
error_key(:external_ip_does_not_exist_error)
|
37
|
+
end
|
38
|
+
|
39
|
+
class InstanceReadyTimeout < VagrantGoogleError
|
40
|
+
error_key(:instance_ready_timeout)
|
41
|
+
end
|
42
|
+
|
35
43
|
class RsyncError < VagrantGoogleError
|
36
44
|
error_key(:rsync_error)
|
37
45
|
end
|
data/lib/vagrant-google.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# Copyright 2013 Google Inc. All Rights Reserved.
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
data/locales/en.yml
CHANGED
@@ -2,6 +2,8 @@ en:
|
|
2
2
|
vagrant_google:
|
3
3
|
already_created: |-
|
4
4
|
The machine is already created.
|
5
|
+
already_status: |-
|
6
|
+
The machine is already in %{status} status.
|
5
7
|
launching_instance: |-
|
6
8
|
Launching an instance with the following settings...
|
7
9
|
not_created: |-
|
@@ -15,16 +17,30 @@ en:
|
|
15
17
|
Make sure rsync is installed and the binary can be found in the PATH.
|
16
18
|
rsync_folder: |-
|
17
19
|
Rsyncing folder: %{hostpath} => %{guestpath}
|
20
|
+
starting: |-
|
21
|
+
Starting the instance...
|
22
|
+
stopping: |-
|
23
|
+
Stopping the instance...
|
18
24
|
terminating: |-
|
19
25
|
Terminating the instance...
|
20
26
|
waiting_for_ready: |-
|
21
27
|
Waiting for instance to become "ready"...
|
28
|
+
waiting_for_stop: |-
|
29
|
+
Waiting for instance to become terminated...
|
22
30
|
waiting_for_ssh: |-
|
23
31
|
Waiting for SSH to become available...
|
24
32
|
warn_networks: |-
|
25
33
|
Warning! The Google provider doesn't support any of the Vagrant
|
26
34
|
high-level network configurations (`config.vm.network`). They
|
27
35
|
will be silently ignored.
|
36
|
+
warn_ssh_vagrant_user: |-
|
37
|
+
Warning! SSH credentials are not set (`ssh.username`, `ssh.private_key`).
|
38
|
+
Unless Vagrant's default insecure private key is added to GCE metadata,
|
39
|
+
"vagrant up" will timeout while trying to estabilish an ssh connection
|
40
|
+
to the instance.
|
41
|
+
NOTE! Adding Vagrant private key to GCE metadata is heavily discouraged,
|
42
|
+
since it potentially allows anyone to connect to your instances,
|
43
|
+
including those not managed by Vagrant.
|
28
44
|
will_not_destroy: |-
|
29
45
|
The instance '%{name}' will not be destroyed, since the confirmation
|
30
46
|
was declined.
|
@@ -50,6 +66,11 @@ en:
|
|
50
66
|
Config must specify only one key location.
|
51
67
|
google_project_id_required: |-
|
52
68
|
A Google Cloud Project ID is required via "google_project_id"
|
69
|
+
auto_restart_invalid_on_preemptible: |-
|
70
|
+
"auto_restart" option must be set to "false" for preemptible instances.
|
71
|
+
on_host_maintenance_invalid_on_preemptible: |-
|
72
|
+
"on_host_maintenance" option must be set to "TERMINATE" for preemptible
|
73
|
+
instances.
|
53
74
|
#-------------------------------------------------------------------------------
|
54
75
|
# Translations for exception classes
|
55
76
|
#-------------------------------------------------------------------------------
|
@@ -72,7 +93,10 @@ en:
|
|
72
93
|
Guest path: %{guestpath}
|
73
94
|
Error: %{stderr}
|
74
95
|
external_ip_error: |-
|
75
|
-
Specified external IP address is
|
96
|
+
Specified external IP address is already in use.
|
97
|
+
IP address requested: %{externalip}
|
98
|
+
external_ip_does_not_exist_error: |-
|
99
|
+
Specified external IP address is invalid or does not exist.
|
76
100
|
IP address requested: %{externalip}
|
77
101
|
disk_type_error: |-
|
78
102
|
Specified disk type is not available in the region selected.
|
@@ -98,6 +122,12 @@ en:
|
|
98
122
|
Resources have been acquired and the instance is being prepared for
|
99
123
|
launch and should be in the RUNNING state soon.
|
100
124
|
|
125
|
+
short_STOPPING: |-
|
126
|
+
stopping
|
127
|
+
long_STOPPING: |-
|
128
|
+
The GCE instance is stopping. Wait until is completely stopped to
|
129
|
+
run `vagrant up` and start it.
|
130
|
+
|
101
131
|
short_RUNNING: |-
|
102
132
|
running
|
103
133
|
long_RUNNING: |-
|
@@ -114,6 +144,5 @@ en:
|
|
114
144
|
short_TERMINATED: |-
|
115
145
|
terminated
|
116
146
|
long_TERMINATED: |-
|
117
|
-
The Google instance failed for some reason
|
118
|
-
|
119
|
-
delete it with `vagrant destroy`.
|
147
|
+
The Google instance was halted or failed for some reason. You can
|
148
|
+
attempt to restart the instance by running `vagrant up`.
|
data/tasks/acceptance.rake
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
def colorize(text, color_code)
|
2
|
+
puts "\033[#{color_code}m#{text}\033[0m"
|
3
|
+
end
|
4
|
+
|
5
|
+
{
|
6
|
+
:red => 31,
|
7
|
+
:green => 32,
|
8
|
+
:yellow => 33
|
9
|
+
}.each do |key, color_code|
|
10
|
+
define_method key do |text|
|
11
|
+
colorize(text, color_code)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
1
15
|
namespace :acceptance do
|
2
16
|
|
3
17
|
desc "shows components that can be tested separately"
|
@@ -8,7 +22,7 @@ namespace :acceptance do
|
|
8
22
|
desc "runs acceptance tests using vagrant-spec"
|
9
23
|
task :run do
|
10
24
|
|
11
|
-
|
25
|
+
yellow "NOTE: For acceptance tests to be functional, correct ssh key needs to be added to GCE metadata."
|
12
26
|
|
13
27
|
if !ENV["GOOGLE_JSON_KEY_LOCATION"] && !ENV["GOOGLE_KEY_LOCATION"]
|
14
28
|
abort ("Environment variables GOOGLE_JSON_KEY_LOCATION or GOOGLE_KEY_LOCATION are not set. Aborting.")
|
@@ -27,7 +41,12 @@ namespace :acceptance do
|
|
27
41
|
end
|
28
42
|
|
29
43
|
components = %w(
|
44
|
+
multi_instance
|
45
|
+
preemptible
|
46
|
+
scopes
|
47
|
+
synced_folder/rsync
|
30
48
|
provisioner/shell
|
49
|
+
provisioner/chef-solo
|
31
50
|
).map{ |s| "provider/google/#{s}" }
|
32
51
|
|
33
52
|
command = "bundle exec vagrant-spec test --components=#{components.join(" ")}"
|
data/tasks/lint.rake
ADDED
data/tasks/test.rake
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
# This tests that multiple instances can be brought up correctly
|
2
|
+
shared_examples 'provider/multi_instance' do |provider, options|
|
3
|
+
if !options[:box]
|
4
|
+
raise ArgumentError,
|
5
|
+
"box option must be specified for provider: #{provider}"
|
6
|
+
end
|
7
|
+
|
8
|
+
include_context 'acceptance'
|
9
|
+
|
10
|
+
before do
|
11
|
+
environment.skeleton('multi_instance')
|
12
|
+
assert_execute('vagrant', 'box', 'add', 'basic', options[:box])
|
13
|
+
assert_execute('vagrant', 'up', "--provider=#{provider}")
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
assert_execute('vagrant', 'destroy', '--force')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should bring up 2 machines in different zones' do
|
21
|
+
status("Test: both machines are running after up")
|
22
|
+
status("Test: machine1 is running after up")
|
23
|
+
result1 = execute("vagrant", "ssh", "z1a", "-c", "echo foo")
|
24
|
+
expect(result1).to exit_with(0)
|
25
|
+
expect(result1.stdout).to match(/foo\n$/)
|
26
|
+
status("Test: machine2 is running after up")
|
27
|
+
result1 = execute("vagrant", "ssh", "z1b", "-c", "echo foo")
|
28
|
+
expect(result1).to exit_with(0)
|
29
|
+
expect(result1.stdout).to match(/foo\n$/)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# This tests that a preemptible instance can be brought up correctly
|
2
|
+
shared_examples 'provider/preemptible' do |provider, options|
|
3
|
+
if !options[:box]
|
4
|
+
raise ArgumentError,
|
5
|
+
"box option must be specified for provider: #{provider}"
|
6
|
+
end
|
7
|
+
|
8
|
+
include_context 'acceptance'
|
9
|
+
|
10
|
+
before do
|
11
|
+
environment.skeleton('preemptible')
|
12
|
+
assert_execute('vagrant', 'box', 'add', 'basic', options[:box])
|
13
|
+
assert_execute('vagrant', 'up', "--provider=#{provider}")
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
assert_execute('vagrant', 'destroy', '--force')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should bring up machine with preemptible option' do
|
21
|
+
status("Test: machine is running after up")
|
22
|
+
result = execute("vagrant", "ssh", "-c", "echo foo")
|
23
|
+
expect(result).to exit_with(0)
|
24
|
+
expect(result.stdout).to match(/foo\n$/)
|
25
|
+
end
|
26
|
+
end
|