Deploy Gnocchi as a Ceilometer metrics storage backend
authorPradeep Kilambi <pkilambi@redhat.com>
Sat, 12 Mar 2016 00:24:41 +0000 (19:24 -0500)
committerPradeep Kilambi <pkilambi@redhat.com>
Mon, 11 Apr 2016 16:27:38 +0000 (12:27 -0400)
* Deploy Gnocchi API.
* Storage backends: swift, rbd and file.
* Indexer backend default to mysql
* Configure Ceilometer to send metrics datas to Gnocchi
* Pacemaker config

Depends-On: Ic8778a3104e0ed0460423e4bf857682220dc5802
Depends-On: I7d2eb9405e0171fc54fa0b616122f69db5f51ce2

Co-Authored-By: Pradeep Kilambi <pkilambi@redhat.com>
Change-Id: Ifde17b1ab8fa2b30544633e455e1c7eb475705aa

17 files changed:
environments/enable-tls.yaml
environments/puppet-ceph-devel.yaml
environments/puppet-ceph-external.yaml
environments/storage-environment.yaml
network/endpoints/endpoint_data.yaml
network/endpoints/endpoint_map.yaml
overcloud.yaml
puppet/all-nodes-config.yaml
puppet/ceph-cluster-config.yaml
puppet/controller.yaml
puppet/extraconfig/ceph/ceph-external-config.yaml
puppet/hieradata/common.yaml
puppet/hieradata/controller.yaml
puppet/hieradata/database.yaml
puppet/manifests/overcloud_controller.pp
puppet/manifests/overcloud_controller_pacemaker.pp
puppet/vip-config.yaml

index 6edb8ac..e95ce4a 100644 (file)
@@ -17,6 +17,9 @@ parameter_defaults:
     GlanceAdmin: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
     GlanceInternal: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
     GlancePublic: {protocol: 'https', port: '13292', host: 'CLOUDNAME'}
+    GnocchiAdmin: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+    GnocchiInternal: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+    GnocchiPublic: {protocol: 'https', port: '13041', host: 'CLOUDNAME'}
     HeatAdmin: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
     HeatInternal: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
     HeatPublic: {protocol: 'https', port: '13004', host: 'CLOUDNAME'}
index fc4b8c7..fb63af6 100644 (file)
@@ -1,6 +1,6 @@
 # A Heat environment file which can be used to enable a Ceph
 # storage cluster using the controller and ceph nodes.
-# Rbd backends are enabled for Cinder, Glance, and Nova.
+# Rbd backends are enabled for Cinder, Glance, Gnocchi and Nova.
 parameters:
   #NOTE: These ID's and keys should be regenerated for
   # a production deployment. What is here is suitable for
@@ -11,5 +11,6 @@ parameters:
   NovaEnableRbdBackend: true
   CinderEnableRbdBackend: true
   GlanceBackend: rbd
+  GnocchiBackend: rbd
   CinderEnableIscsiBackend: false
   ControllerEnableCephStorage: true
index 7f5b508..865e0b9 100644 (file)
@@ -9,16 +9,18 @@ parameter_defaults:
   #CephClientKey: 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ=='
   #CephExternalMonHost: '172.16.1.7, 172.16.1.8'
 
-  # the following parameters enable Ceph backends for Cinder, Glance, and Nova
+  # the following parameters enable Ceph backends for Cinder, Glance, Gnocchi and Nova
   NovaEnableRbdBackend: true
   CinderEnableRbdBackend: true
   GlanceBackend: rbd
+  GnocchiBackend: rbd
   # If the Ceph pools which host VMs, Volumes and Images do not match these
   # names OR the client keyring to use is not named 'openstack',  edit the
   # following as needed.
   NovaRbdPoolName: vms
   CinderRbdPoolName: volumes
   GlanceRbdPoolName: images
+  GnocchiRbdPoolName: metrics
   CephClientUserName: openstack
 
   # finally we disable the Cinder LVM backend
index bd320bd..e1cafd2 100644 (file)
@@ -15,6 +15,8 @@ parameter_defaults:
   NovaEnableRbdBackend: true
   ## Glance backend can be either 'rbd' (Ceph), 'swift' or 'file'.
   GlanceBackend: rbd
