Deploy Aodh services, replacing Ceilometer Alarm
authorPradeep Kilambi <pkilambi@redhat.com>
Mon, 7 Mar 2016 16:27:17 +0000 (11:27 -0500)
committerPradeep Kilambi <pkilambi@redhat.com>
Sun, 20 Mar 2016 14:27:21 +0000 (10:27 -0400)
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
* Add migration logic to remove pcs resources

Depends-On: I5333faa72e52d2aa2a622ac2d4b60825aadc52b5
Depends-On: Ib6c9c4c35da3fb55e0ca8e2d5a58ebaf4204d792

Co-Authored-By: Emilien Macchi <emilien@redhat.com>
Change-Id: Ib47a22884afb032ebc1655e1a4a06bfe70249134

13 files changed:
environments/enable-tls.yaml
extraconfig/tasks/major_upgrade_pacemaker_migrations.sh
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 7fd2694..1f420b3 100644 (file)
 # The migration functions should be idempotent. If the migration has
 # been already applied, it should be possible to call the function
 # again without damaging the deployment or failing the upgrade.
+
+function remove_ceilometer_alarm {
+    if pcs status | grep openstack-ceilometer-alarm; then
+        # Disable pacemaker resources for ceilometer-alarms
+        pcs resource disable openstack-ceilometer-alarm-evaluator
+        check_resource openstack-ceilometer-alarm-evaluator stopped 600
+        pcs resource delete openstack-ceilometer-alarm-evaluator
+        pcs resource disable openstack-ceilometer-alarm-notifier
+        check_resource openstack-ceilometer-alarm-notifier stopped 600
+        pcs resource delete openstack-ceilometer-alarm-notifier
+
+        # remove constraints
+        pcs constraint remove ceilometer-delay-then-ceilometer-alarm-evaluator-constraint
+        pcs constraint remove ceilometer-alarm-evaluator-with-ceilometer-delay-colocation
+        pcs constraint remove ceilometer-alarm-evaluator-then-ceilometer-alarm-notifier-constraint
+        pcs constraint remove ceilometer-alarm-notifier-with-ceilometer-alarm-evaluator-colocation
+        pcs constraint remove ceilometer-alarm-notifier-then-ceilometer-notification-constraint
+        pcs constraint remove ceilometer-notification-with-ceilometer-alarm-notifier-colocation
+
+    fi
+
+    # uninstall openstack-ceilometer-alarm package
+    yum -y remove openstack-ceilometer-alarm
+
+}
index 59e4be4..66efc5c 100755 (executable)
@@ -53,12 +53,13 @@ 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-evaluator
+openstack-aodh-notifier
+openstack-aodh-listener
 openstack-cinder-api
 openstack-cinder-scheduler
 openstack-cinder-volume
@@ -107,6 +108,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 7a0bbf4..84fea0e 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 a31094a..0382533 100644 (file)
@@ -8,6 +8,7 @@ description: A map of OpenStack endpoints. Since the endpoints are URLs,
   parameters come from net_ip_uri_map, which will include these brackets
   in IPv6 addresses.
 parameters:
+  AodhApiVirtualIP: {type: string, default: ''}
   CeilometerApiVirtualIP: {type: string, default: ''}
   CinderApiVirtualIP: {type: string, default: ''}
   GlanceApiVirtualIP: {type: string, default: ''}
@@ -24,6 +25,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}
@@ -71,6 +75,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 343b1bc..35a0db1 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.
@@ -665,6 +670,7 @@ parameters:
     default:
       NeutronTenantNetwork: tenant
       CeilometerApiNetwork: internal_api
+      AodhApiNetwork: internal_api
       MongoDbNetwork: internal_api
       CinderApiNetwork: internal_api
       CinderIscsiNetwork: storage
@@ -864,6 +870,7 @@ resources:
     properties:
       CloudName: {get_param: CloudName}
       CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
+      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]}]}
       GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
@@ -888,6 +895,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}
@@ -1000,6 +1008,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]}]}
           HeatApiVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
@@ -1233,6 +1242,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]}]}
@@ -1353,6 +1363,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]}
@@ -1635,6 +1646,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 2f2a1e9..fed9dd3 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:
@@ -187,6 +189,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']"
@@ -272,6 +282,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
                 glance::notify::rabbitmq::rabbit_hosts: *rabbit_nodes_array
                 heat::rabbit_hosts: *rabbit_nodes_array
index c97012d..879bde5 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: ''
@@ -1140,6 +1148,7 @@ resources:
         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
         ceilometer_password: {get_param: CeilometerPassword}
         ceilometer_store_events: {get_param: CeilometerStoreEvents}
+        aodh_password: {get_param: AodhPassword}
         ceilometer_coordination_url:
           list_join:
             - ''
@@ -1232,6 +1241,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]}]}
@@ -1536,6 +1546,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 98cec36..46471c3 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 e80bee0..3c60e90 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'
@@ -143,6 +144,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
@@ -255,3 +257,7 @@ tripleo::firewall::firewall_rules:
   '127 snmp':
     port: 161
     proto: 'udp'
+  '128 aodh':
+    port:
+      - 8042
+      - 13042
index 0d6a238..b78648f 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')
@@ -568,6 +569,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 2bb081a..c91e179 100644 (file)
@@ -1090,6 +1090,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',
@@ -1580,7 +1606,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:
@@ -1613,8 +1639,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',
@@ -1626,6 +1654,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  => 'openstack-core-clone',
@@ -1676,6 +1714,55 @@ if hiera('step') >= 4 {
       require => [Pacemaker::Resource::Service[$::ceilometer::params::api_service_name],
                   Pacemaker::Resource::Ocf['delay']],
     }
+    # Aodh
+    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 { '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[$::aodh::params::evaluator_service_name],
+                  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]],
+    }
+    pacemaker::constraint::colocation { 'aodh-listener-with-aodh-evaluator-colocation':
+      source  => "${::aodh::params::listener_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::listener_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}