Deploy Aodh services, replacing Ceilometer Alarm
authorEmilien Macchi <emilien@redhat.com>
Tue, 3 Nov 2015 23:09:34 +0000 (18:09 -0500)
committerPradeep Kilambi <pkilambi@redhat.com>
Thu, 3 Mar 2016 18:34:38 +0000 (13:34 -0500)
Ceilometer Alarm is deprecated in Liberty by Aodh.

This patch:
* manage Aodh Keystone resources
* deploy Aodh API under WSGI, Notifier, Listener and Evaluator
* manage new parameters to customize Aodh deployment
* uses ceilometer DB for the upgrade path
* pacemaker config

Depends-On: I9e34485285829884d9c954b804e3bdd5d6e31635
Depends-On: I891985da9248a88c6ce2df1dd186881f582605ee
Depends-On: Ied8ba5985f43a5c5b3be5b35a091aef6ed86572f

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

12 files changed:
environments/enable-tls.yaml
extraconfig/tasks/yum_update.sh
network/endpoints/endpoint_data.yaml
network/endpoints/endpoint_map.yaml
overcloud.yaml
puppet/all-nodes-config.yaml
puppet/controller.yaml
puppet/hieradata/common.yaml
puppet/hieradata/controller.yaml
puppet/manifests/overcloud_controller.pp
puppet/manifests/overcloud_controller_pacemaker.pp
puppet/vip-config.yaml

index 5794c6b..b895f86 100644 (file)
@@ -5,6 +5,9 @@ parameter_defaults:
   SSLKey: |
     The contents of the private key go here
   EndpointMap:
+    AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+    AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+    AodhPublic: {protocol: 'https', port: '13042', host: 'CLOUDNAME'}
     CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
     CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
     CeilometerPublic: {protocol: 'https', port: '13777', host: 'CLOUDNAME'}
index 59e4be4..9fc17f6 100755 (executable)
@@ -53,12 +53,14 @@ neutron-l3-agent
 neutron-metadata-agent
 neutron-openvswitch-agent
 neutron-server
-openstack-ceilometer-alarm-evaluator
-openstack-ceilometer-alarm-notifier
 openstack-ceilometer-api
 openstack-ceilometer-central
 openstack-ceilometer-collector
 openstack-ceilometer-notification
+openstack-aodh-api
+openstack-aodh-evaluator
+openstack-aodh-notifier
+openstack-aodh-listener
 openstack-cinder-api
 openstack-cinder-scheduler
 openstack-cinder-volume
@@ -107,6 +109,9 @@ openstack-nova-scheduler"
         pcs -f $pacemaker_dumpfile constraint order promote redis-master then start openstack-ceilometer-central-clone require-all=false
     fi
 
+    if ! pcs constraint order show | grep "promote redis-master then start openstack-aodh-evaluator-clone"; then
+        pcs -f $pacemaker_dumpfile constraint order promote redis-master then start openstack-aodh-evaluator-clone require-all=false
+    fi
     # ensure neutron constraints https://review.openstack.org/#/c/229466
     # remove ovs-cleanup after server and add openvswitch-agent instead
     if  pcs constraint order show  | grep "start neutron-server-clone then start neutron-ovs-cleanup-clone"; then
index 9d508d1..6aa725a 100644 (file)
@@ -1,6 +1,15 @@
 # Data in this file is used to generate the endpoint_map.yaml template.
 # Run the script build_endpoint_map.py to regenerate the file.
 
+Aodh:
+    Internal:
+        vip_param: AodhApi
+    Public:
+        vip_param: Public
+    Admin:
+        vip_param: AodhApi
+    port: 8042
+
 Ceilometer:
     Internal:
         vip_param: CeilometerApi
index e9f97fa..bff7572 100644 (file)
@@ -5,6 +5,7 @@
 heat_template_version: '2015-04-30'
 description: A map of OpenStack endpoints.
 parameters:
+  AodhApiVirtualIP: {type: string, default: ''}
   CeilometerApiVirtualIP: {type: string, default: ''}
   CinderApiVirtualIP: {type: string, default: ''}
   GlanceApiVirtualIP: {type: string, default: ''}
@@ -21,6 +22,9 @@ parameters:
   EndpointMap:
     type: json
     default:
+      AodhAdmin: {protocol: http, port: '8042', host: IP_ADDRESS}
+      AodhInternal: {protocol: http, port: '8042', host: IP_ADDRESS}
+      AodhPublic: {protocol: http, port: '8042', host: IP_ADDRESS}
       CeilometerAdmin: {protocol: http, port: '8777', host: IP_ADDRESS}
       CeilometerInternal: {protocol: http, port: '8777', host: IP_ADDRESS}
       CeilometerPublic: {protocol: http, port: '8777', host: IP_ADDRESS}
@@ -68,6 +72,120 @@ parameters:
 outputs:
   endpoint_map:
     value:
+      AodhAdmin:
+        host:
+          str_replace:
+            template:
+              get_param: [EndpointMap, AodhAdmin, host]
+            params:
+              CLOUDNAME: {get_param: CloudName}
+              IP_ADDRESS: {get_param: AodhApiVirtualIP}
+        port:
+          get_param: [EndpointMap, AodhAdmin, port]
+        protocol:
+          get_param: [EndpointMap, AodhAdmin, protocol]
+        uri:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, AodhAdmin, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, AodhAdmin, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: AodhApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, AodhAdmin, port]
+        uri_no_suffix:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, AodhAdmin, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, AodhAdmin, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: AodhApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, AodhAdmin, port]
+      AodhInternal:
+        host:
+          str_replace:
+            template:
+              get_param: [EndpointMap, AodhInternal, host]
+            params:
+              CLOUDNAME: {get_param: CloudName}
+              IP_ADDRESS: {get_param: AodhApiVirtualIP}
+        port:
+          get_param: [EndpointMap, AodhInternal, port]
+        protocol:
+          get_param: [EndpointMap, AodhInternal, protocol]
+        uri:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, AodhInternal, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, AodhInternal, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: AodhApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, AodhInternal, port]
+        uri_no_suffix:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, AodhInternal, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, AodhInternal, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: AodhApiVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, AodhInternal, port]
+      AodhPublic:
+        host:
+          str_replace:
+            template:
+              get_param: [EndpointMap, AodhPublic, host]
+            params:
+              CLOUDNAME: {get_param: CloudName}
+              IP_ADDRESS: {get_param: PublicVirtualIP}
+        port:
+          get_param: [EndpointMap, AodhPublic, port]
+        protocol:
+          get_param: [EndpointMap, AodhPublic, protocol]
+        uri:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, AodhPublic, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, AodhPublic, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: PublicVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, AodhPublic, port]
+        uri_no_suffix:
+          list_join:
+          - ''
+          - - get_param: [EndpointMap, AodhPublic, protocol]
+            - ://
+            - str_replace:
+                template:
+                  get_param: [EndpointMap, AodhPublic, host]
+                params:
+                  CLOUDNAME: {get_param: CloudName}
+                  IP_ADDRESS: {get_param: PublicVirtualIP}
+            - ':'
+            - get_param: [EndpointMap, AodhPublic, port]
       CeilometerAdmin:
         host:
           str_replace:
index 0499fa6..d6048de 100644 (file)
@@ -16,6 +16,11 @@ parameters:
     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
     type: string
     hidden: true
+  AodhPassword:
+    default: unset
+    description: The password for the aodh services.
+    type: string
+    hidden: true
   CeilometerBackend:
     default: 'mongodb'
     description: The ceilometer backend type.
@@ -653,6 +658,7 @@ parameters:
     default:
       NeutronTenantNetwork: tenant
       CeilometerApiNetwork: internal_api
+      AodhApiNetwork: internal_api
       MongoDbNetwork: internal_api
       CinderApiNetwork: internal_api
       CinderIscsiNetwork: storage
@@ -852,6 +858,7 @@ resources:
     properties:
       CloudName: {get_param: CloudName}
       CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
+      AodhApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
       CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
       GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
       GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
@@ -876,6 +883,7 @@ resources:
         properties:
           AdminPassword: {get_param: AdminPassword}
           AdminToken: {get_param: AdminToken}
+          AodhPassword: {get_param: AodhPassword}
           CeilometerBackend: {get_param: CeilometerBackend}
           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
           CeilometerPassword: {get_param: CeilometerPassword}
@@ -984,6 +992,7 @@ resources:
           ServiceNetMap: {get_param: ServiceNetMap}
           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]}]}
           CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
@@ -1215,6 +1224,7 @@ resources:
       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
       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]}]}
       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]}]}
@@ -1331,6 +1341,7 @@ resources:
         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
         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]}]}
         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]}