+  ## Gnocchi backend can be either 'rbd' (Ceph), 'swift' or 'file'.
+  GnocchiBackend: rbd
 
 
   #### CINDER NFS SETTINGS ####
index 38d684e..b934ab9 100644 (file)
@@ -19,6 +19,15 @@ Ceilometer:
         vip_param: CeilometerApi
     port: 8777
 
+Gnocchi:
+    Internal:
+        vip_param: GnocchiApi
+    Public:
+        vip_param: Public
+    Admin:
+        vip_param: GnocchiApi
+    port: 8041
+
 Cinder:
     Internal:
         vip_param: CinderApi
index acd6b95..a7f0aff 100644 (file)
@@ -12,6 +12,7 @@ parameters:
   CeilometerApiVirtualIP: {type: string, default: ''}
   CinderApiVirtualIP: {type: string, default: ''}
   GlanceApiVirtualIP: {type: string, default: ''}
+  GnocchiApiVirtualIP: {type: string, default: ''}
   HeatApiVirtualIP: {type: string, default: ''}
   KeystoneAdminApiVirtualIP: {type: string, default: ''}
   KeystonePublicApiVirtualIP: {type: string, default: ''}
@@ -36,6 +37,9 @@ parameters:
       GlanceAdmin: {protocol: http, port: '9292', host: IP_ADDRESS}
       GlanceInternal: {protocol: http, port: '9292', host: IP_ADDRESS}
       GlancePublic: {protocol: http, port: '9292', host: IP_ADDRESS}
+      GnocchiAdmin: {protocol: http, port: '8041', host: IP_ADDRESS}
+      GnocchiInternal: {protocol: http, port: '8041', host: IP_ADDRESS}
+      GnocchiPublic: {protocol: http, port: '8041', host: IP_ADDRESS}
       HeatAdmin: {protocol: http, port: '8004', host: IP_ADDRESS}
       HeatInternal: {protocol: http, port: '8004', host: IP_ADDRESS}
       HeatPublic: {protocol: http, port: '8004', host: IP_ADDRESS}
@@ -644,6 +648,120 @@ outputs:
                   IP_ADDRESS: {get_param: PublicVirtualIP}
             - ':'
             - get_param: [EndpointMap, GlancePublic, port]
+      GnocchiAdmin:
+        host:
+          str_replace:
+            template:
+              get_param: [EndpointMap, GnocchiAdmin, host]
+            params:
+              CLOUDNAME: {get_param: CloudName}
+              IP_ADDRESS: {get_param: GnocchiApiVirtualIP}
+        port:
+          get_param: [EndpointMap, GnocchiAdmin, port]
+        protocol:
+          get_param: [EndpointMap, GnocchiAdmin, protocol]
+        uri:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, GnocchiAdmin, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, GnocchiAdmin, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: GnocchiApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, GnocchiAdmin, port]
+        uri_no_suffix:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, GnocchiAdmin, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, GnocchiAdmin, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: GnocchiApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, GnocchiAdmin, port]
+      GnocchiInternal:
+        host:
+          str_replace:
+            template:
+              get_param: [EndpointMap, GnocchiInternal, host]
+            params:
+              CLOUDNAME: {get_param: CloudName}
+              IP_ADDRESS: {get_param: GnocchiApiVirtualIP}
+        port:
+          get_param: [EndpointMap, GnocchiInternal, port]
+        protocol:
+          get_param: [EndpointMap, GnocchiInternal, protocol]
+        uri:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, GnocchiInternal, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, GnocchiInternal, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: GnocchiApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, GnocchiInternal, port]
+        uri_no_suffix:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, GnocchiInternal, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, GnocchiInternal, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: GnocchiApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, GnocchiInternal, port]
+      GnocchiPublic:
+        host:
+          str_replace:
+            template:
+              get_param: [EndpointMap, GnocchiPublic, host]
+            params:
+              CLOUDNAME: {get_param: CloudName}
+              IP_ADDRESS: {get_param: PublicVirtualIP}
+        port:
+          get_param: [EndpointMap, GnocchiPublic, port]
+        protocol:
+          get_param: [EndpointMap, GnocchiPublic, protocol]
+        uri:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, GnocchiPublic, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, GnocchiPublic, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: PublicVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, GnocchiPublic, port]
+        uri_no_suffix:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, GnocchiPublic, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, GnocchiPublic, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: PublicVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, GnocchiPublic, port]
       HeatAdmin:
         host:
           str_replace:
