vagrant-libvirt 0.0.40 → 0.0.41

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 +4 -4
  2. metadata +13 -103
  3. data/.coveralls.yml +0 -1
  4. data/.github/issue_template.md +0 -37
  5. data/.gitignore +0 -21
  6. data/.travis.yml +0 -28
  7. data/CHANGELOG.md +0 -99
  8. data/Gemfile +0 -27
  9. data/LICENSE +0 -22
  10. data/README.md +0 -1311
  11. data/Rakefile +0 -8
  12. data/example_box/README.md +0 -29
  13. data/example_box/Vagrantfile +0 -60
  14. data/example_box/metadata.json +0 -5
  15. data/lib/vagrant-libvirt.rb +0 -29
  16. data/lib/vagrant-libvirt/action.rb +0 -362
  17. data/lib/vagrant-libvirt/action/create_domain.rb +0 -313
  18. data/lib/vagrant-libvirt/action/create_domain_volume.rb +0 -87
  19. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +0 -294
  20. data/lib/vagrant-libvirt/action/create_networks.rb +0 -353
  21. data/lib/vagrant-libvirt/action/destroy_domain.rb +0 -83
  22. data/lib/vagrant-libvirt/action/destroy_networks.rb +0 -95
  23. data/lib/vagrant-libvirt/action/forward_ports.rb +0 -221
  24. data/lib/vagrant-libvirt/action/halt_domain.rb +0 -35
  25. data/lib/vagrant-libvirt/action/handle_box_image.rb +0 -156
  26. data/lib/vagrant-libvirt/action/handle_storage_pool.rb +0 -57
  27. data/lib/vagrant-libvirt/action/is_created.rb +0 -18
  28. data/lib/vagrant-libvirt/action/is_running.rb +0 -21
  29. data/lib/vagrant-libvirt/action/is_suspended.rb +0 -42
  30. data/lib/vagrant-libvirt/action/message_already_created.rb +0 -16
  31. data/lib/vagrant-libvirt/action/message_not_created.rb +0 -16
  32. data/lib/vagrant-libvirt/action/message_not_running.rb +0 -16
  33. data/lib/vagrant-libvirt/action/message_not_suspended.rb +0 -16
  34. data/lib/vagrant-libvirt/action/package_domain.rb +0 -105
  35. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +0 -94
  36. data/lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb +0 -17
  37. data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +0 -27
  38. data/lib/vagrant-libvirt/action/read_mac_addresses.rb +0 -40
  39. data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +0 -20
  40. data/lib/vagrant-libvirt/action/remove_stale_volume.rb +0 -50
  41. data/lib/vagrant-libvirt/action/resume_domain.rb +0 -34
  42. data/lib/vagrant-libvirt/action/set_boot_order.rb +0 -109
  43. data/lib/vagrant-libvirt/action/set_name_of_domain.rb +0 -64
  44. data/lib/vagrant-libvirt/action/share_folders.rb +0 -71
  45. data/lib/vagrant-libvirt/action/start_domain.rb +0 -303
  46. data/lib/vagrant-libvirt/action/suspend_domain.rb +0 -40
  47. data/lib/vagrant-libvirt/action/wait_till_up.rb +0 -102
  48. data/lib/vagrant-libvirt/cap/mount_p9.rb +0 -42
  49. data/lib/vagrant-libvirt/cap/nic_mac_addresses.rb +0 -17
  50. data/lib/vagrant-libvirt/cap/synced_folder.rb +0 -113
  51. data/lib/vagrant-libvirt/config.rb +0 -698
  52. data/lib/vagrant-libvirt/driver.rb +0 -118
  53. data/lib/vagrant-libvirt/errors.rb +0 -149
  54. data/lib/vagrant-libvirt/plugin.rb +0 -92
  55. data/lib/vagrant-libvirt/provider.rb +0 -130
  56. data/lib/vagrant-libvirt/templates/default_storage_pool.xml.erb +0 -13
  57. data/lib/vagrant-libvirt/templates/domain.xml.erb +0 -229
  58. data/lib/vagrant-libvirt/templates/private_network.xml.erb +0 -34
  59. data/lib/vagrant-libvirt/templates/public_interface.xml.erb +0 -23
  60. data/lib/vagrant-libvirt/util.rb +0 -11
  61. data/lib/vagrant-libvirt/util/collection.rb +0 -19
  62. data/lib/vagrant-libvirt/util/erb_template.rb +0 -22
  63. data/lib/vagrant-libvirt/util/error_codes.rb +0 -100
  64. data/lib/vagrant-libvirt/util/network_util.rb +0 -138
  65. data/lib/vagrant-libvirt/util/timer.rb +0 -17
  66. data/lib/vagrant-libvirt/version.rb +0 -5
  67. data/locales/en.yml +0 -159
  68. data/spec/spec_helper.rb +0 -9
  69. data/spec/support/environment_helper.rb +0 -46
  70. data/spec/support/libvirt_context.rb +0 -30
  71. data/spec/support/sharedcontext.rb +0 -34
  72. data/spec/unit/action/destroy_domain_spec.rb +0 -97
  73. data/spec/unit/action/set_name_of_domain_spec.rb +0 -21
  74. data/spec/unit/action/wait_till_up_spec.rb +0 -127
  75. data/spec/unit/config_spec.rb +0 -106
  76. data/spec/unit/templates/domain_all_settings.xml +0 -133
  77. data/spec/unit/templates/domain_defaults.xml +0 -46
  78. data/spec/unit/templates/domain_spec.rb +0 -75
  79. data/tools/create_box.sh +0 -130
  80. data/tools/prepare_redhat_for_box.sh +0 -119
  81. data/vagrant-libvirt.gemspec +0 -28
