Add Contrail metrics

Change-Id: I27c8d6430e6bd110047b5762b3e70a16e72e48d1
diff --git a/opencontrail/files/collectd_contrail_apis.conf b/opencontrail/files/collectd_contrail_apis.conf
new file mode 100644
index 0000000..5bfea5d
--- /dev/null
+++ b/opencontrail/files/collectd_contrail_apis.conf
@@ -0,0 +1,18 @@
+
+Import "contrail_apis"
+
+<Module "contrail_apis">
+  {%- for api_check_name, api_check in plugin.api_checks.iteritems() %}
+  {%- if api_check.url is defined and api_check.xml_element is defined %}
+  Url "{{ api_check_name }}" "{{ api_check.url }}"
+  XmlElement: "{{ api_check_name }}" "{{ api_check.xml_element }}"
+  {%- if api_check.result_type is defined %}
+  ResultType: "{{ api_check_name }}" "{{ api_check.result_type }}"
+  {%- endif %}
+  {%- if api_check.state is defined %}
+  State: "{{ api_check_name }}" "{{ api_check.state }}"
+  {%- endif %}
+  {%- endif %}
+  {%- endfor %}
+</Module>
+
diff --git a/opencontrail/files/collectd_contrail_ifmap_elements_count.conf b/opencontrail/files/collectd_contrail_ifmap_elements_count.conf
new file mode 100644
index 0000000..e733542
--- /dev/null
+++ b/opencontrail/files/collectd_contrail_ifmap_elements_count.conf
@@ -0,0 +1,6 @@
+
+Import "contrail_ifmap_elements_count"
+
+<Module "contrail_ifmap_elements_count">
+</Module>
+
diff --git a/opencontrail/meta/collectd.yml b/opencontrail/meta/collectd.yml
index 35d6c51..c1aab4f 100644
--- a/opencontrail/meta/collectd.yml
+++ b/opencontrail/meta/collectd.yml
@@ -1,16 +1,48 @@
 {%- if pillar.opencontrail is defined %}
 {%- if pillar.opencontrail.control is defined %}
-{%- from "opencontrail/map.jinja" import collector, config with context %}
+{%- from "opencontrail/map.jinja" import control, collector, config with context %}
 local_plugin:
+{%- if control.get('enabled', False) %}
+{%- set bind_addr=control.bind.address|replace('0.0.0.0', '127.0.0.1') %}
+  contrail_apis:
+    plugin: python
+    template: opencontrail/files/collectd_contrail_apis.conf
+    api_checks:
+      bgp-session-count:
+        url: "http://{{ bind_addr }}:8083/Snh_ShowNeighborStatisticsReq?bgp_or_xmpp=bgp"
+        xml_element: "ShowNeighborStatisticsResp"
+        result_type: "count"
+      bgp-session-up-count:
+        url: "http://{{ bind_addr }}:8083/Snh_ShowNeighborStatisticsReq?bgp_or_xmpp=bgp&up_or_down=up"
+        xml_element: "ShowNeighborStatisticsResp"
+        result_type: "count"
+      bgp-session-down-count:
+        url: "http://{{ bind_addr }}:8083/Snh_ShowNeighborStatisticsReq?bgp_or_xmpp=bgp&up_or_down=down"
+        xml_element: "ShowNeighborStatisticsResp"
+        result_type: "count"
+      xmpp-session-count:
+        url: "http://{{ bind_addr }}:8083/Snh_ShowNeighborStatisticsReq?bgp_or_xmpp=xmpp"
+        xml_element: "ShowNeighborStatisticsResp"
+        result_type: "count"
+      xmpp-session-up-count:
+        url: "http://{{ bind_addr }}:8083/Snh_ShowNeighborStatisticsReq?bgp_or_xmpp=xmpp&up_or_down=up"
+        xml_element: "ShowNeighborStatisticsResp"
+        result_type: "count"
+      xmpp-session-down-count:
+        url: "http://{{ bind_addr }}:8083/Snh_ShowNeighborStatisticsReq?bgp_or_xmpp=xmpp&up_or_down=down"
+        xml_element: "ShowNeighborStatisticsResp"
+        result_type: "count"
+{%- endif %}
   collectd_check_local_endpoint:
     endpoint:
 {%- if config.get('enabled', False) %}
+{%- set bind_addr=config.bind.address|replace('0.0.0.0', '127.0.0.1') %}
       contrail-api:
         expected_code: 401
-        url: "http://{{ config.bind.address|replace('0.0.0.0', '127.0.0.1') }}:{{ config.bind.api_port }}/"
+        url: "http://{{ bind_addr }}:{{ config.bind.api_port }}/"
       contrail-discovery:
         expected_code: 200
-        url: "http://{{ config.bind.address|replace('0.0.0.0', '127.0.0.1') }}:{{ config.bind.discovery_port }}/"
+        url: "http://{{ bind_addr }}:{{ config.bind.discovery_port }}/"
 {%- endif %}
 {%- if collector.get('enabled', False) %}
       contrail-collector:
@@ -70,7 +102,70 @@
 {%- elif pillar.opencontrail.compute is defined %}
 {%- from "opencontrail/map.jinja" import compute with context %}
 {%- if compute.get('enabled', False) %}
+{%- set bind_addr=compute.interface.address|replace('0.0.0.0', '127.0.0.1') %}
 local_plugin:
+  contrail_ifmap_elements_count:
+    plugin: python
+    template: opencontrail/files/collectd_contrail_ifmap_elements_count.conf
+  contrail_apis:
+    plugin: python
+    template: opencontrail/files/collectd_contrail_apis.conf
+    api_checks:
+      vrouter-flows-active:
+        url: "http://{{ bind_addr }}:8085/Snh_AgentStatsReq"
+        xml_element: "FlowStatsResp"
+        result_type: "flow_active"
+      vrouter-flows-aged:
+        url: "http://{{ bind_addr }}:8085/Snh_AgentStatsReq"
+        xml_element: "FlowStatsResp"
+        result_type: "flow_aged"
+      vrouter-flows-created:
+        url: "http://{{ bind_addr }}:8085/Snh_AgentStatsReq"
+        xml_element: "FlowStatsResp"
+        result_type: "flow_created"
+      vrouter-flows-composite-invalid-interface:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_invalid_if"
+      vrouter-flows-discard:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_discard"
+      vrouter-flows-flow-action-drop:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_flow_action_drop"
+      vrouter-flows-flow-queue-limit-exceeded:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_flow_queue_limit_exceeded"
+      vrouter-flows-flow-table-full:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_flow_table_full"
+      vrouter-flows-frag-err:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_frag_err"
+      vrouter-flows-invalid-label:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_invalid_label"
+      vrouter-flows-invalid-nh:
+        url: "http://{{ bind_addr }}:8085/Snh_KDropStatsReq"
+        xml_element: "KDropStatsResp"
+        result_type: "ds_invalid_nh"
+      vrouter-dns-xmpp:
+        url: "http://{{ bind_addr }}:8085/Snh_AgentDnsXmppConnectionStatusReq"
+        xml_element: "AgentXmppDnsData"
+        state: "Established"
+      vrouter-lls:
+        url: "http://{{ bind_addr }}:8085/Snh_LinkLocalServiceInfo"
+        xml_element: "LinkLocalServiceData"
+      vrouter-xmpp:
+        url: "http://{{ bind_addr }}:8085/Snh_AgentXmppConnectionStatusReq"
+        xml_element: "AgentXmppData"
+        state: "Established"
   collectd_check_local_endpoint:
     endpoint:
       contrail-node-manager: