vagrant-linode 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rspec +4 -0
  4. data/.rubocop.yml +1 -0
  5. data/.rubocop_todo.yml +164 -0
  6. data/Gemfile +9 -6
  7. data/README.md +21 -9
  8. data/Rakefile +21 -1
  9. data/Vagrantfile.multi +18 -0
  10. data/box/linode-debian-7.5.box +0 -0
  11. data/box/linode.box +0 -0
  12. data/box/metadata-debian-7.5.json +12 -0
  13. data/box/metadata.json +2 -2
  14. data/features/provision.feature +34 -0
  15. data/features/steps/sdk_steps.rb +13 -0
  16. data/features/steps/server_steps.rb +25 -0
  17. data/features/support/env.rb +34 -0
  18. data/features/support/fog_mock.rb +16 -0
  19. data/features/vagrant-linode.feature +68 -0
  20. data/lib/vagrant-linode.rb +44 -5
  21. data/lib/vagrant-linode/actions.rb +201 -87
  22. data/lib/vagrant-linode/actions/connect_linode.rb +36 -0
  23. data/lib/vagrant-linode/actions/create.rb +9 -9
  24. data/lib/vagrant-linode/actions/create_image.rb +23 -0
  25. data/lib/vagrant-linode/actions/destroy.rb +1 -3
  26. data/lib/vagrant-linode/actions/halt.rb +29 -0
  27. data/lib/vagrant-linode/actions/is_created.rb +16 -0
  28. data/lib/vagrant-linode/actions/is_stopped.rb +17 -0
  29. data/lib/vagrant-linode/actions/list_datacenters.rb +20 -0
  30. data/lib/vagrant-linode/actions/list_distributions.rb +20 -0
  31. data/lib/vagrant-linode/actions/list_images.rb +20 -0
  32. data/lib/vagrant-linode/actions/list_plans.rb +20 -0
  33. data/lib/vagrant-linode/actions/list_servers.rb +20 -0
  34. data/lib/vagrant-linode/actions/message_already_active.rb +16 -0
  35. data/lib/vagrant-linode/actions/message_already_off.rb +16 -0
  36. data/lib/vagrant-linode/actions/message_not_created.rb +16 -0
  37. data/lib/vagrant-linode/actions/message_off.rb +16 -0
  38. data/lib/vagrant-linode/actions/power_off.rb +4 -3
  39. data/lib/vagrant-linode/actions/power_on.rb +3 -2
  40. data/lib/vagrant-linode/actions/read_ssh_info.rb +48 -0
  41. data/lib/vagrant-linode/actions/read_state.rb +38 -0
  42. data/lib/vagrant-linode/actions/rebuild.rb +3 -2
  43. data/lib/vagrant-linode/actions/reload.rb +3 -2
  44. data/lib/vagrant-linode/commands/create_image.rb +21 -0
  45. data/lib/vagrant-linode/commands/datacenters.rb +21 -0
  46. data/lib/vagrant-linode/commands/distributions.rb +21 -0
  47. data/lib/vagrant-linode/commands/images.rb +59 -0
  48. data/lib/vagrant-linode/commands/list_images.rb +21 -0
  49. data/lib/vagrant-linode/commands/networks.rb +21 -0
  50. data/lib/vagrant-linode/commands/plans.rb +21 -0
  51. data/lib/vagrant-linode/commands/root.rb +81 -0
  52. data/lib/vagrant-linode/commands/servers.rb +21 -0
  53. data/lib/vagrant-linode/config.rb +11 -3
  54. data/lib/vagrant-linode/helpers/client.rb +21 -79
  55. data/lib/vagrant-linode/helpers/waiter.rb +21 -0
  56. data/lib/vagrant-linode/plugin.rb +20 -0
  57. data/lib/vagrant-linode/provider.rb +27 -32
  58. data/lib/vagrant-linode/version.rb +1 -1
  59. data/locales/en.yml +17 -1
  60. data/spec/spec_helper.rb +20 -0
  61. data/spec/vagrant-linode/actions/list_distributions_spec.rb +47 -0
  62. data/spec/vagrant-linode/actions/list_plans_spec.rb +47 -0
  63. data/spec/vagrant-linode/config_spec.rb +189 -0
  64. data/test/Vagrantfile +4 -9
  65. data/vagrant-linode.gemspec +1 -1
  66. metadata +70 -20
  67. data/lib/vagrant-linode/actions/check_state.rb +0 -19
  68. data/lib/vagrant-linode/actions/setup_key.rb +0 -52
