vagrant-openstack-illuin-provider 0.12.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 (115) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rubocop.yml +40 -0
  4. data/CHANGELOG.md +282 -0
  5. data/Gemfile +18 -0
  6. data/RELEASE.md +15 -0
  7. data/Rakefile +25 -0
  8. data/Vagrantfile +20 -0
  9. data/dummy.box +0 -0
  10. data/example_box/README.md +13 -0
  11. data/example_box/metadata.json +3 -0
  12. data/functional_tests/Vagrantfile +58 -0
  13. data/functional_tests/keys/vagrant-openstack +27 -0
  14. data/functional_tests/keys/vagrant-openstack.pub +1 -0
  15. data/functional_tests/run_tests.sh +142 -0
  16. data/lib/vagrant-openstack-illuin-provider.rb +29 -0
  17. data/lib/vagrant-openstack-illuin-provider/action.rb +344 -0
  18. data/lib/vagrant-openstack-illuin-provider/action/abstract_action.rb +22 -0
  19. data/lib/vagrant-openstack-illuin-provider/action/connect_openstack.rb +60 -0
  20. data/lib/vagrant-openstack-illuin-provider/action/create_server.rb +187 -0
  21. data/lib/vagrant-openstack-illuin-provider/action/create_stack.rb +76 -0
  22. data/lib/vagrant-openstack-illuin-provider/action/delete_server.rb +53 -0
  23. data/lib/vagrant-openstack-illuin-provider/action/delete_stack.rb +73 -0
  24. data/lib/vagrant-openstack-illuin-provider/action/message.rb +19 -0
  25. data/lib/vagrant-openstack-illuin-provider/action/provision.rb +60 -0
  26. data/lib/vagrant-openstack-illuin-provider/action/read_ssh_info.rb +74 -0
  27. data/lib/vagrant-openstack-illuin-provider/action/read_state.rb +43 -0
  28. data/lib/vagrant-openstack-illuin-provider/action/resume.rb +24 -0
  29. data/lib/vagrant-openstack-illuin-provider/action/snapshot_cleanup.rb +32 -0
  30. data/lib/vagrant-openstack-illuin-provider/action/snapshot_delete.rb +32 -0
  31. data/lib/vagrant-openstack-illuin-provider/action/snapshot_list.rb +22 -0
  32. data/lib/vagrant-openstack-illuin-provider/action/snapshot_restore.rb +29 -0
  33. data/lib/vagrant-openstack-illuin-provider/action/snapshot_save.rb +51 -0
  34. data/lib/vagrant-openstack-illuin-provider/action/start_server.rb +24 -0
  35. data/lib/vagrant-openstack-illuin-provider/action/stop_server.rb +25 -0
  36. data/lib/vagrant-openstack-illuin-provider/action/suspend.rb +24 -0
  37. data/lib/vagrant-openstack-illuin-provider/action/sync_folders.rb +138 -0
  38. data/lib/vagrant-openstack-illuin-provider/action/wait_active.rb +33 -0
  39. data/lib/vagrant-openstack-illuin-provider/action/wait_stop.rb +33 -0
  40. data/lib/vagrant-openstack-illuin-provider/cap/snapshot_list.rb +15 -0
  41. data/lib/vagrant-openstack-illuin-provider/catalog/openstack_catalog.rb +90 -0
  42. data/lib/vagrant-openstack-illuin-provider/client/cinder.rb +39 -0
  43. data/lib/vagrant-openstack-illuin-provider/client/domain.rb +163 -0
  44. data/lib/vagrant-openstack-illuin-provider/client/glance.rb +65 -0
  45. data/lib/vagrant-openstack-illuin-provider/client/heat.rb +49 -0
  46. data/lib/vagrant-openstack-illuin-provider/client/http_utils.rb +116 -0
  47. data/lib/vagrant-openstack-illuin-provider/client/keystone.rb +128 -0
  48. data/lib/vagrant-openstack-illuin-provider/client/neutron.rb +48 -0
  49. data/lib/vagrant-openstack-illuin-provider/client/nova.rb +303 -0
  50. data/lib/vagrant-openstack-illuin-provider/client/openstack.rb +59 -0
  51. data/lib/vagrant-openstack-illuin-provider/client/request_logger.rb +23 -0
  52. data/lib/vagrant-openstack-illuin-provider/client/rest_utils.rb +28 -0
  53. data/lib/vagrant-openstack-illuin-provider/command/abstract_command.rb +51 -0
  54. data/lib/vagrant-openstack-illuin-provider/command/flavor_list.rb +24 -0
  55. data/lib/vagrant-openstack-illuin-provider/command/floatingip_list.rb +32 -0
  56. data/lib/vagrant-openstack-illuin-provider/command/image_list.rb +29 -0
  57. data/lib/vagrant-openstack-illuin-provider/command/main.rb +52 -0
  58. data/lib/vagrant-openstack-illuin-provider/command/network_list.rb +25 -0
  59. data/lib/vagrant-openstack-illuin-provider/command/openstack_command.rb +16 -0
  60. data/lib/vagrant-openstack-illuin-provider/command/reset.rb +20 -0
  61. data/lib/vagrant-openstack-illuin-provider/command/subnet_list.rb +22 -0
  62. data/lib/vagrant-openstack-illuin-provider/command/utils.rb +22 -0
  63. data/lib/vagrant-openstack-illuin-provider/command/volume_list.rb +25 -0
  64. data/lib/vagrant-openstack-illuin-provider/config.rb +505 -0
  65. data/lib/vagrant-openstack-illuin-provider/config/http.rb +39 -0
  66. data/lib/vagrant-openstack-illuin-provider/config_resolver.rb +334 -0
  67. data/lib/vagrant-openstack-illuin-provider/errors.rb +187 -0
  68. data/lib/vagrant-openstack-illuin-provider/logging.rb +39 -0
  69. data/lib/vagrant-openstack-illuin-provider/plugin.rb +58 -0
  70. data/lib/vagrant-openstack-illuin-provider/provider.rb +50 -0
  71. data/lib/vagrant-openstack-illuin-provider/utils.rb +81 -0
  72. data/lib/vagrant-openstack-illuin-provider/version.rb +15 -0
  73. data/lib/vagrant-openstack-illuin-provider/version_checker.rb +76 -0
  74. data/locales/en.yml +412 -0
  75. data/spec/vagrant-openstack-illuin-provider/action/connect_openstack_spec.rb +770 -0
  76. data/spec/vagrant-openstack-illuin-provider/action/create_server_spec.rb +260 -0
  77. data/spec/vagrant-openstack-illuin-provider/action/create_stack_spec.rb +99 -0
  78. data/spec/vagrant-openstack-illuin-provider/action/delete_server_spec.rb +89 -0
  79. data/spec/vagrant-openstack-illuin-provider/action/delete_stack_spec.rb +63 -0
  80. data/spec/vagrant-openstack-illuin-provider/action/message_spec.rb +33 -0
  81. data/spec/vagrant-openstack-illuin-provider/action/provision_spec.rb +97 -0
  82. data/spec/vagrant-openstack-illuin-provider/action/read_ssh_info_spec.rb +202 -0
  83. data/spec/vagrant-openstack-illuin-provider/action/read_state_spec.rb +81 -0
  84. data/spec/vagrant-openstack-illuin-provider/action/resume_server_spec.rb +49 -0
  85. data/spec/vagrant-openstack-illuin-provider/action/start_server_spec.rb +49 -0
  86. data/spec/vagrant-openstack-illuin-provider/action/stop_server_spec.rb +49 -0
  87. data/spec/vagrant-openstack-illuin-provider/action/suspend_server_spec.rb +49 -0
  88. data/spec/vagrant-openstack-illuin-provider/action/sync_folders_spec.rb +155 -0
  89. data/spec/vagrant-openstack-illuin-provider/action/wait_active_spec.rb +53 -0
  90. data/spec/vagrant-openstack-illuin-provider/action/wait_stop_spec.rb +53 -0
  91. data/spec/vagrant-openstack-illuin-provider/action_spec.rb +120 -0
  92. data/spec/vagrant-openstack-illuin-provider/client/cinder_spec.rb +129 -0
  93. data/spec/vagrant-openstack-illuin-provider/client/glance_spec.rb +145 -0
  94. data/spec/vagrant-openstack-illuin-provider/client/heat_spec.rb +130 -0
  95. data/spec/vagrant-openstack-illuin-provider/client/keystone_spec.rb +226 -0
  96. data/spec/vagrant-openstack-illuin-provider/client/neutron_spec.rb +173 -0
  97. data/spec/vagrant-openstack-illuin-provider/client/nova_spec.rb +760 -0
  98. data/spec/vagrant-openstack-illuin-provider/client/utils_spec.rb +176 -0
  99. data/spec/vagrant-openstack-illuin-provider/command/flavor_list_spec.rb +43 -0
  100. data/spec/vagrant-openstack-illuin-provider/command/floatingip_list_spec.rb +74 -0
  101. data/spec/vagrant-openstack-illuin-provider/command/image_list_spec.rb +95 -0
  102. data/spec/vagrant-openstack-illuin-provider/command/network_list_spec.rb +65 -0
  103. data/spec/vagrant-openstack-illuin-provider/command/reset_spec.rb +24 -0
  104. data/spec/vagrant-openstack-illuin-provider/command/subnet_list_spec.rb +45 -0
  105. data/spec/vagrant-openstack-illuin-provider/command/volume_list_spec.rb +40 -0
  106. data/spec/vagrant-openstack-illuin-provider/config_resolver_spec.rb +879 -0
  107. data/spec/vagrant-openstack-illuin-provider/config_spec.rb +416 -0
  108. data/spec/vagrant-openstack-illuin-provider/e2e_spec.rb.save +27 -0
  109. data/spec/vagrant-openstack-illuin-provider/provider_spec.rb +13 -0
  110. data/spec/vagrant-openstack-illuin-provider/spec_helper.rb +37 -0
  111. data/spec/vagrant-openstack-illuin-provider/utils_spec.rb +197 -0
  112. data/spec/vagrant-openstack-illuin-provider/version_checker_spec.rb +39 -0
  113. data/stackrc +25 -0
  114. data/vagrant-openstack-illuin-provider.gemspec +35 -0
  115. metadata +379 -0