index 1d720cc..87a5f7b 100644 (file)
@@ -32,6 +32,12 @@ parameters:
     description: The password for the ceilometer service account.
     type: string
     hidden: true
+  CeilometerMeterDispatcher:
+    default: 'database'
+    description: Dispatcher to process meter data
+    type: string
+    constraints:
+    - allowed_values: ['gnocchi', 'database']
   # This has to be an UUID so for now we generate it outside the template
   CephClusterFSID:
     default: ''
@@ -483,6 +489,21 @@ parameters:
     type: string
     constraints:
     - allowed_values: ['swift', 'file', 'rbd']
+  GnocchiBackend:
+    default: file
+    description: The short name of the Gnocchi backend to use. Should be one
+      of swift, rbd or file
+    type: string
+    constraints:
+    - allowed_values: ['swift', 'file', 'rbd']
+  GnocchiIndexerBackend:
+    default: 'mysql'
+    description: The short name of the Gnocchi indexer backend to use.
+    type: string
+  GnocchiPassword:
+    description: The password for the gnocchi service account.
+    type: string
+    hidden: true
   HeatPassword:
     description: The password for the Heat service account, used by the Heat services.
     type: string
@@ -644,6 +665,7 @@ parameters:
       NeutronTenantNetwork: tenant
       CeilometerApiNetwork: internal_api
       AodhApiNetwork: internal_api
+      GnocchiApiNetwork: internal_api
       MongoDbNetwork: internal_api
       CinderApiNetwork: internal_api
       CinderIscsiNetwork: storage
@@ -854,6 +876,7 @@ resources:
       AodhApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
       CinderApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
       GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
+      GnocchiApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
       HeatApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
       KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
       KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
@@ -885,6 +908,7 @@ resources:
           CeilometerBackend: {get_param: CeilometerBackend}
           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
           CeilometerPassword: {get_param: CeilometerPassword}
+          CeilometerMeterDispatcher: {get_param: CeilometerMeterDispatcher}
           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
           CinderNfsMountOptions: {get_param: CinderNfsMountOptions}
           CinderNfsServers: {get_param: CinderNfsServers}
@@ -911,6 +935,9 @@ resources:
           GlanceBackend: {get_param: GlanceBackend}
           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
           GlanceLogFile: {get_param: GlanceLogFile}
+          GnocchiPassword: {get_param: GnocchiPassword}
+          GnocchiBackend: {get_param: GnocchiBackend}
+          GnocchiIndexerBackend: {get_param: GnocchiIndexerBackend}
           HAProxySyslogAddress: {get_param: HAProxySyslogAddress}
           HeatPassword: {get_param: HeatPassword}
           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
@@ -991,6 +1018,7 @@ resources:
           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
           CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
           AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
+          GnocchiApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
           CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
           HeatApiVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
@@ -1229,6 +1257,7 @@ resources:
       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
       aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
+      gnocchi_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
@@ -1350,6 +1379,7 @@ resources:
         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
         aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
+        gnocchi_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
@@ -1645,6 +1675,9 @@ outputs:
   GlanceInternalVip:
     description: VIP for Glance API internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
+  GnocchiInternalVip:
+    description: VIP for Gnocchi API internal endpoint
+    value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
   HeatInternalVip:
     description: VIP for Heat API internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
index fed9dd3..90eb1b0 100644 (file)
@@ -44,6 +44,8 @@ parameters:
     type: comma_delimited_list
   glance_registry_node_ips:
     type: comma_delimited_list
+  gnocchi_api_node_ips:
+    type: comma_delimited_list
   cinder_api_node_ips:
     type: comma_delimited_list
   neutron_api_node_ips:
@@ -197,6 +199,14 @@ resources:
                         list_join:
                         - "','"
                         - {get_param: aodh_api_node_ips}