@@ -1607,6 +1618,9 @@ outputs:
   PublicVip:
     description: Controller VIP for public API endpoints
     value: {get_attr: [VipMap, net_ip_map, external]}
+  AodhInternalVip:
+    description: VIP for Aodh API internal endpoint
+    value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
   CeilometerInternalVip:
     description: VIP for Ceilometer API internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
index e85975d..f7633a8 100644 (file)
@@ -34,6 +34,8 @@ parameters:
     type: comma_delimited_list
   ceilometer_api_node_ips:
     type: comma_delimited_list
+  aodh_api_node_ips:
+    type: comma_delimited_list
   nova_api_node_ips:
     type: comma_delimited_list
   nova_metadata_node_ips:
@@ -179,6 +181,14 @@ resources:
                         list_join:
                         - "','"
                         - {get_param: ceilometer_api_node_ips}
+                aodh_api_node_ips:
+                  str_replace:
+                    template: "['SERVERS_LIST']"
+                    params:
+                      SERVERS_LIST:
+                        list_join:
+                        - "','"
+                        - {get_param: aodh_api_node_ips}
                 nova_api_node_ips:
                   str_replace:
                     template: "['SERVERS_LIST']"
@@ -264,6 +274,7 @@ resources:
                 # NOTE(gfidente): interpolation with %{} in the
                 # hieradata file can't be used as it returns string
                 ceilometer::rabbit_hosts: *rabbit_nodes_array
+                aodh::rabbit_hosts: *rabbit_nodes_array
                 cinder::rabbit_hosts: *rabbit_nodes_array
                 heat::rabbit_hosts: *rabbit_nodes_array
                 neutron::rabbit_hosts: *rabbit_nodes_array
index 37ded74..569ab5b 100644 (file)
@@ -17,6 +17,14 @@ parameters:
     description: The keystone auth secret and db password.
     type: string
     hidden: true
+  AodhApiVirtualIP:
+    type: string
+    default: ''
+  AodhPassword:
+    default: unset
+    description: The password for the aodh services.
+    type: string
+    hidden: true
   CeilometerApiVirtualIP:
     type: string
     default: ''
@@ -1105,6 +1113,7 @@ resources:
         ceilometer_backend: {get_param: CeilometerBackend}
         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
         ceilometer_password: {get_param: CeilometerPassword}
+        aodh_password: {get_param: AodhPassword}
         ceilometer_coordination_url:
           list_join:
             - ''
@@ -1194,6 +1203,7 @@ resources:
         neutron_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
         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]}]}
         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]}]}
@@ -1495,6 +1505,24 @@ resources:
                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
 
+                # Aodh
+                aodh::rabbit_userid: {get_input: rabbit_username}
+                aodh::rabbit_password: {get_input: rabbit_password}
+                aodh::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
+                aodh::rabbit_port: {get_input: rabbit_client_port}
+                aodh::debug: {get_input: debug}
+                aodh::wsgi::apache::ssl: false
+                aodh::wsgi::apache::bind_host: {get_input: aodh_api_network}
+                aodh::api::service_name: 'httpd'
+                aodh::api::host: {get_input: aodh_api_network}
+                aodh::api::keystone_password: {get_input: aodh_password}
+                aodh::api::keystone_auth_uri: {get_input: keystone_auth_uri}
+                aodh::api::keystone_identity_uri: {get_input: keystone_identity_uri}
+                aodh::auth::auth_password: {get_input: aodh_password}
+                aodh::db::mysql::password: {get_input: aodh_password}
+                # for a migration path from ceilometer-alarm to aodh, we use the same database & coordination
+                aodh::evaluator::coordination_url: {get_input: ceilometer_coordination_url}
+
                 # Nova
                 nova::rabbit_userid: {get_input: rabbit_username}
                 nova::rabbit_password: {get_input: rabbit_password}
index 7a5e54d..262c7cc 100644 (file)
@@ -5,6 +5,9 @@ ssh::server::storeconfigs_enabled: false
 ceilometer::agent::auth::auth_region: 'regionOne'
 ceilometer::agent::auth::auth_tenant_name: 'service'
 
+aodh::auth::auth_region: 'regionOne'
+aodh::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 f97bda1..f52f1d0 100644 (file)
@@ -31,6 +31,7 @@ redis::sentinel::notification_script: '/usr/local/bin/redis-notifications.sh'
 
 # service tenant
 glance::api::keystone_tenant: 'service'
