vagrant-openstack-provider 0.5.2 → 0.6.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/lib/vagrant-openstack-provider.rb +2 -31
  4. data/lib/vagrant-openstack-provider/action.rb +21 -7
  5. data/lib/vagrant-openstack-provider/action/abstract_action.rb +22 -0
  6. data/lib/vagrant-openstack-provider/action/connect_openstack.rb +19 -40
  7. data/lib/vagrant-openstack-provider/action/create_server.rb +10 -6
  8. data/lib/vagrant-openstack-provider/action/create_stack.rb +67 -0
  9. data/lib/vagrant-openstack-provider/action/delete_server.rb +28 -3
  10. data/lib/vagrant-openstack-provider/action/delete_stack.rb +72 -0
  11. data/lib/vagrant-openstack-provider/action/message.rb +4 -2
  12. data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +4 -2
  13. data/lib/vagrant-openstack-provider/action/read_state.rb +9 -4
  14. data/lib/vagrant-openstack-provider/action/resume.rb +4 -2
  15. data/lib/vagrant-openstack-provider/action/start_server.rb +4 -2
  16. data/lib/vagrant-openstack-provider/action/stop_server.rb +4 -2
  17. data/lib/vagrant-openstack-provider/action/suspend.rb +4 -2
  18. data/lib/vagrant-openstack-provider/action/sync_folders.rb +17 -13
  19. data/lib/vagrant-openstack-provider/action/wait_accessible.rb +5 -2
  20. data/lib/vagrant-openstack-provider/action/wait_active.rb +5 -3
  21. data/lib/vagrant-openstack-provider/action/wait_stop.rb +5 -3
  22. data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +66 -0
  23. data/lib/vagrant-openstack-provider/client/domain.rb +41 -1
  24. data/lib/vagrant-openstack-provider/client/glance.rb +63 -0
  25. data/lib/vagrant-openstack-provider/client/heat.rb +50 -0
  26. data/lib/vagrant-openstack-provider/client/http_utils.rb +18 -0
  27. data/lib/vagrant-openstack-provider/client/neutron.rb +9 -15
  28. data/lib/vagrant-openstack-provider/client/nova.rb +3 -3
  29. data/lib/vagrant-openstack-provider/client/openstack.rb +10 -0
  30. data/lib/vagrant-openstack-provider/command/abstract_command.rb +7 -0
  31. data/lib/vagrant-openstack-provider/command/image_list.rb +12 -2
  32. data/lib/vagrant-openstack-provider/command/main.rb +1 -0
  33. data/lib/vagrant-openstack-provider/command/network_list.rb +3 -3
  34. data/lib/vagrant-openstack-provider/command/subnet_list.rb +25 -0
  35. data/lib/vagrant-openstack-provider/config.rb +78 -7
  36. data/lib/vagrant-openstack-provider/config_resolver.rb +36 -5
  37. data/lib/vagrant-openstack-provider/errors.rb +30 -2
  38. data/lib/vagrant-openstack-provider/logging.rb +39 -0
  39. data/lib/vagrant-openstack-provider/version.rb +1 -1
  40. data/locales/en.yml +107 -4
  41. data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +255 -8
  42. data/spec/vagrant-openstack-provider/action/create_server_spec.rb +6 -1
  43. data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +97 -0
  44. data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +34 -6
  45. data/spec/vagrant-openstack-provider/action/delete_stack_spec.rb +64 -0
  46. data/spec/vagrant-openstack-provider/action/read_state_spec.rb +13 -1
  47. data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +1 -0
  48. data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +1 -1
  49. data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +1 -1
  50. data/spec/vagrant-openstack-provider/client/glance_spec.rb +128 -0
  51. data/spec/vagrant-openstack-provider/client/heat_spec.rb +124 -0
  52. data/spec/vagrant-openstack-provider/client/neutron_spec.rb +33 -1
  53. data/spec/vagrant-openstack-provider/client/nova_spec.rb +2 -2
  54. data/spec/vagrant-openstack-provider/command/image_list_spec.rb +75 -23
  55. data/spec/vagrant-openstack-provider/command/subnet_list_spec.rb +46 -0
  56. data/spec/vagrant-openstack-provider/config_resolver_spec.rb +85 -19
  57. data/spec/vagrant-openstack-provider/config_spec.rb +177 -1
  58. data/spec/vagrant-openstack-provider/spec_helper.rb +3 -0
  59. metadata +20 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06f76da66e9d69d7b3750c87355a2b0cd494d82e
