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 %}