vagrant-rimu 0.0.1 → 0.0.6

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 (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,20 +1,22 @@
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 action reads the SSH info for the machine and puts it into the
7
9
  # `:machine_ssh_info` key in the environment.
8
- class ReadSSHInfo
10
+ class ReadSSHInfo < AbstractAction
9
11
  def initialize(app, env)
10
12
  @app = app
11
13
  @machine = env[:machine]
12
- @client = env[:rimu_api]
13
- @logger = Log4r::Logger.new("vagrant_rimu::action::read_ssh_info")
14
+ @logger = Log4r::Logger.new('vagrant_rimu::action::read_ssh_info')
14
15
  end
15
16
 
16
- def call(env)
17
- env[:machine_ssh_info] = read_ssh_info(@client, @machine)
17
+ def execute(env)
18
+ client = env[:rimu_api]
19
+ env[:machine_ssh_info] = read_ssh_info(client, @machine)
18
20
 
19
21
  @app.call(env)
20
22
  end
@@ -32,9 +34,10 @@ module VagrantPlugins
32
34
  end
33
35
 
34
36
  return {
35
- :host => server.allocated_ips["primary_ip"],
37
+ :host => server.allocated_ips['primary_ip'],
36
38
  :port => 22,
37
- :username => "root"
39
+ :username => 'root',
40
+ :private_key_path => machine.config.ssh.private_key_path,
38
41
  }
39
42
  end
40
43
  end
@@ -1,25 +1,32 @@
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
- class ReadState
8
+ class ReadState < AbstractAction
7
9
  def initialize(app, env)
8
10
  @app = app
9
11
  @machine = env[:machine]
10
- @client = env[:rimu_api]
11
12
  @logger = Log4r::Logger.new('vagrant_rimu::action::read_state')
12
13
  end
13
14
 
14
- def call(env)
15
- env[:machine_state] = read_state(@client, @machine)
16
- @logger.info "Machine state is '#{env[:machine_state]}'"
15
+ def execute(env)
16
+ client = env[:rimu_api]
17
+ env[:machine_state] = read_state(client, @machine)
18
+ @logger.info I18n.t('vagrant_rimu.states.current_state', {:state => env[:machine_state]})
17
19
  @app.call(env)
18
20
  end
19
21
 
20
22
  def read_state(client, machine)
21
23
  return :not_created if machine.id.nil?
22
- server = client.servers.status(machine.id.to_i)
24
+ begin
25
+ server = client.servers.status(machine.id.to_i)
26
+ rescue ::Rimu::RimuAPI::RimuRequestError, ::Rimu::RimuAPI::RimuResponseError => e
27
+ @logger.debug(e)
28
+ return :destroyed
29
+ end
23
30
  return :not_created if server.nil?
24
31
  status = server.running_state
25
32
  return :not_created if status.nil?
@@ -28,6 +35,7 @@ module VagrantPlugins
28
35
  'NOTRUNNING' => :off,
29
36
  'RESTARTING' => :shutting_down,
30
37
  'POWERCYCLING' => :shutting_down,
38
+ 'DESTROYED' => :destroyed
31
39
  }
32
40
  states[status.to_s]
33
41
  end
@@ -1,20 +1,25 @@
1
1
  require 'log4r'
2
2
 
3
+ require 'vagrant-rimu/actions/ssh_utils'
4
+
3
5
  module VagrantPlugins
4
6
  module Rimu
5
7
  module Actions
6
- class Rebuild
8
+ class Rebuild < AbstractAction
7
9
  include Vagrant::Util::Retryable
10
+ include VagrantPlugins::Rimu::Actions::SshUtils
8
11
 
9
12
  def initialize(app, env)
10
13
  @app = app
11
- @client = env[:rimu_api]
12
14
  @machine = env[:machine]
13
15
  @logger = Log4r::Logger.new('vagrant::rimu::rebuild')
14
16
  end
15
17
 
16
- def call(env)
18
+ # rubocop:disable Metrics/AbcSize
19
+ def execute(env)
20
+ client = env[:rimu_api]
17
21
  env[:ui].info I18n.t('vagrant_rimu.rebuilding')
