vagrant-openstack-provider-illuin 0.11.1

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 +276 -0
  5. data/Gemfile +22 -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-provider.rb +29 -0
  17. data/lib/vagrant-openstack-provider/action.rb +344 -0
  18. data/lib/vagrant-openstack-provider/action/abstract_action.rb +22 -0
  19. data/lib/vagrant-openstack-provider/action/connect_openstack.rb +60 -0
  20. data/lib/vagrant-openstack-provider/action/create_server.rb +184 -0
  21. data/lib/vagrant-openstack-provider/action/create_stack.rb +76 -0
  22. data/lib/vagrant-openstack-provider/action/delete_server.rb +53 -0
  23. data/lib/vagrant-openstack-provider/action/delete_stack.rb +73 -0
  24. data/lib/vagrant-openstack-provider/action/message.rb +19 -0
  25. data/lib/vagrant-openstack-provider/action/provision.rb +60 -0
  26. data/lib/vagrant-openstack-provider/action/read_ssh_info.rb +74 -0
  27. data/lib/vagrant-openstack-provider/action/read_state.rb +43 -0
  28. data/lib/vagrant-openstack-provider/action/resume.rb +24 -0
  29. data/lib/vagrant-openstack-provider/action/snapshot_cleanup.rb +32 -0
  30. data/lib/vagrant-openstack-provider/action/snapshot_delete.rb +32 -0
  31. data/lib/vagrant-openstack-provider/action/snapshot_list.rb +22 -0
  32. data/lib/vagrant-openstack-provider/action/snapshot_restore.rb +29 -0
  33. data/lib/vagrant-openstack-provider/action/snapshot_save.rb +51 -0
  34. data/lib/vagrant-openstack-provider/action/start_server.rb +24 -0
  35. data/lib/vagrant-openstack-provider/action/stop_server.rb +25 -0
  36. data/lib/vagrant-openstack-provider/action/suspend.rb +24 -0
  37. data/lib/vagrant-openstack-provider/action/sync_folders.rb +138 -0
  38. data/lib/vagrant-openstack-provider/action/wait_active.rb +33 -0
  39. data/lib/vagrant-openstack-provider/action/wait_stop.rb +33 -0
  40. data/lib/vagrant-openstack-provider/cap/snapshot_list.rb +15 -0
  41. data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +90 -0
  42. data/lib/vagrant-openstack-provider/client/cinder.rb +39 -0
  43. data/lib/vagrant-openstack-provider/client/domain.rb +163 -0
  44. data/lib/vagrant-openstack-provider/client/glance.rb +65 -0
  45. data/lib/vagrant-openstack-provider/client/heat.rb +49 -0
  46. data/lib/vagrant-openstack-provider/client/http_utils.rb +116 -0
  47. data/lib/vagrant-openstack-provider/client/keystone.rb +128 -0
  48. data/lib/vagrant-openstack-provider/client/neutron.rb +48 -0
  49. data/lib/vagrant-openstack-provider/client/nova.rb +303 -0
  50. data/lib/vagrant-openstack-provider/client/openstack.rb +59 -0
  51. data/lib/vagrant-openstack-provider/client/request_logger.rb +23 -0
  52. data/lib/vagrant-openstack-provider/client/rest_utils.rb +28 -0
  53. data/lib/vagrant-openstack-provider/command/abstract_command.rb +51 -0
  54. data/lib/vagrant-openstack-provider/command/flavor_list.rb +24 -0
  55. data/lib/vagrant-openstack-provider/command/floatingip_list.rb +32 -0
  56. data/lib/vagrant-openstack-provider/command/image_list.rb +29 -0
  57. data/lib/vagrant-openstack-provider/command/main.rb +52 -0
  58. data/lib/vagrant-openstack-provider/command/network_list.rb +25 -0
  59. data/lib/vagrant-openstack-provider/command/openstack_command.rb +16 -0
  60. data/lib/vagrant-openstack-provider/command/reset.rb +20 -0
  61. data/lib/vagrant-openstack-provider/command/subnet_list.rb +22 -0
  62. data/lib/vagrant-openstack-provider/command/utils.rb +22 -0
  63. data/lib/vagrant-openstack-provider/command/volume_list.rb +25 -0
  64. data/lib/vagrant-openstack-provider/config.rb +498 -0
  65. data/lib/vagrant-openstack-provider/config/http.rb +39 -0
  66. data/lib/vagrant-openstack-provider/config_resolver.rb +334 -0
  67. data/lib/vagrant-openstack-provider/errors.rb +187 -0
  68. data/lib/vagrant-openstack-provider/logging.rb +39 -0
  69. data/lib/vagrant-openstack-provider/plugin.rb +58 -0
  70. data/lib/vagrant-openstack-provider/provider.rb +50 -0
  71. data/lib/vagrant-openstack-provider/utils.rb +36 -0
  72. data/lib/vagrant-openstack-provider/version.rb +15 -0
  73. data/lib/vagrant-openstack-provider/version_checker.rb +76 -0
  74. data/locales/en.yml +412 -0
  75. data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +770 -0
  76. data/spec/vagrant-openstack-provider/action/create_server_spec.rb +260 -0
  77. data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +99 -0
  78. data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +89 -0
  79. data/spec/vagrant-openstack-provider/action/delete_stack_spec.rb +63 -0
  80. data/spec/vagrant-openstack-provider/action/message_spec.rb +33 -0
  81. data/spec/vagrant-openstack-provider/action/provision_spec.rb +97 -0
  82. data/spec/vagrant-openstack-provider/action/read_ssh_info_spec.rb +201 -0
  83. data/spec/vagrant-openstack-provider/action/read_state_spec.rb +81 -0
  84. data/spec/vagrant-openstack-provider/action/resume_server_spec.rb +49 -0
  85. data/spec/vagrant-openstack-provider/action/start_server_spec.rb +49 -0
  86. data/spec/vagrant-openstack-provider/action/stop_server_spec.rb +49 -0
  87. data/spec/vagrant-openstack-provider/action/suspend_server_spec.rb +49 -0
  88. data/spec/vagrant-openstack-provider/action/sync_folders_spec.rb +155 -0
  89. data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +53 -0
  90. data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +53 -0
  91. data/spec/vagrant-openstack-provider/action_spec.rb +120 -0
  92. data/spec/vagrant-openstack-provider/client/cinder_spec.rb +129 -0
  93. data/spec/vagrant-openstack-provider/client/glance_spec.rb +145 -0
  94. data/spec/vagrant-openstack-provider/client/heat_spec.rb +130 -0
  95. data/spec/vagrant-openstack-provider/client/keystone_spec.rb +226 -0
  96. data/spec/vagrant-openstack-provider/client/neutron_spec.rb +173 -0
  97. data/spec/vagrant-openstack-provider/client/nova_spec.rb +760 -0
  98. data/spec/vagrant-openstack-provider/client/utils_spec.rb +176 -0
  99. data/spec/vagrant-openstack-provider/command/flavor_list_spec.rb +43 -0
  100. data/spec/vagrant-openstack-provider/command/floatingip_list_spec.rb +74 -0
  101. data/spec/vagrant-openstack-provider/command/image_list_spec.rb +95 -0
  102. data/spec/vagrant-openstack-provider/command/network_list_spec.rb +65 -0
  103. data/spec/vagrant-openstack-provider/command/reset_spec.rb +24 -0
  104. data/spec/vagrant-openstack-provider/command/subnet_list_spec.rb +45 -0
  105. data/spec/vagrant-openstack-provider/command/volume_list_spec.rb +40 -0
  106. data/spec/vagrant-openstack-provider/config_resolver_spec.rb +879 -0
  107. data/spec/vagrant-openstack-provider/config_spec.rb +414 -0
  108. data/spec/vagrant-openstack-provider/e2e_spec.rb.save +27 -0
  109. data/spec/vagrant-openstack-provider/provider_spec.rb +13 -0
  110. data/spec/vagrant-openstack-provider/spec_helper.rb +37 -0
  111. data/spec/vagrant-openstack-provider/utils_spec.rb +128 -0
  112. data/spec/vagrant-openstack-provider/version_checker_spec.rb +39 -0
  113. data/stackrc +25 -0
  114. data/vagrant-openstack-provider-illuin.gemspec +34 -0
  115. metadata +362 -0
