vagrant-rimu 0.0.1 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +3 -2
  3. data/.gitignore +2 -0
  4. data/.travis.yml +5 -35
  5. data/Gemfile +4 -2
  6. data/README.md +12 -3
  7. data/Rakefile +6 -3
  8. data/Vagrantfile +12 -3
  9. data/gemfiles/vagrant_1.5.gemfile +3 -1
  10. data/gemfiles/vagrant_1.6.gemfile +5 -3
  11. data/gemfiles/vagrant_1.7.gemfile +10 -8
  12. data/lib/vagrant-rimu.rb +10 -0
  13. data/lib/vagrant-rimu/actions.rb +117 -89
  14. data/lib/vagrant-rimu/actions/abstract_action.rb +20 -0
  15. data/lib/vagrant-rimu/actions/billing_methods.rb +13 -7
  16. data/lib/vagrant-rimu/actions/connect_to_rimu.rb +12 -6
  17. data/lib/vagrant-rimu/actions/create.rb +25 -6
  18. data/lib/vagrant-rimu/actions/is_created.rb +4 -2
  19. data/lib/vagrant-rimu/actions/is_stopped.rb +5 -3
  20. data/lib/vagrant-rimu/actions/list_distributions.rb +13 -7
  21. data/lib/vagrant-rimu/actions/list_servers.rb +13 -7
  22. data/lib/vagrant-rimu/actions/message_action_not_supported.rb +19 -0
  23. data/lib/vagrant-rimu/actions/message_already_created.rb +4 -2
  24. data/lib/vagrant-rimu/actions/message_already_off.rb +4 -2
  25. data/lib/vagrant-rimu/actions/message_not_created.rb +4 -2
  26. data/lib/vagrant-rimu/actions/message_will_not_destroy.rb +4 -2
  27. data/lib/vagrant-rimu/actions/message_will_not_stop.rb +19 -0
  28. data/lib/vagrant-rimu/actions/modify_provision_path.rb +5 -3
  29. data/lib/vagrant-rimu/actions/move.rb +32 -5
  30. data/lib/vagrant-rimu/actions/read_ssh_info.rb +10 -7
  31. data/lib/vagrant-rimu/actions/read_state.rb +14 -6
  32. data/lib/vagrant-rimu/actions/rebuild.rb +34 -6
  33. data/lib/vagrant-rimu/actions/reload.rb +11 -4
  34. data/lib/vagrant-rimu/actions/setup_sudo.rb +15 -8
  35. data/lib/vagrant-rimu/actions/setup_user.rb +45 -25
  36. data/lib/vagrant-rimu/actions/ssh_utils.rb +44 -0
  37. data/lib/vagrant-rimu/actions/start_instance.rb +6 -4
  38. data/lib/vagrant-rimu/actions/stop_instance.rb +18 -7
  39. data/lib/vagrant-rimu/actions/terminate_instance.rb +12 -6
  40. data/lib/vagrant-rimu/commands/abstract_command.rb +47 -0
  41. data/lib/vagrant-rimu/commands/billing_methods.rb +10 -10
  42. data/lib/vagrant-rimu/commands/distributions.rb +10 -10
  43. data/lib/vagrant-rimu/commands/list_servers.rb +10 -10
  44. data/lib/vagrant-rimu/commands/move.rb +10 -10
  45. data/lib/vagrant-rimu/commands/rebuild.rb +5 -7
  46. data/lib/vagrant-rimu/commands/rimu_command.rb +13 -0
  47. data/lib/vagrant-rimu/commands/root.rb +26 -43
  48. data/lib/vagrant-rimu/commands/utils.rb +22 -0
  49. data/lib/vagrant-rimu/config.rb +5 -2
  50. data/lib/vagrant-rimu/errors.rb +6 -0
  51. data/lib/vagrant-rimu/logging.rb +28 -0
  52. data/lib/vagrant-rimu/plugin.rb +11 -37
  53. data/lib/vagrant-rimu/provider.rb +4 -2
  54. data/lib/vagrant-rimu/version.rb +1 -1
  55. data/locales/en.yml +70 -19
  56. data/spec/spec_helper.rb +13 -6
  57. data/spec/vagrant-rimu/actions/billing_methods_spec.rb +49 -0
  58. data/spec/vagrant-rimu/actions/connect_to_rimu_spec.rb +2 -1
  59. data/spec/vagrant-rimu/actions/create_spec.rb +167 -0
  60. data/spec/vagrant-rimu/actions/is_created_spec.rb +49 -0
  61. data/spec/vagrant-rimu/actions/is_stopped_spec.rb +49 -0
  62. data/spec/vagrant-rimu/actions/list_distributions_spec.rb +49 -0
  63. data/spec/vagrant-rimu/actions/list_servers_spec.rb +51 -0
  64. data/spec/vagrant-rimu/actions/message_action_not_supported_spec.rb +30 -0
  65. data/spec/vagrant-rimu/actions/message_already_created_spec.rb +1 -4
  66. data/spec/vagrant-rimu/actions/message_will_not_destroy_spec.rb +1 -2
  67. data/spec/vagrant-rimu/actions/message_will_not_stop_spec.rb +35 -0
  68. data/spec/vagrant-rimu/actions/modify_provision_path_spec.rb +2 -7
  69. data/spec/vagrant-rimu/actions/move_spec.rb +75 -0
  70. data/spec/vagrant-rimu/actions/read_ssh_info_spec.rb +21 -0
  71. data/spec/vagrant-rimu/actions/rebuild_spec.rb +7 -1
  72. data/spec/vagrant-rimu/actions/stop_instance_spec.rb +4 -4
  73. data/spec/vagrant-rimu/commands/billing_methods_spec.rb +17 -0
  74. data/spec/vagrant-rimu/commands/distributions_spec.rb +17 -0
  75. data/spec/vagrant-rimu/commands/list_servers_spec.rb +17 -0
  76. data/spec/vagrant-rimu/commands/move_spec.rb +17 -0
  77. data/spec/vagrant-rimu/commands/rebuild_spec.rb +20 -0
  78. data/spec/vagrant-rimu/config_spec.rb +1 -1
  79. data/test/Vagrantfile +4 -2
  80. data/vagrant-rimu.gemspec +5 -1
  81. metadata +81 -27
