Skip to content

Commit 9c9ef27

Browse files
committed
vagrant: Improve network interfaces support
Current code doesn't ensure that the network name is valid. According to current Vagrant documentation, it can only be: - public_network - private_network - forwarded_port Moreover, the same documentation is saying that public network configuration may be reduced to: config.vm.network "public_network" So add needed code to support interfaces without any options. On the test side: - modify the network test to check that the generated Vagrantfile is correct when no option is specified - add a test to ensure invalid network name are caught. Fixes: #99 Signed-off-by: Arnaud Patard <[email protected]>
1 parent d1157e8 commit 9c9ef27

File tree

6 files changed

+50
-5
lines changed

6 files changed

+50
-5
lines changed

src/molecule_plugins/vagrant/modules/vagrant.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
See doc/source/configuration.rst
177177
"""
178178

179+
VAGRANT_VALID_NETNAMES = ["private_network", "public_network", "forwarded_port"]
179180
VAGRANTFILE_TEMPLATE = """
180181
{%- macro ruby_format(value) -%}
181182
{%- if value is boolean -%}
@@ -242,7 +243,7 @@
242243
# Network
243244
##
244245
{% for n in instance.networks %}
245-
c.vm.network "{{ n.name }}", {{ dict2args(n.options) }}
246+
c.vm.network "{{ n.name }}"{% if 'options' in n %}, {{ dict2args(n.options) }}{% endif %}
246247
{% endfor %}
247248
248249
##
@@ -589,10 +590,16 @@ def _get_instance_vagrant_config_dict(self, instance):
589590
networks = []
590591
if "interfaces" in instance:
591592
for iface in instance["interfaces"]:
593+
net_name = iface["network_name"]
594+
if net_name not in VAGRANT_VALID_NETNAMES:
595+
self._module.fail_json(
596+
msg=f"Invalid network_name value {net_name}."
597+
)
592598
net = {}
593-
net["name"] = iface["network_name"]
599+
net["name"] = net_name
594600
iface.pop("network_name")
595-
net["options"] = iface
601+
if len(iface) > 0:
602+
net["options"] = iface
596603
networks.append(net)
597604

598605
# compat

test/vagrant/functional/test_func.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,22 @@ def test_invalid_settings(temp_dir):
100100
not is_vagrant_supported(),
101101
reason="vagrant not supported on this machine",
102102
)
103+
def test_invalid_network_name(temp_dir):
104+
scenario_directory = os.path.join(
105+
os.path.dirname(util.abs_path(__file__)), os.path.pardir, "scenarios"
106+
)
107+
108+
with change_dir_to(scenario_directory):
109+
cmd = ["molecule", "create", "--scenario-name", "invalid_net"]
110+
result = run_command(cmd)
111+
assert result.returncode == 2
112+
113+
assert "Invalid network_name value my_network." in result.stdout
114+
115+
116+
@pytest.mark.skipif(
117+
not is_vagrant_supported(), reason="vagrant not supported on this machine"
118+
)
103119
@pytest.mark.parametrize(
104120
"scenario",
105121
[
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
- name: Converge
3+
hosts: all
4+
gather_facts: false
5+
become: true
6+
tasks:
7+
- name: Sample task # noqa command-instead-of-shell
8+
ansible.builtin.shell:
9+
cmd: uname
10+
changed_when: false
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
dependency:
3+
name: galaxy
4+
driver:
5+
name: vagrant
6+
platforms:
7+
- name: instance/foo
8+
interfaces:
9+
- network_name: my_network
10+
provisioner:
11+
name: ansible

test/vagrant/scenarios/molecule/network/molecule.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ platforms:
1515
- network_name: private_network
1616
ip: 192.168.56.4
1717
auto_config: true
18+
- network_name: public_network
1819
provisioner:
1920
name: ansible
2021
verifier:

test/vagrant/scenarios/molecule/network/verify.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
gather_subset:
66
- network
77
tasks:
8-
- name: Check that there are 3 interfaces
8+
- name: Check that there are 4 interfaces
99
ansible.builtin.assert:
1010
that:
11-
- "{{ ansible_interfaces | length == 3 }}"
11+
- "{{ ansible_interfaces | length == 4 }}"

0 commit comments

Comments
 (0)