@@ -0,0 +1,36 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module Linode
5
+ module Actions
6
+ # This action connects to Linode, verifies credentials work, and
7
+ # puts the Linode connection object into the `:linode_api` key
8
+ # in the environment.
9
+ class ConnectLinode
10
+ def initialize(app, _env)
11
+ @app = app
12
+ @logger = Log4r::Logger.new('vagrant_linode::action::connect_linode')
13
+ end
14
+
15
+ def call(env)
16
+ # Get the configs
17
+ config = env[:machine].provider_config
18
+ api_key = config.api_key
19
+ api_url = config.api_url
20
+
21
+ params = {
22
+ apikey: api_key,
23
+ endpoint: api_url
24
+ }
25
+
26
+ @logger.info('Connecting to Linode api_url...')
27
+
28
+ linode = ::LinodeAPI::Raw.new params
29
+ env[:linode_api] = linode
30
+
31
+ @app.call(env)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,24 +1,24 @@
1
1
  require 'vagrant-linode/helpers/client'
2
+ require 'vagrant-linode/helpers/waiter'
2
3
  require 'vagrant-linode/errors'
3
4
 
4
5
  module VagrantPlugins
5
6
  module Linode
6
7
  module Actions
7
8
  class Create
8
- include Helpers::Client
9
9
  include Vagrant::Util::Retryable
10
+ include VagrantPlugins::Linode::Helpers::Waiter
10
11
 
11
12
  def initialize(app, env)
12
13
  @app = app
13
14
  @machine = env[:machine]
14
- @client = client
15
15
  @logger = Log4r::Logger.new('vagrant::linode::create')
16
16
  end
17
17
 
18
18
  def call(env)
19
+ @client = env[:linode_api]
19
20
  ssh_key_id = env[:machine].config.ssh.private_key_path
20
21
  ssh_key_id = ssh_key_id[0] if ssh_key_id.is_a?(Array)
21
-
22
22
  if ssh_key_id
23
23
  pubkey = File.read(File.expand_path("#{ssh_key_id}.pub"))
24
24
  end
@@ -32,7 +32,7 @@ module VagrantPlugins
32
32
  if @machine.provider_config.distribution
33
33
  distributions = @client.avail.distributions
34
34
  distribution = distributions.find { |d| d.label.downcase.include? @machine.provider_config.distribution.downcase }
35
- raise( Errors::DistroMatch, distro: @machine.provider_config.distribution.to_s ) if distribution == nil
35
+ fail(Errors::DistroMatch, distro: @machine.provider_config.distribution.to_s) if distribution.nil?
36
36
  distribution_id = distribution.distributionid || nil
37
37
  else
38
38
  distribution_id = @machine.provider_config.distributionid
@@ -58,8 +58,8 @@ module VagrantPlugins
58
58
  if @machine.provider_config.plan
59
59
  plans = @client.avail.linodeplans
60
60
  plan = plans.find { |p| p.label.include? @machine.provider_config.plan }
61
- raise Errors::PlanID, plan: @machine.provider_config.plan if plan == nil
62
- plan_id = plan.planid || nil
61
+ fail Errors::PlanID, plan: @machine.provider_config.plan if plan.nil?
62
+ plan_id = plan.planid || nil
63
63
  else
64
64
  plan_id = @machine.provider_config.planid
65
65
  end