+aodh::api::keystone_tenant: 'service'
 glance::registry::keystone_tenant: 'service'
 neutron::server::auth_tenant: 'service'
 neutron::agents::metadata::auth_tenant: 'service'
@@ -142,6 +143,7 @@ tripleo::loadbalancer::redis: true
 tripleo::loadbalancer::sahara: true
 tripleo::loadbalancer::swift_proxy_server: true
 tripleo::loadbalancer::ceilometer: true
+tripleo::loadbalancer::aodh: true
 tripleo::loadbalancer::heat_api: true
 tripleo::loadbalancer::heat_cloudwatch: true
 tripleo::loadbalancer::heat_cfn: true
@@ -254,3 +256,7 @@ tripleo::firewall::firewall_rules:
   '127 snmp':
     port: 161
     proto: 'udp'
+  '128 aodh':
+    port:
+      - 8042
+      - 13042
index 81a33bb..10a64e4 100644 (file)
@@ -113,6 +113,7 @@ if hiera('step') >= 2 {
   include ::sahara::db::mysql
   if downcase(hiera('ceilometer_backend')) == 'mysql' {
     include ::ceilometer::db::mysql
+    include ::aodh::db::mysql
   }
 
   $rabbit_nodes = hiera('rabbit_node_ips')
@@ -571,6 +572,21 @@ if hiera('step') >= 3 {
 
   Cron <| title == 'ceilometer-expirer' |> { command => "sleep $((\$(od -A n -t d -N 3 /dev/urandom) % 86400)) && ${::ceilometer::params::expirer_command}" }
 
+  # Aodh
+  class { '::aodh' :
+    database_connection => $ceilometer_database_connection,
+  }
+  include ::aodh::db::sync
+  # To manage the upgrade:
+  Exec['ceilometer-dbsync'] -> Exec['aodh-db-sync']
+  include ::aodh::auth
+  include ::aodh::api
+  include ::aodh::wsgi::apache
+  include ::aodh::evaluator
+  include ::aodh::notifier
+  include ::aodh::listener
+  include ::aodh::client
+
   # Heat
   class { '::heat' :
     notification_driver => 'messaging',
index 6accdc1..edeaa61 100644 (file)
@@ -1040,6 +1040,32 @@ if hiera('step') >= 3 {
     neutron_options => $neutron_options,
   }
 
+  # Aodh
+  class { '::aodh' :
+    database_connection => $ceilometer_database_connection,
+  }
+  include ::aodh::config
+  include ::aodh::auth
+  include ::aodh::client
+  include ::aodh::wsgi::apache
+  class { '::aodh::api':
+    manage_service => false,
+    enabled        => false,
+    service_name   => 'httpd',
+  }
+  class { '::aodh::evaluator':
+    manage_service => false,
+    enabled        => false,
+  }
+  class { '::aodh::notifier':
+    manage_service => false,
+    enabled        => false,
+  }
+  class { '::aodh::listener':
+    manage_service => false,
+    enabled        => false,
+  }
+
   $snmpd_user = hiera('snmpd_readonly_user_name')
   snmp::snmpv3_user { $snmpd_user:
     authtype => 'MD5',
@@ -1520,7 +1546,7 @@ if hiera('step') >= 4 {
                   Pacemaker::Resource::Service[$::nova::params::conductor_service_name]],
     }
 
-    # Ceilometer
+    # Ceilometer and Aodh
     case downcase(hiera('ceilometer_backend')) {
       /mysql/: {
         pacemaker::resource::service { $::ceilometer::params::agent_central_service_name :
@@ -1553,8 +1579,10 @@ if hiera('step') >= 4 {
     # Fedora doesn't know `require-all` parameter for constraints yet
     if $::operatingsystem == 'Fedora' {
       $redis_ceilometer_constraint_params = undef
+      $redis_aodh_constraint_params = undef
     } else {
       $redis_ceilometer_constraint_params = 'require-all=false'
+      $redis_aodh_constraint_params = 'require-all=false'
     }
     pacemaker::constraint::base { 'redis-then-ceilometer-central-constraint':
       constraint_type   => 'order',
@@ -1566,6 +1594,16 @@ if hiera('step') >= 4 {
       require           => [Pacemaker::Resource::Ocf['redis'],
                             Pacemaker::Resource::Service[$::ceilometer::params::agent_central_service_name]],
     }
+    pacemaker::constraint::base { 'redis-then-aodh-evaluator-constraint':
+      constraint_type   => 'order',
+      first_resource    => 'redis-master',
+      second_resource   => "${::aodh::params::evaluator_service_name}-clone",
+      first_action      => 'promote',
+      second_action     => 'start',
+      constraint_params => $redis_aodh_constraint_params,
+      require           => [Pacemaker::Resource::Ocf['redis'],
+                            Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name]],
+    }
     pacemaker::constraint::base { 'keystone-then-ceilometer-central-constraint':
       constraint_type => 'order',
       first_resource  => "${::apache::params::service_name}-clone",
@@ -1616,6 +1654,60 @@ if hiera('step') >= 4 {
       require => [Pacemaker::Resource::Service[$::ceilometer::params::api_service_name],
                   Pacemaker::Resource::Ocf['delay']],
     }
+    # Aodh
+    pacemaker::resource::service { $::aodh::params::api_service_name :
+      clone_params => 'interleave=true',
+    }
+    pacemaker::resource::service { $::aodh::params::evaluator_service_name :
+      clone_params => 'interleave=true',
+    }
+    pacemaker::resource::service { $::aodh::params::notifier_service_name :
+      clone_params => 'interleave=true',
+    }
+    pacemaker::resource::service { $::aodh::params::listener_service_name :
+      clone_params => 'interleave=true',
+    }
+    pacemaker::constraint::base { 'keystone-then-aodh-api-constraint':
+      constraint_type => 'order',
+      first_resource  => "${::apache::params::service_name}-clone",
+      second_resource => "${::aodh::params::api_service_name}-clone",
+      first_action    => 'start',
+      second_action   => 'start',
+      require         => [Pacemaker::Resource::Service[$::aodh::params::api_service_name],
+                          Pacemaker::Resource::Service[$::apache::params::service_name]],
+    }
+    pacemaker::constraint::base { 'aodh-delay-then-aodh-evaluator-constraint':
+      constraint_type => 'order',
+      first_resource  => 'delay-clone',
+      second_resource => "${::aodh::params::evaluator_service_name}-clone",
+      first_action    => 'start',
+      second_action   => 'start',
+      require         => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name],
+                          Pacemaker::Resource::Ocf['delay']],
+    }
+    pacemaker::constraint::colocation { 'aodh-evaluator-with-aodh-delay-colocation':
+      source  => "${::aodh::params::evaluator_service_name}-clone",
+      target  => 'delay-clone',
+      score   => 'INFINITY',
+      require => [Pacemaker::Resource::Service[$::horizon::params::http_service],
+                  Pacemaker::Resource::Ocf['delay']],
+    }
+    pacemaker::constraint::base { 'aodh-evaluator-then-aodh-notifier-constraint':
+      constraint_type => 'order',
+      first_resource  => "${::aodh::params::evaluator_service_name}-clone",
+      second_resource => "${::aodh::params::notifier_service_name}-clone",
+      first_action    => 'start',
+      second_action   => 'start',
+      require         => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name],
+                          Pacemaker::Resource::Service[$::aodh::params::notifier_service_name]],
+    }
+    pacemaker::constraint::colocation { 'aodh-notifier-with-aodh-evaluator-colocation':
+      source  => "${::aodh::params::notifier_service_name}-clone",
+      target  => "${::aodh::params::evaluator_service_name}-clone",
+      score   => 'INFINITY',
+      require => [Pacemaker::Resource::Service[$::aodh::params::evaluator_service_name],
+                  Pacemaker::Resource::Service[$::aodh::params::notifier_service_name]],
+    }
     if downcase(hiera('ceilometer_backend')) == 'mongodb' {
       pacemaker::constraint::base { 'mongodb-then-ceilometer-central-constraint':
         constraint_type => 'order',
index 5e2f698..ebecd0c 100644 (file)
@@ -26,6 +26,7 @@ resources:
                 nova_api_vip: {get_input: nova_api_vip}
                 nova_metadata_vip: {get_input: nova_metadata_vip}
                 ceilometer_api_vip: {get_input: ceilometer_api_vip}
+                aodh_api_vip: {get_input: aodh_api_vip}
                 heat_api_vip: {get_input: heat_api_vip}
                 horizon_vip: {get_input: horizon_vip}
                 redis_vip: {get_input: redis_vip}