@@ -1,21 +1,27 @@
1
1
  require 'log4r'
2
2
 
3
+ require 'vagrant-rimu/actions/abstract_action'
4
+
3
5
  module VagrantPlugins
4
6
  module Rimu
5
7
  module Actions
6
8
  # This terminates the running server, if there is one.
7
- class TerminateInstance
8
- def initialize(app, env)
9
+ class TerminateInstance < AbstractAction
10
+ def initialize(app, _env)
9
11
  @app = app
10
- @client = env[:rimu_api]
11
12
  @logger = Log4r::Logger.new("vagrant_rimu::action::terminate_instance")
12
13
  end
13
14
 
14
- def call(env)
15
+ def execute(env)
15
16
  if env[:machine].id
16
17
  env[:ui].info(I18n.t("vagrant_rimu.terminating"))
17
- @client.servers.cancel(env[:machine].id.to_i)
18
- env[:machine].id = nil
18
+ client = env[:rimu_api]
19
+ begin
20
+ client.servers.cancel(env[:machine].id.to_i)
21
+ env[:machine].id = nil
22
+ rescue ::Rimu::RimuAPI::RimuRequestError, ::Rimu::RimuAPI::RimuResponseError => e
23
+ raise Errors::ApiError, {:stderr=>e}
24
+ end
19
25
  end
20
26
 
21
27
  @app.call(env)
@@ -0,0 +1,47 @@
1
+ require 'colorize'
2
+
3
+ module VagrantPlugins
4
+ module Rimu
5
+ module Commands
6
+ class AbstractCommand < Vagrant.plugin('2', :command)
7
+ def initialize(argv, env)
8
+ @env = env
9
+ super(normalize_args(argv), env)
10
+ end
11
+
12
+ def execute(name)
13
+ env = {}
14
+ with_target_vms(nil, provider: :rimu) do |machine|
15
+ env[:machine] = machine
16
+ env[:ui] = @env.ui
17
+ end
18
+
19
+ before_cmd(name, @argv, env)
20
+
21
+ cmd(name, @argv, env)
22
+ @env.ui.info('')
23
+ # rubocop:disable Lint/RescueException
24
+ rescue Errors::RimuError, SystemExit, Interrupt => e
25
+ raise e
26
+ rescue Exception => e
27
+ puts I18n.t('vagrant_rimu.errors.global_error').red unless e.message
28
+ raise e
29
+ end
30
+ # rubocop:enable Lint/RescueException
31
+
32
+ def normalize_args(args)
33
+ return args if args.nil?
34
+ args.pop if args.size > 0 && args.last == '--'
35
+ args
36
+ end
37
+
38
+ def before_cmd(_name, _argv, _env)
39
+ end
40
+
41
+ def cmd(_name, _argv, _env)
42
+ fail 'Command not implemented. \'cmd\' method must be overridden in all subclasses'
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,16 +1,16 @@
1
+ require 'vagrant-rimu/commands/rimu_command'
2
+
1
3
  module VagrantPlugins