@@ -0,0 +1,19 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class Message < AbstractAction
7
+ def initialize(app, _env, message)
8
+ @app = app
9
+ @message = message
10
+ end
11
+
12
+ def execute(env)
13
+ env[:ui].info(@message)
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,60 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/action/builder'
4
+
5
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
6
+ require 'vagrant-openstack-illuin-provider/action/read_ssh_info'
7
+
8
+ module VagrantPlugins
9
+ module Openstack
10
+ module Action
11
+ include Vagrant::Action::Builtin
12
+
13
+ class ProvisionWrapper < AbstractAction
14
+ def initialize(app, env)
15
+ @app = app
16
+ @env = env
17
+ @logger = Log4r::Logger.new('vagrant_openstack::action::provision_wrapper')
18
+ end
19
+
20
+ def execute(env)
21
+ @logger.info 'Run provisioning'
22
+ InternalProvisionWrapper.new(@app, @env).call(@env)
23
+ @app.call(env)
24
+ end
25
+ end
26
+
27
+ class InternalProvisionWrapper < Vagrant::Action::Builtin::Provision
28
+ def initialize(app, env)
29
+ @logger = Log4r::Logger.new('vagrant_openstack::action::internal_provision_wrapper')
30
+ super app, env
31
+ end
32
+
33
+ def run_provisioner(env)
34
+ if env[:provisioner].is_a?(Vagrant.plugin('2').manager.provisioners[:shell])
35
+ handle_shell_meta_args(env)
36
+ end
37
+ env[:provisioner].provision
38
+ end
39
+
40
+ private
41
+
42
+ def handle_shell_meta_args(env)
43
+ config = env[:provisioner].config
44
+ args = config.args.nil? ? [] : [config.args].flatten
45
+ config.args = []
46
+ @logger.info "Shell provisioner args: #{args}"
47
+ args.each do |arg|
48
+ if '@@ssh_ip@@'.eql? arg
49
+ ssh_info = VagrantPlugins::Openstack::Action.get_ssh_info(env)
50
+ @logger.info "Replace meta-arg #{arg} by value #{ssh_info[:host]}"
51
+ config.args << ssh_info[:host]
52
+ else
53
+ config.args << arg
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,74 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant-openstack-illuin-provider/config_resolver'
4
+ require 'vagrant-openstack-illuin-provider/utils'
5
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
6
+
7
+ module VagrantPlugins
8
+ module Openstack
9
+ module Action
10
+ # This action reads the SSH info for the machine and puts it into the
11
+ # `:machine_ssh_info` key in the environment.
12
+
13
+ class ReadSSHInfo < AbstractAction
14
+ def initialize(app, _env, resolver = ConfigResolver.new, utils = Utils.new)
15
+ @app = app
16
+ @logger = Log4r::Logger.new('vagrant_openstack::action::read_ssh_info')
17
+ @resolver = resolver
18
+ @utils = utils
19
+ end
20
+
21
+ def execute(env)
22
+ @logger.info 'Reading SSH info'
23
+ server_id = env[:machine].id.to_sym
24
+ SSHInfoHolder.instance.tap do |holder|
25
+ holder.synchronize do
26
+ holder.ssh_info[server_id] = read_ssh_info(env) if holder.ssh_info[server_id].nil?
27
+ env[:machine_ssh_info] = holder.ssh_info[server_id]
28
+ end
29
+ end
30
+ @app.call(env)
31
+ end
32
+
33
+ private
34
+
35
+ def read_ssh_info(env)
36
+ config = env[:machine].provider_config
37
+ env[:ui].warn('SSH is disabled in the provider config. The action you are attempting is likely to fail') if config.ssh_disabled
38
+ hash = {
39
+ host: @utils.get_ip_address(env),
40
+ port: @resolver.resolve_ssh_port(env),
41
+ username: @resolver.resolve_ssh_username(env)
42
+ }
43
+ if env[:machine].config.ssh.insert_key
44
+ hash[:private_key_path] = "#{env[:machine].data_dir}/#{get_keypair_name(env)}" unless config.keypair_name || config.public_key_path
45
+ end
46
+ # Should work silently when https://github.com/mitchellh/vagrant/issues/4637 is fixed
47
+ hash[:log_level] = 'ERROR'
48
+ hash
49
+ end
50
+
51
+ def get_keypair_name(env)
52
+ env[:openstack_client].nova.get_server_details(env, env[:machine].id)['key_name']
53
+ end
54
+ end
55
+
56
+ class SSHInfoHolder < Mutex
57
+ include Singleton
58
+
59
+ #
60
+ # Keys are machine ids
61
+ #
62
+ attr_accessor :ssh_info
63
+
64
+ def initialize
65
+ @ssh_info = {}
66
+ end
67
+ end
68
+
69
+ def self.get_ssh_info(env)
70
+ SSHInfoHolder.instance.ssh_info[env[:machine].id.to_sym]
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,43 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
4
+
5
+ module VagrantPlugins
6
+ module Openstack
7
+ module Action
8
+ # This action reads the state of the machine and puts it in the
9
+ # `:machine_state_id` key in the environment.
10
+ class ReadState < AbstractAction
11
+ def initialize(app, _env)
12
+ @app = app
13
+ @logger = Log4r::Logger.new('vagrant_openstack::action::read_state')
14
+ end
15
+
16
+ def execute(env)
17
+ env[:machine_state_id] = read_state(env)
18
+ @app.call(env)
19
+ end
20
+
21
+ def read_state(env)
22
+ machine = env[:machine]
23
+ return :not_created if machine.id.nil?
24
+
25
+ # Find the machine
26
+ server = env[:openstack_client].nova.get_server_details(env, machine.id)
27
+ if server.nil? || server['status'] == 'DELETED'
28
+ # The machine can't be found
29
+ @logger.info('Machine not found or deleted, assuming it got destroyed.')
30
+ machine.id = nil
31
+ return :not_created
32
+ end
33
+
34
+ if !server['OS-EXT-STS:task_state'].nil?
35
+ server['OS-EXT-STS:task_state'].downcase.to_sym
36
+ else
37
+ server['status'].downcase.to_sym
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class Resume < AbstractAction
7
+ def initialize(app, _env)
8
+ @app = app
9
+ @logger = Log4r::Logger.new('vagrant_openstack::action::resume_server')
10
+ end
11
+
12
+ def execute(env)
13
+ if env[:machine].id
14
+ @logger.info "Resuming suspended VM #{env[:machine].id}..."
15
+ env[:ui].info I18n.t('vagrant.actions.vm.resume.resuming')
16
+ env[:openstack_client].nova.resume_server(env, env[:machine].id)
17
+ end
18
+
19
+ @app.call(env)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,32 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class SnapshotCleanup < AbstractAction
7
+ def initialize(app, _env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ nova = env[:openstack_client].nova
13
+ machine_snapshots = nova.list_snapshots(env, env[:machine].id)
14
+
15
+ snapshots_to_clean = machine_snapshots.select do |s|
16
+ s.metadata.key?('vagrant_snapshot')
17
+ end
18
+
19
+ @app.call env
20
+
21
+ unless snapshots_to_clean.empty?
22
+ env[:ui].info("Deleting Vagrant snapshots: #{snapshots_to_clean.map(&:name)}")
23
+ end
24
+
25
+ snapshots_to_clean.each do |s|
26
+ nova.delete_snapshot(env, s.id)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class SnapshotDelete < AbstractAction
7
+ def initialize(app, _env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ nova = env[:openstack_client].nova
13
+ machine_snapshots = nova.list_snapshots(env, env[:machine].id)
14
+
15
+ snapshot = machine_snapshots.find { |s| s.name == env[:snapshot_name] }
16
+
17
+ unless snapshot.nil?
18
+ env[:ui].info(I18n.t('vagrant.actions.vm.snapshot.deleting',
19
+ name: snapshot.name))
20
+
21
+ nova.delete_snapshot(env, snapshot.id)
22
+
23
+ env[:ui].info(I18n.t('vagrant.actions.vm.snapshot.deleted',
24
+ name: snapshot.name))
25
+ end
26
+
27
+ @app.call env
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class SnapshotList < AbstractAction
7
+ def initialize(app, _env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ nova = env[:openstack_client].nova
13
+ machine_snapshots = nova.list_snapshots(env, env[:machine].id)
14
+
15
+ env[:machine_snapshot_list] = machine_snapshots.map(&:name)
16
+
17
+ @app.call env
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class SnapshotRestore < AbstractAction
7
+ def initialize(app, _env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ nova = env[:openstack_client].nova
13
+ machine_snapshots = nova.list_snapshots(env, env[:machine].id)
14
+
15
+ snapshot = machine_snapshots.find { |s| s.name == env[:snapshot_name] }
16
+
17
+ unless snapshot.nil?
18
+ env[:ui].info(I18n.t('vagrant.actions.vm.snapshot.restoring',
19
+ name: snapshot.name))
20
+
21
+ nova.restore_snapshot(env, env[:machine].id, snapshot.id)
22
+ end
23
+
24
+ @app.call env
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,51 @@
1
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class SnapshotSave < AbstractAction
7
+ def initialize(app, _env, retry_interval = 3)
8
+ @app = app
9
+ @retry_interval = retry_interval
10
+ end
11
+
12
+ def call(env)
13
+ nova = env[:openstack_client].nova
14
+ config = env[:machine].provider_config
15
+
16
+ env[:ui].info(I18n.t('vagrant.actions.vm.snapshot.saving',
17
+ name: env[:snapshot_name]))
18
+
19
+ nova.create_snapshot(
20
+ env,
21
+ env[:machine].id, env[:snapshot_name])
22
+
23
+ image = nova.list_snapshots(env, env[:machine].id).find { |i| i.name == env[:snapshot_name] }
24
+
25
+ timeout(config.server_create_timeout, Errors::Timeout) do
26
+ loop do
27
+ image_status = nova.get_image_details(env, image.id)
28
+
29
+ break if image_status['status'] == 'ACTIVE'
30
+
31
+ unless image_status['progress'].nil?
32
+ env[:ui].clear_line
33
+ env[:ui].report_progress(image_status['progress'], 100, false)
34
+ end
35
+
36
+ sleep @retry_interval
37
+ end
38
+ end
39
+
40
+ # Clear progress output.
41
+ env[:ui].clear_line
42
+
43
+ env[:ui].success(I18n.t('vagrant.actions.vm.snapshot.saved',
44
+ name: env[:snapshot_name]))
45
+
46
+ @app.call env
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,24 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
4
+
5
+ module VagrantPlugins
6
+ module Openstack
7
+ module Action
8
+ class StartServer < AbstractAction
9
+ def initialize(app, _env)
10
+ @app = app
11
+ @logger = Log4r::Logger.new('vagrant_openstack::action::start_server')
12
+ end
13
+
14
+ def execute(env)
15
+ if env[:machine].id
16
+ env[:ui].info(I18n.t('vagrant_openstack.starting_server'))
17
+ env[:openstack_client].nova.start_server(env, env[:machine].id)
18
+ end
19
+ @app.call(env)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant-openstack-illuin-provider/action/abstract_action'
4
+
5
+ module VagrantPlugins
6
+ module Openstack
7
+ module Action
8
+ class StopServer < AbstractAction
9
+ def initialize(app, _env)
10
+ @app = app
11
+ @logger = Log4r::Logger.new('vagrant_openstack::action::stop_server')
12
+ end
13
+
14
+ def execute(env)
15
+ if env[:machine].id
16
+ @logger.info "Stopping server #{env[:machine].id}..."
17
+ env[:ui].info(I18n.t('vagrant_openstack.stopping_server'))
18
+ env[:openstack_client].nova.stop_server(env, env[:machine].id)
19
+ end
20
+ @app.call(env)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end