vagrant-libvirt 0.0.36 → 0.0.37
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/Gemfile +1 -0
- data/README.md +171 -13
- data/lib/vagrant-libvirt/action/create_domain.rb +44 -19
- data/lib/vagrant-libvirt/action/create_domain_volume.rb +12 -12
- data/lib/vagrant-libvirt/action/create_network_interfaces.rb +37 -39
- data/lib/vagrant-libvirt/action/create_networks.rb +34 -34
- data/lib/vagrant-libvirt/action/destroy_domain.rb +7 -8
- data/lib/vagrant-libvirt/action/destroy_networks.rb +12 -13
- data/lib/vagrant-libvirt/action/forward_ports.rb +21 -23
- data/lib/vagrant-libvirt/action/halt_domain.rb +8 -9
- data/lib/vagrant-libvirt/action/handle_box_image.rb +28 -27
- data/lib/vagrant-libvirt/action/handle_storage_pool.rb +8 -8
- data/lib/vagrant-libvirt/action/is_created.rb +1 -1
- data/lib/vagrant-libvirt/action/is_running.rb +2 -2
- data/lib/vagrant-libvirt/action/is_suspended.rb +4 -4
- data/lib/vagrant-libvirt/action/message_already_created.rb +2 -2
- data/lib/vagrant-libvirt/action/message_not_created.rb +2 -2
- data/lib/vagrant-libvirt/action/message_not_running.rb +2 -2
- data/lib/vagrant-libvirt/action/message_not_suspended.rb +2 -2
- data/lib/vagrant-libvirt/action/package_domain.rb +6 -5
- data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +7 -6
- data/lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb +2 -2
- data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +3 -3
- data/lib/vagrant-libvirt/action/read_mac_addresses.rb +8 -10
- data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +4 -4
- data/lib/vagrant-libvirt/action/remove_stale_volume.rb +8 -7
- data/lib/vagrant-libvirt/action/resume_domain.rb +5 -5
- data/lib/vagrant-libvirt/action/set_boot_order.rb +70 -27
- data/lib/vagrant-libvirt/action/set_name_of_domain.rb +10 -12
- data/lib/vagrant-libvirt/action/share_folders.rb +16 -18
- data/lib/vagrant-libvirt/action/start_domain.rb +59 -64
- data/lib/vagrant-libvirt/action/suspend_domain.rb +5 -5
- data/lib/vagrant-libvirt/action/wait_till_up.rb +24 -26
- data/lib/vagrant-libvirt/action.rb +18 -23
- data/lib/vagrant-libvirt/cap/mount_p9.rb +11 -10
- data/lib/vagrant-libvirt/cap/nic_mac_addresses.rb +1 -1
- data/lib/vagrant-libvirt/cap/synced_folder.rb +20 -19
- data/lib/vagrant-libvirt/config.rb +164 -136
- data/lib/vagrant-libvirt/driver.rb +10 -13
- data/lib/vagrant-libvirt/errors.rb +4 -3
- data/lib/vagrant-libvirt/plugin.rb +4 -6
- data/lib/vagrant-libvirt/provider.rb +23 -24
- data/lib/vagrant-libvirt/templates/domain.xml.erb +14 -1
- data/lib/vagrant-libvirt/templates/private_network.xml.erb +4 -0
- data/lib/vagrant-libvirt/util/collection.rb +0 -3
- data/lib/vagrant-libvirt/util/erb_template.rb +6 -10
- data/lib/vagrant-libvirt/util/error_codes.rb +32 -33
- data/lib/vagrant-libvirt/util/network_util.rb +29 -21
- data/lib/vagrant-libvirt/util.rb +3 -4
- data/lib/vagrant-libvirt/version.rb +1 -1
- data/locales/en.yml +3 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/environment_helper.rb +5 -7
- data/spec/support/libvirt_context.rb +13 -11
- data/spec/support/sharedcontext.rb +9 -10
- data/spec/unit/action/destroy_domain_spec.rb +38 -37
- data/spec/unit/action/set_name_of_domain_spec.rb +4 -4
- data/spec/unit/action/wait_till_up_spec.rb +45 -46
- data/spec/unit/config_spec.rb +106 -0
- data/spec/unit/templates/domain_all_settings.xml +125 -0
- data/spec/unit/templates/domain_defaults.xml +44 -0
- data/spec/unit/templates/domain_spec.rb +69 -0
- data/tools/create_box.sh +8 -2
- metadata +12 -3
@@ -33,8 +33,7 @@ module VagrantPlugins
|
|
33
33
|
# can use this method to load in new data for the actual backing
|
34
34
|
# machine or to realize that the machine is now gone (the ID can
|
35
35
|
# become `nil`).
|
36
|
-
def machine_id_changed
|
37
|
-
end
|
36
|
+
def machine_id_changed; end
|
38
37
|
|
39
38
|
# This should return a hash of information that explains how to
|
40
39
|
# SSH into the machine. If the machine is not at a point where
|
@@ -45,12 +44,12 @@ module VagrantPlugins
|
|
45
44
|
#
|
46
45
|
# Ssh info has following format..
|
47
46
|
#
|
48
|
-
#{
|
47
|
+
# {
|
49
48
|
# :host => "1.2.3.4",
|
50
49
|
# :port => "22",
|
51
50
|
# :username => "mitchellh",
|
52
51
|
# :private_key_path => "/path/to/my/key"
|
53
|
-
#}
|
52
|
+
# }
|
54
53
|
# note that modifing @machine.id or accessing @machine.state is not
|
55
54
|
# thread safe, so be careful to avoid these here as this method may
|
56
55
|
# be called from other threads of execution.
|
@@ -60,21 +59,23 @@ module VagrantPlugins
|
|
60
59
|
|
61
60
|
# if can't determine the IP, just return nil and let the core
|
62
61
|
# deal with it, similar to the docker provider
|
63
|
-
return nil
|
62
|
+
return nil unless ip
|
64
63
|
|
65
64
|
ssh_info = {
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
65
|
+
host: ip,
|
66
|
+
port: @machine.config.ssh.guest_port,
|
67
|
+
forward_agent: @machine.config.ssh.forward_agent,
|
68
|
+
forward_x11: @machine.config.ssh.forward_x11
|
70
69
|
}
|
71
70
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
71
|
+
if @machine.provider_config.connect_via_ssh
|
72
|
+
ssh_info[:proxy_command] =
|
73
|
+
"ssh '#{@machine.provider_config.host}' " \
|
74
|
+
"-l '#{@machine.provider_config.username}' " \
|
75
|
+
"-i '#{@machine.provider_config.id_ssh_key_file}' " \
|
76
|
+
'nc %h %p'
|
77
|
+
|
78
|
+
end
|
78
79
|
|
79
80
|
ssh_info
|
80
81
|
end
|
@@ -94,22 +95,21 @@ module VagrantPlugins
|
|
94
95
|
# This should return the state of the machine within this provider.
|
95
96
|
# The state must be an instance of {MachineState}.
|
96
97
|
def state
|
97
|
-
|
98
98
|
state_id = nil
|
99
|
-
state_id = :not_created
|
100
|
-
state_id = :not_created if
|
101
|
-
!state_id && (!@machine.id || !driver.created?(@machine.id))
|
99
|
+
state_id = :not_created unless @machine.id
|
100
|
+
state_id = :not_created if
|
101
|
+
!state_id && (!@machine.id || !driver.created?(@machine.id))
|
102
102
|
# Query the driver for the current state of the machine
|
103
103
|
state_id = driver.state(@machine) if @machine.id && !state_id
|
104
|
-
state_id = :unknown
|
104
|
+
state_id = :unknown unless state_id
|
105
105
|
|
106
106
|
# This is a special pseudo-state so that we don't set the
|
107
107
|
# NOT_CREATED_ID while we're setting up the machine. This avoids
|
108
108
|
# clearing the data dir.
|
109
|
-
state_id = :preparing if @machine.id ==
|
109
|
+
state_id = :preparing if @machine.id == 'preparing'
|
110
110
|
|
111
111
|
# Get the short and long description
|
112
|
-
short = state_id.to_s.
|
112
|
+
short = state_id.to_s.tr('_', ' ')
|
113
113
|
long = I18n.t("vagrant_libvirt.states.#{state_id}")
|
114
114
|
|
115
115
|
# If we're not created, then specify the special ID flag
|
@@ -122,10 +122,9 @@ module VagrantPlugins
|
|
122
122
|
end
|
123
123
|
|
124
124
|
def to_s
|
125
|
-
id = @machine.id.nil? ?
|
125
|
+
id = @machine.id.nil? ? 'new' : @machine.id
|
126
126
|
"Libvirt (#{id})"
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
131
|
-
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
<cpu mode='<%= @cpu_mode %>'>
|
9
9
|
<% if @cpu_mode != 'host-passthrough' %>
|
10
|
-
<model fallback='<%= @cpu_fallback %>'
|
10
|
+
<model fallback='<%= @cpu_fallback %>'><% if @cpu_mode == 'custom' %><%= @cpu_model %><% end %></model>
|
11
11
|
<% if @nested %>
|
12
12
|
<feature policy='optional' name='vmx'/>
|
13
13
|
<feature policy='optional' name='svm'/>
|
@@ -170,6 +170,19 @@
|
|
170
170
|
</source>
|
171
171
|
</hostdev>
|
172
172
|
<% end %>
|
173
|
+
<% unless @redirdevs.empty? %>
|
174
|
+
<% @redirdevs.each do |redirdev| %>
|
175
|
+
<redirdev bus='usb' type='<%= redirdev[:type] %>'>
|
176
|
+
</redirdev>
|
177
|
+
<% end %>
|
178
|
+
<% unless @redirfilters.empty? %>
|
179
|
+
<redirfilter>
|
180
|
+
<% @redirfilters.each do |usbdev| %>
|
181
|
+
<usbdev class='<%= usbdev[:class] %>' vendor='<%= usbdev[:vendor] %>' product='<%= usbdev[:product] %>' version='<%= usbdev[:version] %>' allow='<%= usbdev[:allow] %>'/>
|
182
|
+
<% end %>
|
183
|
+
</redirfilter>
|
184
|
+
<% end %>
|
185
|
+
<% end %>
|
173
186
|
|
174
187
|
<% if @tpm_path -%>
|
175
188
|
<%# TPM Device -%>
|
@@ -2,7 +2,6 @@ module VagrantPlugins
|
|
2
2
|
module ProviderLibvirt
|
3
3
|
module Util
|
4
4
|
module Collection
|
5
|
-
|
6
5
|
# This method finds a matching _thing_ in a collection of
|
7
6
|
# _things_. This works matching if the ID or NAME equals to
|
8
7
|
# `name`. Or, if `name` is a regexp, a partial match is chosen
|
@@ -14,9 +13,7 @@ module VagrantPlugins
|
|
14
13
|
|
15
14
|
nil
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
22
|
-
|
@@ -4,22 +4,18 @@ module VagrantPlugins
|
|
4
4
|
module ProviderLibvirt
|
5
5
|
module Util
|
6
6
|
module ErbTemplate
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
erb = template_name || self.class.to_s.split("::").last.downcase
|
12
|
-
path = File.join(File.dirname(__FILE__), "..", "templates",
|
7
|
+
# TODO: might be a chance to use vagrant template system according to https://github.com/mitchellh/vagrant/issues/3231
|
8
|
+
def to_xml(template_name = nil, data = binding)
|
9
|
+
erb = template_name || self.class.to_s.split('::').last.downcase
|
10
|
+
path = File.join(File.dirname(__FILE__), '..', 'templates',
|
13
11
|
"#{erb}.xml.erb")
|
14
12
|
template = File.read(path)
|
15
13
|
|
16
|
-
# TODO according to erubis documentation, we should rather use evaluate and forget about
|
14
|
+
# TODO: according to erubis documentation, we should rather use evaluate and forget about
|
17
15
|
# binding since the template may then change variables values
|
18
|
-
Erubis::Eruby.new(template, :
|
16
|
+
Erubis::Eruby.new(template, trim: true).result(data)
|
19
17
|
end
|
20
|
-
|
21
18
|
end
|
22
19
|
end
|
23
20
|
end
|
24
21
|
end
|
25
|
-
|
@@ -6,19 +6,19 @@ module VagrantPlugins
|
|
6
6
|
VIR_ERR_OK = 0
|
7
7
|
VIR_ERR_INTERNAL_ERROR = 1 # internal error
|
8
8
|
VIR_ERR_NO_MEMORY = 2 # memory allocation failure
|
9
|
-
VIR_ERR_NO_SUPPORT
|
10
|
-
VIR_ERR_UNKNOWN_HOST
|
11
|
-
VIR_ERR_NO_CONNECT
|
12
|
-
VIR_ERR_INVALID_CONN
|
13
|
-
VIR_ERR_INVALID_DOMAIN
|
9
|
+
VIR_ERR_NO_SUPPORT = 3 # no support for this function
|
10
|
+
VIR_ERR_UNKNOWN_HOST = 4 # could not resolve hostname
|
11
|
+
VIR_ERR_NO_CONNECT = 5 # can't connect to hypervisor
|
12
|
+
VIR_ERR_INVALID_CONN = 6 # invalid connection object
|
13
|
+
VIR_ERR_INVALID_DOMAIN = 7 # invalid domain object
|
14
14
|
VIR_ERR_INVALID_ARG = 8 # invalid function argument
|
15
|
-
VIR_ERR_OPERATION_FAILED
|
15
|
+
VIR_ERR_OPERATION_FAILED = 9 # a command to hypervisor failed
|
16
16
|
VIR_ERR_GET_FAILED = 10 # a HTTP GET command to failed
|
17
17
|
VIR_ERR_POST_FAILED = 11 # a HTTP POST command to failed
|
18
18
|
VIR_ERR_HTTP_ERROR = 12 # unexpected HTTP error code
|
19
|
-
VIR_ERR_SEXPR_SERIAL
|
20
|
-
VIR_ERR_NO_XEN
|
21
|
-
VIR_ERR_XEN_CALL
|
19
|
+
VIR_ERR_SEXPR_SERIAL = 13 # failure to serialize an S-Expr
|
20
|
+
VIR_ERR_NO_XEN = 14 # could not open Xen hypervisor control
|
21
|
+
VIR_ERR_XEN_CALL = 15 # failure doing an hypervisor call
|
22
22
|
VIR_ERR_OS_TYPE = 16 # unknown OS type
|
23
23
|
VIR_ERR_NO_KERNEL = 17 # missing kernel information
|
24
24
|
VIR_ERR_NO_ROOT = 18 # missing root device information
|
@@ -32,31 +32,31 @@ module VagrantPlugins
|
|
32
32
|
VIR_ERR_CALL_FAILED = 26 # not supported by the drivers (DEPRECATED)
|
33
33
|
VIR_ERR_XML_ERROR = 27 # an XML description is not well formed or broken
|
34
34
|
VIR_ERR_DOM_EXIST = 28 # the domain already exist
|
35
|
-
VIR_ERR_OPERATION_DENIED
|
35
|
+
VIR_ERR_OPERATION_DENIED = 29 # operation forbidden on read-only connections
|
36
36
|
VIR_ERR_OPEN_FAILED = 30 # failed to open a conf file
|
37
37
|
VIR_ERR_READ_FAILED = 31 # failed to read a conf file
|
38
|
-
VIR_ERR_PARSE_FAILED
|
38
|
+
VIR_ERR_PARSE_FAILED = 32 # failed to parse a conf file
|
39
39
|
VIR_ERR_CONF_SYNTAX = 33 # failed to parse the syntax of a conf file
|
40
|
-
VIR_ERR_WRITE_FAILED
|
41
|
-
VIR_ERR_XML_DETAIL
|
40
|
+
VIR_ERR_WRITE_FAILED = 34 # failed to write a conf file
|
41
|
+
VIR_ERR_XML_DETAIL = 35 # detail of an XML error
|
42
42
|
VIR_ERR_INVALID_NETWORK = 36 # invalid network object
|
43
43
|
VIR_ERR_NETWORK_EXIST = 37 # the network already exist
|
44
44
|
VIR_ERR_SYSTEM_ERROR = 38 # general system call failure
|
45
45
|
VIR_ERR_RPC = 39 # some sort of RPC error
|
46
|
-
VIR_ERR_GNUTLS_ERROR
|
47
|
-
VIR_WAR_NO_NETWORK
|
46
|
+
VIR_ERR_GNUTLS_ERROR = 40 # error from a GNUTLS call
|
47
|
+
VIR_WAR_NO_NETWORK = 41 # failed to start network
|
48
48
|
VIR_ERR_NO_DOMAIN = 42 # domain not found or unexpectedly disappeared
|
49
49
|
VIR_ERR_NO_NETWORK = 43 # network not found
|
50
50
|
VIR_ERR_INVALID_MAC = 44 # invalid MAC address
|
51
51
|
VIR_ERR_AUTH_FAILED = 45 # authentication failed
|
52
|
-
VIR_ERR_INVALID_STORAGE_POOL
|
52
|
+
VIR_ERR_INVALID_STORAGE_POOL = 46 # invalid storage pool object
|
53
53
|
VIR_ERR_INVALID_STORAGE_VOL = 47 # invalid storage vol object
|
54
|
-
VIR_WAR_NO_STORAGE
|
54
|
+
VIR_WAR_NO_STORAGE = 48 # failed to start storage
|
55
55
|
VIR_ERR_NO_STORAGE_POOL = 49 # storage pool not found
|
56
56
|
VIR_ERR_NO_STORAGE_VOL = 50 # storage volume not found
|
57
57
|
VIR_WAR_NO_NODE = 51 # failed to start node driver
|
58
58
|
VIR_ERR_INVALID_NODE_DEVICE = 52 # invalid node device object
|
59
|
-
VIR_ERR_NO_NODE_DEVICE
|
59
|
+
VIR_ERR_NO_NODE_DEVICE = 53 # node device not found
|
60
60
|
VIR_ERR_NO_SECURITY_MODEL = 54 # security model not found
|
61
61
|
VIR_ERR_OPERATION_INVALID = 55 # operation is not applicable at this time
|
62
62
|
VIR_WAR_NO_INTERFACE = 56 # failed to start interface driver
|
@@ -64,32 +64,32 @@ module VagrantPlugins
|
|
64
64
|
VIR_ERR_INVALID_INTERFACE = 58 # invalid interface object
|
65
65
|
VIR_ERR_MULTIPLE_INTERFACES = 59 # more than one matching interface found
|
66
66
|
VIR_WAR_NO_NWFILTER = 60 # failed to start nwfilter driver
|
67
|
-
VIR_ERR_INVALID_NWFILTER
|
67
|
+
VIR_ERR_INVALID_NWFILTER = 61 # invalid nwfilter object
|
68
68
|
VIR_ERR_NO_NWFILTER = 62 # nw filter pool not found
|
69
|
-
VIR_ERR_BUILD_FIREWALL
|
69
|
+
VIR_ERR_BUILD_FIREWALL = 63 # nw filter pool not found
|
70
70
|
VIR_WAR_NO_SECRET = 64 # failed to start secret storage
|
71
|
-
VIR_ERR_INVALID_SECRET
|
71
|
+
VIR_ERR_INVALID_SECRET = 65 # invalid secret
|
72
72
|
VIR_ERR_NO_SECRET = 66 # secret not found
|
73
|
-
VIR_ERR_CONFIG_UNSUPPORTED
|
73
|
+
VIR_ERR_CONFIG_UNSUPPORTED = 67 # unsupported configuration construct
|
74
74
|
VIR_ERR_OPERATION_TIMEOUT = 68 # timeout occurred during operation
|
75
|
-
VIR_ERR_MIGRATE_PERSIST_FAILED
|
76
|
-
VIR_ERR_HOOK_SCRIPT_FAILED
|
75
|
+
VIR_ERR_MIGRATE_PERSIST_FAILED = 69 # a migration worked, but making the VM persist on the dest host failed
|
76
|
+
VIR_ERR_HOOK_SCRIPT_FAILED = 70 # a synchronous hook script failed
|
77
77
|
VIR_ERR_INVALID_DOMAIN_SNAPSHOT = 71 # invalid domain snapshot
|
78
|
-
VIR_ERR_NO_DOMAIN_SNAPSHOT
|
79
|
-
VIR_ERR_INVALID_STREAM
|
78
|
+
VIR_ERR_NO_DOMAIN_SNAPSHOT = 72 # domain snapshot not found
|
79
|
+
VIR_ERR_INVALID_STREAM = 73 # stream pointer not valid
|
80
80
|
VIR_ERR_ARGUMENT_UNSUPPORTED = 74 # valid API use but unsupported by the given driver
|
81
81
|
VIR_ERR_STORAGE_PROBE_FAILED = 75 # storage pool probe failed
|
82
|
-
VIR_ERR_STORAGE_POOL_BUILT
|
82
|
+
VIR_ERR_STORAGE_POOL_BUILT = 76 # storage pool already built
|
83
83
|
VIR_ERR_SNAPSHOT_REVERT_RISKY = 77 # force was not requested for a risky domain snapshot revert
|
84
84
|
VIR_ERR_OPERATION_ABORTED = 78 # operation on a domain was canceled/aborted by user
|
85
|
-
VIR_ERR_AUTH_CANCELLED
|
86
|
-
VIR_ERR_NO_DOMAIN_METADATA
|
87
|
-
VIR_ERR_MIGRATE_UNSAFE
|
88
|
-
VIR_ERR_OVERFLOW
|
85
|
+
VIR_ERR_AUTH_CANCELLED = 79 # authentication cancelled
|
86
|
+
VIR_ERR_NO_DOMAIN_METADATA = 80 # The metadata is not present
|
87
|
+
VIR_ERR_MIGRATE_UNSAFE = 81 # Migration is not safe
|
88
|
+
VIR_ERR_OVERFLOW = 82 # integer overflow
|
89
89
|
VIR_ERR_BLOCK_COPY_ACTIVE = 83 # action prevented by block copy job
|
90
90
|
VIR_ERR_OPERATION_UNSUPPORTED = 84 # The requested operation is not supported
|
91
91
|
VIR_ERR_SSH = 85 # error in ssh transport driver
|
92
|
-
VIR_ERR_AGENT_UNRESPONSIVE
|
92
|
+
VIR_ERR_AGENT_UNRESPONSIVE = 86 # guest agent is unresponsive, not running or not usable
|
93
93
|
VIR_ERR_RESOURCE_BUSY = 87 # resource is already in use
|
94
94
|
VIR_ERR_ACCESS_DENIED = 88 # operation on the object/resource was denied
|
95
95
|
VIR_ERR_DBUS_SERVICE = 89 # error from a dbus service
|
@@ -98,4 +98,3 @@ module VagrantPlugins
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
@@ -13,39 +13,51 @@ module VagrantPlugins
|
|
13
13
|
management_network_mode = env[:machine].provider_config.management_network_mode
|
14
14
|
management_network_mac = env[:machine].provider_config.management_network_mac
|
15
15
|
management_network_guest_ipv6 = env[:machine].provider_config.management_network_guest_ipv6
|
16
|
+
management_network_autostart = env[:machine].provider_config.management_network_autostart
|
16
17
|
logger.info "Using #{management_network_name} at #{management_network_address} as the management network #{management_network_mode} is the mode"
|
17
18
|
|
18
19
|
begin
|
19
20
|
management_network_ip = IPAddr.new(management_network_address)
|
20
21
|
rescue ArgumentError
|
21
22
|
raise Errors::ManagementNetworkError,
|
22
|
-
|
23
|
+
error_message: "#{management_network_address} is not a valid IP address"
|
23
24
|
end
|
24
25
|
|
25
26
|
# capture address into $1 and mask into $2
|
26
27
|
management_network_ip.inspect =~ /IPv4:(.*)\/(.*)>/
|
27
28
|
|
28
|
-
if
|
29
|
+
if Regexp.last_match(2) == '255.255.255.255'
|
29
30
|
raise Errors::ManagementNetworkError,
|
30
|
-
|
31
|
+
error_message: "#{management_network_address} does not include both an address and subnet mask"
|
31
32
|
end
|
32
33
|
|
33
34
|
management_network_options = {
|
34
35
|
iface_type: :private_network,
|
35
36
|
network_name: management_network_name,
|
36
|
-
ip:
|
37
|
-
netmask:
|
37
|
+
ip: Regexp.last_match(1),
|
38
|
+
netmask: Regexp.last_match(2),
|
38
39
|
dhcp_enabled: true,
|
39
40
|
forward_mode: management_network_mode,
|
40
41
|
guest_ipv6: management_network_guest_ipv6,
|
42
|
+
autostart: management_network_autostart
|
41
43
|
}
|
42
44
|
|
43
45
|
unless management_network_mac.nil?
|
44
46
|
management_network_options[:mac] = management_network_mac
|
45
47
|
end
|
46
48
|
|
49
|
+
if (env[:machine].config.vm.box &&
|
50
|
+
!env[:machine].provider_config.mgmt_attach)
|
51
|
+
raise Errors::ManagementNetworkRequired
|
52
|
+
end
|
53
|
+
|
47
54
|
# add management network to list of networks to check
|
48
|
-
|
55
|
+
# unless mgmt_attach set to false
|
56
|
+
networks = if env[:machine].provider_config.mgmt_attach
|
57
|
+
[management_network_options]
|
58
|
+
else
|
59
|
+
[]
|
60
|
+
end
|
49
61
|
|
50
62
|
env[:machine].config.vm.networks.each do |type, original_options|
|
51
63
|
logger.debug "In config found network type #{type} options #{original_options}"
|
@@ -59,18 +71,18 @@ module VagrantPlugins
|
|
59
71
|
iface_type: type,
|
60
72
|
netmask: '255.255.255.0',
|
61
73
|
dhcp_enabled: true,
|
62
|
-
forward_mode: 'nat'
|
74
|
+
forward_mode: 'nat'
|
63
75
|
}.merge(options)
|
64
76
|
|
65
77
|
if options[:type].to_s == 'dhcp' && options[:ip].nil?
|
66
|
-
options[:network_name] =
|
78
|
+
options[:network_name] = 'vagrant-private-dhcp'
|
67
79
|
end
|
68
80
|
|
69
81
|
# add to list of networks to check
|
70
82
|
networks.push(options)
|
71
83
|
end
|
72
84
|
|
73
|
-
|
85
|
+
networks
|
74
86
|
end
|
75
87
|
|
76
88
|
# Return a list of all (active and inactive) libvirt networks as a list
|
@@ -84,7 +96,8 @@ module VagrantPlugins
|
|
84
96
|
# Iterate over all (active and inactive) networks.
|
85
97
|
active.concat(inactive).each do |network_name|
|
86
98
|
libvirt_network = libvirt_client.lookup_network_by_name(
|
87
|
-
network_name
|
99
|
+
network_name
|
100
|
+
)
|
88
101
|
|
89
102
|
# Parse ip address and netmask from the network xml description.
|
90
103
|
xml = Nokogiri::XML(libvirt_network.xml_desc)
|
@@ -93,19 +106,15 @@ module VagrantPlugins
|
|
93
106
|
netmask = xml.xpath('/network/ip/@netmask').first
|
94
107
|
netmask = netmask.value if netmask
|
95
108
|
|
96
|
-
if xml.at_xpath('//network/ip/dhcp')
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
109
|
+
dhcp_enabled = if xml.at_xpath('//network/ip/dhcp')
|
110
|
+
true
|
111
|
+
else
|
112
|
+
false
|
113
|
+
end
|
101
114
|
|
102
115
|
# Calculate network address of network from ip address and
|
103
116
|
# netmask.
|
104
|
-
if ip && netmask
|
105
|
-
network_address = network_address(ip, netmask)
|
106
|
-
else
|
107
|
-
network_address = nil
|
108
|
-
end
|
117
|
+
network_address = (network_address(ip, netmask) if ip && netmask)
|
109
118
|
|
110
119
|
libvirt_networks << {
|
111
120
|
name: network_name,
|
@@ -123,7 +132,6 @@ module VagrantPlugins
|
|
123
132
|
|
124
133
|
libvirt_networks
|
125
134
|
end
|
126
|
-
|
127
135
|
end
|
128
136
|
end
|
129
137
|
end
|
data/lib/vagrant-libvirt/util.rb
CHANGED
@@ -3,10 +3,9 @@ module VagrantPlugins
|
|
3
3
|
module Util
|
4
4
|
autoload :ErbTemplate, 'vagrant-libvirt/util/erb_template'
|
5
5
|
autoload :Collection, 'vagrant-libvirt/util/collection'
|
6
|
-
autoload :Timer,
|
7
|
-
autoload :NetworkUtil,
|
8
|
-
autoload :ErrorCodes,
|
6
|
+
autoload :Timer, 'vagrant-libvirt/util/timer'
|
7
|
+
autoload :NetworkUtil, 'vagrant-libvirt/util/network_util'
|
8
|
+
autoload :ErrorCodes, 'vagrant-libvirt/util/error_codes'
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
data/locales/en.yml
CHANGED
@@ -137,6 +137,9 @@ en:
|
|
137
137
|
Error while deleting snapshot: %{error_message}.
|
138
138
|
tunnel_port_not_defined: |-
|
139
139
|
tunnel UDP or TCP port not defined.
|
140
|
+
management_network_required: |-
|
141
|
+
Management network can't be disabled when VM use box.
|
142
|
+
Please fix your configuration and run vagrant again.
|
140
143
|
|
141
144
|
states:
|
142
145
|
paused: |-
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'ostruct'
|
2
|
+
require 'pathname'
|
3
3
|
|
4
4
|
class EnvironmentHelper
|
5
|
-
|
6
5
|
attr_writer :domain_name
|
7
6
|
|
8
7
|
attr_accessor :random_hostname, :name, :default_prefix
|
9
8
|
|
10
9
|
def [](value)
|
11
|
-
|
10
|
+
send(value.to_sym)
|
12
11
|
end
|
13
12
|
|
14
13
|
def cpus
|
@@ -34,15 +33,14 @@ class EnvironmentHelper
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def root_path
|
37
|
-
Pathname.new(
|
36
|
+
Pathname.new('./spec/support/foo')
|
38
37
|
end
|
39
38
|
|
40
39
|
def domain_name
|
41
|
-
#noop
|
40
|
+
# noop
|
42
41
|
end
|
43
42
|
|
44
43
|
def libvirt_compute
|
45
44
|
OpenStruct.new(servers: [])
|
46
45
|
end
|
47
|
-
|
48
46
|
end
|
@@ -1,28 +1,30 @@
|
|
1
1
|
require 'fog/libvirt'
|
2
2
|
|
3
|
-
shared_context
|
4
|
-
include_context
|
3
|
+
shared_context 'libvirt' do
|
4
|
+
include_context 'unit'
|
5
5
|
|
6
6
|
let(:libvirt_context) { true }
|
7
|
-
let(:id) {
|
8
|
-
let(:connection) { double(
|
9
|
-
let(:domain) { double(
|
7
|
+
let(:id) { 'dummy-vagrant_dummy' }
|
8
|
+
let(:connection) { double('connection') }
|
9
|
+
let(:domain) { double('domain') }
|
10
10
|
|
11
|
-
def connection_result(options={})
|
11
|
+
def connection_result(options = {})
|
12
12
|
result = options.fetch(:result, nil)
|
13
|
-
double(
|
13
|
+
double('connection_result' => result)
|
14
14
|
end
|
15
15
|
|
16
16
|
before (:each) do
|
17
17
|
# we don't want unit tests to ever run commands on the system; so we wire
|
18
18
|
# in a double to ensure any unexpected messages raise exceptions
|
19
|
-
stub_const(
|
19
|
+
stub_const('::Fog::Compute', connection)
|
20
20
|
|
21
21
|
# drivers also call vm_exists? during init;
|
22
|
-
allow(connection).to receive(:servers).with(kind_of(String))
|
23
|
-
and_return(connection_result(result: nil))
|
22
|
+
allow(connection).to receive(:servers).with(kind_of(String))
|
23
|
+
.and_return(connection_result(result: nil))
|
24
24
|
|
25
25
|
# return some information for domain when needed
|
26
|
-
allow(domain).to receive(:mac).and_return(
|
26
|
+
allow(domain).to receive(:mac).and_return('9C:D5:53:F1:5A:E7')
|
27
|
+
|
28
|
+
machine.stub(id: id)
|
27
29
|
end
|
28
30
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
shared_context
|
3
|
+
shared_context 'unit' do
|
4
4
|
include_context 'vagrant-unit'
|
5
5
|
|
6
|
-
let(:vagrantfile) do
|
6
|
+
let(:vagrantfile) do
|
7
|
+
<<-EOF
|
7
8
|
Vagrant.configure('2') do |config|
|
8
9
|
config.vm.define :test
|
9
10
|
end
|
@@ -15,21 +16,19 @@ shared_context "unit" do
|
|
15
16
|
test_env
|
16
17
|
end
|
17
18
|
let(:env) { { env: iso_env, machine: machine, ui: ui, root_path: '/rootpath' } }
|
18
|
-
let(:conf) { Vagrant::Config::V2::DummyConfig.new
|
19
|
-
let(:ui) { Vagrant::UI::Basic.new
|
19
|
+
let(:conf) { Vagrant::Config::V2::DummyConfig.new }
|
20
|
+
let(:ui) { Vagrant::UI::Basic.new }
|
20
21
|
let(:iso_env) { test_env.create_vagrant_env ui_class: Vagrant::UI::Basic }
|
21
22
|
let(:machine) { iso_env.machine(:test, :libvirt) }
|
22
23
|
# Mock the communicator to prevent SSH commands for being executed.
|
23
24
|
let(:communicator) { double('communicator') }
|
24
25
|
# Mock the guest operating system.
|
25
26
|
let(:guest) { double('guest') }
|
26
|
-
let(:app) {
|
27
|
-
let(:plugin) { register_plugin
|
27
|
+
let(:app) { ->(env) {} }
|
28
|
+
let(:plugin) { register_plugin }
|
28
29
|
|
29
30
|
before (:each) do
|
30
|
-
machine.stub(:
|
31
|
-
machine.stub(:
|
32
|
-
machine.stub(:id => id)
|
31
|
+
machine.stub(guest: guest)
|
32
|
+
machine.stub(communicator: communicator)
|
33
33
|
end
|
34
|
-
|
35
34
|
end
|