From 94dec80705cf6612289baa6797b5cebe07ecfb52 Mon Sep 17 00:00:00 2001
From: Thomas O'Neill <thomas.oneill@eu.clara.net>
Date: Tue, 7 Mar 2017 16:39:59 +0000
Subject: [PATCH] Add neutron-bgp-dragent playbooks and sensible defaults.

Depends-On: If7f5c80eb10a1c418785d9c659ae18bfecfcfe33
Change-Id: I9c54f01193b4e12338e71cd1f0a4635dcbfa43fe
Implements: blueprint neutron-bgp-dragent
---
 ansible/group_vars/all.yml                    |  8 +++++
 ansible/inventory/all-in-one                  |  3 ++
 ansible/inventory/multinode                   |  3 ++
 ansible/roles/neutron/defaults/main.yml       | 21 +++++++++++
 ansible/roles/neutron/handlers/main.yml       | 25 +++++++++++++
 ansible/roles/neutron/tasks/config.yml        | 18 ++++++++++
 .../neutron/templates/bgp_dragent.ini.j2      |  3 ++
 .../templates/neutron-bgp-dragent.json.j2     | 36 +++++++++++++++++++
 etc/kolla/globals.yml                         |  1 +
 ...-neutron-bgp-dragent-26838f8e8c8d37b2.yaml |  3 ++
 10 files changed, 121 insertions(+)
 create mode 100644 ansible/roles/neutron/templates/bgp_dragent.ini.j2
 create mode 100644 ansible/roles/neutron/templates/neutron-bgp-dragent.json.j2
 create mode 100644 releasenotes/notes/add-neutron-bgp-dragent-26838f8e8c8d37b2.yaml

diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index fda731afac..d0233ecdc9 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -344,6 +344,7 @@ enable_neutron_lbaas: "no"
 enable_neutron_fwaas: "no"
 enable_neutron_qos: "no"
 enable_neutron_agent_ha: "no"
+enable_neutron_bgp_dragent: "no"
 enable_nova_serialconsole_proxy: "no"
 enable_octavia: "no"
 enable_panko: "no"
@@ -473,6 +474,13 @@ cloudkitty_collector_backend: "ceilometer"
 designate_backend: "bind9"
 designate_ns_record: "sample.openstack.org"
 
+
+#######################
+# Neutron options
+#######################
+neutron_bgp_router_id: "1.1.1.1"
+
+
 #######################
 # Nova options
 #######################
diff --git a/ansible/inventory/all-in-one b/ansible/inventory/all-in-one
index e42742d239..5b56eb53fc 100644
--- a/ansible/inventory/all-in-one
+++ b/ansible/inventory/all-in-one
@@ -236,6 +236,9 @@ neutron
 [neutron-vpnaas-agent:children]
 neutron
 
+[neutron-bgp-dragent:children]
+neutron
+
 # Ceph
 [ceph-mon:children]
 ceph
diff --git a/ansible/inventory/multinode b/ansible/inventory/multinode
index 37484dc495..24914e57d8 100644
--- a/ansible/inventory/multinode
+++ b/ansible/inventory/multinode
@@ -253,6 +253,9 @@ neutron
 [neutron-vpnaas-agent:children]
 neutron
 
+[neutron-bgp-dragent:children]
+neutron
+
 # Ceph
 [ceph-mon:children]
 ceph
diff --git a/ansible/roles/neutron/defaults/main.yml b/ansible/roles/neutron/defaults/main.yml
index 6c247bf727..37ffc108d6 100644
--- a/ansible/roles/neutron/defaults/main.yml
+++ b/ansible/roles/neutron/defaults/main.yml
@@ -212,6 +212,21 @@ neutron_services:
       - "/lib/modules:/lib/modules:ro"
       - "neutron_metadata_socket:/var/lib/neutron/kolla/"
       - "kolla_logs:/var/log/kolla/"
