From 773ce650f1c4cb465e0814e451b6f989b61ec6d1 Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Tue, 15 Apr 2025 11:11:15 +0100
Subject: [PATCH 1/5] Update to Juniper edgeport template

---
 .../templates/juniper/edge_port_create.j2     | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)
 create mode 100644 geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2

diff --git a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2 b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
new file mode 100644
index 00000000..5b71496d
--- /dev/null
+++ b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
@@ -0,0 +1,23 @@
+{% set gaid_prefix = '$' %}
+{% set csn_prefix = '#' %}
+
+
+{% for member in  ep.edge_port_ae_members %}
+set interfaces {{ member.interface_name }} description "PHY CUSTOMER {{ partner_name }} P_{{ ep.edge_port_name }}{{ ' | '+member.interface_description if member.interface_description is string }}
+set interfaces {{ member.interface_name }} gigether-options 802.3ad {{ ep.edge_port_name }}
+{% endfor %}
+{% if removed_ae_members is defined and removed_ae_members|length > 0 %}
+  {% for member in removed_ae_members %}
+deactivate {{ member.interface_name }}
+  {% endfor %}
+{% endif %}
+
+set interfaces {{ ep.edge_port_name }} description LAG {{ ep.edge_port_type }} {{ partner_name }}{{ ' | '+gaid_prefix+ep.ga_id if ep.ga_id is string }}{{ ' | '+csn_prefix+(ep.custom_service_name | replace("#","")) if ep.custom_service_name is string }}{{ ' | '+ep.edge_port_description if ep.edge_port_description is string }}
+set interfaces {{ ep.edge_port_name }} {% 'flexible-vlan-tagging' if ep.encapsulation == 'qinq' else 'vlan-tagging' %}
+set interfaces {{ ep.edge_port_name }} mtu 9192
+set interfaces {{ ep.edge_port_name }} encapsulation flexible-ethernet-services
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options minimum-links {{ ep.minimum-links }}
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options link-speed {{ ep.edge_port_ae_members[0].memeber_speed }}
+{% if enable_lacp %}
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options lacp active
+{% endif %}
-- 
GitLab


From d3a87cad9174de28f3f6fb2ff2ef9edd9d89a57d Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Tue, 15 Apr 2025 13:21:42 +0100
Subject: [PATCH 2/5] Add Juniper edge-port-terminate template

---
 .../roles/edge_port/templates/juniper/edge_port_terminate.j2 | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_terminate.j2

diff --git a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_terminate.j2 b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_terminate.j2
new file mode 100644
index 00000000..68f1293d
--- /dev/null
+++ b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_terminate.j2
@@ -0,0 +1,5 @@
+{% for member in  ep.edge_port_ae_members %}
+delete interfaces {{ member.interface_name }}
+{% endfor %}
+
+delete interfaces {{ ep.edge_port_name }}
-- 
GitLab


From 09dabc6c1aa5e1469d3abc288139ba80b62bbead Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Wed, 30 Apr 2025 21:32:48 +0100
Subject: [PATCH 3/5] Changes to the Juniper-related edge_port creation

---
 .../roles/edge_port/tasks/deploy.yaml         | 29 +++++++++++++++++++
 .../roles/edge_port/tasks/main.yml            | 12 ++++----
 .../templates/juniper/edge_port_create.j2     | 12 ++++----
 3 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/geant/gap_ansible/roles/edge_port/tasks/deploy.yaml b/geant/gap_ansible/roles/edge_port/tasks/deploy.yaml
index f6e3ee63..57cc6aa2 100644
--- a/geant/gap_ansible/roles/edge_port/tasks/deploy.yaml
+++ b/geant/gap_ansible/roles/edge_port/tasks/deploy.yaml
@@ -2,6 +2,8 @@
 - name: Perform "{{ verb }}" Edge port on  "{{ inventory_hostname }}" [CHECK ONLY][NOKIA]
   when: >-
       dry_run | ansible.builtin.bool
+      and
+      router.vendor == "nokia"
   geant.gap_ansible.nokia_netconf_config:
     format: xml
     default_operation: merge
@@ -13,6 +15,18 @@
   register: output
   check_mode: true
 
+- name: Config deploy [CHECK ONLY][JUNIPER]
+  when: >
+    dry_run | ansible.builtin.bool
+    and
+    router.vendor == "juniper"
+  junipernetworks.junos.junos_config:
+    update: 'replace'
+    src: "{{ play_storage_path }}/edge_port_{{ verb }}.conf"
+    src_format: set
+    check_commit: true
+  diff: true
+  register: output
 
 - name: Fail if there is any diff
   ansible.builtin.fail:
@@ -26,6 +40,8 @@
 - name: Perform "{{ verb }}" Edge port on  "{{ inventory_hostname }}" [FOR REAL][NOKIA]
   when: >-
       not (dry_run | ansible.builtin.bool)
+      and
+      router.vendor == "nokia"
   geant.gap_ansible.nokia_netconf_config:
     format: xml
     default_operation: merge
@@ -36,3 +52,16 @@
   diff: true
   register: output
   check_mode: false
+
+
+- name: Config deploy [AND COMMIT][JUNIPER]
+  when: >
+    not dry_run | ansible.builtin.bool
+    and
+    router.vendor == "juniper"
+  junipernetworks.junos.junos_config:
+    update: 'replace'
+    src: "{{ play_storage_path }}/edge_port_{{ verb }}.conf"
+    src_format: set
+    comment: "{{ commit_comment }}"
+  diff: true
diff --git a/geant/gap_ansible/roles/edge_port/tasks/main.yml b/geant/gap_ansible/roles/edge_port/tasks/main.yml
index 2381bf69..3e69831a 100644
--- a/geant/gap_ansible/roles/edge_port/tasks/main.yml
+++ b/geant/gap_ansible/roles/edge_port/tasks/main.yml
@@ -16,12 +16,10 @@
 - name: Include deploy tasks
   when: >
     verb in verbs
-    and
-    router.vendor == 'nokia'
   ansible.builtin.include_tasks: deploy.yaml
 
-- name: Skip all for Juniper
-  when: >
-    router.vendor == 'juniper'
-  ansible.builtin.debug:
-    msg: "Juniper tasks skipped"
+# - name: Skip all for Juniper
+#   when: >
+#     router.vendor == 'juniper'
+#   ansible.builtin.debug:
+#     msg: "Juniper tasks skipped"
diff --git a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2 b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
index 5b71496d..b5f6bb6d 100644
--- a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
+++ b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
@@ -3,7 +3,7 @@
 
 
 {% for member in  ep.edge_port_ae_members %}
-set interfaces {{ member.interface_name }} description "PHY CUSTOMER {{ partner_name }} P_{{ ep.edge_port_name }}{{ ' | '+member.interface_description if member.interface_description is string }}
+set interfaces {{ member.interface_name }} description "PHY CUSTOMER {{ partner_name }} P_{{ ep.edge_port_name }}{{ ' | '+member.interface_description if member.interface_description is string }}"
 set interfaces {{ member.interface_name }} gigether-options 802.3ad {{ ep.edge_port_name }}
 {% endfor %}
 {% if removed_ae_members is defined and removed_ae_members|length > 0 %}
@@ -12,12 +12,12 @@ deactivate {{ member.interface_name }}
   {% endfor %}
 {% endif %}
 
-set interfaces {{ ep.edge_port_name }} description LAG {{ ep.edge_port_type }} {{ partner_name }}{{ ' | '+gaid_prefix+ep.ga_id if ep.ga_id is string }}{{ ' | '+csn_prefix+(ep.custom_service_name | replace("#","")) if ep.custom_service_name is string }}{{ ' | '+ep.edge_port_description if ep.edge_port_description is string }}
-set interfaces {{ ep.edge_port_name }} {% 'flexible-vlan-tagging' if ep.encapsulation == 'qinq' else 'vlan-tagging' %}
+set interfaces {{ ep.edge_port_name }} description "LAG {{ ep.edge_port_type }} {{ partner_name }}{{ ' | '+gaid_prefix+ep.ga_id if ep.ga_id is string }}{{ ' | '+csn_prefix+(ep.custom_service_name | replace("#","")) if ep.custom_service_name is string }}{{ ' | '+ep.edge_port_description if ep.edge_port_description is string }}"
+set interfaces {{ ep.edge_port_name }} {{ 'flexible-vlan-tagging' if ep.encapsulation == 'qinq' else 'vlan-tagging' }}
 set interfaces {{ ep.edge_port_name }} mtu 9192
 set interfaces {{ ep.edge_port_name }} encapsulation flexible-ethernet-services
-set interfaces {{ ep.edge_port_name }} aggregated-ether-options minimum-links {{ ep.minimum-links }}
-set interfaces {{ ep.edge_port_name }} aggregated-ether-options link-speed {{ ep.edge_port_ae_members[0].memeber_speed }}
-{% if enable_lacp %}
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options minimum-links {{ ep.minimum_links }}
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options link-speed {{ ep.member_speed | lower }}
+{% if ep.enable_lacp %}
 set interfaces {{ ep.edge_port_name }} aggregated-ether-options lacp active
 {% endif %}
-- 
GitLab


From 521043ddd13b2aacda7f670da7bf40f5d1b9efad Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Thu, 1 May 2025 13:06:04 +0100
Subject: [PATCH 4/5] always compile the template

