vagrant-google 0.1.4 → 0.1.5.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +9 -4
- data/README.md +67 -24
- data/Rakefile +12 -15
- data/{example_box → example_boxes}/README.md +1 -1
- data/example_boxes/gce/metadata.json +3 -0
- data/{example_box → example_boxes/gce-test}/metadata.json +0 -0
- data/google-test.box +0 -0
- data/lib/vagrant-google/action/connect_google.rb +15 -7
- data/lib/vagrant-google/action/run_instance.rb +66 -18
- data/lib/vagrant-google/action/sync_folders.rb +21 -1
- data/lib/vagrant-google/action/terminate_instance.rb +2 -1
- data/lib/vagrant-google/action.rb +1 -1
- data/lib/vagrant-google/config.rb +58 -3
- data/lib/vagrant-google/errors.rb +8 -0
- data/lib/vagrant-google/version.rb +1 -1
- data/locales/en.yml +25 -11
- data/tasks/acceptance.rake +38 -0
- data/tasks/bundler.rake +3 -0
- data/tasks/test.rake +8 -0
- data/test/acceptance/base.rb +2 -0
- data/test/acceptance/shared/context_google.rb +3 -0
- data/test/unit/base.rb +19 -0
- data/{spec/vagrant-google/config_spec.rb → test/unit/common/config_test.rb} +50 -3
- data/vagrant-google.gemspec +7 -9
- data/vagrant-spec.config.rb +10 -0
- metadata +49 -81
- data/CONTRIB.md +0 -64
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1579f21e576ddd84be0534329d26b18519f25a3c
|
4
|
+
data.tar.gz: 4bca2bc0bc4be2b3bf8dc0e41fcd44ccd80aa49d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 950faaf3aa714e6599d15292af92b66f3f1f23c621873b5f2ca724c4ad3a0f014ab726dbddd79400644b64e7af123fd48ec49ff84ce408de7d8b0183b55964ce
|
7
|
+
data.tar.gz: aac7d0ae3087361428a9556826b7b7ab20d863b81067da24f61867aef93cabc5c237aa0eaac640b856a7b377ca71a5069c9c6f234c361677235d09f5075df6d8
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p598
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 0.1.5 (May 2015)
|
2
|
+
|
3
|
+
* Added support for JSON private keys [temikus]
|
4
|
+
* Added disk_type parameter support [temikus]
|
5
|
+
* Added acceptance tests [temikus]
|
6
|
+
* Added can_ip_forward, external_ip, autodelete_disk and disk_name parameters support [phueper]
|
7
|
+
* Added support for user specified rsync excludes [patkar]
|
8
|
+
* Miscellaneous bugfixes [mbrukman, beauzeaux, iceydee, mklbtz, temikus]
|
9
|
+
|
1
10
|
# 0.1.4 (October 2014)
|
2
11
|
|
3
12
|
* Add option for disk size [franzs]
|
data/Gemfile
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.
|
@@ -20,5 +20,10 @@ group :development do
|
|
20
20
|
# We depend on Vagrant for development, but we don't add it as a
|
21
21
|
# gem dependency because we expect to be installed within the
|
22
22
|
# Vagrant environment itself using `vagrant plugin`.
|
23
|
-
gem
|
23
|
+
gem 'vagrant', git: "git://github.com/mitchellh/vagrant.git"
|
24
|
+
gem 'vagrant-spec', git: "https://github.com/mitchellh/vagrant-spec.git"
|
25
|
+
end
|
26
|
+
|
27
|
+
group :plugins do
|
28
|
+
gem "vagrant-google" , path: "."
|
24
29
|
end
|
data/README.md
CHANGED
@@ -40,8 +40,7 @@ Service Account for API Access.
|
|
40
40
|
1. Log in with your Google Account and go to
|
41
41
|
[Google Cloud Platform](https://cloud.google.com) and click on the
|
42
42
|
`Try it now` button.
|
43
|
-
1. Create a new project and remember to record the `Project ID`
|
44
|
-
specify.
|
43
|
+
1. Create a new project and remember to record the `Project ID`
|
45
44
|
1. Next, visit the [Developers Console](https://console.developers.google.com)
|
46
45
|
make sure to enable the `Google Compute Engine` service for your project
|
47
46
|
If prompted, review and agree to the terms of service.
|
@@ -49,9 +48,9 @@ Service Account for API Access.
|
|
49
48
|
section and click the `Create new Client ID` button. In the pop-up dialog,
|
50
49
|
select the `Service Account` radio button and the click the `Create Client ID`
|
51
50
|
button.
|
52
|
-
1.
|
53
|
-
|
54
|
-
|
51
|
+
1. Make sure to download the *P12 private key* and save this file in a secure
|
52
|
+
and reliable location. This key file will be used to authorize all API
|
53
|
+
requests to Google Compute Engine.
|
55
54
|
1. Still on the same page, find the newly created `Service Account` text
|
56
55
|
block on the API Access page. Record the `Email address` (it should end
|
57
56
|
with `@developer.gserviceaccount.com`) associated with the new Service
|
@@ -80,7 +79,7 @@ Vagrant.configure("2") do |config|
|
|
80
79
|
config.vm.provider :google do |google, override|
|
81
80
|
google.google_project_id = "YOUR_GOOGLE_CLOUD_PROJECT_ID"
|
82
81
|
google.google_client_email = "YOUR_SERVICE_ACCOUNT_EMAIL_ADDRESS"
|
83
|
-
google.
|
82
|
+
google.google_json_key_location = "/path/to/your/private-key.json"
|
84
83
|
|
85
84
|
override.ssh.username = "USERNAME"
|
86
85
|
override.ssh.private_key_path = "~/.ssh/id_rsa"
|
@@ -94,13 +93,36 @@ And then run `vagrant up --provider=google`.
|
|
94
93
|
|
95
94
|
This will start an Debian 7 (Wheezy) instance in the us-central1-f zone,
|
96
95
|
with an n1-standard-1 machine, and the "default" network within your project.
|
97
|
-
And assuming your SSH information was filled in properly within
|
98
|
-
Vagrantfile, SSH and provisioning will work as well.
|
96
|
+
And assuming your SSH information (see below) was filled in properly within
|
97
|
+
your Vagrantfile, SSH and provisioning will work as well.
|
99
98
|
|
100
99
|
Note that normally a lot of this boilerplate is encoded within the box file,
|
101
100
|
but the box file used for the quick start, the "google" box, has no
|
102
101
|
preconfigured defaults.
|
103
102
|
|
103
|
+
## SSH Support
|
104
|
+
|
105
|
+
In order for SSH to work properly to the GCE VM, you will first need to add
|
106
|
+
your public key to the GCE metadata service for the desired VM user account.
|
107
|
+
When a VM first boots, a Google-provided daemon is responsible for talking to
|
108
|
+
the internal GCE metadata service and creates local user accounts and their
|
109
|
+
respective `~/.ssh/authorized_keys` entries. Most new GCE users will use the
|
110
|
+
[Cloud SDK](https://cloud.google.com/sdk/) `gcloud compute` utility when first
|
111
|
+
getting started with GCE. This utility has built in support for creating SSH
|
112
|
+
key pairs, and uploading the public key to the GCE metadata service. By
|
113
|
+
default, `glcoud compute` creates a key pair named
|
114
|
+
`~/.ssh/google_compute_engine[.pub]`.
|
115
|
+
|
116
|
+
Note that you can use the more standard `~/.ssh/id_rsa[.pub]` files, but you
|
117
|
+
will need to manually add your public key to the GCE metadata service so your
|
118
|
+
VMs will pick up the the key. Note that they public key is typically
|
119
|
+
prefixed with the username, so that the daemon on the VM adds the public key
|
120
|
+
to the correct user account. See the blow links for more help with SSH and
|
121
|
+
GCE VMs.
|
122
|
+
|
123
|
+
* https://cloud.google.com/compute/docs/instances#sshing
|
124
|
+
* https://cloud.google.com/compute/docs/console#sshkeys
|
125
|
+
|
104
126
|
## Box Format
|
105
127
|
|
106
128
|
Every provider in Vagrant must introduce a custom box format. This provider
|
@@ -117,7 +139,9 @@ configuration for this provider.
|
|
117
139
|
This provider exposes quite a few provider-specific configuration options:
|
118
140
|
|
119
141
|
* `google_client_email` - The Client Email address for your Service Account.
|
120
|
-
* `google_key_location` - The location
|
142
|
+
* `google_key_location` - The location of the P12 private key file matching your
|
143
|
+
Service Account.
|
144
|
+
* `google_json_key_location` - The location of the JSON private key file matching your
|
121
145
|
Service Account.
|
122
146
|
* `google_project_id` - The Project ID for your Google Cloud Platform account.
|
123
147
|
* `image` - The image name to use when booting your instance.
|
@@ -125,12 +149,15 @@ This provider exposes quite a few provider-specific configuration options:
|
|
125
149
|
to become "ready" in GCE. Defaults to 20 seconds.
|
126
150
|
* `machine_type` - The machine type to use. The default is "n1-standard-1".
|
127
151
|
* `disk_size` - The disk size in GB. The default is 10.
|
152
|
+
* `disk_name` - The disk name to use. If the disk exists, it will be reused, otherwise created.
|
128
153
|
* `metadata` - Custom key/value pairs of metadata to add to the instance.
|
129
|
-
* `name` - The name of your instance. The default is "
|
154
|
+
* `name` - The name of your instance. The default is "i-yyyyMMddHH". Example 2014/10/01 10:00:00 is "i-2014100101".
|
130
155
|
* `network` - The name of the network to use for the instance. Default is
|
131
156
|
"default".
|
132
157
|
* `tags` - An array of tags to apply to this instance.
|
133
158
|
* `zone` - The zone name where the instance will be created.
|
159
|
+
* `can_ip_forward` - Boolean wether to enable IP Forwarding.
|
160
|
+
* `external_ip` - The external IP address to use.
|
134
161
|
|
135
162
|
These can be set like typical provider-specific configuration:
|
136
163
|
|
@@ -139,9 +166,9 @@ Vagrant.configure("2") do |config|
|
|
139
166
|
# ... other stuff
|
140
167
|
|
141
168
|
config.vm.provider :google do |google|
|
142
|
-
google.google_project_id = "
|
143
|
-
google.google_client_email = "
|
144
|
-
google.
|
169
|
+
google.google_project_id = "YOUR_GOOGLE_CLOUD_PROJECT_ID"
|
170
|
+
google.google_client_email = "YOUR_SERVICE_ACCOUNT_EMAIL_ADDRESS"
|
171
|
+
google.google_json_key_location = "/path/to/your/private-key.json"
|
145
172
|
end
|
146
173
|
end
|
147
174
|
```
|
@@ -157,16 +184,16 @@ Vagrant.configure("2") do |config|
|
|
157
184
|
config.vm.box = "gce"
|
158
185
|
|
159
186
|
config.vm.provider :google do |google|
|
160
|
-
google.google_project_id = "
|
161
|
-
google.google_client_email = "
|
162
|
-
google.
|
187
|
+
google.google_project_id = "YOUR_GOOGLE_CLOUD_PROJECT_ID"
|
188
|
+
google.google_client_email = "YOUR_SERVICE_ACCOUNT_EMAIL_ADDRESS"
|
189
|
+
google.google_json_key_location = "/path/to/your/private-key.json"
|
163
190
|
|
164
191
|
# Make sure to set this to trigger the zone_config
|
165
192
|
google.zone = "us-central1-f"
|
166
193
|
|
167
194
|
google.zone_config "us-central1-f" do |zone1f|
|
168
195
|
zone1f.name = "testing-vagrant"
|
169
|
-
zone1f.image = "debian-7-wheezy-
|
196
|
+
zone1f.image = "debian-7-wheezy-v20150127"
|
170
197
|
zone1f.machine_type = "n1-standard-4"
|
171
198
|
zone1f.zone = "us-central1-f"
|
172
199
|
zone1f.metadata = {'custom' => 'metadata', 'testing' => 'foobarbaz'}
|
@@ -199,10 +226,6 @@ machine over SSH.
|
|
199
226
|
This is good enough for all built-in Vagrant provisioners (shell, chef, and
|
200
227
|
puppet) to work!
|
201
228
|
|
202
|
-
## Known Issues
|
203
|
-
|
204
|
-
* https://github.com/mitchellh/vagrant-google/issues/17
|
205
|
-
|
206
229
|
## Development
|
207
230
|
|
208
231
|
To work on the `vagrant-google` plugin, clone this repository out, and use
|
@@ -227,11 +250,31 @@ that uses it, and uses bundler to execute Vagrant:
|
|
227
250
|
$ bundle exec vagrant up --provider=google
|
228
251
|
```
|
229
252
|
|
253
|
+
## Acceptance testing
|
254
|
+
|
255
|
+
**Work-in-progress:** Acceptance tests are based on vagrant-spec library which
|
256
|
+
is currently under active development so they may occasionally break.
|
257
|
+
|
258
|
+
Before you start acceptance tests, you'll need to set the authentication variables accordingly.
|
259
|
+
|
260
|
+
Next, export your GCP authentication data:
|
261
|
+
|
262
|
+
```
|
263
|
+
export GOOGLE_CLIENT_EMAIL="your-google_service_account_email@developer.gserviceaccount.com"
|
264
|
+
export GOOGLE_PROJECT_ID="your-google-cloud-project-id"
|
265
|
+
export GOOGLE_JSON_KEY_LOCATION="/full/path/to/your/private-key.json"
|
266
|
+
|
267
|
+
export GOOGLE_SSH_USER="testuser"
|
268
|
+
export GOOGLE_SSH_KEY_LOCATION="/home/testuser/.ssh/id_rsa"
|
269
|
+
```
|
270
|
+
|
271
|
+
After, you can run acceptance tests by running the `run` task in `acceptance` namespace:
|
272
|
+
```
|
273
|
+
bundle exec rake acceptance:run
|
274
|
+
```
|
275
|
+
|
230
276
|
## Changelog
|
231
277
|
* See [CHANGELOG.md](https://github.com/mitchellh/vagrant-google/blob/master/CHANGELOG.md)
|
232
278
|
|
233
|
-
## Contributing
|
234
|
-
* See [CONTRIB.md](https://github.com/mitchellh/vagrant-google/blob/master/CONTRIB.md)
|
235
|
-
|
236
279
|
## Licensing
|
237
280
|
* See [LICENSE](https://github.com/mitchellh/vagrant-google/blob/master/LICENSE)
|
data/Rakefile
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.
|
@@ -14,22 +14,19 @@
|
|
14
14
|
|
15
15
|
require 'rubygems'
|
16
16
|
require 'bundler/setup'
|
17
|
-
require 'rspec/core/rake_task'
|
18
17
|
|
19
18
|
# Immediately sync all stdout so that tools like buildbot can
|
20
19
|
# immediately load in the output.
|
21
20
|
$stdout.sync = true
|
22
21
|
$stderr.sync = true
|
23
22
|
|
24
|
-
#
|
25
|
-
|
23
|
+
# Load all the rake tasks from the "tasks" folder. This folder
|
24
|
+
# allows us to nicely separate rake tasks into individual files
|
25
|
+
# based on their role, which makes development and debugging easier
|
26
|
+
# than one monolithic file.
|
27
|
+
task_dir = File.expand_path("../tasks", __FILE__)
|
28
|
+
Dir["#{task_dir}/**/*.rake"].each do |task_file|
|
29
|
+
load task_file
|
30
|
+
end
|
26
31
|
|
27
|
-
|
28
|
-
# publishing.
|
29
|
-
Bundler::GemHelper.install_tasks
|
30
|
-
|
31
|
-
# Install the `spec` task so that we can run tests.
|
32
|
-
RSpec::Core::RakeTask.new
|
33
|
-
|
34
|
-
# Default task is to run the unit tests
|
35
|
-
task :default => "spec"
|
32
|
+
task default: "test:unit"
|
@@ -5,7 +5,7 @@ This folder shows the example contents of a box for the `google` provider.
|
|
5
5
|
To turn this into a box:
|
6
6
|
|
7
7
|
```
|
8
|
-
$ tar cvzf
|
8
|
+
$ tar cvzf ../../google.box ./metadata.json ./Vagrantfile
|
9
9
|
```
|
10
10
|
|
11
11
|
This box works by using Vagrant's built-in Vagrantfile merging to setup
|
File without changes
|
data/google-test.box
ADDED
Binary file
|
@@ -29,13 +29,21 @@ module VagrantPlugins
|
|
29
29
|
def call(env)
|
30
30
|
provider_config = env[:machine].provider_config
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
unless provider_config.google_json_key_location.nil?
|
33
|
+
fog_config = {
|
34
|
+
:provider => :google,
|
35
|
+
:google_project => provider_config.google_project_id,
|
36
|
+
:google_client_email => provider_config.google_client_email,
|
37
|
+
:google_json_key_location => provider_config.google_json_key_location
|
38
|
+
}
|
39
|
+
else
|
40
|
+
fog_config = {
|
41
|
+
:provider => :google,
|
42
|
+
:google_project => provider_config.google_project_id,
|
43
|
+
:google_client_email => provider_config.google_client_email,
|
44
|
+
:google_key_location => provider_config.google_key_location
|
45
|
+
}
|
46
|
+
end
|
39
47
|
|
40
48
|
@logger.info("Connecting to Google...")
|
41
49
|
env[:google_compute] = Fog::Compute.new(fog_config)
|
@@ -40,42 +40,90 @@ module VagrantPlugins
|
|
40
40
|
name = zone_config.name
|
41
41
|
machine_type = zone_config.machine_type
|
42
42
|
disk_size = zone_config.disk_size
|
43
|
+
disk_name = zone_config.disk_name
|
44
|
+
disk_type = zone_config.disk_type
|
43
45
|
network = zone_config.network
|
44
46
|
metadata = zone_config.metadata
|
45
47
|
tags = zone_config.tags
|
48
|
+
can_ip_forward = zone_config.can_ip_forward
|
49
|
+
external_ip = zone_config.external_ip
|
50
|
+
autodelete_disk = zone_config.autodelete_disk
|
46
51
|
|
47
52
|
# Launch!
|
48
53
|
env[:ui].info(I18n.t("vagrant_google.launching_instance"))
|
49
|
-
env[:ui].info(" -- Name:
|
50
|
-
env[:ui].info(" -- Type:
|
51
|
-
env[:ui].info(" -- Disk
|
52
|
-
env[:ui].info(" --
|
53
|
-
env[:ui].info(" --
|
54
|
-
env[:ui].info(" --
|
55
|
-
env[:ui].info(" --
|
56
|
-
env[:ui].info(" --
|
54
|
+
env[:ui].info(" -- Name: #{name}")
|
55
|
+
env[:ui].info(" -- Type: #{machine_type}")
|
56
|
+
env[:ui].info(" -- Disk type: #{disk_type}")
|
57
|
+
env[:ui].info(" -- Disk size: #{disk_size} GB")
|
58
|
+
env[:ui].info(" -- Disk name: #{disk_name}")
|
59
|
+
env[:ui].info(" -- Image: #{image}")
|
60
|
+
env[:ui].info(" -- Zone: #{zone}") if zone
|
61
|
+
env[:ui].info(" -- Network: #{network}") if network
|
62
|
+
env[:ui].info(" -- Metadata: '#{metadata}'")
|
63
|
+
env[:ui].info(" -- Tags: '#{tags}'")
|
64
|
+
env[:ui].info(" -- IP Forward: #{can_ip_forward}")
|
65
|
+
env[:ui].info(" -- External IP: #{external_ip}")
|
66
|
+
env[:ui].info(" -- Autodelete Disk: #{autodelete_disk}")
|
57
67
|
begin
|
58
68
|
request_start_time = Time.now().to_i
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
69
|
+
if !external_ip.nil?
|
70
|
+
address = env[:google_compute].addresses.get_by_ip_address(external_ip)
|
71
|
+
if !address.nil?
|
72
|
+
if address.in_use?
|
73
|
+
raise Errors::ExternalIpError,
|
74
|
+
:externalip => external_ip
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
#Check if disk type is available in the zone
|
79
|
+
if !disk_type.nil?
|
80
|
+
disk_type_obj = env[:google_compute].list_disk_types(zone).body['items'].select { |dt| dt['name'] == disk_type } || []
|
81
|
+
if !disk_type_obj.empty?
|
82
|
+
disk_type = disk_type_obj[0]["selfLink"]
|
83
|
+
else
|
84
|
+
raise Errors::DiskTypeError,
|
85
|
+
:disktype => disk_type
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
if disk_name.nil?
|
90
|
+
# no disk_name... disk_name defaults to instance name
|
91
|
+
disk = env[:google_compute].disks.create(
|
92
|
+
name: name,
|
93
|
+
size_gb: disk_size,
|
94
|
+
type: disk_type,
|
95
|
+
zone_name: zone,
|
96
|
+
source_image: image
|
97
|
+
)
|
98
|
+
disk.wait_for { disk.ready? }
|
99
|
+
else
|
100
|
+
disk = env[:google_compute].disks.get(disk_name, zone)
|
101
|
+
if disk.nil?
|
102
|
+
# disk not found... create it with name
|
103
|
+
disk = env[:google_compute].disks.create(
|
104
|
+
name: disk_name,
|
105
|
+
size_gb: disk_size,
|
106
|
+
type: disk_type,
|
107
|
+
zone_name: zone,
|
108
|
+
source_image: image
|
109
|
+
)
|
110
|
+
disk.wait_for { disk.ready? }
|
111
|
+
end
|
112
|
+
end
|
66
113
|
|
67
114
|
defaults = {
|
68
115
|
:name => name,
|
69
116
|
:zone_name => zone,
|
70
117
|
:machine_type => machine_type,
|
71
118
|
:disk_size => disk_size,
|
119
|
+
:disk_type => disk_type,
|
72
120
|
:image => image,
|
73
121
|
:network => network,
|
74
122
|
:metadata => metadata,
|
75
123
|
:tags => tags,
|
76
|
-
|
77
|
-
|
78
|
-
:disks => [disk.get_as_boot_disk(true,
|
124
|
+
:can_ip_forward => can_ip_forward,
|
125
|
+
:external_ip => external_ip,
|
126
|
+
:disks => [disk.get_as_boot_disk(true, autodelete_disk)],
|
79
127
|
}
|
80
128
|
server = env[:google_compute].servers.create(defaults)
|
81
129
|
@logger.info("Machine '#{zone}:#{name}' created.")
|
@@ -14,6 +14,7 @@
|
|
14
14
|
require "log4r"
|
15
15
|
require "vagrant/util/subprocess"
|
16
16
|
require "vagrant/util/scoped_hash_override"
|
17
|
+
require "vagrant/util/which"
|
17
18
|
|
18
19
|
module VagrantPlugins
|
19
20
|
module Google
|
@@ -38,6 +39,11 @@ module VagrantPlugins
|
|
38
39
|
|
39
40
|
# Ignore disabled shared folders
|
40
41
|
next if data[:disabled]
|
42
|
+
|
43
|
+
unless Vagrant::Util::Which.which('rsync')
|
44
|
+
env[:ui].warn(I18n.t('vagrant_aws.rsync_not_found_warning'))
|
45
|
+
break
|
46
|
+
end
|
41
47
|
|
42
48
|
hostpath = File.expand_path(data[:hostpath], env[:root_path])
|
43
49
|
guestpath = data[:guestpath]
|
@@ -46,6 +52,11 @@ module VagrantPlugins
|
|
46
52
|
# avoid creating an additional directory with rsync
|
47
53
|
hostpath = "#{hostpath}/" if hostpath !~ /\/$/
|
48
54
|
|
55
|
+
# on windows rsync.exe requires cygdrive-style paths
|
56
|
+
if Vagrant::Util::Platform.windows?
|
57
|
+
hostpath = hostpath.gsub(/^(\w):/) { "/cygdrive/#{$1}" }
|
58
|
+
end
|
59
|
+
|
49
60
|
env[:ui].info(I18n.t("vagrant_google.rsync_folder",
|
50
61
|
:hostpath => hostpath,
|
51
62
|
:guestpath => guestpath))
|
@@ -61,14 +72,23 @@ module VagrantPlugins
|
|
61
72
|
Array(ssh_info[:private_key_path]).map { |path| "-i '#{path}' " }.join
|
62
73
|
end
|
63
74
|
|
75
|
+
#collect rsync excludes specified :rsync__excludes=>['path1',...] in synced_folder options
|
76
|
+
excludes = ['.vagrant/', *Array(data[:rsync__excludes])]
|
77
|
+
|
64
78
|
# Rsync over to the guest path using the SSH info
|
65
79
|
command = [
|
66
80
|
"rsync", "--verbose", "--archive", "-z",
|
67
|
-
|
81
|
+
*excludes.map{|e|['--exclude', e]}.flatten,
|
68
82
|
"-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no #{ssh_key_options(ssh_info)}",
|
69
83
|
hostpath,
|
70
84
|
"#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
|
71
85
|
|
86
|
+
# we need to fix permissions when using rsync.exe on windows, see
|
87
|
+
# http://stackoverflow.com/questions/5798807/rsync-permission-denied-created-directories-have-no-permissions
|
88
|
+
if Vagrant::Util::Platform.windows?
|
89
|
+
command.insert(1, "--chmod", "ugo=rwX")
|
90
|
+
end
|
91
|
+
|
72
92
|
r = Vagrant::Util::Subprocess.execute(*command)
|
73
93
|
if r.exit_code != 0
|
74
94
|
raise Errors::RsyncError,
|
@@ -27,8 +27,9 @@ module VagrantPlugins
|
|
27
27
|
server = env[:google_compute].servers.get(env[:machine].id, env[:machine].provider_config.zone)
|
28
28
|
|
29
29
|
# Destroy the server and remove the tracking ID
|
30
|
+
# destroy() is called with 'false' to disable asynchronous execution.
|
30
31
|
env[:ui].info(I18n.t("vagrant_google.terminating"))
|
31
|
-
server.destroy if not server.nil?
|
32
|
+
server.destroy(false) if not server.nil?
|
32
33
|
env[:machine].id = nil
|
33
34
|
|
34
35
|
@app.call(env)
|
@@ -104,7 +104,7 @@ module VagrantPlugins
|
|
104
104
|
# This action is called to bring the box up from nothing.
|
105
105
|
def self.action_up
|
106
106
|
Vagrant::Action::Builder.new.tap do |b|
|
107
|
-
b.use
|
107
|
+
b.use HandleBox
|
108
108
|
b.use ConfigValidate
|
109
109
|
b.use ConnectGoogle
|
110
110
|
b.use Call, IsCreated do |env, b2|
|
@@ -26,6 +26,11 @@ module VagrantPlugins
|
|
26
26
|
# @return [String]
|
27
27
|
attr_accessor :google_key_location
|
28
28
|
|
29
|
+
# The path to the Service Account json-formatted private key
|
30
|
+
#
|
31
|
+
# @return [String]
|
32
|
+
attr_accessor :google_json_key_location
|
33
|
+
|
29
34
|
# The Google Cloud Project ID (not name or number)
|
30
35
|
#
|
31
36
|
# @return [String]
|
@@ -46,6 +51,16 @@ module VagrantPlugins
|
|
46
51
|
# @return [Int]
|
47
52
|
attr_accessor :disk_size
|
48
53
|
|
54
|
+
# The name of the disk to be used, it it exists, it will be reused, otherwise created.
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
attr_accessor :disk_name
|
58
|
+
|
59
|
+
# The type of the disk to be used, such as "pd-standard"
|
60
|
+
#
|
61
|
+
# @return [String]
|
62
|
+
attr_accessor :disk_type
|
63
|
+
|
49
64
|
# The user metadata string
|
50
65
|
#
|
51
66
|
# @return [Hash<String, String>]
|
@@ -66,6 +81,21 @@ module VagrantPlugins
|
|
66
81
|
# @return [Array]
|
67
82
|
attr_accessor :tags
|
68
83
|
|
84
|
+
# wether to enable ip forwarding
|
85
|
+
#
|
86
|
+
# @return Boolean
|
87
|
+
attr_accessor :can_ip_forward
|
88
|
+
|
89
|
+
# The external IP Address to use
|
90
|
+
#
|
91
|
+
# @return String
|
92
|
+
attr_accessor :external_ip
|
93
|
+
|
94
|
+
# wether to autodelete disk on instance delete
|
95
|
+
#
|
96
|
+
# @return Boolean
|
97
|
+
attr_accessor :autodelete_disk
|
98
|
+
|
69
99
|
# The timeout value waiting for instance ready
|
70
100
|
#
|
71
101
|
# @return [Int]
|
@@ -86,14 +116,20 @@ module VagrantPlugins
|
|
86
116
|
def initialize(zone_specific=false)
|
87
117
|
@google_client_email = UNSET_VALUE
|
88
118
|
@google_key_location = UNSET_VALUE
|
119
|
+
@google_json_key_location = UNSET_VALUE
|
89
120
|
@google_project_id = UNSET_VALUE
|
90
121
|
@image = UNSET_VALUE
|
91
122
|
@machine_type = UNSET_VALUE
|
92
123
|
@disk_size = UNSET_VALUE
|
124
|
+
@disk_name = UNSET_VALUE
|
125
|
+
@disk_type = UNSET_VALUE
|
93
126
|
@metadata = {}
|
94
127
|
@name = UNSET_VALUE
|
95
128
|
@network = UNSET_VALUE
|
96
129
|
@tags = []
|
130
|
+
@can_ip_forward = UNSET_VALUE
|
131
|
+
@external_ip = UNSET_VALUE
|
132
|
+
@autodelete_disk = UNSET_VALUE
|
97
133
|
@instance_ready_timeout = UNSET_VALUE
|
98
134
|
@zone = UNSET_VALUE
|
99
135
|
|
@@ -110,7 +146,7 @@ module VagrantPlugins
|
|
110
146
|
# image and machine type name for zones. Example:
|
111
147
|
#
|
112
148
|
# google.zone_config "us-central1-f" do |zone|
|
113
|
-
# zone.image = "debian-7-wheezy-
|
149
|
+
# zone.image = "debian-7-wheezy-v20150127"
|
114
150
|
# zone.machine_type = "n1-standard-4"
|
115
151
|
# end
|
116
152
|
#
|
@@ -170,10 +206,11 @@ module VagrantPlugins
|
|
170
206
|
# will default to nil if the environment variables are not present.
|
171
207
|
@google_client_email = ENV['GOOGLE_CLIENT_EMAIL'] if @google_client_email == UNSET_VALUE
|
172
208
|
@google_key_location = ENV['GOOGLE_KEY_LOCATION'] if @google_key_location == UNSET_VALUE
|
209
|
+
@google_json_key_location = ENV['GOOGLE_JSON_KEY_LOCATION'] if @google_json_key_location == UNSET_VALUE
|
173
210
|
@google_project_id = ENV['GOOGLE_PROJECT_ID'] if @google_project_id == UNSET_VALUE
|
174
211
|
|
175
212
|
# Image must be nil, since we can't default that
|
176
|
-
@image = "debian-7-wheezy-
|
213
|
+
@image = "debian-7-wheezy-v20150127" if @image == UNSET_VALUE
|
177
214
|
|
178
215
|
# Default instance type is an n1-standard-1
|
179
216
|
@machine_type = "n1-standard-1" if @machine_type == UNSET_VALUE
|
@@ -181,6 +218,12 @@ module VagrantPlugins
|
|
181
218
|
# Default disk size is 10 GB
|
182
219
|
@disk_size = 10 if @disk_size == UNSET_VALUE
|
183
220
|
|
221
|
+
# Default disk name is nil
|
222
|
+
@disk_name = nil if @disk_name == UNSET_VALUE
|
223
|
+
|
224
|
+
# Default disk type is pd-standard
|
225
|
+
@disk_type = "pd-standard" if @disk_type == UNSET_VALUE
|
226
|
+
|
184
227
|
# Instance name defaults to a new datetime value (hour granularity)
|
185
228
|
t = Time.now
|
186
229
|
@name = "i-#{t.year}#{t.month.to_s.rjust(2,'0')}#{t.day.to_s.rjust(2,'0')}#{t.hour.to_s.rjust(2,'0')}" if @name == UNSET_VALUE
|
@@ -191,6 +234,15 @@ module VagrantPlugins
|
|
191
234
|
# Default zone is us-central1-f.
|
192
235
|
@zone = "us-central1-f" if @zone == UNSET_VALUE
|
193
236
|
|
237
|
+
# autodelete_disk defaults to true
|
238
|
+
@autodelete_disk = true if @autodelete_disk == UNSET_VALUE
|
239
|
+
|
240
|
+
# can_ip_forward defaults to nil
|
241
|
+
@can_ip_forward = nil if @can_ip_forward == UNSET_VALUE
|
242
|
+
|
243
|
+
# external_ip defaults to nil
|
244
|
+
@external_ip = nil if @external_ip == UNSET_VALUE
|
245
|
+
|
194
246
|
# Default instance_ready_timeout
|
195
247
|
@instance_ready_timeout = 20 if @instance_ready_timeout == UNSET_VALUE
|
196
248
|
|
@@ -231,8 +283,11 @@ module VagrantPlugins
|
|
231
283
|
config.google_project_id.nil?
|
232
284
|
errors << I18n.t("vagrant_google.config.google_client_email_required") if \
|
233
285
|
config.google_client_email.nil?
|
286
|
+
errors << I18n.t("vagrant_google.config.google_duplicate_key_location") if \
|
287
|
+
!config.google_key_location.nil? and !config.google_json_key_location.nil?
|
234
288
|
errors << I18n.t("vagrant_google.config.google_key_location_required") if \
|
235
|
-
config.google_key_location.nil?
|
289
|
+
config.google_key_location.nil? and config.google_json_key_location.nil?
|
290
|
+
|
236
291
|
end
|
237
292
|
|
238
293
|
errors << I18n.t("vagrant_google.config.image_required") if config.image.nil?
|
@@ -20,6 +20,14 @@ module VagrantPlugins
|
|
20
20
|
error_namespace("vagrant_google.errors")
|
21
21
|
end
|
22
22
|
|
23
|
+
class ExternalIpError < VagrantGoogleError
|
24
|
+
error_key(:external_ip_error)
|
25
|
+
end
|
26
|
+
|
27
|
+
class DiskTypeError <VagrantGoogleError
|
28
|
+
error_key(:disk_type_error)
|
29
|
+
end
|
30
|
+
|
23
31
|
class FogError < VagrantGoogleError
|
24
32
|
error_key(:fog_error)
|
25
33
|
end
|