2
4
  module Rimu
3
5
  module Commands
4
- class BillingMethods < Vagrant.plugin('2', :command)
5
- def execute
6
- opts = OptionParser.new do |o|
7
- o.banner = 'Usage: vagrant rimu billing_methods [options]'
8
- end
9
- argv = parse_options(opts)
10
- return unless argv
11
- with_target_vms(argv, provider: :rimu) do |machine|
12
- machine.action('billing_methods')
13
- end
6
+ class BillingMethods < RimuCommand
7
+ def self.synopsis
8
+ I18n.t('vagrant_rimu.commands.billing_methods')
9
+ end
10
+
11
+ def cmd(name, argv, env)
12
+ fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
13
+ env[:machine].action('billing_methods')
14
14
  end
15
15
  end
16
16
  end
@@ -1,16 +1,16 @@
1
+ require 'vagrant-rimu/commands/rimu_command'
2
+
1
3
  module VagrantPlugins
2
4
  module Rimu
3
5
  module Commands
4
- class Distributions < Vagrant.plugin('2', :command)
5
- def execute
6
- opts = OptionParser.new do |o|
7
- o.banner = 'Usage: vagrant rimu distributions [options]'
8
- end
9
- argv = parse_options(opts)
10
- return unless argv
11
- with_target_vms(argv, provider: :rimu) do |machine|
12
- machine.action('list_distributions')
13
- end
6
+ class Distributions < RimuCommand
7
+ def self.synopsis
8
+ I18n.t('vagrant_rimu.commands.list_distributions')
9
+ end
10
+
11
+ def cmd(name, argv, env)
12
+ fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
13
+ env[:machine].action('list_distributions')
14
14
  end
15
15
  end
16
16
  end
@@ -1,16 +1,16 @@
1
+ require 'vagrant-rimu/commands/rimu_command'
2
+
1
3
  module VagrantPlugins
2
4
  module Rimu
3
5
  module Commands
4
- class ListServers < Vagrant.plugin('2', :command)
5
- def execute
6
- opts = OptionParser.new do |o|
7
- o.banner = 'Usage: vagrant rimu servers [options]'
8
- end
9
- argv = parse_options(opts)
10
- return unless argv
11
- with_target_vms(argv, provider: :rimu) do |machine|
12
- machine.action('list_servers')
13
- end
6
+ class ListServers < RimuCommand
7
+ def self.synopsis
8
+ I18n.t('vagrant_rimu.commands.list_servers')
9
+ end
10
+
11
+ def cmd(name, argv, env)
12
+ fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
13
+ env[:machine].action('list_servers')
14
14
  end
15
15
  end
16
16
  end
@@ -1,16 +1,16 @@
1
+ require 'vagrant-rimu/commands/abstract_command'
2
+
1
3
  module VagrantPlugins
2
4
  module Rimu
3
5
  module Commands
4
- class Move < Vagrant.plugin('2', :command)
5
- def execute
6
- opts = OptionParser.new do |o|
7
- o.banner = 'Usage: vagrant rimu move [options]'
8
- end
9
- argv = parse_options(opts)
10
- return unless argv
11
- with_target_vms(argv, provider: :rimu) do |machine|
12
- machine.action('move')
13
- end
6
+ class Move < AbstractCommand
7
+ def self.synopsis
8
+ I18n.t('vagrant_rimu.commands.move')
9
+ end
10
+
11
+ def cmd(name, argv, env)
12
+ fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
13
+ env[:machine].action('move')
14
14
  end
15
15
  end
16
16
  end
@@ -1,15 +1,13 @@
1
- require 'optparse'
2
-
3
1
  module VagrantPlugins
4
2
  module Rimu
5
3
  module Commands
6
4
  class Rebuild < Vagrant.plugin('2', :command)
5
+ def self.synopsis
6
+ I18n.t('vagrant_rimu.commands.rebuild')
7
+ end
8
+
7
9
  def execute
8
- opts = OptionParser.new do |o|
9
- o.banner = 'Usage: vagrant rebuild [vm-name]'
10
- end
11
- argv = parse_options(opts)
12
- with_target_vms(argv) do |machine|
10
+ with_target_vms(nil, provider: :rimu) do |machine|
13
11
  machine.action(:rebuild)
14
12
  end
15
13
  0
@@ -0,0 +1,13 @@
1
+ require 'vagrant-rimu/commands/abstract_command'
2
+
3
+ module VagrantPlugins
4
+ module Rimu
5
+ module Commands
6
+ class RimuCommand < AbstractCommand
7
+ def before_cmd(_name, _argv, env)
8
+ VagrantPlugins::Rimu::Actions::ConnectToRimu.new(nil, env).call(env)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,65 +1,48 @@
1
- require 'optparse'
2
-
3
1
  module VagrantPlugins