---
 geant/gap_ansible/roles/edge_port/tasks/compile.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/geant/gap_ansible/roles/edge_port/tasks/compile.yaml b/geant/gap_ansible/roles/edge_port/tasks/compile.yaml
index 0cdaff1a..3b47ff32 100644
--- a/geant/gap_ansible/roles/edge_port/tasks/compile.yaml
+++ b/geant/gap_ansible/roles/edge_port/tasks/compile.yaml
@@ -7,7 +7,7 @@
     ansible_connection: local
 
 - name: Print the template in "{{ play_storage_path }}/edge_port_{{ verb }}.conf"
-  when: verb == "create"
+  when: verb in verbs
   ansible.builtin.template:
     src: "{{ router.vendor }}/edge_port_{{ verb }}.j2"
     dest: "{{ play_storage_path }}/edge_port_{{ verb }}.conf"
-- 
GitLab


From 9b64216bc28600fa75a92e022446db20caeefa43 Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Thu, 1 May 2025 13:06:29 +0100
Subject: [PATCH 5/5] Add Juniper templates for `create` and `update`

---
 .../templates/juniper/edge_port_create.j2     |  5 ----
 .../templates/juniper/edge_port_update.j2     | 23 +++++++++++++++++++
 2 files changed, 23 insertions(+), 5 deletions(-)
 create mode 100644 geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_update.j2

diff --git a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2 b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
index b5f6bb6d..e9be6984 100644
--- a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
+++ b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_create.j2
@@ -6,11 +6,6 @@
 set interfaces {{ member.interface_name }} description "PHY CUSTOMER {{ partner_name }} P_{{ ep.edge_port_name }}{{ ' | '+member.interface_description if member.interface_description is string }}"
 set interfaces {{ member.interface_name }} gigether-options 802.3ad {{ ep.edge_port_name }}
 {% endfor %}
-{% if removed_ae_members is defined and removed_ae_members|length > 0 %}
-  {% for member in removed_ae_members %}
-deactivate {{ member.interface_name }}
-  {% endfor %}
-{% endif %}
 
 set interfaces {{ ep.edge_port_name }} description "LAG {{ ep.edge_port_type }} {{ partner_name }}{{ ' | '+gaid_prefix+ep.ga_id if ep.ga_id is string }}{{ ' | '+csn_prefix+(ep.custom_service_name | replace("#","")) if ep.custom_service_name is string }}{{ ' | '+ep.edge_port_description if ep.edge_port_description is string }}"
 set interfaces {{ ep.edge_port_name }} {{ 'flexible-vlan-tagging' if ep.encapsulation == 'qinq' else 'vlan-tagging' }}
diff --git a/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_update.j2 b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_update.j2
new file mode 100644
index 00000000..da7dcd30
--- /dev/null
+++ b/geant/gap_ansible/roles/edge_port/templates/juniper/edge_port_update.j2
@@ -0,0 +1,23 @@
+{% set gaid_prefix = '$' %}
+{% set csn_prefix = '#' %}
+
+
+{% for member in  ep.edge_port_ae_members %}
+set interfaces {{ member.interface_name }} description "PHY CUSTOMER {{ partner_name }} P_{{ ep.edge_port_name }}{{ ' | '+member.interface_description if member.interface_description is string }}"
+set interfaces {{ member.interface_name }} gigether-options 802.3ad {{ ep.edge_port_name }}
+{% endfor %}
+{% if removed_ae_members is defined and removed_ae_members|length > 0 %}
+  {% for member in removed_ae_members %}
+delete interfaces {{ member.interface_name }}
+  {% endfor %}
+{% endif %}
+
+set interfaces {{ ep.edge_port_name }} description "LAG {{ ep.edge_port_type }} {{ partner_name }}{{ ' | '+gaid_prefix+ep.ga_id if ep.ga_id is string }}{{ ' | '+csn_prefix+(ep.custom_service_name | replace("#","")) if ep.custom_service_name is string }}{{ ' | '+ep.edge_port_description if ep.edge_port_description is string }}"
+set interfaces {{ ep.edge_port_name }} {{ 'flexible-vlan-tagging' if ep.encapsulation == 'qinq' else 'vlan-tagging' }}
+set interfaces {{ ep.edge_port_name }} mtu 9192
+set interfaces {{ ep.edge_port_name }} encapsulation flexible-ethernet-services
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options minimum-links {{ ep.minimum_links }}
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options link-speed {{ ep.member_speed | lower }}
+{% if ep.enable_lacp %}
+set interfaces {{ ep.edge_port_name }} aggregated-ether-options lacp active
+{% endif %}
-- 
GitLab