vagrant-linode 0.1.3 → 0.2.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.
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,48 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module Linode
5
+ module Actions
6
+ # This action reads the SSH info for the machine and puts it into the
7
+ # `:machine_ssh_info` key in the environment.
8
+ class ReadSSHInfo
9
+ def initialize(app, _env)
10
+ @env = _env
11
+ @app = app
12
+ @machine = _env[:machine]
13
+ @logger = Log4r::Logger.new('vagrant_linode::action::read_ssh_info')
14
+ end
15
+
16
+ def call(env)
17
+ env[:machine_ssh_info] = read_ssh_info(env[:linode_api], @machine)
18
+
19
+ @app.call(env)
20
+ end
21
+
22
+ def read_ssh_info(_linode, machine)
23
+ return nil if machine.id.nil?
24
+ server = Provider.linode(machine, refresh: true)
25
+ @env[:ui].info "Machine State ID: %s" % [machine.state.id]
26
+
27
+ #return nil if machine.state.id != :active # @todo this seems redundant to the next line. may be more correct.
28
+ if server.nil?
29
+ # The machine can't be found
30
+ @logger.info("Machine couldn't be found, assuming it got destroyed.")
31
+ machine.id = nil
32
+ return nil
33
+ end
34
+
35
+ public_network = server.network.find { |network| network['ispublic'] == 1 }
36
+ @env[:ui].info "IP Address: %s" % public_network['ipaddress']
37
+
38
+ {
39
+ host: public_network['ipaddress'],
40
+ port: '22',
41
+ username: 'root',
42
+ private_key_path: machine.config.ssh.private_key_path
43
+ }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Actions
4
+ class ReadState
5
+ def initialize(app, env)
6
+ @app = app
7
+ @machine = env[:machine]
8
+ @logger = Log4r::Logger.new('vagrant_linode::action::read_state')
9
+ end
10
+
11
+ def call(env)
12
+ env[:machine_state] = read_state(env[:linode_api], @machine)
13
+ @logger.info "Machine state is '#{env[:machine_state]}'"
14
+ @app.call(env)
15
+ end
16
+
17
+ def read_state(_linode, machine)
18
+ return :not_created if machine.id.nil?
19
+ server = Provider.linode(machine)
20
+
21
+ return :not_created if server.nil?
22
+ status = server.status
23
+ return :not_created if status.nil?
24
+ states = {
25
+ '' => :not_created,
26
+ '-2' => :boot_failed,
27
+ '-1' => :being_created,
28
+ '0' => :brand_new,
29
+ '1' => :active, # running
30
+ '2' => :off, # powered off
31
+ '3' => :shutting_down
32
+ }
33
+ states[status.to_s]
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,20 +1,21 @@
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 Rebuild
7
- include Helpers::Client
8
8
  include Vagrant::Util::Retryable
9
+ include Helpers::Waiter
9
10
 
10
11
  def initialize(app, env)
11
12
  @app = app
12
13
  @machine = env[:machine]
13
- @client = client
14
14
  @logger = Log4r::Logger.new('vagrant::linode::rebuild')
15
15
  end
16
16
 
17
17
  def call(env)
18
+ @client = env[:linode_api]
18
19
  # @todo find a convenient way to send provider_config back to the create action, reusing the diskid or configid
19
20
  fail 'not implemented'
20
21
  # look up image id
@@ -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 Reload
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::reload')
14
14
  end
15
15
 
16
16
  def call(env)
17
+ @client = env[:linode_api]
17
18
  # submit reboot linode request
18
19
  result = @client.linode.reboot(linodeid: @machine.id)
