Merge "Collect lbaas logs"
diff --git a/metadata/service/compute/single.yml b/metadata/service/compute/single.yml
index d86284d..e1196b2 100644
--- a/metadata/service/compute/single.yml
+++ b/metadata/service/compute/single.yml
@@ -1,5 +1,7 @@
 applications:
 - neutron
+classes:
+- service.neutron.support
 parameters:
   neutron:
     compute:
@@ -24,5 +26,3 @@
         mechanism:
           ovs:
             driver: openvswitch
-
-
diff --git a/metadata/service/gateway/single.yml b/metadata/service/gateway/single.yml
index 1e8fa2b..4ff30d1 100644
--- a/metadata/service/gateway/single.yml
+++ b/metadata/service/gateway/single.yml
@@ -1,5 +1,7 @@
 applications:
 - neutron
+classes:
+- service.neutron.support
 parameters:
   neutron:
     gateway:
diff --git a/neutron/files/liberty/neutron-server.conf.Debian b/neutron/files/liberty/neutron-server.conf.Debian
index 4d15921..80a4559 100644
--- a/neutron/files/liberty/neutron-server.conf.Debian
+++ b/neutron/files/liberty/neutron-server.conf.Debian
@@ -570,7 +570,12 @@
 # Driver or drivers to handle sending notifications. (multi
 # valued)
 # notification_driver=
-{%- if server.notification %}
+{%- if server.notification is mapping %}
+notification_driver = {{ server.notification.get('driver', 'messagingv2') }}
+{%- if server.notification.topics is defined %}
+notification_topics = {{ server.notification.topics }}
+{%- endif %}
+{%- elif server.notification %}
 notification_driver = neutron.openstack.common.notifier.rpc_notifier
 {%- endif %}
 # AMQP topic used for OpenStack notifications. (list value)
diff --git a/neutron/files/mitaka/ml2_conf.ini b/neutron/files/mitaka/ml2_conf.ini
index d455fb9..a0879b1 100644
--- a/neutron/files/mitaka/ml2_conf.ini
+++ b/neutron/files/mitaka/ml2_conf.ini
@@ -168,7 +168,7 @@
 # List of <physical_network>:<vlan_min>:<vlan_max> or <physical_network> specifying physical_network names usable for VLAN provider and
 # tenant networks, as well as ranges of VLAN tags on each available for allocation to tenant networks. (list value)
 #network_vlan_ranges =
-network_vlan_ranges ={%- if "vlan" in server.backend.tenant_network_types %}physnet1{%- if server.backend.external_vlan_range is defined %}:{{ server.backend.external_vlan_range }}{%- endif %},physnet2:{{ server.backend.tenant_vlan_range }}{%- endif %}
+network_vlan_ranges = physnet1{%- if server.backend.external_vlan_range is defined %}:{{ server.backend.external_vlan_range }}{%- endif %}{%- if "vlan" in server.backend.tenant_network_types %},physnet2:{{ server.backend.tenant_vlan_range }}{%- endif %}
 
 
 [ml2_type_vxlan]
diff --git a/neutron/files/mitaka/neutron-generic.conf.Debian b/neutron/files/mitaka/neutron-generic.conf.Debian
index 57e64f6..d746ac2 100644
--- a/neutron/files/mitaka/neutron-generic.conf.Debian
+++ b/neutron/files/mitaka/neutron-generic.conf.Debian
@@ -1181,6 +1181,14 @@
 # messaging, messagingv2, routing, log, test, noop (multi valued)
 # Deprecated group/name - [DEFAULT]/notification_driver
 #driver =
+{%- if neutron.notification is mapping %}
+driver = {{ neutron.notification.get('driver', 'messagingv2') }}
+{%- if neutron.notification.topics is defined %}
+topics = {{ neutron.notification.topics }}
+{%- endif %}
+{%- elif neutron.get('notification', False) %}
+driver = messagingv2
+{%- endif %}
 
 # A URL representing the messaging driver to use for notifications. If not set,
 # we fall back to the same configuration used for RPC. (string value)
@@ -1551,4 +1559,4 @@
 
 # Sets the list of available ciphers. value should be a string in the OpenSSL
 # cipher list format. (string value)
-#ciphers = <None>
\ No newline at end of file
+#ciphers = <None>
diff --git a/neutron/files/mitaka/neutron-server.conf.Debian b/neutron/files/mitaka/neutron-server.conf.Debian
index b587cba..eae3a94 100644
--- a/neutron/files/mitaka/neutron-server.conf.Debian
+++ b/neutron/files/mitaka/neutron-server.conf.Debian
@@ -1241,7 +1241,12 @@
 # messaging, messagingv2, routing, log, test, noop (multi valued)
 # Deprecated group/name - [DEFAULT]/notification_driver
 #driver =