+                gnocchi_api_node_ips:
+                  str_replace:
+                    template: "['SERVERS_LIST']"
+                    params:
+                      SERVERS_LIST:
+                        list_join:
+                        - "','"
+                        - {get_param: gnocchi_api_node_ips}
                 nova_api_node_ips:
                   str_replace:
                     template: "['SERVERS_LIST']"
index dc2f98e..6c6be47 100644 (file)
@@ -36,6 +36,9 @@ parameters:
   GlanceRbdPoolName:
     default: images
     type: string
+  GnocchiRbdPoolName:
+    default: metrics
+    type: string
   CephClientUserName:
     default: openstack
     type: string
@@ -94,7 +97,7 @@ resources:
                         secret: 'ADMIN_KEY',
                         mode: '0644',
                         cap_mon: 'allow r',
-                        cap_osd: 'allow class-read object_prefix rbd_children, allow rwx pool=CINDER_POOL, allow rwx pool=NOVA_POOL, allow rwx pool=GLANCE_POOL'
+                        cap_osd: 'allow class-read object_prefix rbd_children, allow rwx pool=CINDER_POOL, allow rwx pool=NOVA_POOL, allow rwx pool=GLANCE_POOL, allow rwx pool=GNOCCHI_POOL'
                       }
                     }"
                     params:
@@ -103,9 +106,12 @@ resources:
                       NOVA_POOL: {get_param: NovaRbdPoolName}
                       CINDER_POOL: {get_param: CinderRbdPoolName}
                       GLANCE_POOL: {get_param: GlanceRbdPoolName}
+                      GNOCCHI_POOL: {get_param: GnocchiRbdPoolName}
                 nova::compute::rbd::libvirt_images_rbd_pool: {get_param: NovaRbdPoolName}
                 cinder_rbd_pool_name: {get_param: CinderRbdPoolName}
                 glance::backend::rbd::rbd_store_pool: {get_param: GlanceRbdPoolName}
+                gnocchi::storage::ceph::ceph_pool: {get_param: GnocchiRbdPoolName}
+                gnocchi::storage::ceph::ceph_username: {get_param: CephClientUserName}
                 nova::compute::rbd::libvirt_rbd_user: {get_param: CephClientUserName}
                 glance::backend::rbd::rbd_store_user: {get_param: CephClientUserName}
                 nova::compute::rbd::rbd_keyring:
@@ -113,11 +119,17 @@ resources:
                   - '.'
                   - - 'client'
                     - {get_param: CephClientUserName}
+                gnocchi::storage::ceph::ceph_keyring:
+                  list_join:
+                  - '.'
+                  - - 'client'
+                    - {get_param: CephClientUserName}
                 ceph_client_user_name: {get_param: CephClientUserName}
                 ceph_pools:
                   - {get_param: CinderRbdPoolName}
                   - {get_param: NovaRbdPoolName}
                   - {get_param: GlanceRbdPoolName}
+                  - {get_param: GnocchiRbdPoolName}
 
 outputs:
   config_id:
index dca561f..56eb8b9 100644 (file)
@@ -34,6 +34,12 @@ parameters:
     default: false
     description: Whether to store events in ceilometer.
     type: boolean
+  CeilometerMeterDispatcher:
+    default: 'database'
+    description: Dispatcher to process meter data
+    type: string
+    constraints:
+    - allowed_values: ['gnocchi', 'database']
   CinderApiVirtualIP:
     type: string
     default: ''
@@ -223,6 +229,24 @@ parameters:
       Mount options for Pacemaker mount used as Glance storage.
       Effective when GlanceFilePcmkManage is true.
     type: string
+  GnocchiBackend:
+    default: file
+    description: The short name of the Gnocchi backend to use. Should be one
+      of swift, rbd, or file
+    type: string
+    constraints:
+    - allowed_values: ['swift', 'file', 'rbd']
+  GnocchiIndexerBackend:
+    default: 'mysql'
+    description: The short name of the Gnocchi indexer backend to use.
+    type: string
+  GnocchiApiVirtualIP:
+    type: string
+    default: ''
+  GnocchiPassword:
+    description: The password for the gnocchi service and db account.
+    type: string
+    hidden: true
   HAProxyStatsPassword:
     description: Password for HAProxy stats endpoint
     type: string