+  neutron-bgp-dragent:
+    container_name: "neutron_bgp_dragent"
+    image: "{{ neutron_bgp_dragent_image_full }}"
+    privileged: True
+    enabled: "{{ enable_neutron_bgp_dragent | bool }}"
+    group: "neutron-bgp-dragent"
+    host_in_groups: "{{ False if orchestration_engine == 'KUBERNETES' else inventory_hostname in groups['neutron-bgp-dragent'] }}"
+    volumes:
+      - "{{ node_config_directory }}/neutron-bgp-dragent/:{{ container_config_directory }}/:ro"
+      - "/etc/localtime:/etc/localtime:ro"
+      - "/run:/run:shared"
+      - "/run/netns/:/run/netns/:shared"
+      - "/lib/modules:/lib/modules:ro"
+      - "neutron_metadata_socket:/var/lib/neutron/kolla/"
+      - "kolla_logs:/var/log/kolla/"
 
 
 ####################
@@ -261,6 +276,10 @@ neutron_vpnaas_agent_image: "{{ docker_registry ~ '/' if docker_registry else ''
 neutron_vpnaas_agent_tag: "{{ openstack_release }}"
 neutron_vpnaas_agent_image_full: "{{ neutron_vpnaas_agent_image }}:{{ neutron_vpnaas_agent_tag }}"
 
+neutron_bgp_dragent_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-neutron-bgp-dragent"
+neutron_bgp_dragent_tag: "{{ openstack_release }}"
+neutron_bgp_dragent_image_full: "{{ neutron_bgp_dragent_image }}:{{ neutron_bgp_dragent_tag }}"
+
 openvswitch_db_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ kolla_install_type }}-openvswitch-db-server"
 openvswitch_db_tag: "{{ openstack_release }}"
 openvswitch_db_image_full: "{{ openvswitch_db_image }}:{{ openvswitch_db_tag }}"
@@ -318,5 +337,7 @@ service_plugins:
     enabled: true
   - name: "sfc"
     enabled: "{{ neutron_plugin_agent == 'sfc' }}"
+  - name: "neutron_dynamic_routing.services.bgp.bgp_plugin.BgpPlugin"
+    enabled: "{{ enable_neutron_bgp_dragent | bool }}"
 
 neutron_service_plugins: "{{ service_plugins|selectattr('enabled', 'equalto', true)|list }}"
diff --git a/ansible/roles/neutron/handlers/main.yml b/ansible/roles/neutron/handlers/main.yml
index f68c65b224..63d5b13d9e 100644
--- a/ansible/roles/neutron/handlers/main.yml
+++ b/ansible/roles/neutron/handlers/main.yml
@@ -359,3 +359,28 @@
       or neutron_vpnaas_agent_ini | changed
       or policy_json | changed
       or neutron_vpnaas_agent_container | changed