4
2
  module Rimu
5
3
  module Commands
4
+ COMMANDS = [
5
+ { name: :'billing-methods', file: 'billing_methods', clazz: 'BillingMethods' },
6
+ { name: :'distributions', file: 'distributions', clazz: 'Distributions' },
7
+ { name: :'servers', file: 'list_servers', clazz: 'ListServers' },
8
+ { name: :'move-vps', file: 'move', clazz: 'Move' },
9
+ # { name: :'rebuild', file: 'rebuild', clazz: 'Rebuild' },
10
+ ]
11
+
6
12
  class Root < Vagrant.plugin('2', :command)
7
13
  def self.synopsis
8
- 'query Rimu for various options'
14
+ I18n.t('vagrant_rimu.commands.root_synopsis')
9
15
  end
10
16
 
11
17
  def initialize(argv, env)
18
+ @env = env
12
19
  @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
20
+ @commands = Vagrant::Registry.new
13
21
 
14
- @subcommands = Vagrant::Registry.new
15
-
16
- @subcommands.register(:distributions) do
17
- require File.expand_path('../distributions', __FILE__)
18
- Distributions
19
- end
20
-
21
- @subcommands.register(:move) do
22
- require File.expand_path('../move', __FILE__)
23
- Move
24
- end
25
-
26
- @subcommands.register(:billing_methods) do
27
- require File.expand_path('../billing_methods', __FILE__)
28
- BillingMethods
29
- end
30
-
31
- @subcommands.register(:servers) do
32
- require File.expand_path('../list_servers', __FILE__)
33
- ListServers
22
+ COMMANDS.each do |cmd|
23
+ @commands.register(cmd[:name]) do
24
+ require_relative cmd[:file]
25
+ Commands.const_get(cmd[:clazz])
26
+ end
34
27
  end
35
28
 
36
29
  super(argv, env)
37
30
  end
38
31
 
39
32
  def execute
40
- if @main_args.include?('-h') || @main_args.include?('--help')
41
- return help
42
- end
43
- command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
44
- return help if !command_class || !@sub_command
45
- @logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
46
- command_class.new(@sub_args, @env).execute
33
+ command_class = @commands.get(@sub_command.to_sym) if @sub_command
34
+ return usage unless command_class && @sub_command
35
+ command_class.new(@sub_args, @env).execute(@sub_command)
47
36
  end
48
37
 
49
- def help
50
- opts = OptionParser.new do |o|
51
- o.banner = 'Usage: vagrant rimu <subcommand> [<args>]'
52
- o.separator ''
53
- o.separator 'Available subcommands:'
54
- keys = []
55
- @subcommands.each { |key, _value| keys << key.to_s }
56
- keys.sort.each do |key|
57
- o.separator " #{key}"
58
- end
59
- o.separator ''
60
- o.separator 'For help on any individual subcommand run `vagrant rimu <subcommand> -h`'
38
+ def usage
39
+ @env.ui.info I18n.t('vagrant_rimu.commands.root_usage')
40
+ @env.ui.info ''
41
+ @env.ui.info I18n.t('vagrant_rimu.commands.available_subcommands')
42
+ @commands.each do |key, value|
43
+ @env.ui.info " #{key.to_s.ljust(20)} #{value.synopsis}"
61
44
  end
62
- @env.ui.info(opts.help, prefix: false)
45
+ @env.ui.info ''
63
46
  end
64
47
  end
65
48
  end
@@ -0,0 +1,22 @@
1
+ require 'terminal-table'
2
+
3
+ module VagrantPlugins
4
+ module Rimu
5
+ module Commands
6
+ module Utils
7
+ # def display_item_list(env, items)
8
+ # rows = []
9
+ # items.each do |item|
10
+ # rows << [item.id, item.name]
11
+ # end
12
+ # display_table(env, %w(ID Name), rows)
13
+ # end
14
+
15
+ def display_table(env, headers, rows)
16
+ table = Terminal::Table.new headings: headers, rows: rows
17
+ env[:ui].info("\n#{table}")
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,5 @@
1
+ require 'vagrant'
2
+
1
3
  module VagrantPlugins
2
4
  module Rimu
3
5
  class Config < Vagrant.plugin('2', :config)
@@ -135,6 +137,7 @@ module VagrantPlugins
135
137
  @data_centre = UNSET_VALUE
136
138
  end
137
139
 