22
+
18
23
  params = {
19
24
  :instantiation_options => {
20
25
  :domain_name => @machine.provider_config.host_name,
@@ -35,15 +40,38 @@ module VagrantPlugins
35
40
  }
36
41
  params.delete(:instantiation_via_clone_options) if @machine.provider_config.vps_to_clone.nil?
37
42
  params.delete(:instantiation_options) if params.has_key?(:instantiation_via_clone_options)
38
- @client.servers.reinstall(@machine.id.to_i, params)
43
+ if @machine.provider_config.root_password
44
+ root_pass = @machine.provider_config.root_password
45
+ else
46
+ root_pass = Digest::SHA2.new.update(@machine.provider_config.api_key).to_s
47
+ end
48
+ if params.has_key?(:instantiation_options)
49
+ params[:instantiation_options][:password] = root_pass
50
+ end
51
+
52
+ begin
53
+ client.servers.reinstall(@machine.id.to_i, params)
54
+ rescue ::Rimu::RimuAPI::RimuRequestError, ::Rimu::RimuAPI::RimuResponseError => e
55
+ raise Errors::ApiError, {:stderr=>e}
56
+ end
57
+
39
58
  switch_user = @machine.provider_config.setup?
40
59
  user = @machine.config.ssh.username
41
- @machine.config.ssh.username = 'root' if switch_user
60
+ if switch_user
61
+ @machine.config.ssh.username = 'root'
62
+ @machine.config.ssh.password = root_pass
63
+ end
64
+
42
65
  retryable(:tries => 120, :sleep => 10) do
43
66
  next if env[:interrupted]
44
- raise 'not ready' if !@machine.communicate.ready?
67
+ raise 'not ready' unless @machine.communicate.ready?
45
68
  end
69
+
70
+ # upload root ssh key
71
+ upload_key(env)
72
+
46
73
  @machine.config.ssh.username = user
74
+
47
75
  @app.call(env)
48
76
  end
49
77
  end
@@ -1,19 +1,26 @@
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
- class Reload
8
+ class Reload < AbstractAction
7
9
  def initialize(app, env)
8
10
  @app = app
9
- @client = env[:rimu_api]
10
11
  @machine = env[:machine]
11
12
  @logger = Log4r::Logger.new('vagrant::rimu::reload')
12
13
  end
13
14
 
14
- def call(env)
15
+ def execute(env)
16
+ client = env[:rimu_api]
15
17
  env[:ui].info I18n.t('vagrant_rimu.reloading')
16
- @client.servers.reboot(@machine.id.to_i)
18
+
19
+ begin
20
+ client.servers.reboot(@machine.id.to_i)
21
+ rescue ::Rimu::RimuAPI::RimuRequestError, ::Rimu::RimuAPI::RimuResponseError => e
22
+ raise Errors::ApiError, {:stderr=>e}
23
+ end
17
24
 
18
25
  @app.call(env)
19
26
  end
@@ -1,16 +1,18 @@
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
- class SetupSudo
8
+ class SetupSudo < AbstractAction
7
9
  def initialize(app, env)
8
10
  @app = app
9
11
  @machine = env[:machine]
10
12
  @logger = Log4r::Logger.new('vagrant::rimu::setup_sudo')
11
13
  end
12
14
 
13
- def call(env)
15
+ def execute(env)
14
16
  # check if setup is enabled
15
17
  return @app.call(env) unless @machine.provider_config.setup?
16
18
 
@@ -18,10 +20,20 @@ module VagrantPlugins
18
20
  user = @machine.config.ssh.username
19
21
  @machine.config.ssh.username = 'root'
20
22
 
23
+ # modify the sudoers file
24
+ modify_sudo(env)
25
+
26
+ # reset ssh username
27
+ @machine.config.ssh.username = user
28
+
29
+ @app.call(env)
30
+ end
31
+
32
+ def modify_sudo(env)
21
33
  # check for guest name available in Vagrant 1.2 first
22
34
  guest_name = @machine.guest.name if @machine.guest.respond_to?(:name)
23
35
  guest_name ||= @machine.guest.to_s.downcase
24
-
36
+
25
37
  case guest_name
26
38
  when /redhat/
27
39
  env[:ui].info I18n.t('vagrant_rimu.modifying_sudo')
@@ -31,11 +43,6 @@ module VagrantPlugins
31
43
  sed -i'.bk' -e 's/\(Defaults\s\+requiretty\)/# \1/' /etc/sudoers
32
44
  BASH
33
45
  end
34
-
35
- # reset ssh username
36
- @machine.config.ssh.username = user
37
-
38
- @app.call(env)
39
46
  end
40
47
  end
41
48
  end
@@ -1,16 +1,22 @@
1
1
  require 'log4r'
2
2
 
3
+ require 'vagrant-rimu/actions/ssh_utils'
4
+ require 'vagrant-rimu/actions/abstract_action'
5
+
3
6
  module VagrantPlugins
4
7
  module Rimu
5
8
  module Actions
6
- class SetupUser
9
+ class SetupUser < AbstractAction
10
+ include VagrantPlugins::Rimu::Actions::SshUtils
11
+
7
12
  def initialize(app, env)
8
13
  @app = app
9
14
  @machine = env[:machine]
10
15
  @logger = Log4r::Logger.new('vagrant::rimu::setup_user')
11
16
  end
12
17
 
13
- def call(env)
18
+ # rubocop:disable Metrics/AbcSize
19
+ def execute(env)
14
20
  # check if setup is enabled
15
21
  return @app.call(env) unless @machine.provider_config.setup?
16
22
 
@@ -21,11 +27,40 @@ module VagrantPlugins
21
27
  user = @machine.config.ssh.username
22
28
  @machine.config.ssh.username = 'root'
23
29
 
30
+ # create user account
31
+ create_user(env, user)
32
+
33
+ # create the .ssh directory in the users home
34
+ @machine.communicate.execute("su #{user} -c 'mkdir -p ~/.ssh'")
35
+
36
+ # add the specified key to the authorized keys file
37
+ upload_key(env, user)
38
+
39
+ # reset username
40
+ @machine.config.ssh.username = user
41
+
42
+ @app.call(env)
43
+ end
44
+
45
+ # def upload_key(user)
46
+ # path = @machine.config.ssh.private_key_path
47
+ # path = path[0] if path.is_a?(Array)
48
+ # path = File.expand_path(path, @machine.env.root_path)
49
+ # pub_key = public_key(path)
50
+ # @machine.communicate.execute(<<-BASH)
51
+ # if ! grep '#{pub_key}' /home/#{user}/.ssh/authorized_keys; then
52
+ # echo '#{pub_key}' >> /home/#{user}/.ssh/authorized_keys;
53
+ # fi
54
+ #
55
+ # chown -R #{user} /home/#{user}/.ssh;
56
+ # BASH
57
+ # end
58
+
59
+ def create_user(env, user)
24
60
  env[:ui].info I18n.t('vagrant_rimu.creating_user', {
25
61
  :user => user
26
62
  })
27
-
28
- # create user account
63
+
29
64
  @machine.communicate.execute(<<-BASH)
30
65
  if ! (grep ^#{user}: /etc/passwd); then
31
66
  useradd -m -s /bin/bash #{user};
@@ -40,28 +75,13 @@ module VagrantPlugins
40
75
  sed -i -e "/#{user}/ s/=.*/=(ALL:ALL) NOPASSWD: ALL/" /etc/sudoers;
41
76
  fi
42
77
  BASH
43
-
44
- # create the .ssh directory in the users home
45
- @machine.communicate.execute("su #{user} -c 'mkdir -p ~/.ssh'")
46
-
47
- # add the specified key to the authorized keys file
48
- path = @machine.config.ssh.private_key_path
49
- path = path[0] if path.is_a?(Array)
50
- path = File.expand_path(path, @machine.env.root_path)
51
- pub_key = Rimu.public_key(path)
52
- @machine.communicate.execute(<<-BASH)
53
- if ! grep '#{pub_key}' /home/#{user}/.ssh/authorized_keys; then
54
- echo '#{pub_key}' >> /home/#{user}/.ssh/authorized_keys;
55
- fi
56
-
57
- chown -R #{user} /home/#{user}/.ssh;
58
- BASH
59
-
60
- # reset username
61
- @machine.config.ssh.username = user
62
-
63
- @app.call(env)
64
78
  end
79
+
80
+ # def public_key(private_key_path)
81
+ # File.read("#{private_key_path}.pub")
82
+ # rescue
83
+ # raise Errors::PublicKeyError, :path => "#{private_key_path}.pub"
84
+ # end
65
85
  end
66
86
  end
67
87
  end
@@ -0,0 +1,44 @@
1
+ require 'pathname'
2
+
3
+ module VagrantPlugins
4
+ module Rimu
5
+ module Actions
6
+ module SshUtils
7
+
8
+ # rubocop:disable Metrics/AbcSize
9
+ def upload_key(env, user=nil)
10
+ path = env[:machine].config.ssh.private_key_path
11
+ path = path[0] if path.is_a?(Array)
12
+ path = File.expand_path(path, env[:machine].env.root_path)
13
+ pub_key = public_key(path)
14
+ if user.nil?
15
+ env[:machine].communicate.execute(<<-BASH)
16
+ if [ ! -d /root/.ssh ]; then
17
+ mkdir /root/.ssh;
18
+ chmod 0700 /root/.ssh;
19
+ fi
20
+ if ! grep '#{pub_key.chomp}' /root/.ssh/authorized_keys; then
21
+ echo '#{pub_key}' >> /root/.ssh/authorized_keys;
22
+ fi
23
+ BASH
24
+ else
25
+ env[:machine].communicate.execute(<<-BASH)
26
+ if ! grep '#{pub_key.chomp}' /home/#{user}/.ssh/authorized_keys; then
27
+ echo '#{pub_key}' >> /home/#{user}/.ssh/authorized_keys;
28
+ fi
29
+
30
+ chown -R #{user} /home/#{user}/.ssh;
31
+ BASH
32
+ end
33
+ end
34
+
35
+ def public_key(private_key_path)
36
+ File.read("#{private_key_path}.pub")
37
+ rescue
38
+ raise Errors::PublicKeyError, :path => "#{private_key_path}.pub"
39
+ end
40
+ end
41
+ # rubocop:enable Metrics/AbcSize
42
+ end
43
+ end
44
+ end
@@ -1,20 +1,22 @@
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
- class StartInstance
8
+ class StartInstance < AbstractAction
7
9
  def initialize(app, env)
8
10
  @app = app
9
- @client = env[:rimu_api]
10
11
  @machine = env[:machine]
11
12
  @logger = Log4r::Logger.new("vagrant_rimu::action::start_instance")
12
13
  end
13
14
 
14
- def call(env)
15
+ def execute(env)
16
+ client = env[:rimu_api]
15
17
  env[:ui].info I18n.t('vagrant_rimu.starting')
16
18
  begin
17
- result = @client.servers.start(@machine.id.to_i)
19
+ result = client.servers.start(@machine.id.to_i)
18
20
  raise StandardError, "No response from the API" if result.nil?
19
21
  raise StandardError, "VPS is not be running" if result.running_state != 'RUNNING'
20
22
  rescue StandardError => e
@@ -1,25 +1,36 @@
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 stops the running instance.
7
- class StopInstance
8
- def initialize(app, env)
9
+ class StopInstance < AbstractAction
10
+ def initialize(app, _env)
9
11
  @app = app
10
- @client = env[:rimu_api]
11
12
  @logger = Log4r::Logger.new('vagrant_rimu::action::stop_instance')
12
13
  end
13
14
 
14
- def call(env)
15
- if env[:machine].state.id == :stopped
15
+ def execute(env)
16
+ if env[:machine].state.id == :off
16
17
  env[:ui].info(I18n.t('vagrant_rimu.already_status', :status => env[:machine].state.id))
17
18
  else
18
- env[:ui].info(I18n.t('vagrant_rimu.stopping'))
19
- @client.servers.shutdown(env[:machine].id.to_i)
19
+ shutdown(env)
20
20
  end
21
+
21
22
  @app.call(env)
22
23
  end
24
+
25
+ def shutdown(env)
26
+ env[:ui].info(I18n.t('vagrant_rimu.stopping'))
27
+ client = env[:rimu_api]
28
+ begin
29
+ client.servers.shutdown(env[:machine].id.to_i)
30
+ rescue ::Rimu::RimuAPI::RimuRequestError, ::Rimu::RimuAPI::RimuResponseError => e
31
+ raise Errors::ApiError, {:stderr=>e}
32
+ end
33
+ end
23
34
  end
24
35
  end
25
36
  end