@@ -1098,6 +1122,10 @@ resources:
         ceilometer_password: {get_param: CeilometerPassword}
         ceilometer_store_events: {get_param: CeilometerStoreEvents}
         aodh_password: {get_param: AodhPassword}
+        ceilometer_meter_dispatcher: {get_param: CeilometerMeterDispatcher}
+        gnocchi_password: {get_param: GnocchiPassword}
+        gnocchi_backend: {get_param: GnocchiBackend}
+        gnocchi_indexer_backend: {get_param: GnocchiIndexerBackend}
         ceilometer_coordination_url:
           list_join:
             - ''
@@ -1114,6 +1142,15 @@ resources:
               - '@'
               - {get_param: MysqlVirtualIPUri}
               - '/ceilometer'
+        gnocchi_dsn:
+          list_join:
+            - ''
+            - - 'mysql+pymysql://gnocchi:'
+              - {get_param: GnocchiPassword}
+              - '@'
+              - {get_param: MysqlVirtualIPUri}
+              - '/gnocchi'
+        gnocchi_internal_url: {get_param: [EndpointMap, GnocchiInternal, uri]}
         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
         nova_enable_db_purge: {get_param: NovaEnableDBPurge}
@@ -1193,6 +1230,7 @@ resources:
         neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
         ceilometer_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
         aodh_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
+        gnocchi_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
         nova_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
         nova_metadata_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
         horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
@@ -1471,6 +1509,11 @@ resources:
                 ceilometer::agent::central::coordination_url: {get_input: ceilometer_coordination_url}
                 ceilometer::agent::notification::store_events: {get_input: ceilometer_store_events}
                 ceilometer::db::mysql::password: {get_input: ceilometer_password}
+                ceilometer::collector::meter_dispatcher: {get_input: ceilometer_meter_dispatcher}
+                ceilometer::dispatcher::gnocchi::url: {get_input: gnocchi_internal_url }
+                ceilometer::dispatcher::gnocchi::filter_project: 'service'
+                ceilometer::dispatcher::gnocchi::archive_policy: 'low'
+                ceilometer::dispatcher::gnocchi::resources_definition_file: 'gnocchi_resources.yaml'
                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
 
@@ -1492,6 +1535,22 @@ resources:
                 # for a migration path from ceilometer-alarm to aodh, we use the same database & coordination
                 aodh::evaluator::coordination_url: {get_input: ceilometer_coordination_url}
 
+                # Gnocchi
+                gnocchi_backend: {get_input: gnocchi_backend}
+                gnocchi_indexer_backend: {get_input: gnocchi_indexer_backend}
+                gnocchi_mysql_conn_string: {get_input: gnocchi_dsn}
+                gnocchi::debug: {get_input: debug}
+                gnocchi::wsgi::apache::ssl: false
+                gnocchi::wsgi::apache::bind_host: {get_input: gnocchi_api_network}
+                gnocchi::api::service_name: 'httpd'
+                gnocchi::api::host: {get_input: gnocchi_api_network}
+                gnocchi::api::keystone_password: {get_input: gnocchi_password}
+                gnocchi::api::keystone_auth_uri: {get_input: keystone_auth_uri}
+                gnocchi::api::keystone_identity_uri: {get_input: keystone_identity_uri}
+                gnocchi::db::mysql::password: {get_input: gnocchi_password}
+                gnocchi::storage::swift::swift_authurl: {get_input: keystone_auth_uri}
+                gnocchi::storage::swift::swift_key: {get_input: gnocchi_password}
+
                 # Nova
                 nova::rabbit_userid: {get_input: rabbit_username}
                 nova::rabbit_password: {get_input: rabbit_password}
index 312d49a..5942088 100644 (file)
@@ -38,6 +38,9 @@ parameters:
   GlanceRbdPoolName:
     default: images
     type: string
+  GnocchiRbdPoolName:
+    default: metrics
+    type: string
   CephClientUserName:
     default: openstack
     type: string
@@ -68,7 +71,7 @@ resources:
                         secret: 'CLIENT_KEY',
                         mode: '0644',
                         cap_mon: 'allow r',