@@ -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
@@ -0,0 +1,60 @@
1
+ require 'log4r'
2
+ require 'json'
3
+
4
+ require 'vagrant-openstack-provider/client/openstack'
5
+ require 'vagrant-openstack-provider/client/request_logger'
6
+ require 'vagrant-openstack-provider/action/abstract_action'
7
+ require 'vagrant-openstack-provider/catalog/openstack_catalog'
8
+
9
+ module VagrantPlugins
10
+ module Openstack
11
+ module Action
12
+ class ConnectOpenstack < AbstractAction
13
+ include VagrantPlugins::Openstack::HttpUtils::RequestLogger
14
+ include VagrantPlugins::Openstack::Catalog
15
+
16
+ def initialize(app, env, catalog_reader = OpenstackCatalog.new)
17
+ @app = app
18
+ @logger = Log4r::Logger.new('vagrant_openstack::action::connect_openstack')
19
+ @catalog_reader = catalog_reader
20
+ env[:openstack_client] = VagrantPlugins::Openstack
21
+ end
22
+
23
+ def execute(env)
24
+ client = env[:openstack_client]
25
+ if client.session.token.nil?
26
+ catalog = client.keystone.authenticate(env)
27
+ @catalog_reader.read(env, catalog)
28
+ override_endpoint_catalog_with_user_config(env)
29
+ check_configuration(env)
30
+ log_endpoint_catalog(env)
31
+ end
32
+ @app.call(env) unless @app.nil?
33
+ end
34
+
35
+ private
36
+
37
+ def override_endpoint_catalog_with_user_config(env)
38
+ client = env[:openstack_client]
39
+ config = env[:machine].provider_config
40
+ endpoints = client.session.endpoints
41
+ endpoints[:compute] = config.openstack_compute_url unless config.openstack_compute_url.nil?
42
+ endpoints[:network] = config.openstack_network_url unless config.openstack_network_url.nil?
43
+ endpoints[:volume] = config.openstack_volume_url unless config.openstack_volume_url.nil?
44
+ endpoints[:image] = config.openstack_image_url unless config.openstack_image_url.nil?
45
+ endpoints.delete_if { |_, value| value.nil? || value.empty? }
46
+ end
47
+
48
+ def check_configuration(env)
49
+ fail Errors::MissingNovaEndpoint unless env[:openstack_client].session.endpoints.key? :compute
50
+ end
51
+
52
+ def log_endpoint_catalog(env)
53
+ env[:openstack_client].session.endpoints.each do |key, value|
54
+ @logger.info(" -- #{key.to_s.ljust 15}: #{value}")
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,184 @@
1
+ require 'log4r'
2
+ require 'socket'
3
+ require 'timeout'
4
+ require 'sshkey'
5
+
6
+ require 'vagrant-openstack-provider/config_resolver'
7
+ require 'vagrant-openstack-provider/utils'
8
+ require 'vagrant-openstack-provider/action/abstract_action'
9
+ require 'vagrant/util/retryable'
10
+
11
+ module VagrantPlugins
12
+ module Openstack
13
+ module Action
14
+ class CreateServer < AbstractAction
15
+ include Vagrant::Util::Retryable
16
+
17
+ def initialize(app, _env, resolver = ConfigResolver.new, utils = Utils.new)
18
+ @app = app
19
+ @logger = Log4r::Logger.new('vagrant_openstack::action::create_server')
20
+ @resolver = resolver
21
+ @utils = utils
22
+ end
23
+
24
+ def execute(env)
25
+ @logger.info 'Start create server action'
26
+
27
+ config = env[:machine].provider_config
28
+
29
+ fail Errors::MissingBootOption if config.image.nil? && config.volume_boot.nil?
30
+ fail Errors::ConflictBootOption unless config.image.nil? || config.volume_boot.nil?
31
+
32
+ options = {
33
+ flavor: @resolver.resolve_flavor(env),
34
+ image: @resolver.resolve_image(env),
35
+ volume_boot: @resolver.resolve_volume_boot(env),
36
+ networks: @resolver.resolve_networks(env),
37
+ volumes: @resolver.resolve_volumes(env),
38
+ keypair_name: @resolver.resolve_keypair(env),
39
+ availability_zone: env[:machine].provider_config.availability_zone,
40
+ scheduler_hints: env[:machine].provider_config.scheduler_hints,
41
+ security_groups: @resolver.resolve_security_groups(env),
42
+ user_data: env[:machine].provider_config.user_data,
43
+ metadata: env[:machine].provider_config.metadata
44
+ }
45
+
46
+ server_id = create_server(env, options)
47
+
48
+ # Store the ID right away so we can track it
49
+ env[:machine].id = server_id
50
+
51
+ waiting_for_server_to_be_built(env, server_id)
52
+ assign_floating_ip(env, server_id)
53
+ waiting_for_floating_ip_to_be_assigned(env, server_id)
54
+ attach_volumes(env, server_id, options[:volumes]) unless options[:volumes].empty?
55
+
56
+ @app.call(env)
57
+ end
58
+
59
+ private
60
+
61
+ def create_server(env, options)
62
+ config = env[:machine].provider_config
63
+ nova = env[:openstack_client].nova
64
+ server_name = config.server_name || env[:machine].name
65
+
66
+ env[:ui].info(I18n.t('vagrant_openstack.launching_server'))
67
+ env[:ui].info(" -- Tenant : #{config.tenant_name}")
68
+ env[:ui].info(" -- Name : #{server_name}")
69
+ env[:ui].info(" -- Flavor : #{options[:flavor].name}")
70
+ env[:ui].info(" -- FlavorRef : #{options[:flavor].id}")
71
+ unless options[:image].nil?
72
+ env[:ui].info(" -- Image : #{options[:image].name}")
73
+ env[:ui].info(" -- ImageRef : #{options[:image].id}")
74
+ end
75
+ env[:ui].info(" -- Boot volume : #{options[:volume_boot][:id]} (#{options[:volume_boot][:device]})") unless options[:volume_boot].nil?
76
+ env[:ui].info(" -- KeyPair : #{options[:keypair_name]}") unless options[:keypair_name].nil?
77
+
78
+ unless options[:networks].empty?
79
+ formated_networks = ' -- '
80
+ if options[:networks].size == 1
81
+ formated_networks << 'Network : '
82
+ else
83
+ formated_networks << 'Networks : '
84
+ end
85
+ formated_networks << options[:networks].map do |n|
86
+ if n.key? :fixed_ip
87
+ "#{n[:uuid]} (#{n[:fixed_ip]})"
88
+ else
89
+ n[:uuid]
90
+ end
91
+ end.join(', ')
92
+ env[:ui].info(formated_networks)
93
+ end
94
+
95
+ unless options[:volumes].empty?
96
+ options[:volumes].each do |volume|
97
+ device = volume[:device]
98
+ device = :auto if device.nil?
99
+ env[:ui].info(" -- Volume attached : #{volume[:id]} => #{device}")
100
+ end
101
+ end
102
+
103
+ log = "Launching server '#{server_name}' in project '#{config.tenant_name}' "
104
+ log << "with flavor '#{options[:flavor].name}' (#{options[:flavor].id}), "
105
+ unless options[:image].nil?
106
+ log << "image '#{options[:image].name}' (#{options[:image].id}) "
107
+ end
108
+ unless options[:keypair_name].nil?
109
+ log << "and keypair '#{options[:keypair_name]}'"
110
+ end
111
+
112
+ @logger.info(log)
113
+
114
+ image_ref = options[:image].id unless options[:image].nil?
115
+
116
+ create_opts = {
117
+ name: server_name,
118
+ image_ref: image_ref,
119
+ volume_boot: options[:volume_boot],
120
+ flavor_ref: options[:flavor].id,
121
+ keypair: options[:keypair_name],
122
+ availability_zone: options[:availability_zone],
123
+ networks: options[:networks],
124
+ scheduler_hints: options[:scheduler_hints],
125
+ security_groups: options[:security_groups],
126
+ user_data: options[:user_data],
127
+ metadata: options[:metadata]
128
+ }
129
+
130
+ nova.create_server(env, create_opts)
131
+ end
132
+
133
+ def waiting_for_server_to_be_built(env, server_id, retry_interval = 3)
134
+ @logger.info "Waiting for the server with id #{server_id} to be built..."
135
+ env[:ui].info(I18n.t('vagrant_openstack.waiting_for_build'))
136
+ config = env[:machine].provider_config
137
+ Timeout.timeout(config.server_create_timeout, Errors::Timeout) do
138
+ server_status = 'WAITING'
139
+ until server_status == 'ACTIVE'
140
+ @logger.debug('Waiting for server to be ACTIVE')
141
+ server_status = env[:openstack_client].nova.get_server_details(env, server_id)['status']
142
+ fail Errors::ServerStatusError, server: server_id if server_status == 'ERROR'
143
+ sleep retry_interval
144
+ end
145
+ end
146
+ end
147
+
148
+ def assign_floating_ip(env, server_id)
149
+ floating_ip = @resolver.resolve_floating_ip(env)
150
+ return if !floating_ip || floating_ip.empty?
151
+ @logger.info "Using floating IP #{floating_ip}"
152
+ env[:ui].info(I18n.t('vagrant_openstack.using_floating_ip', floating_ip: floating_ip))
153
+ env[:openstack_client].nova.add_floating_ip(env, server_id, floating_ip)
154
+ rescue Errors::UnableToResolveFloatingIP
155
+ @logger.info 'Vagrant was unable to resolve FloatingIP, continue assuming it is not necessary'
156
+ end
157
+
158
+ def waiting_for_floating_ip_to_be_assigned(env, server_id, retry_interval = 3)
159
+ floating_ip = @resolver.resolve_floating_ip(env)
160
+ return if !floating_ip || floating_ip.empty?
161
+ @logger.info "Waiting for floating IP #{floating_ip} to be assigned"
162
+ env[:ui].info(I18n.t('vagrant_openstack.waiting_for_floating_ip', floating_ip: floating_ip))
163
+ config = env[:machine].provider_config
164
+ Timeout.timeout(config.floating_ip_assign_timeout, Errors::Timeout) do
165
+ until env[:openstack_client].nova.check_assigned_floating_ip(env, server_id, floating_ip)
166
+ sleep retry_interval
167
+ end
168
+ return
169
+ end
170
+ rescue Errors::UnableToResolveFloatingIP
171
+ @logger.info 'Vagrant was unable to resolve FloatingIP, not waiting for assignment'
172
+ end
173
+
174
+ def attach_volumes(env, server_id, volumes)
175
+ @logger.info("Attaching volumes #{volumes} to server #{server_id}")
176
+ volumes.each do |volume|
177
+ @logger.debug("Attaching volumes #{volume}")
178
+ env[:openstack_client].nova.attach_volume(env, server_id, volume[:id], volume[:device])
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,76 @@
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
+ @@is_created = false
17
+
18
+ def initialize(app, _env)
19
+ @app = app
20
+ @logger = Log4r::Logger.new('vagrant_openstack::action::create_stack')
21
+ end
22
+
23
+ def execute(env)
24
+ if @@is_created
25
+ @app.call(env)
26
+ return
27
+ end
28
+
29
+ @logger.info 'Start create stacks action'
30
+
31
+ config = env[:machine].provider_config
32
+
33
+ heat = env[:openstack_client].heat
34
+
35
+ config.stacks.each do |stack|
36
+ env[:ui].info(I18n.t('vagrant_openstack.create_stack'))
37
+ env[:ui].info(" -- Stack Name : #{stack[:name]}")
38
+ env[:ui].info(" -- Template : #{stack[:template]}")
39
+
40
+ create_opts = {
41
+ name: stack[:name],
42
+ template: YAML.load_file(stack[:template])
43
+ }
44
+
45
+ stack_id = heat.create_stack(env, create_opts)
46
+
47
+ file_path = "#{env[:machine].data_dir}/stack_#{stack[:name]}_id"
48
+ File.write(file_path, stack_id)
49
+
50
+ waiting_for_stack_to_be_created(env, stack[:name], stack_id)
51
+ end unless config.stacks.nil?
52
+
53
+ @@is_created = true
54
+ @app.call(env)
55
+ end
56
+
57
+ private
58
+
59
+ def waiting_for_stack_to_be_created(env, stack_name, stack_id, retry_interval = 3)
60
+ @logger.info "Waiting for the stack with id #{stack_id} to be built..."
61
+ env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack'))
62
+ config = env[:machine].provider_config
63
+ Timeout.timeout(config.stack_create_timeout, Errors::Timeout) do
64
+ stack_status = 'CREATE_IN_PROGRESS'
65
+ until stack_status == 'CREATE_COMPLETE'
66
+ @logger.debug('Waiting for stack to be CREATED')
67
+ stack_status = env[:openstack_client].heat.get_stack_details(env, stack_name, stack_id)['stack_status']
68
+ fail Errors::StackStatusError, stack: stack_id if stack_status == 'CREATE_FAILED'
69
+ sleep retry_interval
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,53 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant-openstack-provider/action/abstract_action'
4
+
5
+ module VagrantPlugins
6
+ module Openstack
7
+ module Action
8
+ # This deletes the running server, if there is one.
9
+ class DeleteServer < AbstractAction
10
+ def initialize(app, _env)
11
+ @app = app
12
+ @logger = Log4r::Logger.new('vagrant_openstack::action::delete_server')
13
+ end
14
+
15
+ def execute(env)
16
+ if env[:machine].id
17
+ @logger.info "Deleting server #{env[:machine].id}..."
18
+ env[:ui].info(I18n.t('vagrant_openstack.deleting_server'))
19
+ env[:openstack_client].nova.delete_server(env, env[:machine].id)
20
+ env[:openstack_client].nova.delete_keypair_if_vagrant(env, env[:machine].id)
21
+
22
+ waiting_for_instance_to_be_deleted(env, env[:machine].id)
23
+
24
+ end
25
+
26
+ @app.call(env)
27
+ end
28
+
29
+ private
30
+
31
+ def waiting_for_instance_to_be_deleted(env, instance_id, retry_interval = 3)
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
+ config = env[:machine].provider_config
35
+ Timeout.timeout(config.server_delete_timeout, Errors::Timeout) do
36
+ delete_ok = false
37
+ until delete_ok
38
+ begin
39
+ @logger.debug('Waiting for instance to be DELETED')
40
+ server_status = env[:openstack_client].nova.get_server_details(env, instance_id)['status']
41
+ fail Errors::ServerStatusError, server: instance_id if server_status == 'ERROR'
42
+ break if server_status == 'DELETED'
43
+ sleep retry_interval
44
+ rescue Errors::InstanceNotFound
45
+ delete_ok = true
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,73 @@
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 DeleteStack < AbstractAction
16
+ def initialize(app, _env)
17
+ @app = app
18
+ @logger = Log4r::Logger.new('vagrant_openstack::action::delete_stack')
19
+ end
20
+
21
+ def execute(env)
22
+ @logger.info 'Start delete stacks action'
23
+
24
+ heat = env[:openstack_client].heat
25
+
26
+ list_stack_files(env).each do |stack|
27
+ env[:ui].info(I18n.t('vagrant_openstack.delete_stack'))
28
+ env[:ui].info(" -- Stack Name : #{stack[:name]}")
29
+ env[:ui].info(" -- Stack ID : #{stack[:id]}")
30
+
31
+ heat.delete_stack(env, stack[:name], stack[:id])
32
+
33
+ waiting_for_stack_to_be_deleted(env, stack[:name], stack[:id])
34
+ end
35
+
36
+ # This will remove all files in the .vagrant instance directory
37
+ env[:machine].id = nil
38
+
39
+ @app.call(env)
40
+ end
41
+
42
+ private
43
+
44
+ def list_stack_files(env)
45
+ stack_files = []
46
+ Dir.glob("#{env[:machine].data_dir}/stack_*_id") do |stack_file|
47
+ file_name = stack_file.split('/')[-1]
48
+ stack_files << {
49
+ name: file_name[6, (file_name.length) - 9],
50
+ id: File.read("#{stack_file}")
51
+ }
52
+ end
53
+ stack_files
54
+ end
55
+
56
+ def waiting_for_stack_to_be_deleted(env, stack_name, stack_id, retry_interval = 3)
57
+ @logger.info "Waiting for the stack with id #{stack_id} to be deleted..."
58
+ env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack_deleted'))
59
+ config = env[:machine].provider_config
60
+ Timeout.timeout(config.stack_delete_timeout, Errors::Timeout) do
61
+ stack_status = 'DELETE_IN_PROGRESS'
62
+ until stack_status == 'DELETE_COMPLETE'
63
+ @logger.debug('Waiting for stack to be DELETED')
64
+ stack_status = env[:openstack_client].heat.get_stack_details(env, stack_name, stack_id)['stack_status']
65
+ fail Errors::StackStatusError, stack: stack_id if stack_status == 'DELETE_FAILED'
66
+ sleep retry_interval
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end