140
+ # rubocop:disable Metrics/AbcSize
138
141
  def finalize!
139
142
  @api_key = ENV['RIMU_API_KEY'] if @api_key == UNSET_VALUE
140
143
  @api_url = ENV['RIMU_URL'] if @api_url == UNSET_VALUE
@@ -162,8 +165,8 @@ module VagrantPlugins
162
165
 
163
166
  def validate(machine)
164
167
  errors = []
165
- errors << I18n.t('vagrant_rimu.config.api_key') if !@api_key
166
- errors << I18n.t('vagrant_rimu.config.host_name') if !@host_name
168
+ errors << I18n.t('vagrant_rimu.config.api_key') unless @api_key
169
+ errors << I18n.t('vagrant_rimu.config.host_name') unless @host_name
167
170
  if @host_name
168
171
  errors << I18n.t('vagrant_rimu.config.invalid_host_name', {:host_name => @host_name}) \
169
172
  unless @host_name.match(/\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/)
@@ -1,3 +1,5 @@
1
+ require 'vagrant'
2
+
1
3
  module VagrantPlugins
2
4
  module Rimu
3
5
  module Errors
@@ -16,6 +18,10 @@ module VagrantPlugins
16
18
  class ApiError < RimuError
17
19
  error_key(:api_error)
18
20
  end
21
+
22
+ class NoArgRequiredForCommand < RimuError
23
+ error_key(:no_args)
24
+ end
19
25
  end
20
26
  end
21
27
  end
@@ -0,0 +1,28 @@
1
+ module VagrantPlugins
2
+ module Rimu
3
+ module Logging
4
+ def self.init
5
+ level = nil
6
+ begin
7
+ level = Log4r.const_get(ENV['VAGRANT_LOG'].upcase)
8
+ rescue NameError
9
+ begin
10
+ level = Log4r.const_get(ENV['VAGRANT_RIMU_LOG'].upcase)
11
+ rescue NameError
12
+ level = nil
13
+ end
14
+ end
15
+
16
+ level = nil unless level.is_a?(Integer)
17
+
18
+ if level
19
+ logger = Log4r::Logger.new('vagrant_rimu')
20
+ out = Log4r::Outputter.stdout
21
+ out.formatter = Log4r::PatternFormatter.new(pattern: '%d | %5l | %m', date_pattern: '%Y-%m-%d %H:%M')
22
+ logger.outputters = out
23
+ logger.level = level
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -24,57 +24,31 @@ module VagrantPlugins
24
24
 
25
25
  provider(:rimu, {:box_optional => true, :parallel => true}) do
26
26
  # Setup logging and i18n
27
- setup_logging
28
- setup_i18n
27
+ Rimu.init_i18n
28
+ Rimu.init_logging
29
+
29
30
  # Return the provider
30
31
  require_relative "provider"
31
32
  Provider
32
33
  end
33
34
 
34
35
  command(:rimu) do
36
+ # Setup logging and i18n
37
+ Rimu.init_i18n
38
+ Rimu.init_logging
39
+
35
40
  require_relative "commands/root"
36
41
  Commands::Root
37
42
  end
38
43
 
39
44
  command(:rebuild) do
45
+ # Setup logging and i18n
46
+ Rimu.init_i18n
47
+ Rimu.init_logging
48
+
40
49
  require_relative "commands/rebuild"
41
50
  Commands::Rebuild
42
51
  end
43
-
44
- # This initializes the internationalization strings.
45
- def self.setup_i18n
46
- I18n.load_path << File.expand_path("locales/en.yml", Rimu.source_root)
47
- I18n.reload!
48
- end
49
-
50
- # This sets up our log level to be whatever VAGRANT_LOG is.
51
- def self.setup_logging
52
- require "log4r"
53
-
54
- level = nil
55
- begin
56
- level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
57
- rescue NameError
58
- # This means that the logging constant wasn't found,
59
- # which is fine. We just keep `level` as `nil`. But
60
- # we tell the user.
61
- level = nil
62
- end
63
-
64
- # Some constants, such as "true" resolve to booleans, so the
65
- # above error checking doesn't catch it. This will check to make
66
- # sure that the log level is an integer, as Log4r requires.
67
- level = nil if !level.is_a?(Integer)
68
-
69
- # Set the logging level on all "vagrant" namespaced
70
- # logs as long as we have a valid level.
71
- if level
72
- logger = Log4r::Logger.new("vagrant_rimu")
73
- logger.outputters = Log4r::Outputter.stderr
74
- logger.level = level
75
- logger = nil
76
- end
77
- end
78
52
  end
79
53
  end
80
54
  end