-                        cap_osd: 'allow class-read object_prefix rbd_children, allow rwx pool=CINDER_POOL, allow rwx pool=NOVA_POOL, allow rwx pool=GLANCE_POOL'
+                        cap_osd: 'allow class-read object_prefix rbd_children, allow rwx pool=CINDER_POOL, allow rwx pool=NOVA_POOL, allow rwx pool=GLANCE_POOL, allow rwx pool=GNOCCHI_POOL'
                       }
                     }"
                     params:
@@ -77,10 +80,13 @@ resources:
                       NOVA_POOL: {get_param: NovaRbdPoolName}
                       CINDER_POOL: {get_param: CinderRbdPoolName}
                       GLANCE_POOL: {get_param: GlanceRbdPoolName}
+                      GNOCCHI_POOL: {get_param: GnocchiRbdPoolName}
                 ceph::profile::params::ms_bind_ipv6: {get_param: CephIPv6}
                 nova::compute::rbd::libvirt_images_rbd_pool: {get_param: NovaRbdPoolName}
                 cinder_rbd_pool_name: {get_param: CinderRbdPoolName}
                 glance::backend::rbd::rbd_store_pool: {get_param: GlanceRbdPoolName}
+                gnocchi::storage::ceph::ceph_pool: {get_param: GnocchiRbdPoolName}
+                gnocchi::storage::ceph::ceph_username: {get_param: CephClientUserName}
                 nova::compute::rbd::libvirt_rbd_user: {get_param: CephClientUserName}
                 glance::backend::rbd::rbd_store_user: {get_param: CephClientUserName}
                 nova::compute::rbd::rbd_keyring:
@@ -88,11 +94,17 @@ resources:
                   - '.'
                   - - 'client'
                     - {get_param: CephClientUserName}
+                gnocchi::storage::ceph::ceph_keyring:
+                  list_join:
+                  - '.'
+                  - - 'client'
+                    - {get_param: CephClientUserName}
                 ceph_client_user_name: {get_param: CephClientUserName}
                 ceph_pools:
                   - {get_param: CinderRbdPoolName}
                   - {get_param: NovaRbdPoolName}
                   - {get_param: GlanceRbdPoolName}
+                  - {get_param: GnocchiRbdPoolName}
 
 outputs:
   config_id:
index 46471c3..3496595 100644 (file)
@@ -8,6 +8,9 @@ ceilometer::agent::auth::auth_tenant_name: 'service'
 aodh::auth::auth_region: 'regionOne'
 aodh::auth::auth_tenant_name: 'service'
 
+gnocchi::auth::auth_region: 'regionOne'
+gnocchi::auth::auth_tenant_name: 'service'
+
 nova::api::admin_tenant_name: 'service'
 nova::network::neutron::neutron_project_name: 'service'
 nova::network::neutron::neutron_username: 'neutron'
index 8766263..79db941 100644 (file)
@@ -6,6 +6,16 @@ nova::consoleauth::enabled: true
 nova::vncproxy::enabled: true
 nova::scheduler::enabled: true
 
+# gnocchi
+gnocchi::db::sync::extra_opts: '--skip-storage'
+gnocchi::storage::swift::swift_user: 'service:gnocchi'
+gnocchi::storage::swift::swift_auth_version: 2
+gnocchi::statsd::resource_id: '0a8b55df-f90f-491c-8cb9-7cdecec6fc26'
+gnocchi::statsd::user_id: '27c0d3f8-e7ee-42f0-8317-72237d1c5ae3'
+gnocchi::statsd::project_id: '6c38cd8d-099a-4cb2-aecf-17be688e8616'
+gnocchi::statsd::flush_delay: 10
+gnocchi::statsd::archive_policy_name: 'low'
+
 # rabbitmq
 rabbitmq::delete_guest_user: false
 rabbitmq::wipe_db_on_cookie_change: true
@@ -44,6 +54,7 @@ neutron::agents::dhcp::dhcp_delete_namespaces: True
 cinder::api::keystone_tenant: 'service'
 swift::proxy::authtoken::admin_tenant_name: 'service'
 ceilometer::api::keystone_tenant: 'service'