@@ -1,353 +0,0 @@
1
- require 'log4r'
2
- require 'vagrant/util/network_ip'
3
- require 'vagrant/util/scoped_hash_override'
4
- require 'ipaddr'
5
- require 'thread'
6
-
7
- module VagrantPlugins
8
- module ProviderLibvirt
9
- module Action
10
- # Prepare all networks needed for domain connections.
11
- class CreateNetworks
12
- include Vagrant::Util::NetworkIP
13
- include Vagrant::Util::ScopedHashOverride
14
- include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
15
- include VagrantPlugins::ProviderLibvirt::Util::NetworkUtil
16
-
17
- @@lock = Mutex.new
18
-
19
- def initialize(app, env)
20
- mess = 'vagrant_libvirt::action::create_networks'
21
- @logger = Log4r::Logger.new(mess)
22
- @app = app
23
-
24
- @available_networks = []
25
- @options = {}
26
- @libvirt_client = env[:machine].provider.driver.connection.client
27
- end
28
-
29
- def call(env)
30
- # only one vm at a time should try to set up networks
31
- # otherwise they'll have inconsitent views of current state
32
- # and conduct redundant operations that cause errors
33
- @@lock.synchronize do
34
- # Iterate over networks If some network is not
35
- # available, create it if possible. Otherwise raise an error.
36
- configured_networks(env, @logger).each do |options|
37
- # Only need to create private networks
38
- next if options[:iface_type] != :private_network ||
39
- options.fetch(:tunnel_type, nil)
40
- @logger.debug "Searching for network with options #{options}"
41
-
42
- # should fix other methods so this doesn't have to be instance var
43
- @options = options
44
-
45
- # Get a list of all (active and inactive) libvirt networks. This
46
- # list is used throughout this class and should be easier to
47
- # process than libvirt API calls.
48
- @available_networks = libvirt_networks(
49
- env[:machine].provider.driver.connection.client
50
- )
51
-
52
- # Prepare a hash describing network for this specific interface.
53
- @interface_network = {
54
- name: nil,
55
- ip_address: nil,
56
- netmask: @options[:netmask],
57
- network_address: nil,
58
- bridge_name: nil,
59
- ipv6_address: options[:ipv6_address] || nil,
60
- ipv6_prefix: options[:ipv6_prefix] || nil,
61
- created: false,
62
- active: false,
63
- autostart: options[:autostart] || false,
64
- guest_ipv6: @options[:guest_ipv6] || 'yes',
65
- libvirt_network: nil
66
- }
67
-
68
- if @options[:ip]
69
- handle_ip_option(env)
70
- elsif @options[:type].to_s == 'dhcp'
71
- handle_dhcp_private_network(env)
72
- elsif @options[:network_name]
73
- handle_network_name_option(env)
74
- else
75
- raise Errors::CreateNetworkError, error_message: @options
76
- end
77
-
78
- autostart_network if @interface_network[:autostart]
79
- activate_network unless @interface_network[:active]
80
- end
81
- end
82
-
83
- @app.call(env)
84
- end
85
-
86
- private
87
-
88
- def lookup_network_by_ip(ip)
89
- @logger.debug "looking up network with ip == #{ip}"
90
- @available_networks.find { |network| network[:network_address] == ip }
91
- end
92
-
93
- # Return hash of network for specified name, or nil if not found.
94
- def lookup_network_by_name(network_name)
95
- @logger.debug "looking up network named #{network_name}"
96
- @available_networks.find { |network| network[:name] == network_name }
97
- end
98
-
99
- # Return hash of network for specified bridge, or nil if not found.
100
- def lookup_bridge_by_name(bridge_name)
101
- @logger.debug "looking up bridge named #{bridge_name}"
102
- @available_networks.find { |network| network[:bridge_name] == bridge_name }
103
- end
104
-
105
- # Throw an error if dhcp setting for an existing network does not
106
- # match what was configured in the vagrantfile
107
- # since we always enable dhcp for the management network
108
- # this ensures we wont start a vm vagrant cant reach
109
- # Allow the situation where DHCP is not requested (:libvirt__dhcp_enabled == false)
110
- # but where it is enabled on the virtual network
111
- def verify_dhcp
112
- if @interface_network[:dhcp_enabled] == true && @options[:dhcp_enabled] == false
113
- raise Errors::DHCPMismatch,
114
- network_name: @interface_network[:name],
115
- requested: @options[:dhcp_enabled] ? 'enabled' : 'disabled'
116
- end
117
- end
118
-
119
- # Handle only situations, when ip is specified. Variables @options and
120
- # @available_networks should be filled before calling this function.
121
- def handle_ip_option(env)
122
- return unless @options[:ip]
123
- net_address = nil
124
- unless @options[:forward_mode] == 'veryisolated'
125
- net_address = network_address(@options[:ip], @options[:netmask])
126
-
127
- # Set IP address of network (actually bridge). It will be used as
128
- # gateway address for machines connected to this network.
129
- @interface_network[:ip_address] = get_host_ip_addr(net_address)
130
- end
131
-
132
- @interface_network[:network_address] = net_address
133
-
134
- # if network is veryisolated, search by name
135
- network = if @options[:libvirt__forward_mode] == 'veryisolated'
136
- lookup_network_by_name(@options[:network_name])
137
- elsif net_address
138
- # otherwise, search by ip (if set)
139
- lookup_network_by_ip(net_address)
140
- else
141
- # leaving this here to mimic prior behavior. If we get
142
- # here, something's probably broken.
143
- lookup_network_by_name(@options[:network_name])
144
- end
145
- @interface_network = network if network
146
-
147
- verify_dhcp if @interface_network[:created]
148
-
149
- if @options[:network_name]
150
- @logger.debug 'Checking that network name does not clash with ip'
151
- if @interface_network[:created]
152
- # Just check for mismatch error here - if name and ip from
153
- # config match together.
154
- if @options[:network_name] != @interface_network[:name]
155
- raise Errors::NetworkNameAndAddressMismatch,
156
- ip_address: @options[:ip],
157
- network_name: @options[:network_name]
158
- end
159
- else
160
- # Network is not created, but name is set. We need to check,
161
- # whether network name from config doesn't already exist.
162
- if lookup_network_by_name @options[:network_name]
163
- raise Errors::NetworkNameAndAddressMismatch,
164
- ip_address: @options[:ip],
165
- network_name: @options[:network_name]
166
- end
167
-
168
- # Network with 'name' doesn't exist. Set it as name for new
169
- # network.
170
- @interface_network[:name] = @options[:network_name]
171
- end
172
- end
173
-
174
- # Do we need to create new network?
175
- unless @interface_network[:created]
176
-
177
- # TODO: stop after some loops. Don't create infinite loops.
178
-
179
- # Is name for new network set? If not, generate a unique one.
180
- count = 0
181
- while @interface_network[:name].nil?
182
- @logger.debug 'generating name for network'
183
-
184
- # Generate a network name.
185
- network_name = env[:root_path].basename.to_s.dup
186
- network_name << count.to_s
187
- count += 1
188
-
189
- # Check if network name is unique.
190
- next if lookup_network_by_name(network_name)
191
-
192
- @interface_network[:name] = network_name
193
- end
194
-
195
- # Generate a unique name for network bridge.
196
- @interface_network[:bridge_name] = generate_bridge_name
197
-
198
- # Create a private network.
199
- create_private_network(env)
200
- end
201
- end
202
-
203
- # Handle network_name option, if ip was not specified. Variables
204
- # @options and @available_networks should be filled before calling this
205
- # function.
206
- def handle_network_name_option(env)
207
- return if @options[:ip] || \
208
- !@options[:network_name] || \
209
- !@options[:libvirt__forward_mode] == 'veryisolated'
210
-
211
- network = lookup_network_by_name(@options[:network_name])
212
- @interface_network = network if network
213
-
214
- if @options[:libvirt__forward_mode] == 'veryisolated'
215
- # if this interface has a network address, something's wrong.
216
- if @interface_network[:network_address]
217
- raise Errors::NetworkNotAvailableError,
218
- network_name: @options[:network_name]
219
- end
220
- else
221
- if !@interface_network
222
- raise Errors::NetworkNotAvailableError,
223
- network_name: @options[:network_name]
224
- else
225
- verify_dhcp
226
- end
227
- end
228
-
229
- # Do we need to create new network?
230
- unless @interface_network[:created]
231
- @interface_network[:name] = @options[:network_name]
232
- @interface_network[:ip_address] ||= @options[:host_ip]
233
-
234
- # Generate a unique name for network bridge.
235
- @interface_network[:bridge_name] = generate_bridge_name
236
-
237
- # Create a private network.
238
- create_private_network(env)
239
- end
240
- end
241
-
242
- def handle_dhcp_private_network(env)
243
- net_address = '172.28.128.0'
244
- network = lookup_network_by_ip(net_address)
245
- @interface_network = network if network
246
-
247
- # Do we need to create new network?
248
- unless @interface_network[:created]
249
- @interface_network[:name] = 'vagrant-private-dhcp'
250
- @interface_network[:network_address] = net_address
251
-
252
- # Set IP address of network (actually bridge). It will be used as
253
- # gateway address for machines connected to this network.
254
- @interface_network[:ip_address] = get_host_ip_addr(net_address)
255
-
256
- # Generate a unique name for network bridge.
257
- @interface_network[:bridge_name] = generate_bridge_name
258
-
259
- # Create a private network.
260
- create_private_network(env)
261
- end
262
- end
263
-
264
- # Return provided address or first address of network otherwise
265
- def get_host_ip_addr(network)
266
- @options[:host_ip] ? IPAddr.new(@options[:host_ip]) : IPAddr.new(network).succ
267
- end
268
-
269
- # Return the first available virbr interface name
270
- def generate_bridge_name
271
- @logger.debug 'generating name for bridge'
272
- count = 0
273
- while lookup_bridge_by_name(bridge_name = "virbr#{count}")
274
- count += 1
275
- end
276
- @logger.debug "found available bridge name #{bridge_name}"
277
- bridge_name
278
- end
279
-
280
- def create_private_network(env)
281
- @network_name = @interface_network[:name]
282
- @network_bridge_name = @interface_network[:bridge_name]
283
- @network_address = @interface_network[:ip_address]
284
- @network_netmask = @interface_network[:netmask]
285
- @guest_ipv6 = @interface_network[:guest_ipv6]
286
-
287
- @network_ipv6_address = @interface_network[:ipv6_address]
288
- @network_ipv6_prefix = @interface_network[:ipv6_prefix]
289
-
290
- @network_forward_mode = @options[:forward_mode]
291
- if @options[:forward_device]
292
- @network_forward_device = @options[:forward_device]
293
- end
294
-
295
- if @options[:dhcp_enabled]
296
- # Find out DHCP addresses pool range.
297
- network_address = "#{@interface_network[:network_address]}/"
298
- network_address << (@interface_network[:netmask]).to_s
299
- net = @interface_network[:network_address] ? IPAddr.new(network_address) : nil
300
-
301
- # First is address of network, second is gateway (by default).
302
- # So start the range two addresses after network address by default.
303
- # TODO: Detect if this IP is not set on the interface.
304
- start_address = @options[:dhcp_start] || net.to_range.begin.succ
305
-
306
- # Default to last possible address. (Stop address must not be broadcast address.)
307
- stop_address = @options[:dhcp_stop] || (net.to_range.end & IPAddr.new('255.255.255.254'))
308
-
309
- @network_dhcp_enabled = true
310
- @network_dhcp_bootp_file = @options[:dhcp_bootp_file]
311
- @network_dhcp_bootp_server = @options[:dhcp_bootp_server]
312
- @network_range_start = start_address
313
- @network_range_stop = stop_address
314
- else
315
- @network_dhcp_enabled = false
316
- end
317
-
318
- begin
319
- @interface_network[:libvirt_network] = \
320
- @libvirt_client.define_network_xml(to_xml('private_network'))
321
- @logger.debug 'created network'
322
- rescue => e
323
- raise Errors::CreateNetworkError, error_message: e.message
324
- end
325
-
326
- created_networks_file = env[:machine].data_dir + 'created_networks'
327
-
328
- message = 'Saving information about created network '
329
- message << "#{@interface_network[:name]}, "
330
- message << "UUID=#{@interface_network[:libvirt_network].uuid} "
331
- message << "to file #{created_networks_file}."
332
- @logger.info(message)
333
-
334
- File.open(created_networks_file, 'a') do |file|
335
- file.puts @interface_network[:libvirt_network].uuid
336
- end
337
- end
338
-
339
- def autostart_network
340
- @interface_network[:libvirt_network].autostart = true
341
- rescue => e
342
- raise Errors::AutostartNetworkError, error_message: e.message
343
- end
344
-
345
- def activate_network
346
- @interface_network[:libvirt_network].create
347
- rescue => e
348
- raise Errors::ActivateNetworkError, error_message: e.message
349
- end
350
- end
351
- end
352
- end
353
- end
@@ -1,83 +0,0 @@
1
- require 'log4r'
2
-
3
- module VagrantPlugins
4
- module ProviderLibvirt
5
- module Action
6
- class DestroyDomain
7
- def initialize(app, _env)
8
- @logger = Log4r::Logger.new('vagrant_libvirt::action::destroy_domain')
9
- @app = app
10
- end
11
-
12
- def call(env)
13
- # Destroy the server, remove the tracking ID
14
- env[:ui].info(I18n.t('vagrant_libvirt.destroy_domain'))
15
-
16
- # Must delete any snapshots before domain can be destroyed
17
- # Fog libvirt currently doesn't support snapshots. Use
18
- # ruby-libvirt client directly. Note this is racy, see
19
- # http://www.libvirt.org/html/libvirt-libvirt.html#virDomainSnapshotListNames
20
- libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(
21
- env[:machine].id
22
- )
23
- begin
24
- libvirt_domain.list_snapshots.each do |name|
25
- @logger.info("Deleting snapshot '#{name}'")
26
- begin
27
- libvirt_domain.lookup_snapshot_by_name(name).delete
28
- rescue => e
29
- raise Errors::DeleteSnapshotError, error_message: e.message
30
- end
31
- end
32
- rescue
33
- # Some drivers (xen) don't support getting list of snapshots,
34
- # not much can be done here about it
35
- @logger.warn("Failed to get list of snapshots")
36
- end
37
-
38
- # must remove managed saves
39
- libvirt_domain.managed_save_remove if libvirt_domain.has_managed_save?
40
-
41
- domain = env[:machine].provider.driver.connection.servers.get(env[:machine].id.to_s)
42
-
43
- if env[:machine].provider_config.disks.empty? &&
44
- env[:machine].provider_config.cdroms.empty?
45
- # if using default configuration of disks and cdroms
46
- # cdroms are consider volumes, but cannot be destroyed
47
- domain.destroy(destroy_volumes: true)
48
- else
49
- domain.destroy(destroy_volumes: false)
50
-
51
- env[:machine].provider_config.disks.each do |disk|
52
- # shared disks remove only manually or ???
53
- next if disk[:allow_existing]
54
- diskname = libvirt_domain.name + '-' + disk[:device] + '.' + disk[:type].to_s
55
- # diskname is unique
56
- libvirt_disk = domain.volumes.select do |x|
57
- x.name == diskname
58
- end.first
59
- if libvirt_disk
60
- libvirt_disk.destroy
61
- elsif disk[:path]
62
- poolname = env[:machine].provider_config.storage_pool_name
63
- libvirt_disk = domain.volumes.select do |x|
64
- # FIXME: can remove pool/target.img and pool/123/target.img
65
- x.path =~ /\/#{disk[:path]}$/ && x.pool_name == poolname
66
- end.first
67
- libvirt_disk.destroy if libvirt_disk
68
- end
69
- end
70
-
71
- # remove root storage
72
- root_disk = domain.volumes.select do |x|
73
- x.name == libvirt_domain.name + '.img'
74
- end.first
75
- root_disk.destroy if root_disk
76
- end
77
-
78
- @app.call(env)
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,95 +0,0 @@
1
- require 'log4r'
2
- require 'nokogiri'
3
-
4
- module VagrantPlugins
5
- module ProviderLibvirt
6
- module Action
7
- # Destroy all networks created for this specific domain. Skip
8
- # removing if network has still active connections.
9
- class DestroyNetworks
10
- def initialize(app, _env)
11
- @logger = Log4r::Logger.new('vagrant_libvirt::action::destroy_networks')
12
- @app = app
13
- end
14
-
15
- def call(env)
16
- # If there were some networks created for this machine, in machines
17
- # data directory, created_networks file holds UUIDs of each network.
18
- created_networks_file = env[:machine].data_dir + 'created_networks'
19
-
20
- @logger.info 'Checking if any networks were created'
21
- # If created_networks file doesn't exist, there are no networks we
22
- # need to remove.
23
- unless File.exist?(created_networks_file)
24
- env[:machine].id = nil
25
- return @app.call(env)
26
- end
27
-
28
- @logger.info 'File with created networks exists'
29
-
30
- # Iterate over each created network UUID and try to remove it.
31
- created_networks = []
32
- file = File.open(created_networks_file, 'r')
33
- file.readlines.each do |network_uuid|
34
- @logger.info "Checking for #{network_uuid}"
35
- # lookup_network_by_uuid throws same exception
36
- # if there is an error or if the network just doesn't exist
37
- begin
38
- libvirt_network = env[:machine].provider.driver.connection.client.lookup_network_by_uuid(
39
- network_uuid
40
- )
41
- rescue Libvirt::RetrieveError => e
42
- # this network is already destroyed, so move on
43
- if e.message =~ /Network not found/
44
- @logger.info 'It is already undefined'
45
- next
46
- # some other error occured, so raise it again
47
- else
48
- raise e
49
- end
50
- end
51
-
52
- # Skip removing if network has still active connections.
53
- xml = Nokogiri::XML(libvirt_network.xml_desc)
54
- connections = xml.xpath('/network/@connections').first
55
- unless connections.nil?
56
- @logger.info 'Still has connections so will not undefine'
57
- created_networks << network_uuid
58
- next
59
- end
60
-
61
- # Shutdown network first.
62
- # Undefine network.
63
- begin
64
- libvirt_network.destroy
65
- libvirt_network.undefine
66
- @logger.info 'Undefined it'
67
- rescue => e
68
- raise Errors::DestroyNetworkError,
69
- network_name: libvirt_network.name,
70
- error_message: e.message
71
- end
72
- end
73
- file.close
74
-
75
- # Update status of created networks after removing some/all of them.
76
- # Not sure why we are doing this, something else seems to always delete the file
77
- if !created_networks.empty?
78
- File.open(created_networks_file, 'w') do |file|
79
- @logger.info 'Writing new created_networks file'
80
- created_networks.each do |network_uuid|
81
- file.puts network_uuid
82
- end
83
- end
84
- else
85
- @logger.info 'Deleting created_networks file'
86
- File.delete(created_networks_file)
87
- end
88
-
89
- env[:machine].id = nil
90
- @app.call(env)
91
- end
92
- end
93
- end
94
- end
95
- end