From 7b8f43e4d876bc283a70e91c1cfdca409aeff79e Mon Sep 17 00:00:00 2001
From: Attila Farkas <ati@mail.muni.cz>
Date: Fri, 3 Jul 2020 08:28:41 +0200
Subject: [PATCH] add new version of the interface role

---
 templates/interface/defaults/main.yml   | 52 +++++++++++++++----------
 templates/interface/meta/main.yml       |  2 +-
 templates/interface/tasks/clean.yml     |  4 +-
 templates/interface/tasks/interface.yml | 21 +++++-----
 templates/interface/tasks/main.yml      |  6 +--
 5 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/templates/interface/defaults/main.yml b/templates/interface/defaults/main.yml
index 0910da5..fb4accb 100644
--- a/templates/interface/defaults/main.yml
+++ b/templates/interface/defaults/main.yml
@@ -2,39 +2,49 @@
 interface_default_file: /etc/network/interfaces
 interface_directory: '{{ interface_default_file }}.d'
 interface_file_name:
-interface_file: '
+interface_file: >-
     {%- if interface_file_name is defined and interface_file_name -%}
         {{ interface_directory }}/{{ interface_file_name }}
     {%- else -%}
         {{ interface_default_file }}
-    {%- endif %}'
+    {%- endif -%}
 
 interface_clean: True
-interface_mtu: 1442
 
-interface_ip:
-interface_mac:
-interface_name:
+interface_identification:
+interface_name: >-
+    {%- import "roles/common/templates/network.j2" as network with context -%}
+    {%- if interface_identification in ansible_interfaces -%}
+        {{ interface_identification }}
+    {%- elif interface_identification | ipv4 -%}
+        {{ network.ip_to_interface(interface_identification) }}
+    {%- elif interface_identification | regex_search("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$")-%}
+        {{ network.mac_to_interface(interface_identification) }}
+    {%- else -%}
+        ""
+    {%- endif -%}
+interface_configuration_type: dhcp
+
+interface_static_ip:
+interface_static_netmask:
+
+interface_mtu: 1442
 interface_default_gateway:
 interface_routes: []
 # - gateway:
 #   network:
-#   mask:
+#   netmask:
 
-interface_device: '
-    {%- import "roles/common/templates/network.j2" as network with context -%}
-    {%- if interface_ip is defined and interface_ip -%}
-        {{ network.ip_to_interface(interface_ip) | default("") }}
+interface_sanity_check_msg: >-
+    {%- if not interface_identification -%}
+        interface_identification is not set,
+    {%- endif -%}
+    {%- if interface_configuration_type not in ["dhcp", "static"] -%}
+        unknown interface_configuration_type,
     {%- endif -%}
-    {%- if interface_mac is defined and interface_mac -%}
-        {{ network.mac_to_interface(interface_mac) | default("") }}
+    {%- if interface_configuration_type == "static" and
+            (interface_static_ip is undefined or not interface_static_ip or
+            interface_static_netmask is undefined or not interface_static_netmask) -%}
+        interface_static_ip or interface_static_netmask is not defined
     {%- endif -%}
-    {%- if interface_name is defined and interface_name -%}
-        {{ interface_name }}
-    {%- endif -%}'
-interface_identifiers:
-    interface_ip: '{{ interface_ip }}'
-    interface_mac: '{{ interface_mac }}'
-    interface_name: '{{ interface_name }}'
-interface_condition_single_interface_identifier: '{{ interface_identifiers | dict2items | map(attribute="value") | select("string") | select("ne", "") | list | length != 1 }}'
 
diff --git a/templates/interface/meta/main.yml b/templates/interface/meta/main.yml
index 58ecda5..c504218 100644
--- a/templates/interface/meta/main.yml
+++ b/templates/interface/meta/main.yml
@@ -8,7 +8,7 @@ galaxy_info:
     author: Kamil Andoniadis
     description: Basic network interface configuration
     licence: MIT
-    min_ansible_version: 2.3.3
+    min_ansible_version: 2.8
     platforms:
         - name: Debian
           versions:
diff --git a/templates/interface/tasks/clean.yml b/templates/interface/tasks/clean.yml
index 36a651b..bb36d21 100644
--- a/templates/interface/tasks/clean.yml
+++ b/templates/interface/tasks/clean.yml
@@ -11,14 +11,14 @@
 - name: remove old iface settings for retrieved interface name
   replace:
       path: '{{ item }}'
-      regexp: ^iface[ \t]{{ interface_device }}[ \t].*(\n[ \t]+.*)*
+      regexp: ^iface[ \t]{{ interface_name }}[ \t].*(\n[ \t]+.*)*
   notify: interface_networking_restart
   with_items: '{{ interface_config_files }}'
 
 - name: remove the rest of old settings for retrieved interface name
   replace:
       path: '{{ item }}'
-      regexp: '^.*(?<=\s){{ interface_device }}(?=\s).*$'
+      regexp: '^.*(?<=\s){{ interface_name }}(?=\s).*$'
   notify: interface_networking_restart
   with_items: '{{ interface_config_files }}'
 
diff --git a/templates/interface/tasks/interface.yml b/templates/interface/tasks/interface.yml
index 5f78cca..5b17f26 100644
--- a/templates/interface/tasks/interface.yml
+++ b/templates/interface/tasks/interface.yml
@@ -3,22 +3,23 @@
   blockinfile:
       path: '{{ interface_file }}'
       create: yes
-      marker: '# {mark} {{ interface_device }}'
+      marker: '# {mark} {{ interface_name }}'
       block: |
-          allow-hotplug {{ interface_device }}
-          auto {{ interface_device }}
-          iface {{ interface_device }} inet static
-              address {{ interface_ip }}
-              netmask {{ interface_netmask }}
+          allow-hotplug {{ interface_name }}
+          auto {{ interface_name }}
+          iface {{ interface_name }} inet {{ interface_configuration_type }}
+              {% if interface_configuration_type == "static" -%}
+              address {{ interface_static_ip }}
+              netmask {{ interface_static_netmask }}
+              {% endif -%}
               mtu {{ interface_mtu }}
               {% if interface_default_gateway -%}
-              gateway {{ interface_default_gateway }}
-              up route add default gw {{ interface_default_gateway }}
+              up route add default gw {{ interface_default_gateway }} 
               {% endif -%}
               {% if interface_routes -%}
               {% for route in interface_routes -%}
-              post-up ip route add {{ route['network'] }}/{{ route['mask'] }} via {{ route['gateway'] }}
-              pre-down ip route del {{ route['network'] }}/{{ route['mask'] }} via {{ route['gateway'] }}
+              post-up ip route add {{ route['network'] }}/{{ route['netmask'] }} via {{ route['gateway'] }}
+              pre-down ip route del {{ route['network'] }}/{{ route['netmask'] }} via {{ route['gateway'] }}
               {% endfor %}
               {% endif %}
   notify: interface_networking_restart
diff --git a/templates/interface/tasks/main.yml b/templates/interface/tasks/main.yml
index 7e69f74..6116619 100644
--- a/templates/interface/tasks/main.yml
+++ b/templates/interface/tasks/main.yml
@@ -1,8 +1,8 @@
 
-- name: check existence of single interface identifier
+- name: sanity check
   fail:
-      msg: there must be set exactly one of [interface_ip|interface_mac|interface_name] variables, got {{ interface_identifiers }}
-  when: interface_condition_single_interface_identifier
+      msg: '{{ interface_sanity_check_msg }}'
+  when: interface_sanity_check_msg | length > 0
 
 - include: clean.yml
   when: interface_clean is defined and interface_clean
-- 
GitLab