@@ -69,14 +69,14 @@ module VagrantPlugins
69
69
 
70
70
  # Sanity checks for disk size
71
71
  if xvda_size != true
72
- disk_sanity = false if ( xvda_size.to_i + swap_size.to_i ) > ( plan['disk'].to_i * 1024 )
72
+ disk_sanity = false if ( xvda_size.to_i + swap_size.to_i) > ( plan['disk'].to_i * 1024)
73
73
  end
74
74
 
75
75
  # throw if disk sizes are too large
76
76
  if xvda_size == true
77
- xvda_size = ( ( plan['disk'].to_i * 1024 ) - swap_size.to_i )
77
+ xvda_size = ( ( plan['disk'].to_i * 1024) - swap_size.to_i)
78
78
  elsif disk_sanity == false
79
- raise Errors::DiskSize, current: (xvda_size.to_i + swap_size.to_i), max: ( plan['disk'].to_i * 1024 )
79
+ fail Errors::DiskSize, current: (xvda_size.to_i + swap_size.to_i), max: ( plan['disk'].to_i * 1024)
80
80
  end
81
81
 
82
82
  env[:ui].info I18n.t('vagrant_linode.info.creating')
@@ -0,0 +1,23 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class CreateImage
5
+ def initialize(app, _env)
6
+ @app = app
7
+ @machine = _env[:machine]
8
+ end
9
+
10
+ def call(env)
11
+ linode_api = env[:linode_api]
12
+ env[:ui].info ('%-36s %-36s %-10s %-10s' % ['Image ID', 'Disk Label', 'Disk ID', 'Job ID'])
13
+ linode_api.linode.disk.list(:linodeid => @machine.id).each do |disk|
14
+ next if disk.type == 'swap'
15
+ img = linode_api.linode.disk.imagize :linodeid => disk.linodeid, :diskid => disk.diskid, :description => 'Imagized with Vagrant'
16
+ env[:ui].info ('%-36s %-36s %-10s %-10s' % [img.imageid, disk.label, disk.diskid, img.jobid])
17
+ end
18
+ @app.call(env)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,16 +4,14 @@ module VagrantPlugins
4
4
  module Linode
5
5
  module Actions
6
6
  class Destroy
7
- include Helpers::Client
8
-
9
7
  def initialize(app, env)
10
8
  @app = app
11
9
  @machine = env[:machine]
12
- @client = client
13
10
  @logger = Log4r::Logger.new('vagrant::linode::destroy')
14
11
  end
15
12
 
16
13
  def call(env)
14
+ @client = env[:linode_api]
17
15
  # submit destroy linode request
18
16
  @client.linode.delete(linodeid: @machine.id, skipchecks: true)
19
17
 