19
20
 
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class CreateImage < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode images create [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('create_image')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class Datacenters < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode datacenters [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('list_datacenters')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class Distributions < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode distributions [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('list_distributions')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,59 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class Images < 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_images', __FILE__)
11
+ ListImages
12
+ end
13
+ @subcommands.register(:create) do
14
+ require File.expand_path('../create_image', __FILE__)
15
+ CreateImage
16
+ end
17
+
18
+ super(argv, env)
19
+ end
20
+
21
+ def execute
22
+ if @main_args.include?('-h') || @main_args.include?('--help')
23
+ # Print the help for all the rackspace commands.
24
+ return help
25
+ end
26
+
27
+ command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
28
+ return help if !command_class || !@sub_command
29
+ @logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
30
+
31
+ # Initialize and execute the command class
32
+ command_class.new(@sub_args, @env).execute
33
+ end
34
+
35
+ def help
36
+ opts = OptionParser.new do |opts|
37
+ opts.banner = 'Usage: vagrant linode images <subcommand> [<args>]'
38
+ opts.separator ''
39
+ opts.separator 'Available subcommands:'
40
+
41
+ # Add the available subcommands as separators in order to print them
42
+ # out as well.
43
+ keys = []
44
+ @subcommands.each { |key, _value| keys << key.to_s }
45
+
46
+ keys.sort.each do |key|
47
+ opts.separator " #{key}"
48
+ end
49
+
50
+ opts.separator ''
51
+ opts.separator 'For help on any individual subcommand run `vagrant linode images <subcommand> -h`'
52
+ end
53
+
54
+ @env.ui.info(opts.help, prefix: false)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class ListImages < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode images list [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('list_images')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class Networks < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode networks [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('list_networks')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class Plans < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode plans [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('list_plans')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,81 @@
1
+ require 'vagrant-linode/actions'
2
+
3
+ module VagrantPlugins
4
+ module Linode
5
+ module Commands
6
+ class Root < Vagrant.plugin('2', :command)
7
+ def self.synopsis
8
+ 'query Linode for available images or plans'
9
+ end
10
+
11
+ def initialize(argv, env)
12
+ @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
13
+
14
+ @subcommands = Vagrant::Registry.new
15
+ @subcommands.register(:images) do
16
+ require File.expand_path('../images', __FILE__)
17
+ Images
18
+ end
19
+ @subcommands.register(:plans) do
20
+ require File.expand_path('../plans', __FILE__)
21
+ Plans
22
+ end
23
+ @subcommands.register(:distributions) do
24
+ require File.expand_path('../distributions', __FILE__)
25
+ Distributions
26
+ end
27
+ @subcommands.register(:datacenters) do
28
+ require File.expand_path('../datacenters', __FILE__)
29
+ Datacenters
30
+ end
31
+ @subcommands.register(:networks) do
32
+ require File.expand_path('../networks', __FILE__)
33
+ Networks
34
+ end
35
+ @subcommands.register(:servers) do
36
+ require File.expand_path('../servers', __FILE__)
37
+ Servers
38
+ end
39
+
40
+ super(argv, env)
41
+ end
42
+
43
+ def execute
44
+ if @main_args.include?('-h') || @main_args.include?('--help')
45
+ # Print the help for all the linode commands.
46
+ return help
47
+ end
48
+
49
+ command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
50
+ return help if !command_class || !@sub_command
51
+ @logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
52
+
53
+ # Initialize and execute the command class
54
+ command_class.new(@sub_args, @env).execute
55
+ end
56
+
57
+ def help
58
+ opts = OptionParser.new do |opts|
59
+ opts.banner = 'Usage: vagrant linode <subcommand> [<args>]'
60
+ opts.separator ''
61
+ opts.separator 'Available subcommands:'
62
+
63
+ # Add the available subcommands as separators in order to print them
64
+ # out as well.
65
+ keys = []
66
+ @subcommands.each { |key, _value| keys << key.to_s }
67
+
68
+ keys.sort.each do |key|
69
+ opts.separator " #{key}"
70
+ end
71
+
72
+ opts.separator ''
73
+ opts.separator 'For help on any individual subcommand run `vagrant linode <subcommand> -h`'
74
+ end
75
+
76
+ @env.ui.info(opts.help, prefix: false)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Linode
3
+ module Commands
4
+ class Servers < Vagrant.plugin('2', :command)
5
+ def execute
6
+ options = {}
7
+ opts = OptionParser.new do |o|
8
+ o.banner = 'Usage: vagrant linode servers [options]'
9
+ end
10
+
11
+ argv = parse_options(opts)
12
+ return unless argv
13
+
14
+ with_target_vms(argv, provider: :linode) do |machine|
15
+ machine.action('list_servers')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,7 +1,8 @@
1
1
  module VagrantPlugins
2
2
  module Linode
3
3
  class Config < Vagrant.plugin('2', :config)
4
- attr_accessor :token
4
+ attr_accessor :token # deprecated
5
+ attr_accessor :api_key
5
6
  attr_accessor :api_url
6
7
  attr_accessor :distribution
7
8
  attr_accessor :datacenter
@@ -21,7 +22,10 @@ module VagrantPlugins
21
22
  alias_method :setup?, :setup
22
23
 
23
24
  def initialize
25
+ # @logger = Log4r::Logger.new('vagrant::linode::config')
26
+
24
27
  @token = UNSET_VALUE
28
+ @api_key = UNSET_VALUE
25
29
  @api_url = UNSET_VALUE
26
30
  @distribution = UNSET_VALUE
27
31
  @datacenter = UNSET_VALUE
@@ -40,7 +44,9 @@ module VagrantPlugins
40
44
  end
41
45
 
42
46
  def finalize!
47
+ @api_key = ENV['LINODE_API_KEY'] if @api_key == UNSET_VALUE
43
48
  @token = ENV['LINODE_TOKEN'] if @token == UNSET_VALUE
49
+ @api_key = @token if ((@api_key == nil) and (@token != nil))
44
50
  @api_url = ENV['LINODE_URL'] if @api_url == UNSET_VALUE
45
51
  @distribution = 'Ubuntu 14.04 LTS' if @distribution == UNSET_VALUE
46
52
  @datacenter = 'dallas' if @datacenter == UNSET_VALUE
@@ -59,8 +65,10 @@ module VagrantPlugins
59
65
 
60
66
  def validate(machine)
61
67
  errors = []
62
- errors << I18n.t('vagrant_linode.config.token') unless @token
63
-
68
+ errors << I18n.t('vagrant_linode.config.api_key') unless @api_key
69
+ # Log4r::Logger.new('vagrant_linode.config.token') if @token
70
+ # env[:ui].info I18n.t('vagrant_linode.config.token') if @token
71
+ # errors << I18n.t('vagrant_linode.config.token') if @token
64
72
  key = machine.config.ssh.private_key_path
65
73
  key = key[0] if key.is_a?(Array)
66
74
  if !key