+
+- name: Restart neutron-bgp-dragent container
+  vars:
+    service_name: "neutron-bgp-dragent"
+    service: "{{ neutron_services[service_name] }}"
+    config_json: "{{ neutron_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    neutron_conf: "{{ neutron_confs.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    policy_json: "{{ policy_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    neutron_bgp_dragent_container: "{{ check_neutron_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
+  kolla_docker:
+    action: "recreate_or_restart_container"
+    common_options: "{{ docker_common_options }}"
+    name: "{{ service.container_name }}"
+    image: "{{ service.image }}"
+    volumes: "{{ service.volumes }}"
+    privileged: "{{ service.privileged | default(False) }}"
+  when:
+    - action != "config"
+    - service.enabled | bool
+    - service.host_in_groups | bool
+    - config_json | changed
+      or neutron_conf | changed
+      or neutron_bgp_dragent_ini | changed
+      or policy_json | changed
+      or neutron_bgp_dragent_container | changed
diff --git a/ansible/roles/neutron/tasks/config.yml b/ansible/roles/neutron/tasks/config.yml
index d7411b31b5..c80f55af5a 100644
--- a/ansible/roles/neutron/tasks/config.yml
+++ b/ansible/roles/neutron/tasks/config.yml
@@ -47,6 +47,7 @@
       - "neutron-server"
       - "neutron-lbaas-agent"
       - "neutron-vpnaas-agent"
+      - "neutron-bgp-dragent"
   merge_configs:
     sources:
       - "{{ role_path }}/templates/neutron.conf.j2"
@@ -251,6 +252,22 @@
   notify:
     - "Restart {{ service_name }} container"
 
+- name: Copying over bgp_dragent.ini
+  vars:
+    service_name: "neutron-bgp-dragent"
+    neutron_bgp_dragent: "{{ neutron_services['neutron-bgp-dragent'] }}"
+  merge_configs:
+    sources:
+      - "{{ role_path }}/templates/bgp_dragent.ini.j2"
+      - "{{ node_custom_config }}/neutron/bgp_dragent.ini"
+    dest: "{{ node_config_directory }}/{{ service_name }}/bgp_dragent.ini"
+  register: neutron_bgp_dragent_ini
+  when:
+    - neutron_bgp_dragent.enabled | bool
+    - neutron_bgp_dragent.host_in_groups | bool
+  notify:
+    - "Restart {{ service_name }} container"
+
 - name: Check if policies shall be overwritten
   local_action: stat path="{{ node_custom_config }}/neutron/policy.json"
   register: neutron_policy
@@ -267,6 +284,7 @@
       - "neutron-server"
       - "neutron-lbaas-agent"
       - "neutron-vpnaas-agent"
+      - "neutron-bgp-dragent"
   template:
     src: "{{ node_custom_config }}/neutron/policy.json"
     dest: "{{ node_config_directory }}/{{ service_name }}/policy.json"
diff --git a/ansible/roles/neutron/templates/bgp_dragent.ini.j2 b/ansible/roles/neutron/templates/bgp_dragent.ini.j2
new file mode 100644
index 0000000000..89ffbe45ac
--- /dev/null
+++ b/ansible/roles/neutron/templates/bgp_dragent.ini.j2
@@ -0,0 +1,3 @@
+[BGP]
+bgp_speaker_driver = neutron_dynamic_routing.services.bgp.agent.driver.ryu.driver.RyuBgpDriver
+bgp_router_id = {{ neutron_bgp_router_id }}
diff --git a/ansible/roles/neutron/templates/neutron-bgp-dragent.json.j2 b/ansible/roles/neutron/templates/neutron-bgp-dragent.json.j2
new file mode 100644
index 0000000000..bfc514ffb5
--- /dev/null
+++ b/ansible/roles/neutron/templates/neutron-bgp-dragent.json.j2
@@ -0,0 +1,36 @@
+{
+    "command": "neutron-bgp-dragent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/bgp_dragent.ini",
+    "config_files": [
+        {
+            "source": "{{ container_config_directory }}/neutron.conf",
+            "dest": "/etc/neutron/neutron.conf",
+            "owner": "neutron",
+            "perm": "0600"
+        },
+        {
+            "source": "{{ container_config_directory }}/bgp_dragent.ini",
+            "dest": "/etc/neutron/bgp_dragent.ini",
+            "owner": "neutron",
+            "perm": "0600"
+        },
+        {
+            "source": "{{ container_config_directory }}/policy.json",
+            "dest": "/etc/neutron/policy.json",
+            "owner": "neutron",
+            "perm": "0600",
+            "optional": true
+        }
+    ],
+    "permissions": [
+        {
+            "path": "/var/log/kolla/neutron",
+            "owner": "neutron:neutron",
+            "recurse": true
+        },
+        {
+            "path": "/var/lib/neutron/kolla",
+            "owner": "neutron:neutron",
+            "recurse": true
+        }
+    ]
+}
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index a36867168d..afa6dba6de 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -170,6 +170,7 @@ kolla_internal_vip_address: "10.10.10.254"
 #enable_mongodb: "no"
 #enable_murano: "no"
 #enable_multipathd: "no"
+#enable_neutron_bgp_dragent: "no"
 #enable_neutron_dvr: "no"
 #enable_neutron_lbaas: "no"
 #enable_neutron_fwaas: "no"
diff --git a/releasenotes/notes/add-neutron-bgp-dragent-26838f8e8c8d37b2.yaml b/releasenotes/notes/add-neutron-bgp-dragent-26838f8e8c8d37b2.yaml
new file mode 100644
index 0000000000..5ab87ef1da
--- /dev/null
+++ b/releasenotes/notes/add-neutron-bgp-dragent-26838f8e8c8d37b2.yaml
@@ -0,0 +1,3 @@
+---
+features:
+  - Added playbooks and default configuration for neutron-bgp-dragent service