-{%- if server.notification %}
+{%- if server.notification is mapping %}
+driver = {{ server.notification.get('driver', 'messagingv2') }}
+{%- if server.notification.topics is defined %}
+topics = {{ server.notification.topics }}
+{%- endif %}
+{%- elif server.notification %}
 driver = messagingv2
 {%- endif %}
 # A URL representing the messaging driver to use for notifications. If not set,
diff --git a/neutron/files/mitaka/openvswitch_agent.ini b/neutron/files/mitaka/openvswitch_agent.ini
index d22dda7..4656e35 100644
--- a/neutron/files/mitaka/openvswitch_agent.ini
+++ b/neutron/files/mitaka/openvswitch_agent.ini
@@ -101,6 +101,7 @@
 
 # Network types supported by the agent (gre and/or vxlan). (list value)
 #tunnel_types =
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
 tunnel_types =vxlan
 
 # The UDP port to use for VXLAN tunnels. (port value)
@@ -112,7 +113,6 @@
 # MTU size of veth interfaces (integer value)
 #veth_mtu = 9000
 
-{%- if "vxlan" in neutron.backend.tenant_network_types %}
 # Use ML2 l2population mechanism driver to learn remote MAC and IPs and improve tunnel scalability. (boolean value)
 #l2_population = false
 l2_population = True
@@ -180,7 +180,9 @@
 
 # Local IP address of tunnel endpoint. Can be either an IPv4 or IPv6 address. (IP address value)
 #local_ip = <None>
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
 local_ip = {{ neutron.local_ip }}
+{%- endif %}
 
 # Comma-separated list of <physical_network>:<bridge> tuples mapping physical network names to the agent's node-specific Open vSwitch bridge
 # names to be used for flat and VLAN networks. The length of bridge names should be no more than 11. Each bridge must exist, and should have
diff --git a/neutron/meta/collectd.yml b/neutron/meta/collectd.yml
index 4fb96c5..5afd628 100644
--- a/neutron/meta/collectd.yml
+++ b/neutron/meta/collectd.yml
@@ -1,4 +1,4 @@
-{%- if pillar.neutron.server %}
+{%- if pillar.neutron.server is defined %}
 {%- from "neutron/map.jinja" import server with context %}
 {%- if server.get('enabled', False) %}
 local_plugin:
diff --git a/neutron/meta/heka.yml b/neutron/meta/heka.yml
index 9faeaf2..b14c967 100644
--- a/neutron/meta/heka.yml
+++ b/neutron/meta/heka.yml
@@ -1,3 +1,12 @@
+{%- from "neutron/map.jinja" import server with context %}
+{%- if server.get('backend', {}).engine is defined and server.backend.engine == "ml2" %}
+{% set neutron_agents = ('l3', 'dhcp', 'metadata', 'openvswitch') %}
+{%- else %}
+{% set neutron_agents = () %}
+{%- endif %}
+
+{% set ovs_support = pillar.neutron.get('compute', {}).get('enabled', False) or pillar.neutron.get('gateway', {}).get('enabled', False) %}
+
 log_collector:
   decoder:
     neutron:
@@ -5,6 +14,12 @@
       module_file: /usr/share/lma_collector/decoders/openstack_log.lua
       module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
       adjust_timezone: true
+{%- if ovs_support %}
+    ovs:
+      engine: sandbox
+      module_file: /usr/share/lma_collector/decoders/ovs_log.lua
+      module_dir: /usr/share/lma_collector/common;/usr/share/heka/lua_modules
+{%- endif %}
   splitter:
     neutron:
       engine: token
@@ -18,6 +33,16 @@
       priority: ["^Seq"]
       decoder: "neutron_decoder"
       splitter: "neutron_splitter"
+{%- if ovs_support %}
+    ovs_log:
+      engine: logstreamer
+      log_directory: "/var/log/openvswitch"
+      file_match: '(?P<Service>ovs\-vswitchd|ovsdb\-server|ovs\-ctl)\.log$'
+      differentiator: ['Service']
+      priority: ["^Seq"]
+      decoder: "ovs_decoder"
+      splitter: "TokenSplitter"
+{%- endif %}
 metric_collector:
   trigger:
     neutron_logs_error:
@@ -34,7 +59,7 @@
         window: 70
         periods: 0
         function: max
-    {%- if pillar.neutron.server is defined %}
+{%- if pillar.neutron.server is defined %}
     neutron_api_local_endpoint:
       description: 'Neutron API is locally down'
       severity: down
@@ -47,25 +72,32 @@
         window: 60
         periods: 0
         function: last
-    {%- endif %}
+{%- endif %}
   alarm:
-    {%- if pillar.neutron.server is defined %}
-    neutron_logs:
+{%- if pillar.neutron.server is defined %}
+    neutron_logs_control:
       alerting: enabled
       triggers:
       - neutron_logs_error
       dimension:
-        service: neutron-logs
+        service: neutron-logs-control
     neutron_api_endpoint:
       alerting: enabled
       triggers:
       - neutron_api_local_endpoint
       dimension:
         service: neutron-api-endpoint
-    {%- endif %}
+{%- else %}
+    neutron_logs_data:
+      alerting: enabled
+      triggers:
+      - neutron_logs_error
+      dimension:
+        service: neutron-logs-data
+{%- endif %}
+{%- if pillar.neutron.server is defined %}
 remote_collector:
   trigger:
-    {%- if pillar.neutron.server is defined %}
     neutron_api_check_failed:
       description: 'Endpoint check for neutron-api is failed'
       severity: down
@@ -78,25 +110,95 @@
         window: 60
         periods: 0
         function: last
-    {%- endif %}
+{%- for agent in neutron_agents %}
+    neutron_{{ agent }}_two_up:
+      description: 'Some Neutron {{ agent }} agents are down'
+      severity: warning
+      logical_operator: and
+      rules:
+      - metric: openstack_neutron_agents
+        field:
+          service: {{ agent }}
+          state: up
+        relational_operator: '>='
+        threshold: 2
+        window: 60
+        periods: 0
+        function: last
+      - metric: openstack_neutron_agents
+        field:
+          service: {{ agent }}
+          state: down
+        relational_operator: '>'
+        threshold: 0
+        window: 60
+        periods: 0
+        function: last
+    neutron_{{ agent }}_one_up:
+      description: 'Only one Neutron {{ agent }} agent is up'
+      severity: critical
+      logical_operator: and
+      rules:
+      - metric: openstack_neutron_agents
+        field:
+          service: {{ agent }}
+          state: up
+        relational_operator: '=='
+        threshold: 1
+        window: 60
+        periods: 0
+        function: last
+      - metric: openstack_neutron_agents_percent
+        field:
+          service: {{ agent }}
+          state: up
+        relational_operator: '<'
+        threshold: 100
+        window: 60
+        periods: 0
+        function: last
+    neutron_{{ agent }}_zero_up:
+      description: 'All Neutron {{ agent }} agents are down or disabled'
+      severity: down
+      rules:
+      - metric: openstack_neutron_agents
+        field:
+          service: {{ agent }}
+          state: up
+        relational_operator: '=='
+        threshold: 0
+        window: 60
+        periods: 0
+        function: last
+{%- endfor %}
   alarm:
-    {%- if pillar.neutron.server is defined %}
     neutron_api_check:
       triggers:
       - neutron_api_check_failed
       dimension:
         service: neutron-api-check
-    {%- endif %}
+{%- for agent in neutron_agents %}
+    neutron_{{ agent }}:
+      alerting: enabled
+      triggers:
+      - neutron_{{ agent }}_zero_up
+      - neutron_{{ agent }}_one_up
+      - neutron_{{ agent }}_two_up
+      dimension:
+        service: neutron-{{ agent }}
+{%- endfor %}
+{%- endif %}
 aggregator:
   alarm_cluster:
-    neutron_logs:
+{%- if pillar.neutron.server is defined %}
+    neutron_logs_control:
       policy: status_of_members
       alerting: enabled
       group_by: hostname
       match:
-        service: neutron-logs
+        service: neutron-logs-control
       members:
-      - neutron_logs
+      - neutron_logs_control
       dimension:
         service: neutron-control
         nagios_host: 01-service-clusters
@@ -127,9 +229,49 @@
       match:
         service: neutron-control
       members:
-      - neutron_logs
+      - neutron_logs_control
       - neutron_api_endpoint
       - neutron_api_check
       dimension:
         cluster_name: neutron-control
         nagios_host: 00-top-clusters
+{%- for agent in neutron_agents %}
+    neutron_{{ agent }}:
+      policy: highest_severity
+      alerting: enabled
+      match:
+        service: neutron-{{ agent }}
+      members:
+      - neutron_{{ agent }}
+      dimension:
+        service: neutron-data
+        nagios_host: 01-service-clusters
+{%- endfor %}
+{%- if neutron_agents|length > 0 %}
+    neutron_data:
+      policy: highest_severity
+      alerting: enabled_with_notification
+      match:
+        service: neutron-data
+      members:
+      - neutron_logs_data
+{%- for agent in neutron_agents %}
+      - neutron_{{ agent }}
+{%- endfor %}
+      dimension:
+        cluster_name: neutron-data
+        nagios_host: 00-top-clusters
+{%- endif %}
+{%- else %}
+    neutron_logs_data:
+      policy: status_of_members
+      alerting: enabled
+      group_by: hostname
+      match:
+        service: neutron-logs-data
+      members:
+      - neutron_logs_data
+      dimension:
+        service: neutron-data
+        nagios_host: 01-service-clusters
+{%- endif %}