@@ -0,0 +1,29 @@
1
+ require 'vagrant-linode/helpers/client'
2
+ require 'vagrant-linode/helpers/waiter'
3
+
4
+ module VagrantPlugins
5
+ module Linode
6
+ module Actions
7
+
8
+ class Reload
9
+ include Helpers::Waiter
10
+ def initialize(app, env)
11
+ @app = app
12
+ @machine = env[:machine]
13
+ @logger = Log4r::Logger.new('vagrant::linode::reload')
14
+ end
15
+
16
+ def call(env)
17
+ @client = env[:linode_api]
18
+ # submit reboot linode request
19
+ result = @client.linode.reboot(linodeid: @machine.id)
20
+
21
+ # wait for request to complete
22
+ env[:ui].info I18n.t('vagrant_linode.info.reloading')
23
+ wait_for_event(env, result['jobid'])
24
+ @app.call(env)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class IsCreated
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:result] = env[:machine].state.id != :not_created
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class IsStopped
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:result] = env[:machine].state.id == :off
11
+
12
+ @app.call(env)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class ListDatacenters
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ linode_api = env[:linode_api]
11
+ env[:ui].info ('%-15s %-36s %s' % ['Datacenter ID', 'Location', 'Abbr'])
12
+ linode_api.avail.datacenters.sort_by(&:datacenterid).each do |dc|
13
+ env[:ui].info ('%-15s %-36s %s' % [dc.datacenterid, dc.location, dc.abbr])
14
+ end
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class ListDistributions
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ linode_api = env[:linode_api]
11
+ env[:ui].info ('%-4s %-6s %s' % ['ID', 'Size', 'Distribution Name'])
12
+ linode_api.avail.distributions.sort_by(&:distributionid).each do |dist|
13
+ env[:ui].info ('%-4s %-6s %s' % [dist.distributionid, dist.minimagesize, dist.label])
14
+ end
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class ListImages
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ linode_api = env[:linode_api]
11
+ env[:ui].info ('%-10s %-22s %-10s %s' % ['Image ID', 'Created', 'Size (MB)', 'Image Label'])
12
+ linode_api.image.list.sort_by(&:imageid).each do |img|
13
+ env[:ui].info ('%-10s %-22s %-10s %s' % [img.imageid, img.create_dt, img.minsize, img.label])
14
+ end
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class ListPlans
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ linode_api = env[:linode_api]
11
+ env[:ui].info ('%-36s %s' % ['Plan ID', 'Plan Name'])
12
+ linode_api.avail.linodeplans.sort_by(&:planid).each do |plan|
13
+ env[:ui].info ('%-36s %s' % [plan.planid, plan.label])
14
+ end
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class ListServers
5
+ def initialize(app, _env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ linode_api = env[:linode_api]
11
+ env[:ui].info ('%-8s %-30s %-20s %-10s %-9s' % ['LinodeID', 'Label', 'DataCenter', 'Plan', 'Status'])
12
+ linode_api.linode.list.sort_by(&:imageid).each do |ln|
13
+ env[:ui].info ('%-8s %-30s %-20s %-10s %-9s' % [ln.linodeid, ln.label, ln.datacenterid, ln.planid, ln.status])
14
+ end
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class MessageAlreadyActive
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_linode.info.already_active", :status => :active))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class MessageAlreadyOff
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_linode.info.already_off", :status => :off))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class MessageNotCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_linode.info.not_created", :status => :not_created))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class MessageOff
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_linode.info.off", :status => :off))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,19 +1,20 @@
1
1
  require 'vagrant-linode/helpers/client'
2
+ require 'vagrant-linode/helpers/waiter'
2
3
  # TODO: --force
3
4
  module VagrantPlugins
4
5
  module Linode
5
6
  module Actions
6
- class PowerOff
7
- include Helpers::Client
8
7
 
8
+ class PowerOff
9
+ include Helpers::Waiter
9
10
  def initialize(app, env)
10
11
  @app = app
11
12
  @machine = env[:machine]
12
- @client = client
13
13
  @logger = Log4r::Logger.new('vagrant::linode::power_off')
14
14
  end
15
15
 
16
16
  def call(env)
17
+ @client = env[:linode_api]
17
18
  # submit power off linode request
18
19
  result = @client.linode.shutdown(linodeid: @machine.id)
19
20
 
@@ -1,19 +1,20 @@
1
1
  require 'vagrant-linode/helpers/client'
2
+ require 'vagrant-linode/helpers/waiter'
2
3
 
3
4
  module VagrantPlugins
4
5
  module Linode
5
6
  module Actions
6
7
  class PowerOn
7
- include Helpers::Client
8
+ include Helpers::Waiter
8
9
 
9
10
  def initialize(app, env)
10
11
  @app = app
11
12
  @machine = env[:machine]
12
- @client = client
13
13
  @logger = Log4r::Logger.new('vagrant::linode::power_on')
14
14
  end
15
15
 
16
16
  def call(env)
17
+ @client = env[:linode_api]
17
18
  # submit power on linode request
18
19
  result = @client.linode.boot(linodeid: @machine.id)
19
20