+gnocchi::api::keystone_tenant: 'service'
 heat::keystone_tenant: 'service'
 sahara::admin_tenant_name: 'service'
 
@@ -151,6 +162,7 @@ tripleo::loadbalancer::sahara: true
 tripleo::loadbalancer::swift_proxy_server: true
 tripleo::loadbalancer::ceilometer: true
 tripleo::loadbalancer::aodh: true
+tripleo::loadbalancer::gnocchi: true
 tripleo::loadbalancer::heat_api: true
 tripleo::loadbalancer::heat_cloudwatch: true
 tripleo::loadbalancer::heat_cfn: true
@@ -267,3 +279,7 @@ tripleo::firewall::firewall_rules:
     port:
       - 8042
       - 13042
+  '129 gnocchi-api':
+    port:
+      - 8041
+      - 13041
index 6171469..4eb199c 100644 (file)
@@ -61,6 +61,14 @@ ceilometer::db::mysql::allowed_hosts:
   - '%'
   - "%{hiera('mysql_bind_host')}"
 
+# Gnocchi
+gnocchi::db::mysql::user: gnocchi
+gnocchi::db::mysql::host: "%{hiera('mysql_virtual_ip')}"
+gnocchi::db::mysql::dbname: gnocchi
+gnocchi::db::mysql::allowed_hosts:
+  - '%'
+  - "%{hiera('mysql_bind_host')}"
+
 sahara::db::mysql::user: sahara
 sahara::db::mysql::host: "%{hiera('mysql_virtual_ip')}"
 sahara::db::mysql::dbname: sahara
