vagrant-linode 0.3.0 → 0.4.0
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/.rspec +3 -7
- data/CHANGELOG.md +2 -0
- data/Gemfile +5 -1
- data/README.md +32 -2
- data/lib/vagrant-linode/actions.rb +9 -0
- data/lib/vagrant-linode/actions/connect_linode.rb +2 -1
- data/lib/vagrant-linode/actions/create.rb +21 -18
- data/lib/vagrant-linode/actions/list_volumes.rb +50 -0
- data/lib/vagrant-linode/actions/rebuild.rb +6 -3
- data/lib/vagrant-linode/client_wrapper.rb +25 -0
- data/lib/vagrant-linode/commands/list_volumes.rb +20 -0
- data/lib/vagrant-linode/commands/root.rb +4 -0
- data/lib/vagrant-linode/commands/volumes.rb +55 -0
- data/lib/vagrant-linode/config.rb +7 -0
- data/lib/vagrant-linode/errors.rb +9 -1
- data/lib/vagrant-linode/services/volume_manager.rb +59 -0
- data/lib/vagrant-linode/version.rb +1 -1
- data/locales/en.yml +3 -0
- data/spec/spec_helper.rb +7 -3
- data/spec/vagrant-linode/services/volume_manager_spec.rb +42 -0
- data/test/Vagrantfile +10 -12
- metadata +24 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9188fdd2aa3e774b85bab464f1b5830e4c3ed5c
|
4
|
+
data.tar.gz: 7d13d05b7f4ba405cc0cbf561f8db36955587fa0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96e2e509f49563c002ff8f8a0b6c510813fea9b5be9b175fc476f8a4b8e6d4aef5f7a65aefa9ede6104618652fa26891061f63b634abc71a832d0b4f08dcf8fa
|
7
|
+
data.tar.gz: aa390a2af81709249571b00dece9663ed946415cc16218fcfdb5fc8872d6f7d1b94b59b40c4634d99adf5d8b3b9a74a1dad77595aa54bd72a2bd973c713120e9
|
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
|
+
v0.4.0 added support for Linode Volumes
|
4
|
+
added `vagrant linode volumes list` command
|
3
5
|
v0.3.0 fixes for Vagrant 2.0.1 (now requires Ruby 2.2.0+)
|
4
6
|
xen-only kernels are no longer available (Fixes KVM Grub options)
|
5
7
|
rebuild command warns / quits if Linode is not powered down
|
data/Gemfile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
|
-
ruby '
|
2
|
+
ruby '>= 2.2.0'
|
3
3
|
|
4
4
|
group :development do
|
5
5
|
# We depend on Vagrant for development, but we don't add it as a
|
@@ -10,6 +10,10 @@ group :development do
|
|
10
10
|
gem 'pry'
|
11
11
|
end
|
12
12
|
|
13
|
+
group :test do
|
14
|
+
gem 'rspec-its'
|
15
|
+
end
|
16
|
+
|
13
17
|
group :plugins do
|
14
18
|
gemspec
|
15
19
|
end
|
data/README.md
CHANGED
@@ -176,9 +176,27 @@ curl -X POST "https://api.linode.com/?api_action=avail.kernels" \
|
|
176
176
|
|
177
177
|
More detail: [Linode API - Kernels](https://www.linode.com/api/utility/avail.kernels)
|
178
178
|
|
179
|
+
### provider.volumes - [Volume Handling](https://www.linode.com/docs/platform/how-to-use-block-storage-with-your-linode/)
|
180
|
+
|
181
|
+
The plugin can create and attach additional volumes when creating Linodes. `vagrant rebuild` calls will rebuild the VM only and reattach the volume afterwards without losing the contents.
|
182
|
+
|
183
|
+
```rb
|
184
|
+
config.vm.provider :linode do |linode|
|
185
|
+
linode.plan = "Linode 2048"
|
186
|
+
linode.volumes = [
|
187
|
+
{label: "extra_volume", size: 1},
|
188
|
+
]
|
189
|
+
end
|
190
|
+
```
|
191
|
+
|
192
|
+
NOTES:
|
193
|
+
* The volume needs to be formatted and mounted inside the VM either manually or by a StackScript, etc.
|
194
|
+
* The plugin doesn't do any volume metadata management. If a volume is renamed the next `vagrant up` call will create a new one.
|
195
|
+
* Running `vagrant destroy` will **NOT** destroy the volumes.
|
196
|
+
|
179
197
|
### nfs.functional
|
180
198
|
|
181
|
-
The sync provider, NFS, has been disabled to make rsync easier to use. To enable NFS,
|
199
|
+
The sync provider, NFS, has been disabled to make rsync easier to use. To enable NFS,
|
182
200
|
run Vagrant with an environment variable `LINODE_NFS_FUNCTIONAL=1`. This will require
|
183
201
|
a bit more configuration between the Linode and the Vagrant host.
|
184
202
|
|
@@ -193,7 +211,7 @@ command:
|
|
193
211
|
This command will create a new linode, setup your SSH key for authentication,
|
194
212
|
create a new user account, and run the provisioners you have configured.
|
195
213
|
|
196
|
-
The environment variable `VAGRANT_DEFAULT_PROVIDER` can be set to `linode` to avoid sending `--provider=linode` on each `vagrant up`.
|
214
|
+
The environment variable `VAGRANT_DEFAULT_PROVIDER` can be set to `linode` to avoid sending `--provider=linode` on each `vagrant up`.
|
197
215
|
|
198
216
|
**Supported Commands**
|
199
217
|
|
@@ -233,6 +251,18 @@ You can now make modifications. Running `vagrant` within the Bundler
|
|
233
251
|
environment will ensure that plugins installed in your Vagrant
|
234
252
|
environment are not loaded.
|
235
253
|
|
254
|
+
### Building and Publishing
|
255
|
+
|
256
|
+
```
|
257
|
+
vi lib/vagrant-linode/version.rb
|
258
|
+
vi CHANGELOG.md
|
259
|
+
git commit -m 'version 0.1.2' lib/vagrant-linode/version.rb CHANGELOG.md
|
260
|
+
git tag -s v0.1.2
|
261
|
+
git push --tags origin master
|
262
|
+
gem build vagrant-linode.gemspec
|
263
|
+
gem push vagrant-linode-0.1.2.gem
|
264
|
+
```
|
265
|
+
|
236
266
|
[](https://gitter.im/displague/vagrant-linode?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
237
267
|
[](https://codeclimate.com/github/displague/vagrant-linode)
|
238
268
|
[](https://codeclimate.com/github/displague/vagrant-linode)
|
@@ -256,6 +256,14 @@ module VagrantPlugins
|
|
256
256
|
end
|
257
257
|
end
|
258
258
|
|
259
|
+
def self.action_list_volumes
|
260
|
+
Vagrant::Action::Builder.new.tap do |b|
|
261
|
+
# b.use ConfigValidate # is this per machine?
|
262
|
+
b.use ConnectLinode
|
263
|
+
b.use ListVolumes
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
259
267
|
action_root = Pathname.new(File.expand_path('../actions', __FILE__))
|
260
268
|
autoload :ConnectLinode, action_root.join('connect_linode')
|
261
269
|
autoload :ReadState, action_root.join('read_state')
|
@@ -284,6 +292,7 @@ module VagrantPlugins
|
|
284
292
|
autoload :ListDistributions, action_root.join('list_distributions')
|
285
293
|
autoload :ListKernels, action_root.join('list_kernels')
|
286
294
|
autoload :ListDatacenters, action_root.join('list_datacenters')
|
295
|
+
autoload :ListVolumes, action_root.join('list_volumes')
|
287
296
|
end
|
288
297
|
end
|
289
298
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
+
require "vagrant-linode/client_wrapper"
|
2
3
|
|
3
4
|
module VagrantPlugins
|
4
5
|
module Linode
|
@@ -25,7 +26,7 @@ module VagrantPlugins
|
|
25
26
|
|
26
27
|
@logger.info('Connecting to Linode api_url...')
|
27
28
|
|
28
|
-
linode = ::LinodeAPI::Retryable.new
|
29
|
+
linode = ClientWrapper.new(::LinodeAPI::Retryable.new(params), env[:ui])
|
29
30
|
env[:linode_api] = linode
|
30
31
|
|
31
32
|
@app.call(env)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'vagrant-linode/helpers/client'
|
2
2
|
require 'vagrant-linode/helpers/waiter'
|
3
3
|
require 'vagrant-linode/errors'
|
4
|
+
require 'vagrant-linode/services/volume_manager'
|
4
5
|
|
5
6
|
module VagrantPlugins
|
6
7
|
module Linode
|
@@ -122,21 +123,21 @@ module VagrantPlugins
|
|
122
123
|
datacenterid: datacenter_id,
|
123
124
|
paymentterm: @machine.provider_config.paymentterm || 1
|
124
125
|
)
|
125
|
-
|
126
|
+
@machine.id = result['linodeid'].to_s
|
127
|
+
env[:ui].info I18n.t('vagrant_linode.info.created', linodeid: @machine.id, label: (@machine.provider_config.label or "linode#{@machine.id}"))
|
126
128
|
|
127
|
-
# @client.linode.job.list(:linodeid =>
|
129
|
+
# @client.linode.job.list(:linodeid => @machine.id, :pendingonly => 1)
|
128
130
|
# assign the machine id for reference in other commands
|
129
|
-
@machine.id = result['linodeid'].to_s
|
130
131
|
|
131
132
|
disklist = []
|
132
133
|
|
133
134
|
if stackscript_id
|
134
135
|
disk = @client.linode.disk.createfromstackscript(
|
135
|
-
linodeid:
|
136
|
+
linodeid: @machine.id,
|
136
137
|
stackscriptid: stackscript_id,
|
137
138
|
stackscriptudfresponses: JSON.dump(stackscript_udf_responses),
|
138
139
|
distributionid: distribution_id,
|
139
|
-
label: 'Vagrant Disk Distribution ' + distribution_id.to_s + ' Linode ' +
|
140
|
+
label: 'Vagrant Disk Distribution ' + distribution_id.to_s + ' Linode ' + @machine.id,
|
140
141
|
type: 'ext4',
|
141
142
|
size: xvda_size,
|
142
143
|
rootsshkey: pubkey,
|
@@ -145,9 +146,9 @@ module VagrantPlugins
|
|
145
146
|
disklist.push(disk['diskid'])
|
146
147
|
elsif distribution_id
|
147
148
|
disk = @client.linode.disk.createfromdistribution(
|
148
|
-
linodeid:
|
149
|
+
linodeid: @machine.id,
|
149
150
|
distributionid: distribution_id,
|
150
|
-
label: 'Vagrant Disk Distribution ' + distribution_id.to_s + ' Linode ' +
|
151
|
+
label: 'Vagrant Disk Distribution ' + distribution_id.to_s + ' Linode ' + @machine.id,
|
151
152
|
type: 'ext4',
|
152
153
|
size: xvda_size,
|
153
154
|
rootsshkey: pubkey,
|
@@ -156,9 +157,9 @@ module VagrantPlugins
|
|
156
157
|
disklist.push(disk['diskid'])
|
157
158
|
elsif image_id
|
158
159
|
disk = @client.linode.disk.createfromimage(
|
159
|
-
linodeid:
|
160
|
+
linodeid: @machine.id,
|
160
161
|
imageid: image_id,
|
161
|
-
label: 'Vagrant Disk Image (' + image_id.to_s + ') for ' +
|
162
|
+
label: 'Vagrant Disk Image (' + image_id.to_s + ') for ' + @machine.id,
|
162
163
|
size: xvda_size,
|
163
164
|
rootsshkey: pubkey,
|
164
165
|
rootpass: root_pass
|
@@ -170,7 +171,7 @@ module VagrantPlugins
|
|
170
171
|
|
171
172
|
if swap_size > 0
|
172
173
|
swap = @client.linode.disk.create(
|
173
|
-
linodeid:
|
174
|
+
linodeid: @machine.id,
|
174
175
|
label: 'Vagrant swap',
|
175
176
|
type: 'swap',
|
176
177
|
size: swap_size
|
@@ -183,8 +184,8 @@ module VagrantPlugins
|
|
183
184
|
if xvdc_size > 0
|
184
185
|
xvdc_type = @machine.provider_config.xvdc_type.is_a?(Vagrant::Config::V2::DummyConfig) ? "raw" : @machine.provider_config.xvdc_type
|
185
186
|
xvdc = @client.linode.disk.create(
|
186
|
-
linodeid:
|
187
|
-
label: 'Vagrant Leftover Disk Linode ' +
|
187
|
+
linodeid: @machine.id,
|
188
|
+
label: 'Vagrant Leftover Disk Linode ' + @machine.id,
|
188
189
|
type: xvdc_type,
|
189
190
|
size: xvdc_size,
|
190
191
|
)
|
@@ -194,7 +195,7 @@ module VagrantPlugins
|
|
194
195
|
end
|
195
196
|
|
196
197
|
config = @client.linode.config.create(
|
197
|
-
linodeid:
|
198
|
+
linodeid: @machine.id,
|
198
199
|
label: 'Vagrant Config',
|
199
200
|
disklist: disklist.join(','),
|
200
201
|
kernelid: kernel_id
|
@@ -202,7 +203,7 @@ module VagrantPlugins
|
|
202
203
|
|
203
204
|
# @todo: allow provisioning to set static configuration for networking
|
204
205
|
if @machine.provider_config.private_networking
|
205
|
-
private_network = @client.linode.ip.addprivate linodeid:
|
206
|
+
private_network = @client.linode.ip.addprivate linodeid: @machine.id
|
206
207
|
end
|
207
208
|
|
208
209
|
label = @machine.provider_config.label
|
@@ -212,16 +213,18 @@ module VagrantPlugins
|
|
212
213
|
group = @machine.provider_config.group
|
213
214
|
group = "" if @machine.provider_config.group == false
|
214
215
|
|
216
|
+
Services::VolumeManager.new(@machine, @client.volume, env[:ui]).perform
|
217
|
+
|
215
218
|
result = @client.linode.update(
|
216
|
-
linodeid:
|
219
|
+
linodeid: @machine.id,
|
217
220
|
label: label,
|
218
221
|
lpm_displaygroup: group
|
219
222
|
)
|
220
223
|
|
221
|
-
env[:ui].info I18n.t('vagrant_linode.info.booting', linodeid:
|
224
|
+
env[:ui].info I18n.t('vagrant_linode.info.booting', linodeid: @machine.id)
|
222
225
|
|
223
|
-
bootjob = @client.linode.boot linodeid:
|
224
|
-
# sleep 1 until ! @client.linode.job.list(:linodeid =>
|
226
|
+
bootjob = @client.linode.boot linodeid: @machine.id
|
227
|
+
# sleep 1 until ! @client.linode.job.list(:linodeid => @machine.id, :jobid => bootjob['jobid'], :pendingonly => 1).length
|
225
228
|
wait_for_event(env, bootjob['jobid'])
|
226
229
|
|
227
230
|
# refresh linode state with provider and output ip address
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Linode
|
3
|
+
module Actions
|
4
|
+
class ListVolumes
|
5
|
+
def initialize(app, _env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
api = env[:linode_api]
|
11
|
+
logger = env[:ui]
|
12
|
+
machine = env[:machine]
|
13
|
+
|
14
|
+
remote_volumes = api.volume.list
|
15
|
+
volume_definitions = machine.provider_config.volumes
|
16
|
+
|
17
|
+
volume_definitions.each do |volume|
|
18
|
+
volume_label = "#{machine.name}_#{volume[:label]}"
|
19
|
+
remote_volume = remote_volumes.find { |v| v.label == volume_label }
|
20
|
+
|
21
|
+
if remote_volume.nil?
|
22
|
+
logger.info format_volume(volume_label, "does not exist")
|
23
|
+
next
|
24
|
+
end
|
25
|
+
|
26
|
+
logger.info format_volume(volume_label, volume_state(machine, remote_volume))
|
27
|
+
end
|
28
|
+
|
29
|
+
@app.call(env)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def volume_state(machine, volume)
|
35
|
+
if volume.linodeid.to_s == machine.id
|
36
|
+
"attached"
|
37
|
+
elsif volume.linodeid == 0
|
38
|
+
"detached"
|
39
|
+
else
|
40
|
+
"attached to other VM"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def format_volume(label, state)
|
45
|
+
"volume \"%s\": %s" % [label, state]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'vagrant-linode/helpers/client'
|
2
2
|
require 'vagrant-linode/helpers/waiter'
|
3
3
|
require 'vagrant-linode/errors'
|
4
|
+
require 'vagrant-linode/services/volume_manager'
|
4
5
|
|
5
6
|
module VagrantPlugins
|
6
7
|
module Linode
|
@@ -101,7 +102,7 @@ module VagrantPlugins
|
|
101
102
|
fail Errors::PlanID, plan: @machine.provider_config.planid if plan.nil?
|
102
103
|
plan_id = @machine.provider_config.planid
|
103
104
|
end
|
104
|
-
|
105
|
+
|
105
106
|
### Disk Images
|
106
107
|
xvda_size, swap_size, disk_sanity = @machine.provider_config.xvda_size, @machine.provider_config.swap_size, true
|
107
108
|
|
@@ -143,7 +144,7 @@ module VagrantPlugins
|
|
143
144
|
jobid: job
|
144
145
|
)
|
145
146
|
|
146
|
-
while jobStatus[0]['host_finish_dt'].nil? || jobStatus[0]['host_finish_dt'].empty? do
|
147
|
+
while jobStatus[0]['host_finish_dt'].nil? || jobStatus[0]['host_finish_dt'].empty? do
|
147
148
|
sleep(5)
|
148
149
|
jobStatus = @client.linode.job.list(
|
149
150
|
linodeid: @machine.id,
|
@@ -238,6 +239,8 @@ module VagrantPlugins
|
|
238
239
|
group = @machine.provider_config.group
|
239
240
|
group = "" if @machine.provider_config.group == false
|
240
241
|
|
242
|
+
Services::VolumeManager.new(@machine, @client.volume, env[:ui]).perform
|
243
|
+
|
241
244
|
result = @client.linode.update(
|
242
245
|
linodeid: @machine.id,
|
243
246
|
label: label,
|
@@ -276,7 +279,7 @@ module VagrantPlugins
|
|
276
279
|
|
277
280
|
@app.call(env)
|
278
281
|
end
|
279
|
-
|
282
|
+
|
280
283
|
def get_server_name
|
281
284
|
"vagrant_linode-#{rand.to_s.split('.')[1]}"
|
282
285
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Linode
|
5
|
+
class ClientWrapper
|
6
|
+
def initialize(client, logger)
|
7
|
+
@client = client
|
8
|
+
@logger = logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def method_missing(method, *args, &block)
|
12
|
+
result = @client.send(method, *args, &block)
|
13
|
+
|
14
|
+
if result.is_a? LinodeAPI::Retryable
|
15
|
+
self.class.new(result, @logger)
|
16
|
+
else
|
17
|
+
result
|
18
|
+
end
|
19
|
+
rescue ::LinodeAPI::APIError => e
|
20
|
+
@logger.error e.details.inspect
|
21
|
+
raise
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Linode
|
3
|
+
module Commands
|
4
|
+
class ListVolumes < Vagrant.plugin('2', :command)
|
5
|
+
def execute
|
6
|
+
opts = OptionParser.new do |o|
|
7
|
+
o.banner = 'Usage: vagrant linode volumes list [options]'
|
8
|
+
end
|
9
|
+
|
10
|
+
argv = parse_options(opts)
|
11
|
+
return unless argv
|
12
|
+
|
13
|
+
with_target_vms(argv) do |machine|
|
14
|
+
machine.action(:list_volumes)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Linode
|
3
|
+
module Commands
|
4
|
+
class Volumes < Vagrant.plugin('2', :command)
|
5
|
+
def initialize(argv, env)
|
6
|
+
@main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
|
7
|
+
|
8
|
+
@subcommands = Vagrant::Registry.new
|
9
|
+
@subcommands.register(:list) do
|
10
|
+
require File.expand_path('../list_volumes', __FILE__)
|
11
|
+
ListVolumes
|
12
|
+
end
|
13
|
+
|
14
|
+
super(argv, env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
if @main_args.include?('-h') || @main_args.include?('--help')
|
19
|
+
# Print the help for all the rackspace commands.
|
20
|
+
return help
|
21
|
+
end
|
22
|
+
|
23
|
+
command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
|
24
|
+
return help if !command_class || !@sub_command
|
25
|
+
@logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
|
26
|
+
|
27
|
+
# Initialize and execute the command class
|
28
|
+
command_class.new(@sub_args, @env).execute
|
29
|
+
end
|
30
|
+
|
31
|
+
def help
|
32
|
+
opts = OptionParser.new do |opts|
|
33
|
+
opts.banner = 'Usage: vagrant linode volumes <subcommand> [<args>]'
|
34
|
+
opts.separator ''
|
35
|
+
opts.separator 'Available subcommands:'
|
36
|
+
|
37
|
+
# Add the available subcommands as separators in order to print them
|
38
|
+
# out as well.
|
39
|
+
keys = []
|
40
|
+
@subcommands.each { |key, _value| keys << key.to_s }
|
41
|
+
|
42
|
+
keys.sort.each do |key|
|
43
|
+
opts.separator " #{key}"
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.separator ''
|
47
|
+
opts.separator 'For help on any individual subcommand run `vagrant linode volumes <subcommand> -h`'
|
48
|
+
end
|
49
|
+
|
50
|
+
@env.ui.info(opts.help, prefix: false)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -26,6 +26,7 @@ module VagrantPlugins
|
|
26
26
|
attr_accessor :kernel
|
27
27
|
attr_accessor :label
|
28
28
|
attr_accessor :group
|
29
|
+
attr_accessor :volumes
|
29
30
|
|
30
31
|
alias_method :setup?, :setup
|
31
32
|
|
@@ -57,6 +58,7 @@ module VagrantPlugins
|
|
57
58
|
@kernel = UNSET_VALUE
|
58
59
|
@label = UNSET_VALUE
|
59
60
|
@group = UNSET_VALUE
|
61
|
+
@volumes = UNSET_VALUE
|
60
62
|
end
|
61
63
|
|
62
64
|
def finalize!
|
@@ -90,6 +92,7 @@ module VagrantPlugins
|
|
90
92
|
@kernel = 'Latest 64 bit' if @kernel.nil? and @kernelid.nil?
|
91
93
|
@label = false if @label == UNSET_VALUE
|
92
94
|
@group = false if @group == UNSET_VALUE
|
95
|
+
@volumes = [] if @volumes == UNSET_VALUE
|
93
96
|
end
|
94
97
|
|
95
98
|
def validate(machine)
|
@@ -134,6 +137,10 @@ module VagrantPlugins
|
|
134
137
|
errors << I18n.t('vagrant_linode.config.distribution_or_image')
|
135
138
|
end
|
136
139
|
|
140
|
+
if !@volumes.is_a? Array
|
141
|
+
errors << I18n.t("vagrant_linode.config.volumes")
|
142
|
+
end
|
143
|
+
|
137
144
|
{ 'Linode Provider' => errors }
|
138
145
|
end
|
139
146
|
end
|
@@ -20,7 +20,7 @@ module VagrantPlugins
|
|
20
20
|
class DatacenterMatch < LinodeError
|
21
21
|
error_key(:datacenter_match)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
class ImageMatch < LinodeError
|
25
25
|
error_key(:image_match)
|
26
26
|
end
|
@@ -64,6 +64,14 @@ module VagrantPlugins
|
|
64
64
|
class StackscriptUDFFormat < LinodeError
|
65
65
|
error_key(:stackscript_udf_responses)
|
66
66
|
end
|
67
|
+
|
68
|
+
class VolumeSizeMissing < LinodeError
|
69
|
+
error_key(:volume_size_missing)
|
70
|
+
end
|
71
|
+
|
72
|
+
class VolumeLabelMissing < LinodeError
|
73
|
+
error_key(:volume_label_missing)
|
74
|
+
end
|
67
75
|
end
|
68
76
|
end
|
69
77
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "vagrant-linode/errors"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Linode
|
5
|
+
module Services
|
6
|
+
class VolumeManager
|
7
|
+
def initialize(machine, api, logger)
|
8
|
+
@machine = machine
|
9
|
+
@volumes_api = api
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def perform
|
14
|
+
volume_definitions.each do |volume|
|
15
|
+
raise Errors::VolumeLabelMissing if volume[:label].to_s.empty?
|
16
|
+
|
17
|
+
volume_name = "#{@machine.name}_#{volume[:label]}"
|
18
|
+
|
19
|
+
remote_volume = remote_volumes.find { |v| v.label == volume_name }
|
20
|
+
if remote_volume
|
21
|
+
attach_volume(remote_volume)
|
22
|
+
else
|
23
|
+
create_and_attach_volume(volume_name, volume[:size])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def volume_definitions
|
31
|
+
@machine.provider_config.volumes
|
32
|
+
end
|
33
|
+
|
34
|
+
def remote_volumes
|
35
|
+
@_remote_volumes ||= @volumes_api.list
|
36
|
+
end
|
37
|
+
|
38
|
+
def attach_volume(volume)
|
39
|
+
@volumes_api.update(
|
40
|
+
volumeid: volume.volumeid,
|
41
|
+
linodeid: @machine.id
|
42
|
+
)
|
43
|
+
@logger.info "volume #{volume.label} attached"
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_and_attach_volume(label, size)
|
47
|
+
raise Errors::VolumeSizeMissing unless size.to_i > 0
|
48
|
+
|
49
|
+
@volumes_api.create(
|
50
|
+
label: label,
|
51
|
+
size: size,
|
52
|
+
linodeid: @machine.id
|
53
|
+
)
|
54
|
+
@logger.info "volume #{label} created and attached"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/locales/en.yml
CHANGED
@@ -52,6 +52,7 @@ en:
|
|
52
52
|
kernelid_or_kernel: "Use either kernelid or kernel, not both"
|
53
53
|
imageid_or_image: "Use either imageid or image, not both"
|
54
54
|
distribution_or_image: "Distribution can not be specified with Image options"
|
55
|
+
volumes: "Volumes must be an array of disks"
|
55
56
|
errors:
|
56
57
|
public_key: |-
|
57
58
|
There was an issue reading the public key at:
|
@@ -133,3 +134,5 @@ en:
|
|
133
134
|
Supported distributions can be found at the following url - https://manager.linode.com/stackscripts
|
134
135
|
stackscript_udf_responses: !-
|
135
136
|
The stackscript UDF responses object provided is of the wrong type. It should be a Hash.
|
137
|
+
volume_size_missing: For volumes that need to be created the size has to be specified.
|
138
|
+
volume_label_missing: You must specify a volume label.
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
if ENV['COVERAGE'] != 'false'
|
2
2
|
require 'simplecov'
|
3
3
|
require 'coveralls'
|
4
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
5
5
|
SimpleCov::Formatter::HTMLFormatter,
|
6
6
|
Coveralls::SimpleCov::Formatter
|
7
|
-
]
|
7
|
+
])
|
8
8
|
SimpleCov.start
|
9
9
|
|
10
10
|
# Normally classes are lazily loaded, so any class without a test
|
@@ -17,4 +17,8 @@ if ENV['COVERAGE'] != 'false'
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
require '
|
20
|
+
require 'pry'
|
21
|
+
require 'rspec/its'
|
22
|
+
|
23
|
+
I18n.load_path << 'locales/en.yml'
|
24
|
+
I18n.reload!
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "vagrant-linode/services/volume_manager"
|
2
|
+
|
3
|
+
describe VagrantPlugins::Linode::Services::VolumeManager do
|
4
|
+
subject { described_class.new(machine, client, logger) }
|
5
|
+
let(:provider_config) { double(:config, volumes: [{label: "testvolume", size: 3}]) }
|
6
|
+
let(:machine) { double(:machine, id: 123, name: "test", provider_config: provider_config) }
|
7
|
+
let(:logger) { double(:logger, info: nil) }
|
8
|
+
let(:remote_volumes) { [double(:volume, volumeid: 234, size: 3, label: "test_testvolume")] }
|
9
|
+
let(:client) { double(:api, list: remote_volumes) }
|
10
|
+
|
11
|
+
describe "#perform" do
|
12
|
+
context "when the volume label is not specified" do
|
13
|
+
let(:provider_config) { double(:config, volumes: [{size: 3}]) }
|
14
|
+
it "raises an error" do
|
15
|
+
expect { subject.perform }.to raise_error "You must specify a volume label."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when the remote volume does not exist" do
|
20
|
+
let(:remote_volumes) { [] }
|
21
|
+
it "creates the volume bound to the linode" do
|
22
|
+
expect(client).to receive(:create).with(label: "test_testvolume", size: 3, linodeid: 123)
|
23
|
+
subject.perform
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when the size is not specified" do
|
27
|
+
let(:provider_config) { double(:config, volumes: [{label: "testvolume"}]) }
|
28
|
+
it "raises an error" do
|
29
|
+
expect { subject.perform }.to raise_error "For volumes that need to be created the size has to be specified."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when the remote volume exists" do
|
35
|
+
let(:remote_volumes) { [double(:volume, volumeid: 234, size: 3, label: "test_testvolume")] }
|
36
|
+
it "attaches the volume to the machine" do
|
37
|
+
expect(client).to receive(:update).with(volumeid: 234, linodeid: 123)
|
38
|
+
subject.perform
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/test/Vagrantfile
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
# vi: set ft=ruby :
|
3
3
|
|
4
4
|
Vagrant.configure('2') do |config|
|
5
|
-
|
6
|
-
config.ssh.private_key_path = '
|
5
|
+
config.ssh.username = 'tester'
|
6
|
+
config.ssh.private_key_path = './test_id_rsa'
|
7
7
|
|
8
|
-
|
9
|
-
config.vm.network 'forwarded_port', guest: 8080, host: 80
|
8
|
+
config.vm.synced_folder '.', '/vagrant', disabled: true
|
10
9
|
|
11
10
|
config.vm.provider :linode do |provider, override|
|
12
11
|
override.vm.box = 'linode'
|
12
|
+
override.vm.box_url = 'https://github.com/displague/vagrant-linode/raw/master/box/linode.box'
|
13
13
|
provider.api_key = ENV['LINODE_API_KEY']
|
14
14
|
provider.ssh_key_name = 'Test Key'
|
15
15
|
provider.distribution = 'Debian 8'
|
@@ -17,7 +17,6 @@ Vagrant.configure('2') do |config|
|
|
17
17
|
provider.plan = '2048'
|
18
18
|
provider.label = 'vagrant-'+Time.new.strftime("%F%T").gsub(/[^0-9]/,'')
|
19
19
|
|
20
|
-
|
21
20
|
# Disk Image Sizes (Optional configuration)
|
22
21
|
|
23
22
|
# Main Disk Image Size
|
@@ -40,18 +39,17 @@ Vagrant.configure('2') do |config|
|
|
40
39
|
# provider.private_networking = true
|
41
40
|
end
|
42
41
|
|
43
|
-
|
42
|
+
config.vm.provision :shell, path: 'scripts/provision.sh'
|
44
43
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
config.vm.provision :chef_solo do |chef|
|
45
|
+
chef.cookbooks_path = 'cookbooks'
|
46
|
+
chef.add_recipe 'test'
|
47
|
+
end
|
49
48
|
|
50
49
|
# Linode Specific Configurations
|
51
50
|
config.vm.define :ubuntu do |ubuntu|
|
52
51
|
ubuntu.vm.provider :linode do |provider|
|
53
|
-
provider.distribution = 'Ubuntu
|
54
|
-
config.vm.provision :shell, inline: 'sudo apt-get install -y apache2'
|
52
|
+
provider.distribution = 'Ubuntu 14.04 LTS'
|
55
53
|
|
56
54
|
# Optional Settings
|
57
55
|
provider.label = 'Vagrant-Ubuntu'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-linode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marques Johansson
|
@@ -9,62 +9,62 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-12-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: linodeapi
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 2.0.1
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 2.0.1
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: log4r
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '1.1'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ~>
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '1.1'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rake
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ~>
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '12.0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ~>
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '12.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ~>
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '3.5'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '3.5'
|
70
70
|
description: Enables Vagrant to manage Linode linodes
|
@@ -75,10 +75,10 @@ executables: []
|
|
75
75
|
extensions: []
|
76
76
|
extra_rdoc_files: []
|
77
77
|
files:
|
78
|
-
-
|
79
|
-
-
|
80
|
-
-
|
81
|
-
-
|
78
|
+
- .gitignore
|
79
|
+
- .rspec
|
80
|
+
- .rubocop.yml
|
81
|
+
- .rubocop_todo.yml
|
82
82
|
- CHANGELOG.md
|
83
83
|
- Gemfile
|
84
84
|
- LICENSE.txt
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/vagrant-linode/actions/list_kernels.rb
|
105
105
|
- lib/vagrant-linode/actions/list_plans.rb
|
106
106
|
- lib/vagrant-linode/actions/list_servers.rb
|
107
|
+
- lib/vagrant-linode/actions/list_volumes.rb
|
107
108
|
- lib/vagrant-linode/actions/message_already_active.rb
|
108
109
|
- lib/vagrant-linode/actions/message_already_off.rb
|
109
110
|
- lib/vagrant-linode/actions/message_not_created.rb
|
@@ -119,17 +120,20 @@ files:
|
|
119
120
|
- lib/vagrant-linode/actions/setup_hostname.rb
|
120
121
|
- lib/vagrant-linode/actions/setup_sudo.rb
|
121
122
|
- lib/vagrant-linode/actions/setup_user.rb
|
123
|
+
- lib/vagrant-linode/client_wrapper.rb
|
122
124
|
- lib/vagrant-linode/commands/create_image.rb
|
123
125
|
- lib/vagrant-linode/commands/datacenters.rb
|
124
126
|
- lib/vagrant-linode/commands/distributions.rb
|
125
127
|
- lib/vagrant-linode/commands/images.rb
|
126
128
|
- lib/vagrant-linode/commands/kernels.rb
|
127
129
|
- lib/vagrant-linode/commands/list_images.rb
|
130
|
+
- lib/vagrant-linode/commands/list_volumes.rb
|
128
131
|
- lib/vagrant-linode/commands/networks.rb
|
129
132
|
- lib/vagrant-linode/commands/plans.rb
|
130
133
|
- lib/vagrant-linode/commands/rebuild.rb
|
131
134
|
- lib/vagrant-linode/commands/root.rb
|
132
135
|
- lib/vagrant-linode/commands/servers.rb
|
136
|
+
- lib/vagrant-linode/commands/volumes.rb
|
133
137
|
- lib/vagrant-linode/config.rb
|
134
138
|
- lib/vagrant-linode/errors.rb
|
135
139
|
- lib/vagrant-linode/helpers/client.rb
|
@@ -137,12 +141,14 @@ files:
|
|
137
141
|
- lib/vagrant-linode/helpers/waiter.rb
|
138
142
|
- lib/vagrant-linode/plugin.rb
|
139
143
|
- lib/vagrant-linode/provider.rb
|
144
|
+
- lib/vagrant-linode/services/volume_manager.rb
|
140
145
|
- lib/vagrant-linode/version.rb
|
141
146
|
- locales/en.yml
|
142
147
|
- spec/spec_helper.rb
|
143
148
|
- spec/vagrant-linode/actions/list_distributions_spec.rb
|
144
149
|
- spec/vagrant-linode/actions/list_plans_spec.rb
|
145
150
|
- spec/vagrant-linode/config_spec.rb
|
151
|
+
- spec/vagrant-linode/services/volume_manager_spec.rb
|
146
152
|
- test/Vagrantfile
|
147
153
|
- test/cookbooks/test/recipes/default.rb
|
148
154
|
- test/scripts/provision.sh
|
@@ -160,17 +166,17 @@ require_paths:
|
|
160
166
|
- lib
|
161
167
|
required_ruby_version: !ruby/object:Gem::Requirement
|
162
168
|
requirements:
|
163
|
-
- -
|
169
|
+
- - '>='
|
164
170
|
- !ruby/object:Gem::Version
|
165
171
|
version: '0'
|
166
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
173
|
requirements:
|
168
|
-
- -
|
174
|
+
- - '>='
|
169
175
|
- !ruby/object:Gem::Version
|
170
176
|
version: '0'
|
171
177
|
requirements: []
|
172
178
|
rubyforge_project:
|
173
|
-
rubygems_version: 2.
|
179
|
+
rubygems_version: 2.6.13
|
174
180
|
signing_key:
|
175
181
|
specification_version: 4
|
176
182
|
summary: Enables Vagrant to manage Linode linodes
|
@@ -179,6 +185,7 @@ test_files:
|
|
179
185
|
- spec/vagrant-linode/actions/list_distributions_spec.rb
|
180
186
|
- spec/vagrant-linode/actions/list_plans_spec.rb
|
181
187
|
- spec/vagrant-linode/config_spec.rb
|
188
|
+
- spec/vagrant-linode/services/volume_manager_spec.rb
|
182
189
|
- test/Vagrantfile
|
183
190
|
- test/cookbooks/test/recipes/default.rb
|
184
191
|
- test/scripts/provision.sh
|