4
- data.tar.gz: 94b6f3cfae8334fecf64e9fc69d1e8e2da651659
3
+ metadata.gz: 6fcb72c6f544989dbe6afa13b2320eb81f35505e
4
+ data.tar.gz: 5f04da4d1e21da40d5d7ad6bb83e471e654292f6
5
5
  SHA512:
6
- metadata.gz: afa0415d10ee018a52bb356c3bb3a387ae9035c84d44696d16f38f87e854cc72a85ed73c002203775f83b5fb7ed5814fc25406ac854e98dbb66f7062509b218f
7
- data.tar.gz: 33d2530168597883a587064f92571ca8a8291efe617b1f38d4ba154eafa90d7b16b7ff08b4d27adf820755b155f2718a8699a7db417d5ad3f70df6d3a3b15aaa
6
+ metadata.gz: b4427ad7ce03abf95ebbc7f1dabc6188d66cb5daf5a8c5b07f9ff21c6bc44b8fdb62767ff4549bdb99c26bca4b775aad0d648d7df13865420e2ec440217705b9
7
+ data.tar.gz: 98450beaed75447f516f1be64dd46b399d6aa4e856d999a01f213fe7a0594693fe74d6108034efd1f200d191e0d597e637c7147a057752304a0295e48bc0d28e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,35 @@
1
+ # 0.6.0 (November 28, 2014)
2
+
3
+ FEATURES:
4
+
5
+ - First implementation of Heat Stacks [#170](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/170)
6
+ - Allow public and private networks to be specified [#148](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/148)
7
+ - Add custom command "subnet-list" [#160](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/160)
8
+ - Allow public and private networks to be specified [#148](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/148)
9
+ - Add config parameter os.region [#128](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/128)
10
+
11
+ IMPROVEMENTS:
12
+
13
+ - Rsync all files [#166](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/166)
14
+ - Support glance API v1 [#168](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/168)
15
+ - Replace fail <string> by fail Errors::... [#152](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/152)
16
+ - When an unknown error occurs, provide information to debug and submit issue [#115](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/115)
17
+ - Print more information for command "vagrant openstack image-list" [#104](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/104)
18
+ - Cannot 'resume' while instance is in vm_state active [#91](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/91)
19
+ - Allow config.floating_ip_pool to take an array as input [#90](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/90)
20
+ - Display the current task value in the status option [#89](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/89)
21
+
22
+ BUG FIXES:
23
+
24
+ - Fix ssh_disabled [#182](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/182)
25
+ - Avoid printing contribution message on user interruption [#169](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/169)
26
+ - Network configuration is lost when machine definition overrides provider's configuration [#146](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/146)
27
+ - When VM status is "ERROR" continue waiting for startup [#62](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/62)
28
+
29
+ DOCUMENTATION:
30
+
31
+ - Add a CONTRIBUTING.md file [#151](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/151)
32
+
1
33
  # 0.5.2 (November 6, 2014)
2
34
 
3
35
  BUG FIXES:
@@ -32,6 +64,8 @@ BUG FIXES:
32
64
  - user_data needs to be Base64 encoded in Nova.createServer [#122](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/122)
33
65
  - SSH failures after port 22 is open because user doesn't exist yet [#106](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/106)
34
66
  - Floating IP should not be mandatory [#55](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/55)
67
+ - sync_folders error under windows 7 [#119](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/119)
68
+ - Ansible provisionner doesn't use our generated SSH key [#133](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/133)
35
69
 
36
70
  # 0.4.1 (October 3, 2014)
37
71
 
@@ -1,6 +1,7 @@
1
1
  require 'pathname'
2
2
 
3
3
  require 'vagrant-openstack-provider/plugin'
4
+ require 'vagrant-openstack-provider/logging'
4
5
 
5
6
  module VagrantPlugins
6
7
  module Openstack
@@ -14,38 +15,8 @@ module VagrantPlugins
14
15
  I18n.reload!
15
16
  end
16
17
 
17
- # This initializes the logging so that our logs are outputted at
18
- # the same level as Vagrant core logs.
19
18
  def self.init_logging
20
- # Initialize logging
21
- level = nil
22
- begin
23
- level = Log4r.const_get(ENV['VAGRANT_LOG'].upcase)
24
- rescue NameError
25
- # This means that the logging constant wasn't found,
26
- # which is fine. We just keep `level` as `nil`. But
27
- # we tell the user.
28
- begin
29
- level = Log4r.const_get(ENV['VAGRANT_OPENSTACK_LOG'].upcase)
30
- rescue NameError
31
- level = nil
32
- end
33
- end
34
-
35
- # Some constants, such as "true" resolve to booleans, so the
36
- # above error checking doesn't catch it. This will check to make
37
- # sure that the log level is an integer, as Log4r requires.
38
- level = nil unless level.is_a?(Integer)
39
-
40
- # Set the logging level
41
- # logs as long as we have a valid level.
42
- if level
43
- logger = Log4r::Logger.new('vagrant_openstack')
44
- out = Log4r::Outputter.stdout
45
- out.formatter = Log4r::PatternFormatter.new(pattern: '%d | %5l | %m', date_pattern: '%Y-%m-%d %H:%M')
46
- logger.outputters = out
47
- logger.level = level
48
- end
19
+ Logging.init
49
20
  end
50
21
 
51
22
  # This returns the path to the source of this plugin.
@@ -18,6 +18,7 @@ module VagrantPlugins
18
18
  b2.use Message, I18n.t('vagrant_openstack.not_created')
19
19
  else
20
20
  b2.use DeleteServer
21
+ b2.use DeleteStack
21
22
  end
22
23
  end
23
24
  end
@@ -97,10 +98,13 @@ module VagrantPlugins
97
98
  b.use Call, ReadState do |env, b2|
98
99
  case env[:machine_state_id]
99
100
  when :not_created
100
- b2.use Provision
101
+ ssh_disabled = env[:machine].provider_config.ssh_disabled
102
+ b2.use Provision unless ssh_disabled
101
103
  b2.use SyncFolders
104
+ b2.use CreateStack
102
105
  b2.use CreateServer
103
- b2.use WaitForServerToBeAccessible
106
+ b2.use Message, I18n.t('vagrant_openstack.ssh_disabled_provisioning') if ssh_disabled
107
+ b2.use WaitForServerToBeAccessible unless ssh_disabled
104
108
  when :shutoff
105
109
  b2.use StartServer
106
110
  when :suspended
@@ -128,17 +132,21 @@ module VagrantPlugins
128
132
 
129
133
  # This is the action that is primarily responsible for suspending
130
134
  # the virtual machine.
135
+ # Vm cannot be suspended when the machine_state_id is not "active" (typically a task is ongoing)
131
136
  def self.action_suspend
132
137
  new_builder.tap do |b|
133
138
  b.use ConfigValidate
134
139
  b.use ConnectOpenstack
135
140
  b.use Call, ReadState do |env, b2|
136
- if env[:machine_state_id] == :not_created
141
+ case env[:machine_state_id]
142
+ when :not_created
137
143
  b2.use Message, I18n.t('vagrant_openstack.not_created')
138
- elsif env[:machine_state_id] == :suspended
144
+ when :suspended
139
145
  b2.use Message, I18n.t('vagrant_openstack.already_suspended')
140
- else
146
+ when :active
141
147
  b2.use Suspend
148
+ else
149
+ b2.use Message, I18n.t('vagrant_openstack.ongoing_task')
142
150
  end
143
151
  end
144
152
  end
@@ -146,15 +154,19 @@ module VagrantPlugins
146
154
 
147
155
  # This is the action that is primarily responsible for resuming
148
156
  # suspended machines.
157
+ # Vm cannot be resumed when the machine_state_id is not suspended.
149
158
  def self.action_resume
150
159
  new_builder.tap do |b|
151
160
  b.use ConfigValidate
152
161
  b.use ConnectOpenstack
153
162
  b.use Call, ReadState do |env, b2|
154
- if env[:machine_state_id] == :not_created
163
+ case env[:machine_state_id]
164
+ when :not_created
155
165
  b2.use Message, I18n.t('vagrant_openstack.not_created')
156
- else
166
+ when :suspended
157
167
  b2.use Resume
168
+ else
169
+ b2.use Message, I18n.t('vagrant_openstack.not_suspended')
158
170
  end
159
171
  end
160
172
  end
@@ -190,6 +202,8 @@ module VagrantPlugins
190
202
  autoload :Message, action_root.join('message')
191
203
  autoload :ConnectOpenstack, action_root.join('connect_openstack')
192
204
  autoload :CreateServer, action_root.join('create_server')
205
+ autoload :CreateStack, action_root.join('create_stack')
206
+ autoload :DeleteStack, action_root.join('delete_stack')
193
207
  autoload :DeleteServer, action_root.join('delete_server')
194
208
  autoload :StopServer, action_root.join('stop_server')
195
209
  autoload :StartServer, action_root.join('start_server')
@@ -0,0 +1,22 @@
1
+ require 'colorize'
2
+
3
+ module VagrantPlugins
4
+ module Openstack
5
+ module Action
6
+ class AbstractAction
7
+ def call(env)
8
+ execute(env)
9
+ # rubocop:disable Style/SpecialGlobalVars
10
+ # rubocop:disable Lint/RescueException
11
+ rescue Errors::VagrantOpenstackError, SystemExit, Interrupt => e
12
+ raise e
13
+ rescue Exception => e
14
+ puts I18n.t('vagrant_openstack.global_error').red unless e.message && e.message.start_with?('Catched Error:')
15
+ raise $!, "Catched Error: #{$!}", $!.backtrace
16
+ end
17
+ # rubocop:enable Lint/RescueException
18
+ # rubocop:enable Style/SpecialGlobalVars
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,25 +4,30 @@ require 'json'
4
4
 
5
5
  require 'vagrant-openstack-provider/client/openstack'
6
6
  require 'vagrant-openstack-provider/client/request_logger'
7
+ require 'vagrant-openstack-provider/action/abstract_action'
8
+ require 'vagrant-openstack-provider/catalog/openstack_catalog'
7
9
 
8
10
  module VagrantPlugins
9
11
  module Openstack
10
12
  module Action
11
- class ConnectOpenstack
13
+ class ConnectOpenstack < AbstractAction
12
14
  include VagrantPlugins::Openstack::HttpUtils::RequestLogger
15
+ include VagrantPlugins::Openstack::Catalog
13
16
 
14
- def initialize(app, env)
17
+ def initialize(app, env, catalog_reader = OpenstackCatalog.new)
15
18
  @app = app
16
19
  @logger = Log4r::Logger.new('vagrant_openstack::action::connect_openstack')
20
+ @catalog_reader = catalog_reader
17
21
  env[:openstack_client] = VagrantPlugins::Openstack
18
22
  end
19
23
 
20
- def call(env)
24
+ def execute(env)
21
25
  client = env[:openstack_client]
22
26
  if client.session.token.nil?
23
27
  catalog = client.keystone.authenticate(env)
24
- read_endpoint_catalog(env, catalog)
28
+ @catalog_reader.read(env, catalog)
25
29
  override_endpoint_catalog_with_user_config(env)
30
+ check_configuration(env)
26
31
  log_endpoint_catalog(env)
27
32
  end
28
33
  @app.call(env) unless @app.nil?
@@ -30,45 +35,19 @@ module VagrantPlugins
30
35
 
31
36
  private
32
37
 
33
- def read_endpoint_catalog(env, catalog)
34
- config = env[:machine].provider_config
35
- client = env[:openstack_client]
36
- @logger.info(I18n.t('vagrant_openstack.client.looking_for_available_endpoints'))
37
-
38
- catalog.each do |service|
39
- se = service['endpoints']
40
- if se.size > 1
41
- env[:ui].warn I18n.t('vagrant_openstack.client.multiple_endpoint', size: se.size, type: service['type'])
42
- env[:ui].warn " => #{service['endpoints'][0]['publicURL']}"
43
- end
44
- url = se[0]['publicURL'].strip
45
- client.session.endpoints[service['type'].to_sym] = url unless url.empty?
46
- end
47
-
48
- read_network_api_version(env) if config.openstack_network_url.nil? && !client.session.endpoints[:network].nil?
49
- end
50
-
51
- def read_network_api_version(env)
52
- client = env[:openstack_client]
53
- versions = client.neutron.get_api_version_list(env)
54
- if versions.size > 1
55
- version_list = ''
56
- versions.each do |version|
57
- links = version['links'].map { |l| l['href'] }
58
- version_list << "#{version['id'].ljust(6)} #{version['status'].ljust(10)} #{links}\n"
59
- end
60
- fail Errors::MultipleApiVersion, api_name: 'Neutron', url_property: 'openstack_network_url', version_list: version_list
61
- end
62
- client.session.endpoints[:network] = versions.first['links'].first['href']
63
- end
64
-
65
38
  def override_endpoint_catalog_with_user_config(env)
66
39
  client = env[:openstack_client]
67
40
  config = env[:machine].provider_config
68
- client.session.endpoints[:compute] = config.openstack_compute_url unless config.openstack_compute_url.nil?
69
- client.session.endpoints[:network] = config.openstack_network_url unless config.openstack_network_url.nil?
70
- client.session.endpoints[:volume] = config.openstack_volume_url unless config.openstack_volume_url.nil?
71
- client.session.endpoints.delete_if { |_, value| value.nil? || value.empty? }
41
+ endpoints = client.session.endpoints
42
+ endpoints[:compute] = config.openstack_compute_url unless config.openstack_compute_url.nil?
43
+ endpoints[:network] = config.openstack_network_url unless config.openstack_network_url.nil?
44
+ endpoints[:volume] = config.openstack_volume_url unless config.openstack_volume_url.nil?
45
+ endpoints[:image] = config.openstack_image_url unless config.openstack_image_url.nil?
46
+ endpoints.delete_if { |_, value| value.nil? || value.empty? }
47
+ end
48
+
49
+ def check_configuration(env)
50
+ fail Errors::MissingNovaEndpoint unless env[:openstack_client].session.endpoints.key? :compute
72
51
  end
73
52
 
74
53
  def log_endpoint_catalog(env)
@@ -5,12 +5,13 @@ require 'sshkey'
5
5
 
6
6
  require 'vagrant-openstack-provider/config_resolver'
7
7
  require 'vagrant-openstack-provider/utils'
8
+ require 'vagrant-openstack-provider/action/abstract_action'
8
9
  require 'vagrant/util/retryable'
9
10
 
10
11
  module VagrantPlugins
11
12
  module Openstack
12
13
  module Action
13
- class CreateServer
14
+ class CreateServer < AbstractAction
14
15
  include Vagrant::Util::Retryable
15
16
 
16
17
  def initialize(app, _env, resolver = ConfigResolver.new, utils = Utils.new)
@@ -20,7 +21,7 @@ module VagrantPlugins
20
21
  @utils = utils
21
22
  end
22
23
 
23
- def call(env)
24
+ def execute(env)
24
25
  @logger.info 'Start create server action'
25
26
 
26
27
  config = env[:machine].provider_config
@@ -127,12 +128,15 @@ module VagrantPlugins
127
128
  end
128
129
 
129
130
  def waiting_for_server_to_be_built(env, server_id, retry_interval = 3, timeout = 200)
130
- @logger.info 'Waiting for the server to be built...'
131
+ @logger.info "Waiting for the server with id #{server_id} to be built..."
131
132
  env[:ui].info(I18n.t('vagrant_openstack.waiting_for_build'))
132
- timeout(timeout) do
133
- while env[:openstack_client].nova.get_server_details(env, server_id)['status'] != 'ACTIVE'
134
- sleep retry_interval
133
+ timeout(timeout, Errors::Timeout) do
134
+ server_status = 'WAITING'
135
+ until server_status == 'ACTIVE'
135
136
  @logger.debug('Waiting for server to be ACTIVE')
137
+ server_status = env[:openstack_client].nova.get_server_details(env, server_id)['status']
138
+ fail Errors::ServerStatusError, server: server_id if server_status == 'ERROR'
139
+ sleep retry_interval
136
140
  end
137
141
  end
138
142
  end
@@ -0,0 +1,67 @@
1
+ require 'log4r'
2
+ require 'socket'
3
+ require 'timeout'
4
+ require 'sshkey'
5
+ require 'yaml'
6
+
7
+ require 'vagrant-openstack-provider/config_resolver'
8
+ require 'vagrant-openstack-provider/utils'
9
+ require 'vagrant-openstack-provider/action/abstract_action'
10
+ require 'vagrant/util/retryable'
11
+
12
+ module VagrantPlugins
13
+ module Openstack
14
+ module Action
15
+ class CreateStack < AbstractAction
16
+ def initialize(app, _env)
17
+ @app = app
18
+ @logger = Log4r::Logger.new('vagrant_openstack::action::create_stack')
19
+ end
20
+
21
+ def execute(env)
22
+ @logger.info 'Start create stacks action'
23
+
24
+ config = env[:machine].provider_config
25
+
26
+ heat = env[:openstack_client].heat
27
+
28
+ config.stacks.each do |stack|
29
+ env[:ui].info(I18n.t('vagrant_openstack.create_stack'))
30
+ env[:ui].info(" -- Stack Name : #{stack[:name]}")
31
+ env[:ui].info(" -- Template : #{stack[:template]}")
32
+
33
+ create_opts = {
34
+ name: stack[:name],
35
+ template: YAML.load_file(stack[:template])
36
+ }
37
+
38
+ stack_id = heat.create_stack(env, create_opts)
39
+
40
+ file_path = "#{env[:machine].data_dir}/stack_#{stack[:name]}_id"
41
+ File.write(file_path, stack_id)
42
+
43
+ waiting_for_stack_to_be_created(env, stack[:name], stack_id)
44
+ end unless config.stacks.nil?
45
+
46
+ @app.call(env)
47
+ end
48
+
49
+ private
50
+
51
+ def waiting_for_stack_to_be_created(env, stack_name, stack_id, retry_interval = 3, timeout = 200)
52
+ @logger.info "Waiting for the stack with id #{stack_id} to be built..."
53
+ env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack'))
54
+ timeout(timeout, Errors::Timeout) do
55
+ stack_status = 'CREATE_IN_PROGRESS'
56
+ until stack_status == 'CREATE_COMPLETE'
57
+ @logger.debug('Waiting for stack to be CREATED')
58
+ stack_status = env[:openstack_client].heat.get_stack_details(env, stack_name, stack_id)['stack_status']
59
+ fail Errors::StackStatusError, stack: stack_id if stack_status == 'CREATE_FAILED'
60
+ sleep retry_interval
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,26 +1,51 @@
1
1
  require 'log4r'
2
2
 
3
+ require 'vagrant-openstack-provider/action/abstract_action'
4
+
3
5
  module VagrantPlugins
4
6
  module Openstack
5
7
  module Action
6
8
  # This deletes the running server, if there is one.
7
- class DeleteServer
9
+ class DeleteServer < AbstractAction
8
10
  def initialize(app, _env)
9
11
  @app = app
10
12
  @logger = Log4r::Logger.new('vagrant_openstack::action::delete_server')
11
13
  end
12
14
 
13
- def call(env)
15
+ def execute(env)
14
16
  if env[:machine].id
15
17
  @logger.info "Deleting server #{env[:machine].id}..."
16
18
  env[:ui].info(I18n.t('vagrant_openstack.deleting_server'))
17
19
  env[:openstack_client].nova.delete_server(env, env[:machine].id)
18
20
  env[:openstack_client].nova.delete_keypair_if_vagrant(env, env[:machine].id)
19
- env[:machine].id = nil
21
+
22
+ waiting_for_instance_to_be_deleted(env, env[:machine].id)
23
+
20
24
  end
21
25
 
22
26
  @app.call(env)
23
27
  end
28
+
29
+ private
30
+
31
+ def waiting_for_instance_to_be_deleted(env, instance_id, retry_interval = 3, timeout = 200)
32
+ @logger.info "Waiting for the instance with id #{instance_id} to be deleted..."
33
+ env[:ui].info(I18n.t('vagrant_openstack.waiting_deleted'))
34
+ timeout(timeout, Errors::Timeout) do
35
+ delete_ok = false
36
+ until delete_ok
37
+ begin
38
+ @logger.debug('Waiting for instance to be DELETED')
39
+ server_status = env[:openstack_client].nova.get_server_details(env, instance_id)['status']
40
+ fail Errors::ServerStatusError, server: instance_id if server_status == 'ERROR'
41
+ break if server_status == 'DELETED'
42
+ sleep retry_interval
43
+ rescue Errors::InstanceNotFound
44
+ delete_ok = true
45
+ end
46
+ end
47
+ end
48
+ end
24
49
  end
25
50
  end
26
51
  end