index 0bf5f88..779e7f2 100644 (file)
@@ -121,6 +121,9 @@ if hiera('step') >= 2 {
   include ::cinder::db::mysql
   include ::heat::db::mysql
   include ::sahara::db::mysql
+  if downcase(hiera('gnocchi_indexer_backend')) == 'mysql' {
+    include ::gnocchi::db::mysql
+  }
   if downcase(hiera('ceilometer_backend')) == 'mysql' {
     include ::ceilometer::db::mysql
     include ::aodh::db::mysql
@@ -577,6 +580,7 @@ if hiera('step') >= 4 {
   include ::ceilometer::expirer
   include ::ceilometer::collector
   include ::ceilometer::agent::auth
+  include ::ceilometer::dispatcher::gnocchi
   class { '::ceilometer::db' :
     database_connection => $ceilometer_database_connection,
   }
@@ -633,6 +637,26 @@ if hiera('step') >= 4 {
     neutron_options => $neutron_options,
   }
 
+  # Gnocchi
+  $gnocchi_database_connection = hiera('gnocchi_mysql_conn_string')
+  class { '::gnocchi':
+    database_connection => $gnocchi_database_connection,
+  }
+  include ::gnocchi::api
+  include ::gnocchi::wsgi::apache
+  include ::gnocchi::client
+  include ::gnocchi::db::sync
+  include ::gnocchi::storage
+  include ::gnocchi::metricd
+  include ::gnocchi::statsd
+  $gnocchi_backend = downcase(hiera('gnocchi_backend', 'swift'))
+  case $gnocchi_backend {
+      'swift': { include ::gnocchi::storage::swift }
+      'file': { include ::gnocchi::storage::file }
+      'rbd': { include ::gnocchi::storage::ceph }
+      default: { fail('Unrecognized gnocchi_backend parameter.') }
+  }
+
   $snmpd_user = hiera('snmpd_readonly_user_name')
   snmp::snmpv3_user { $snmpd_user:
     authtype => 'MD5',
index 4cf04d8..f5d4cf9 100644 (file)
@@ -24,6 +24,7 @@ Service <|
   tag == 'cinder-service' or
   tag == 'ceilometer-service' or
   tag == 'glance-service' or
+  tag == 'gnocchi-service' or
   tag == 'heat-service' or
   tag == 'keystone-service' or
   tag == 'neutron-service' or
@@ -543,6 +544,11 @@ MYSQL_HOST=localhost\n",
       }
     }
 
+    if downcase(hiera('gnocchi_indexer_backend')) == 'mysql' {
+      class { '::gnocchi::db::mysql':
+        require => Exec['galera-ready'],
+      }
+    }
     class { '::sahara::db::mysql':
       require       => Exec['galera-ready'],
     }
@@ -1057,6 +1063,7 @@ if hiera('step') >= 4 {
     sync_db             => $sync_db,
   }
   include ::ceilometer::agent::auth
+  include ::ceilometer::dispatcher::gnocchi
 
   Cron <| title == 'ceilometer-expirer' |> { command => "sleep $((\$(od -A n -t d -N 3 /dev/urandom) % 86400)) && ${::ceilometer::params::expirer_command}" }
 
@@ -1135,6 +1142,40 @@ if hiera('step') >= 4 {
     enabled        => false,
   }
 
+  # Gnocchi
+  $gnocchi_database_connection = hiera('gnocchi_mysql_conn_string')
+  include ::gnocchi::client
+  if $sync_db {
+    include ::gnocchi::db::sync
+  }
+  include ::gnocchi::storage
+  $gnocchi_backend = downcase(hiera('gnocchi_backend', 'swift'))
+  case $gnocchi_backend {
+      'swift': { include ::gnocchi::storage::swift }
+      'file': { include ::gnocchi::storage::file }
+      'rbd': { include ::gnocchi::storage::ceph }
+      default: { fail('Unrecognized gnocchi_backend parameter.') }
+  }
+  class { '::gnocchi':
+    database_connection => $gnocchi_database_connection,
+  }
+  class { '::gnocchi::api' :
+    manage_service => false,
+    enabled        => false,
+    service_name   => 'httpd',
+  }
+  class { '::gnocchi::wsgi::apache' :
+    ssl => false,
+  }
+  class { '::gnocchi::metricd' :
+    manage_service => false,
+    enabled        => false,
+  }
+  class { '::gnocchi::statsd' :
+    manage_service => false,
+    enabled        => false,
+  }
+
   $snmpd_user = hiera('snmpd_readonly_user_name')
   snmp::snmpv3_user { $snmpd_user:
     authtype => 'MD5',
@@ -1781,6 +1822,30 @@ if hiera('step') >= 5 {
       }
     }
 
+    # gnocchi
+    pacemaker::resource::service { $::gnocchi::params::metricd_service_name :
+      clone_params => 'interleave=true',
+    }
+    pacemaker::resource::service { $::gnocchi::params::statsd_service_name :
+      clone_params => 'interleave=true',
+    }
+    pacemaker::constraint::base { 'gnocchi-metricd-then-gnocchi-statsd-constraint':
+      constraint_type => 'order',
+      first_resource  => "${::gnocchi::params::metricd_service_name}-clone",
+      second_resource => "${::gnocchi::params::statsd_service_name}-clone",
+      first_action    => 'start',
+      second_action   => 'start',
+      require         => [Pacemaker::Resource::Service[$::gnocchi::params::metricd_service_name],
+                          Pacemaker::Resource::Service[$::gnocchi::params::statsd_service_name]],
+    }
+    pacemaker::constraint::colocation { 'gnocchi-statsd-with-metricd-colocation':
+      source  => "${::gnocchi::params::statsd_service_name}-clone",
+      target  => "${::gnocchi::params::metricd_service_name}-clone",
+      score   => 'INFINITY',
+      require => [Pacemaker::Resource::Service[$::gnocchi::params::metricd_service_name],
+                  Pacemaker::Resource::Service[$::gnocchi::params::statsd_service_name]],
+    }
+
     # Heat
     pacemaker::resource::service { $::heat::params::api_service_name :
       clone_params => 'interleave=true',
index ebecd0c..3e8e918 100644 (file)
@@ -27,6 +27,7 @@ resources:
                 nova_metadata_vip: {get_input: nova_metadata_vip}
                 ceilometer_api_vip: {get_input: ceilometer_api_vip}
                 aodh_api_vip: {get_input: aodh_api_vip}
+                gnocchi_api_vip: {get_input: gnocchi_api_vip}
                 heat_api_vip: {get_input: heat_api_vip}
                 horizon_vip: {get_input: horizon_vip}
                 redis_vip: {get_input: redis_vip}