initial refactoring step and addition of gnocchi

* applied new template logic and refactored all recipes accordingly
* removed vmware and suse support and specs
* removed alarm ceilometer-alarm notifier and evaluator (needs to be rewritten
  for aodh)
* added recipe for telemetry-metric/gnocchi deployment
* set gnocchi as default dispatcher for ceilometer
* added initial specs for gnocchi recipes

Depends-On: I22114b6d2d46cce561a2f292b92ff5f531cff533
Change-Id: If513cb2715d8266845bd6541d12005edef70f11c
This commit is contained in:
Jan Klare 2016-05-19 18:10:21 +02:00
parent fd677da703
commit faceb7e6e0
40 changed files with 884 additions and 1356 deletions

135
README.md
View File

@ -1,106 +1,79 @@
Description
===========
Installs the OpenStack Metering service **Ceilometer** as part of the OpenStack
reference deployment Chef for OpenStack. Ceilometer is currently installed
from packages.
Installs the OpenStack Metering service **Ceilometer** as well as **Gnocchi** as
the backend for Metrics as part of the OpenStack reference deployment Chef for
OpenStack. Both are currently installed from packages.
https://wiki.openstack.org/wiki/Ceilometer
http://docs.openstack.org/developer/ceilometer/
http://docs.openstack.org/developer/gnocchi/
Requirements
============
- Chef 12 or higher
- chefdk 0.9.0 for testing (also includes berkshelf for cookbook dependency
resolution)
WARNING:
- Currently there are no gnocchi packages included for Ubuntu Trusty. The
gnocchi recipe will only work on Ubuntu Xenial and above.
Platform
========
- ubuntu
- redhat
- centos
Cookbooks
---------
=========
The following cookbooks are dependencies:
* openstack-common
* openstack-identity
* openstack-compute
Usage
=====
agent-central
----
- Installs agent central service.
agent-compute
----
- Installs agent compute service.
agent-notification
----
- Installs agent notification service.
alarm-evaluator
----
- Installs alarm evaluator service.
alarm-notifier
----
- Installs alarm notifier service.
api
----
- Installs API service.
client
----
- Install the client packages
collector
----
- Installs collector package and service. If the NoSQL database is used for metering service, ceilometer-dbsync will not be executed.
common
----
- Common metering configuration.
identity_registration
----
- Registers the endpoints, tenant and user for metering service with Keystone.
- 'openstack-common', '>= 13.0.0'
- 'openstack-identity', '>= 13.0.0'
Attributes
==========
* `openstack['telemetry']['api']['auth']['version']` - Select v2.0 or v3.0. Default v2.0. The auth API version used to interact with identity service.
* `openstack['telemetry']['sample_source']` - The source name of emitted samples, default value is openstack.
* `openstack['telemetry']['api']['auth']['memcached_servers']` - A list of memcached server(s) to use for caching
* `openstack['telemetry']['api']['auth']['memcache_security_strategy']` - Whether token data should be authenticated or authenticated and encrypted. Acceptable values are MAC or ENCRYPT
* `openstack['telemetry']['api']['auth']['memcache_secret_key']` - This string is used for key derivation
* `openstack['telemetry']['api']['auth']['hash_algorithms']` - Hash algorithms to use for hashing PKI tokens
* `openstack['telemetry']['api']['auth']['cafile']` - A PEM encoded Certificate Authority to use when verifying HTTPs connections
* `openstack['telemetry']['api']['auth']['insecure']` - Set whether to verify HTTPS connections
* `openstack['telemetry']['service-credentials']['cafile']` - A PEM encoded Certificate Authority to use when verifying HTTPs connections (for service polling authentication)
* `openstack['telemetry']['service-credentials']['insecure']` - Set whether to verify HTTPS connections (for service polling authentication)
* `openstack['telemetry']['dbsync_timeout']` - Set dbsync command timeout value
* `openstack['telemetry']['database']['time_to_live']` - Set a time_to_live parameter (ttl) for samples. Set -1 for no expiry
* `openstack['telemetry']['notification']['store_events']` - Set a store_events parameter for notification service
Please see the extensive inline documentation in `attributes/*.rb` for
descriptions of all the settable attributes for this cookbook.
The following attributes are defined in attributes/default.rb of the common cookbook, but are documented here due to their relevance:
Note that all attributes are in the `default['openstack']` "namespace"
* `openstack['endpoints']['telemetry-api-bind']['host']` - The IP address to bind the api service to
* `openstack['endpoints']['telemetry-api-bind']['port']` - The port to bind the api service to
* `openstack['endpoints']['telemetry-api-bind']['bind_interface']` - The interface name to bind the api service to
The usage of attributes to generate the node.conf is decribed in the
openstack-common cookbook.
If the value of the 'bind_interface' attribute is non-nil, then the telemetry service will be bound to the first IP address on that interface. If the value of the 'bind_interface' attribute is nil, then the telemetry service will be bound to the IP address specifie
Recipes
=======
Testing
=====
## agent-central
- Installs agent central service.
Please refer to the [TESTING.md](TESTING.md) for instructions for testing the cookbook.
## agent-compute
- Installs agent compute service.
Berkshelf
=====
## agent-notification
- Installs agent notification service.
Berks will resolve version requirements and dependencies on first run and
store these in Berksfile.lock. If new cookbooks become available you can run
`berks update` to update the references in Berksfile.lock. Berksfile.lock will
be included in stable branches to provide a known good set of dependencies.
Berksfile.lock will not be included in development branches to encourage
development against the latest cookbooks.
## api
- Installs API service.
## client
- Install the client packages
## collector
- Installs collector package and service. If the NoSQL database is used for metering service, ceilometer-dbsync will not be executed.
## common
- Common metering configuration.
## identity_registration
- Registers the endpoints, tenant and user for metering and metric service with Keystone.
## gnocchi
- Installs gnochhi as default backend for ceilometer metrics
License and Author
==================
@ -116,7 +89,7 @@ License and Author
| **Author** | Chen Zhiwei (<zhiwchen@cn.ibm.com>) |
| **Author** | David Geng (<gengjh@cn.ibm.com>) |
| **Author** | Mark Vanderwiel (<vanderwl@us.ibm.com>) |
| **Author** | Jan Klare (<j.klare@x-ion.de>) |
| **Author** | Jan Klare (<j.klare@cloudbau.de>) |
| | |
| **Copyright** | Copyright (c) 2013, Opscode, Inc. |
| **Copyright** | Copyright (c) 2013, AT&T Services, Inc. |

View File

@ -0,0 +1,18 @@
default['openstack']['telemetry']['conf_secrets'] = {}
default['openstack']['telemetry']['conf'].tap do |conf|
# [DEFAULT] section
conf['DEFAULT']['rpc_backend'] = node['openstack']['mq']['service_type']
conf['DEFAULT']['meter_dispatchers'] = 'gnocchi'
# [keystone_authtoken] section
conf['keystone_authtoken']['username'] = 'ceilometer'
conf['keystone_authtoken']['project_name'] = 'service'
conf['keystone_authtoken']['auth_type'] = 'password'
conf['keystone_authtoken']['region_name'] = node['openstack']['region']
# [service_credentials] section
conf['service_credentials']['username'] = 'ceilometer'
conf['service_credentials']['project_name'] = 'service'
conf['service_credentials']['auth_type'] = 'password'
conf['service_credentials']['interface'] = 'internal'
conf['service_credentials']['region_name'] = node['openstack']['region']
end

View File

@ -19,104 +19,61 @@
# limitations under the License.
#
# The name of the Chef role that knows about the message queue server
# that Nova uses
default['openstack']['telemetry']['rabbit_server_chef_role'] = 'os-ops-messaging'
# Set the endpoints for the telemetry services to allow all other cookbooks to
# access and use them
%w(telemetry telemetry-metric).each do |ts|
%w(public internal admin).each do |ep_type|
default['openstack']['endpoints'][ep_type][ts]['host'] = '127.0.0.1'
default['openstack']['endpoints'][ep_type][ts]['scheme'] = 'http'
default['openstack']['endpoints'][ep_type][ts]['path'] = ''
default['openstack']['endpoints'][ep_type]['telemetry']['port'] = 8777
default['openstack']['endpoints'][ep_type]['telemetry-metric']['port'] = 8041
# web-service (e.g. apache) listen address (can be different from openstack
# telemetry endpoints)
end
default['openstack']['bind_service']['all'][ts]['host'] = '127.0.0.1'
end
default['openstack']['bind_service']['all']['telemetry']['port'] = 8777
default['openstack']['bind_service']['all']['telemetry-metric']['port'] = 8041
default['openstack']['telemetry']['conf_dir'] = '/etc/ceilometer'
default['openstack']['telemetry']['conf'] = ::File.join(node['openstack']['telemetry']['conf_dir'], 'ceilometer.conf')
default['openstack']['telemetry']['periodic_interval'] = 600
default['openstack']['telemetry']['conf_file'] =
::File.join(node['openstack']['telemetry']['conf_dir'], 'ceilometer.conf')
default['openstack']['telemetry-metric']['conf_dir'] = '/etc/gnocchi'
default['openstack']['telemetry-metric']['conf_file'] =
::File.join(node['openstack']['telemetry-metric']['conf_dir'], 'gnocchi.conf')
default['openstack']['telemetry']['syslog']['use'] = false
default['openstack']['telemetry']['verbose'] = 'true'
default['openstack']['telemetry']['debug'] = 'false'
default['openstack']['telemetry']['api']['auth']['cache_dir'] = '/var/cache/ceilometer/api'
default['openstack']['telemetry']['api']['auth']['version'] = node['openstack']['api']['auth']['version']
# A list of memcached server(s) to use for caching
default['openstack']['telemetry']['api']['auth']['memcached_servers'] = nil
# Whether token data should be authenticated or authenticated and encrypted. Acceptable values are MAC or ENCRYPT
default['openstack']['telemetry']['api']['auth']['memcache_security_strategy'] = nil
# This string is used for key derivation
default['openstack']['telemetry']['api']['auth']['memcache_secret_key'] = nil
# Hash algorithms to use for hashing PKI tokens
default['openstack']['telemetry']['api']['auth']['hash_algorithms'] = 'md5'
# A PEM encoded Certificate Authority to use when verifying HTTPs connections
default['openstack']['telemetry']['api']['auth']['cafile'] = nil
# Verify HTTPS connections
default['openstack']['telemetry']['api']['auth']['insecure'] = false
default['openstack']['telemetry']['user'] = 'ceilometer'
default['openstack']['telemetry']['group'] = 'ceilometer'
default['openstack']['telemetry']['region'] = node['openstack']['region']
default['openstack']['telemetry']['service_user'] = 'ceilometer'
default['openstack']['telemetry']['service_tenant_name'] = 'service'
default['openstack']['telemetry-metric']['user'] = 'gnocchi'
default['openstack']['telemetry-metric']['group'] = 'gnocchi'
default['openstack']['telemetry']['service_role'] = 'admin'
default['openstack']['telemetry-metric']['service_role'] = 'admin'
# A PEM encoded Certificate Authority to use when verifying HTTPs connections (for service polling authentication)
default['openstack']['telemetry']['service-credentials']['cafile'] = nil
# Verify HTTPS connections (for service polling authentication)
default['openstack']['telemetry']['service-credentials']['insecure'] = false
default['openstack']['telemetry']['sample_source'] = 'openstack'
default['openstack']['telemetry']['dbsync_timeout'] = 3600
case node['openstack']['compute']['driver']
when 'libvirt.LibvirtDriver'
default['openstack']['telemetry']['hypervisor_inspector'] = 'libvirt'
when 'vmwareapi.VMwareESXDriver', 'vmwareapi.VMwareVCDriver'
default['openstack']['telemetry']['hypervisor_inspector'] = 'vsphere'
else
default['openstack']['telemetry']['hypervisor_inspector'] = nil
end
default['openstack']['telemetry']['identity-api']['auth']['version'] =
node['openstack']['api']['auth']['version']
default['openstack']['telemetry-metric']['identity-api']['auth']['version'] =
node['openstack']['api']['auth']['version']
case platform_family
when 'suse' # :pragma-foodcritic: ~FC024 - won't fix this
default['openstack']['telemetry']['platform'] = {
'common_packages' => ['openstack-ceilometer'],
'agent_central_packages' => ['openstack-ceilometer-agent-central'],
'agent_central_service' => 'openstack-ceilometer-agent-central',
'agent_compute_packages' => ['openstack-ceilometer-agent-compute'],
'agent_compute_service' => 'openstack-ceilometer-agent-compute',
'agent_notification_packages' => ['openstack-ceilometer-agent-notification'],
'agent_notification_service' => 'openstack-ceilometer-agent-notification',
'alarm_evaluator_packages' => ['openstack-ceilometer-alarm-evaluator'],
'alarm_evaluator_service' => 'openstack-ceilometer-alarm-evaluator',
'alarm_notifier_packages' => ['openstack-ceilometer-alarm-notifier'],
'alarm_notifier_service' => 'openstack-ceilometer-alarm-notifier',
'api_packages' => ['openstack-ceilometer-api'],
'api_service' => 'openstack-ceilometer-api',
'client_packages' => ['python-ceilometerclient'],
'collector_packages' => ['openstack-ceilometer-collector'],
'collector_service' => 'openstack-ceilometer-collector',
'package_overrides' => ''
}
when 'fedora', 'rhel'
when 'rhel'
default['openstack']['telemetry']['platform'] = {
'common_packages' => ['openstack-ceilometer-common'],
'gnocchi_packages' => ['openstack-gnocchi-api', 'openstack-gnocchi-metricd'],
'gnocchi-api_service' => 'openstack-gnocchi-api',
'gnocchi-metricd_service' => 'openstack-gnocchi-metricd',
'agent_central_packages' => ['openstack-ceilometer-central'],
'agent_central_service' => 'openstack-ceilometer-central',
'agent_compute_packages' => ['openstack-ceilometer-compute'],
'agent_compute_service' => 'openstack-ceilometer-compute',
'agent_notification_packages' => ['openstack-ceilometer-collector'],
'agent_notification_service' => 'openstack-ceilometer-notification',
'alarm_evaluator_packages' => ['openstack-ceilometer-alarm'],
'alarm_evaluator_service' => 'openstack-ceilometer-alarm-evaluator',
'alarm_notifier_packages' => ['openstack-ceilometer-alarm'],
'alarm_notifier_service' => 'openstack-ceilometer-alarm-notifier',
'api_packages' => ['openstack-ceilometer-api'],
'api_service' => 'openstack-ceilometer-api',
'client_packages' => ['python-ceilometerclient'],
'client_packages' => ['python-ceilometerclient', 'python-gnocchiclient'],
'collector_packages' => ['openstack-ceilometer-collector'],
'collector_service' => 'openstack-ceilometer-collector',
'package_overrides' => ''
@ -125,27 +82,20 @@ when 'fedora', 'rhel'
when 'debian'
default['openstack']['telemetry']['platform'] = {
'common_packages' => ['ceilometer-common'],
'gnocchi_packages' => ['gnocchi-api', 'gnocchi-metricd'],
'gnocchi-api_service' => 'gnocchi-api',
'gnocchi-metricd_service' => 'gnocchi-metricd',
'agent_central_packages' => ['ceilometer-agent-central'],
'agent_central_service' => 'ceilometer-agent-central',
'agent_compute_packages' => ['ceilometer-agent-compute'],
'agent_compute_service' => 'ceilometer-agent-compute',
'agent_notification_packages' => ['ceilometer-agent-notification'],
'agent_notification_service' => 'ceilometer-agent-notification',
'alarm_evaluator_packages' => ['ceilometer-alarm-evaluator'],
'alarm_evaluator_service' => 'ceilometer-alarm-evaluator',
'alarm_notifier_packages' => ['ceilometer-alarm-notifier'],
'alarm_notifier_service' => 'ceilometer-alarm-notifier',
'api_packages' => ['ceilometer-api'],
'api_service' => 'ceilometer-api',
'client_packages' => ['python-ceilometerclient'],
'client_packages' => ['python-ceilometerclient', 'python-gnocchiclient'],
'collector_packages' => ['ceilometer-collector', 'python-mysqldb'],
'collector_service' => 'ceilometer-collector',
'package_overrides' => "-o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef'"
}
end
# The time to live value for samples which is specified in seconds, override to -1 if no data expiry is required
default['openstack']['telemetry']['database']['time_to_live'] = 1800
# Decide whether to store events in notification service or not
default['openstack']['telemetry']['notification']['store_events'] = false

View File

@ -0,0 +1,15 @@
default['openstack']['telemetry-metric']['conf_secrets'] = {}
default['openstack']['telemetry-metric']['conf'].tap do |conf|
# [DEFAULT] section
conf['DEFAULT']['rpc_backend'] = node['openstack']['mq']['service_type']
# [keystone_authtoken] section
conf['keystone_authtoken']['username'] = 'gnocchi'
conf['keystone_authtoken']['project_name'] = 'service'
conf['keystone_authtoken']['auth_type'] = 'password'
conf['keystone_authtoken']['region_name'] = node['openstack']['region']
conf['storage']['driver'] = 'file'
if node['openstack']['telemetry-metric']['conf']['storage']['driver'] == 'file'
conf['storage']['file_basepath'] = '/var/lib/gnocchi'
end
end

31
files/api-paste.ini Normal file
View File

@ -0,0 +1,31 @@
[pipeline:main]
pipeline = gnocchi+auth
[composite:gnocchi+noauth]
use = egg:Paste#urlmap
/ = gnocchiversions
/v1 = gnocchiv1
[composite:gnocchi+auth]
use = egg:Paste#urlmap
/ = gnocchiversions
/v1 = gnocchiv1+auth
[pipeline:gnocchiv1+auth]
pipeline = keystone_authtoken gnocchiv1
[app:gnocchiversions]
paste.app_factory = gnocchi.rest.app:app_factory
root = gnocchi.rest.VersionsController
[app:gnocchiv1]
paste.app_factory = gnocchi.rest.app:app_factory
root = gnocchi.rest.V1Controller
[filter:keystone_authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
oslo_config_project = gnocchi
[filter:cors]
paste.filter_factory = oslo_middleware.cors:filter_factory
oslo_config_project = gnocchi

View File

@ -0,0 +1,213 @@
---
resources:
- resource_type: identity
archive_policy: low
metrics:
- 'identity.authenticate.success'
- 'identity.authenticate.pending'
- 'identity.authenticate.failure'
- 'identity.user.created'
- 'identity.user.deleted'
- 'identity.user.updated'
- 'identity.group.created'
- 'identity.group.deleted'
- 'identity.group.updated'
- 'identity.role.created'
- 'identity.role.deleted'
- 'identity.role.updated'
- 'identity.project.created'
- 'identity.project.deleted'
- 'identity.project.updated'
- 'identity.trust.created'
- 'identity.trust.deleted'
- 'identity.role_assignment.created'
- 'identity.role_assignment.deleted'
- resource_type: ceph_account
metrics:
- 'radosgw.objects'
- 'radosgw.objects.size'
- 'radosgw.objects.containers'
- 'radosgw.api.request'
- 'radosgw.containers.objects'
- 'radosgw.containers.objects.size'
- resource_type: instance
metrics:
- 'instance'
- 'memory'
- 'memory.usage'
- 'memory.resident'
- 'vcpus'
- 'cpu'
- 'cpu.delta'
- 'cpu_util'
- 'disk.root.size'
- 'disk.ephemeral.size'
- 'disk.read.requests'
- 'disk.read.requests.rate'
- 'disk.write.requests'
- 'disk.write.requests.rate'
- 'disk.read.bytes'
- 'disk.read.bytes.rate'
- 'disk.write.bytes'
- 'disk.write.bytes.rate'
- 'disk.latency'
- 'disk.iops'
- 'disk.capacity'
- 'disk.allocation'
- 'disk.usage'
attributes:
host: resource_metadata.host
image_ref: resource_metadata.image_ref
display_name: resource_metadata.display_name
flavor_id: resource_metadata.(instance_flavor_id|(flavor.id))
server_group: resource_metadata.user_metadata.server_group
- resource_type: instance_network_interface
metrics:
- 'network.outgoing.packets.rate'
- 'network.incoming.packets.rate'
- 'network.outgoing.packets'
- 'network.incoming.packets'
- 'network.outgoing.bytes.rate'
- 'network.incoming.bytes.rate'
- 'network.outgoing.bytes'
- 'network.incoming.bytes'
attributes:
name: resource_metadata.vnic_name
instance_id: resource_metadata.instance_id
- resource_type: instance_disk
metrics:
- 'disk.device.read.requests'
- 'disk.device.read.requests.rate'
- 'disk.device.write.requests'
- 'disk.device.write.requests.rate'
- 'disk.device.read.bytes'
- 'disk.device.read.bytes.rate'
- 'disk.device.write.bytes'
- 'disk.device.write.bytes.rate'
- 'disk.device.latency'
- 'disk.device.iops'
- 'disk.device.capacity'
- 'disk.device.allocation'
- 'disk.device.usage'
attributes:
name: resource_metadata.disk_name
instance_id: resource_metadata.instance_id
- resource_type: image
metrics:
- 'image'
- 'image.size'
- 'image.download'
- 'image.serve'
attributes:
name: resource_metadata.name
container_format: resource_metadata.container_format
disk_format: resource_metadata.disk_format
- resource_type: ipmi
metrics:
- 'hardware.ipmi.node.power'
- 'hardware.ipmi.node.temperature'
- 'hardware.ipmi.node.inlet_temperature'
- 'hardware.ipmi.node.outlet_temperature'
- 'hardware.ipmi.node.fan'
- 'hardware.ipmi.node.current'
- 'hardware.ipmi.node.voltage'
- 'hardware.ipmi.node.airflow'
- 'hardware.ipmi.node.cups'
- 'hardware.ipmi.node.cpu_util'
- 'hardware.ipmi.node.mem_util'
- 'hardware.ipmi.node.io_util'
- resource_type: network
metrics:
- 'bandwidth'
- 'network'
- 'network.create'
- 'network.update'
- 'subnet'
- 'subnet.create'
- 'subnet.update'
- 'port'
- 'port.create'
- 'port.update'
- 'router'
- 'router.create'
- 'router.update'
- 'ip.floating'
- 'ip.floating.create'
- 'ip.floating.update'
- resource_type: stack
metrics:
- 'stack.create'
- 'stack.update'
- 'stack.delete'
- 'stack.resume'
- 'stack.suspend'
- resource_type: swift_account
metrics:
- 'storage.objects.incoming.bytes'
- 'storage.objects.outgoing.bytes'
- 'storage.api.request'
- 'storage.objects.size'
- 'storage.objects'
- 'storage.objects.containers'
- 'storage.containers.objects'
- 'storage.containers.objects.size'
- resource_type: volume
metrics:
- 'volume'
- 'volume.size'
- 'volume.create'
- 'volume.delete'
- 'volume.update'
- 'volume.resize'
- 'volume.attach'
- 'volume.detach'
attributes:
display_name: resource_metadata.display_name
- resource_type: host
metrics:
- 'hardware.cpu.load.1min'
- 'hardware.cpu.load.5min'
- 'hardware.cpu.load.15min'
- 'hardware.cpu.util'
- 'hardware.memory.total'
- 'hardware.memory.used'
- 'hardware.memory.swap.total'
- 'hardware.memory.swap.avail'
- 'hardware.memory.buffer'
- 'hardware.memory.cached'
- 'hardware.network.ip.outgoing.datagrams'
- 'hardware.network.ip.incoming.datagrams'
- 'hardware.system_stats.cpu.idle'
- 'hardware.system_stats.io.outgoing.blocks'
- 'hardware.system_stats.io.incoming.blocks'
attributes:
host_name: resource_metadata.resource_url
- resource_type: host_disk
metrics:
- 'hardware.disk.size.total'
- 'hardware.disk.size.used'
attributes:
host_name: resource_metadata.resource_url
device_name: resource_metadata.device
- resource_type: host_network_interface
metrics:
- 'hardware.network.incoming.bytes'
- 'hardware.network.outgoing.bytes'
- 'hardware.network.outgoing.errors'
attributes:
host_name: resource_metadata.resource_url
device_name: resource_metadata.name

View File

@ -4,7 +4,7 @@ maintainer_email 'openstack-dev@lists.openstack.org'
license 'Apache 2.0'
description 'The OpenStack Metering service Ceilometer.'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '12.0.0'
version '13.0.0'
recipe 'openstack-telemetry::agent-central', 'Installs agent central service.'
recipe 'openstack-telemetry::agent-compute', 'Installs agent compute service.'
@ -17,10 +17,9 @@ recipe 'openstack-telemetry::alarm-notifier', 'Installs the alarm notifier servi
recipe 'openstack-telemetry::common', 'Common metering configuration.'
recipe 'openstack-telemetry::identity_registration', 'Registers the endpoints, tenant and user for metering service with Keystone'
%w(ubuntu suse).each do |os|
%w(ubuntu redhat centos).each do |os|
supports os
end
depends 'openstack-common', '>= 12.0.0'
depends 'openstack-identity', '>= 12.0.0'
depends 'openstack-compute', '>= 12.0.0'
depends 'openstack-common', '>= 13.0.0'
depends 'openstack-identity', '>= 13.0.0'

View File

@ -31,8 +31,6 @@ end
service 'ceilometer-agent-central' do
service_name platform['agent_central_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
subscribes :restart, "template[#{node['openstack']['telemetry']['conf_file']}]"
action [:enable, :start]
end

View File

@ -29,20 +29,8 @@ platform['agent_compute_packages'].each do |pkg|
end
end
# temp fix for compute-agent init not installing properly ubuntu
# See https://bugs.launchpad.net/cloud-archive/+bug/1221945
if node['platform'] == 'ubuntu'
init_script = '/etc/init/ceilometer-agent-compute.conf'
execute 'fix init script' do
command "cp #{init_script}.dpkg-new #{init_script}"
not_if { ::File.exist?(init_script) }
end
end
service 'ceilometer-agent-compute' do
service_name platform['agent_compute_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
subscribes :restart, "template[#{node['openstack']['telemetry']['conf_file']}]"
action [:enable, :start]
end

View File

@ -30,8 +30,6 @@ end
service 'ceilometer-agent-notification' do
service_name platform['agent_notification_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
subscribes :restart, "template[#{node['openstack']['telemetry']['conf_file']}]"
action [:enable, :start]
end

View File

@ -1,37 +0,0 @@
# encoding: UTF-8
#
# Cookbook Name:: openstack-telemetry
# Recipe:: alarm-evaluator
#
# Copyright 2014, IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
include_recipe 'openstack-telemetry::common'
platform = node['openstack']['telemetry']['platform']
platform['alarm_evaluator_packages'].each do |pkg|
package pkg do
options platform['package_overrides']
action :upgrade
end
end
service 'ceilometer-agent-evaluator' do
service_name platform['alarm_evaluator_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
action [:enable, :start]
end

View File

@ -22,12 +22,6 @@
include_recipe 'openstack-telemetry::common'
directory ::File.dirname(node['openstack']['telemetry']['api']['auth']['cache_dir']) do
owner node['openstack']['telemetry']['user']
group node['openstack']['telemetry']['group']
mode 00700
end
platform = node['openstack']['telemetry']['platform']
platform['api_packages'].each do |pkg|
package pkg do
@ -38,8 +32,6 @@ end
service 'ceilometer-api' do
service_name platform['api_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
subscribes :restart, "template[#{node['openstack']['telemetry']['conf_file']}]"
action [:enable, :start]
end

View File

@ -22,13 +22,6 @@
include_recipe 'openstack-telemetry::common'
conf_switch = "--config-file #{node['openstack']['telemetry']['conf']}"
execute 'database migration' do
command "ceilometer-dbsync #{conf_switch}"
timeout node['openstack']['telemetry']['dbsync_timeout']
end
platform = node['openstack']['telemetry']['platform']
platform['collector_packages'].each do |pkg|
package pkg do
@ -37,20 +30,13 @@ platform['collector_packages'].each do |pkg|
end
end
# temp fix for collector init not installing properly ubuntu
# See https://bugs.launchpad.net/cloud-archive/+bug/1221945
if node['platform'] == 'ubuntu'
init_script = '/etc/init/ceilometer-collector.conf'
execute 'fix init script' do
command "cp #{init_script}.dpkg-new #{init_script}"
not_if { ::File.exist?(init_script) }
end
conf_switch = "--config-file #{node['openstack']['telemetry']['conf_file']}"
execute 'database migration' do
command "ceilometer-dbsync #{conf_switch}"
end
service 'ceilometer-collector' do
service_name platform['collector_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
subscribes :restart, "template[#{node['openstack']['telemetry']['conf_file']}]"
action [:enable, :start]
end

View File

@ -44,70 +44,63 @@ platform['common_packages'].each do |pkg|
end
end
mq_service_type = node['openstack']['mq']['telemetry']['service_type']
if mq_service_type == 'rabbitmq'
node['openstack']['mq']['telemetry']['rabbit']['ha'] && (rabbit_hosts = rabbit_servers)
mq_password = get_password 'user', node['openstack']['mq']['telemetry']['rabbit']['userid']
elsif mq_service_type == 'qpid'
mq_password = get_password 'user', node['openstack']['mq']['telemetry']['qpid']['username']
if node['openstack']['telemetry']['conf']['DEFAULT']['rpc_backend'] == 'rabbit'
user = node['openstack']['mq']['telemetry']['rabbit']['userid']
node.default['openstack']['telemetry']['conf_secrets']
.[]('oslo_messaging_rabbit')['rabbit_userid'] = user
node.default['openstack']['telemetry']['conf_secrets']
.[]('oslo_messaging_rabbit')['rabbit_password'] =
get_password 'user', user
end
db_user = node['openstack']['db']['telemetry']['username']
db_pass = get_password 'db', 'ceilometer'
db_uri = db_uri('telemetry', db_user, db_pass).to_s
bind_service = node['openstack']['bind_service']['all']['telemetry']
bind_service_address = bind_address bind_service
service_user = node['openstack']['telemetry']['service_user']
service_pass = get_password 'service', 'openstack-ceilometer'
service_tenant = node['openstack']['telemetry']['service_tenant_name']
# define secrets that are needed in the ceilometer.conf
node.default['openstack']['telemetry']['conf_secrets'].tap do |conf_secrets|
conf_secrets['database']['connection'] =
db_uri('telemetry', db_user, db_pass)
conf_secrets['service_credentials']['password'] =
get_password 'service', 'openstack-telemetry'
conf_secrets['keystone_authtoken']['password'] =
get_password 'service', 'openstack-telemetry'
end
identity_endpoint = internal_endpoint 'identity-internal'
identity_admin_endpoint = admin_endpoint 'identity-admin'
image_endpoint = internal_endpoint 'image-api'
telemetry_api_bind = endpoint 'telemetry-api-bind'
identity_public_endpoint = public_endpoint 'identity'
auth_url =
auth_uri_transform(
identity_public_endpoint.to_s,
node['openstack']['telemetry']['identity-api']['auth']['version']
)
auth_uri = auth_uri_transform identity_endpoint.to_s, node['openstack']['telemetry']['api']['auth']['version']
identity_uri = identity_uri_transform(identity_admin_endpoint)
Chef::Log.debug("openstack-telemetry::common:service_user|#{service_user}")
Chef::Log.debug("openstack-telemetry::common:service_tenant|#{service_tenant}")
Chef::Log.debug("openstack-telemetry::common:identity_endpoint|#{identity_endpoint}")
metering_secret = get_password 'token', 'openstack_metering_secret'
node.default['openstack']['telemetry']['conf'].tap do |conf|
conf['api']['host'] = bind_service_address
conf['api']['port'] = bind_service.port
conf['keystone_authtoken']['auth_url'] = auth_url
conf['service_credentials']['auth_url'] = auth_url
conf['dispatcher_gnocchi']['url'] = public_endpoint 'telemetry-metric'
conf['dispatcher_gnocchi']['filter_project'] = 'service'
end
directory node['openstack']['telemetry']['conf_dir'] do
owner node['openstack']['telemetry']['user']
group node['openstack']['telemetry']['group']
mode 00750
action :create
end
if node['openstack']['telemetry']['hypervisor_inspector'] == 'vsphere'
vmware_host_pass = get_password 'token', node['openstack']['compute']['vmware']['secret_name']
end
# merge all config options and secrets to be used in the ceilometer.conf
ceilometer_conf_options = merge_config_options 'telemetry'
template node['openstack']['telemetry']['conf'] do
source 'ceilometer.conf.erb'
template node['openstack']['telemetry']['conf_file'] do
source 'openstack-service.conf.erb'
cookbook 'openstack-common'
owner node['openstack']['telemetry']['user']
group node['openstack']['telemetry']['group']
mode 00640
variables(
auth_uri: auth_uri,
identity_uri: identity_uri,
database_connection: db_uri,
image_endpoint: image_endpoint,
identity_endpoint: identity_endpoint,
mq_service_type: mq_service_type,
mq_password: mq_password,
rabbit_hosts: rabbit_hosts,
service_pass: service_pass,
service_tenant_name: service_tenant,
service_user: service_user,
metering_secret: metering_secret,
api_bind_host: telemetry_api_bind.host,
api_bind_port: telemetry_api_bind.port,
vmware_host_pass: vmware_host_pass
service_config: ceilometer_conf_options
)
end

View File

@ -0,0 +1,108 @@
# encoding: UTF-8
#
# Cookbook Name:: openstack-telemetry
# Recipe:: gnocchi_configure
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
platform = node['openstack']['telemetry']['platform']
db_user = node['openstack']['db']['telemetry-metric']['username']
db_pass = get_password 'db', 'gnocchi'
bind_service = node['openstack']['bind_service']['all']['telemetry-metric']
bind_service_address = bind_address bind_service
# define secrets that are needed in the gnocchi.conf
node.default['openstack']['telemetry-metric']['conf_secrets'].tap do |conf_secrets|
conf_secrets['database']['connection'] =
db_uri('telemetry-metric', db_user, db_pass)
conf_secrets['indexer']['url'] =
db_uri('telemetry-metric', db_user, db_pass)
conf_secrets['keystone_authtoken']['password'] =
get_password 'service', 'openstack-telemetry-metric'
end
identity_public_endpoint = public_endpoint 'identity'
auth_url =
auth_uri_transform(
identity_public_endpoint.to_s,
node['openstack']['telemetry-metric']['identity-api']['auth']['version']
)
node.default['openstack']['telemetry-metric']['conf'].tap do |conf|
conf['api']['host'] = bind_service_address
conf['api']['port'] = bind_service.port
conf['keystone_authtoken']['auth_url'] = auth_url
end
# merge all config options and secrets to be used in the gnocchi.conf
gnocchi_conf_options = merge_config_options 'telemetry-metric'
template node['openstack']['telemetry-metric']['conf_file'] do
source 'openstack-service.conf.erb'
cookbook 'openstack-common'
owner node['openstack']['telemetry-metric']['user']
group node['openstack']['telemetry-metric']['group']
mode 00640
variables(
service_config: gnocchi_conf_options
)
end
# drop gnocchi_resources.yaml to ceilometer folder (current workaround since not
# included in ubuntu package)
cookbook_file File.join(node['openstack']['telemetry']['conf_dir'], 'gnocchi_resources.yaml') do
source 'gnocchi_resources.yaml'
owner node['openstack']['telemetry']['user']
group node['openstack']['telemetry']['group']
mode 00640
end
# drop api-paste.ini to gnocchi folder (default ini will not use keystone auth)
cookbook_file File.join(node['openstack']['telemetry-metric']['conf_dir'], 'api-paste.ini') do
source 'api-paste.ini'
owner node['openstack']['telemetry-metric']['user']
group node['openstack']['telemetry-metric']['group']
mode 00640
end
if node['openstack']['telemetry-metric']['conf']['storage']['driver'] == 'file'
# default store is file, so create needed directories with correct permissions
# (on ubuntu they are created by the package, but owned by root and not writable
# for gnocchi)
store_path = node['openstack']['telemetry-metric']['conf']['storage']['file_basepath']
%w(tmp measure cache).each do |dir|
directory File.join(store_path, dir) do
owner node['openstack']['telemetry-metric']['user']
group node['openstack']['telemetry-metric']['group']
recursive true
mode 00750
end
end
end
# dbsync for gnocchi
execute 'gnocchi-upgrade' do
user node['openstack']['telemetry-metric']['user']
end
service 'gnocchi-api' do
service_name platform['gnocchi-api_service']
subscribes :restart, "template[#{node['openstack']['telemetry-metric']['conf_file']}]"
action [:enable, :start]
end
service 'gnocchi-metricd' do
service_name platform['gnocchi-metricd_service']
subscribes :restart, "template[#{node['openstack']['telemetry-metric']['conf_file']}]"
action [:enable, :start]
end

View File

@ -1,9 +1,7 @@
# encoding: UTF-8
#
# Cookbook Name:: openstack-telemetry
# Recipe:: alarm-notifier
#
# Copyright 2014, IBM Corp.
# Recipe:: gnocchi_install
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -21,17 +19,9 @@
include_recipe 'openstack-telemetry::common'
platform = node['openstack']['telemetry']['platform']
platform['alarm_notifier_packages'].each do |pkg|
platform['gnocchi_packages'].each do |pkg|
package pkg do
options platform['package_overrides']
action :upgrade
end
end
service 'ceilometer-alarm-notifier' do
service_name platform['alarm_notifier_service']
supports status: true, restart: true
subscribes :restart, "template[#{node['openstack']['telemetry']['conf']}]"
action [:enable, :start]
end

View File

@ -24,67 +24,83 @@ class ::Chef::Recipe # rubocop:disable Documentation
include ::Openstack
end
admin_api_endpoint = admin_endpoint 'telemetry-api'
internal_api_endpoint = internal_endpoint 'telemetry-api'
public_api_endpoint = public_endpoint 'telemetry-api'
identity_admin_endpoint = admin_endpoint 'identity-admin'
identity_admin_endpoint = admin_endpoint 'identity'
bootstrap_token = get_password 'token', 'openstack_identity_bootstrap_token'
auth_uri = ::URI.decode identity_admin_endpoint.to_s
service_pass = get_password 'service', 'openstack-ceilometer'
service_user = node['openstack']['telemetry']['service_user']
service_role = node['openstack']['telemetry']['service_role']
service_tenant_name = node['openstack']['telemetry']['service_tenant_name']
# Register Service Tenant
openstack_identity_register 'Register Service Tenant' do
auth_uri auth_uri
bootstrap_token bootstrap_token
tenant_name service_tenant_name
tenant_description 'Service Tenant'
%w(telemetry telemetry-metric).each do |telemetry_service|
case telemetry_service
when 'telemetry'
service_name = 'ceilometer'
service_type = 'metering'
when 'telemetry-metric'
service_name = 'gnocchi'
service_type = 'metric'
end
action :create_tenant
end
# Register Service User
openstack_identity_register 'Register Service User' do
auth_uri auth_uri
bootstrap_token bootstrap_token
tenant_name service_tenant_name
user_name service_user
user_pass service_pass
action :create_user
end
# Grant Admin role to Service User for Service Tenant
openstack_identity_register "Grant 'admin' Role to Service User for Service Tenant" do
auth_uri auth_uri
bootstrap_token bootstrap_token
tenant_name service_tenant_name
user_name service_user
role_name service_role
action :grant_role
end
openstack_identity_register 'Register Metering Service' do
auth_uri auth_uri
bootstrap_token bootstrap_token
service_name 'ceilometer'
service_type 'metering'
service_description 'Ceilometer Service'
action :create_service
end
openstack_identity_register 'Register Metering Endpoint' do
auth_uri auth_uri
bootstrap_token bootstrap_token
service_type 'metering'
endpoint_region node['openstack']['telemetry']['region']
endpoint_adminurl ::URI.decode admin_api_endpoint.to_s
endpoint_internalurl ::URI.decode internal_api_endpoint.to_s
endpoint_publicurl ::URI.decode public_api_endpoint.to_s
action :create_endpoint
admin_api_endpoint = admin_endpoint telemetry_service
internal_api_endpoint = internal_endpoint telemetry_service
public_api_endpoint = public_endpoint telemetry_service
service_pass = get_password 'service', "openstack-#{telemetry_service}"
service_role = node['openstack'][telemetry_service]['service_role']
service_user =
node['openstack'][telemetry_service]['conf']['keystone_authtoken']['username']
service_tenant_name =
node['openstack'][telemetry_service]['conf']['keystone_authtoken']['project_name']
# Register Service Tenant
openstack_identity_register "Register Service Tenant for #{telemetry_service}" do
auth_uri auth_uri
bootstrap_token bootstrap_token
tenant_name service_tenant_name
tenant_description 'Service Tenant'
action :create_tenant
end
# Register Service User
openstack_identity_register "Register #{service_user} User" do
auth_uri auth_uri
bootstrap_token bootstrap_token
tenant_name service_tenant_name
user_name service_user
user_pass service_pass
action :create_user
end
# Grant Admin role to Service User for Service Tenant
openstack_identity_register "Grant 'admin' Role to #{service_user} User for Service Tenant" do
auth_uri auth_uri
bootstrap_token bootstrap_token
tenant_name service_tenant_name
user_name service_user
role_name service_role
action :grant_role
end
openstack_identity_register "Register Service #{telemetry_service}" do
auth_uri auth_uri
bootstrap_token bootstrap_token
service_name service_name
service_type service_type
service_description 'Ceilometer Service'
action :create_service
end
openstack_identity_register "Register #{service_type} Endpoint" do
auth_uri auth_uri
bootstrap_token bootstrap_token
service_type service_type
endpoint_region node['openstack'][telemetry_service]['conf']['keystone_authtoken']['region_name']
endpoint_adminurl ::URI.decode admin_api_endpoint.to_s
endpoint_internalurl ::URI.decode internal_api_endpoint.to_s
endpoint_publicurl ::URI.decode public_api_endpoint.to_s
action :create_endpoint
end
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::agent-central' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the agent-central package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-agent-central'
end
it 'starts the agent-central service' do
expect(chef_run).to start_service 'openstack-ceilometer-agent-central'
end
end
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::agent-compute' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the agent-compute package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-agent-compute'
end
it 'starts the agent-compute service' do
expect(chef_run).to start_service 'openstack-ceilometer-agent-compute'
end
end
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::agent-notification' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the agent-notification package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-agent-notification'
end
it 'starts the agent-notification service' do
expect(chef_run).to start_service 'openstack-ceilometer-agent-notification'
end
end
end

View File

@ -1,22 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::alarm-evaluator' do
describe 'rhel' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'installs the alarm-evaluator package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-alarm'
end
it 'starts the alarm-evaluator service' do
expect(chef_run).to start_service 'openstack-ceilometer-alarm-evaluator'
end
end
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::alarm-evaluator' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the alarm-evaluator package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-alarm-evaluator'
end
it 'starts the alarm-evaluator service' do
expect(chef_run).to start_service 'openstack-ceilometer-alarm-evaluator'
end
end
end

View File

@ -1,29 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::alarm-evaluator' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'installs the alarm-evaluator package' do
expect(chef_run).to upgrade_package 'ceilometer-alarm-evaluator'
end
it 'starts and enables the alarm-evaluator service' do
expect(chef_run).to enable_service('ceilometer-alarm-evaluator')
expect(chef_run).to start_service('ceilometer-alarm-evaluator')
end
describe 'ceilometer-alarm-evaluator' do
it 'subscribes to its config file' do
expect(chef_run.service('ceilometer-alarm-evaluator')).to subscribe_to('template[/etc/ceilometer/ceilometer.conf]').delayed
end
end
end
end

View File

@ -1,22 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::alarm-notifier' do
describe 'rhel' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'installs the alarm-notifier package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-alarm'
end
it 'starts the alarm-notifier service' do
expect(chef_run).to start_service 'openstack-ceilometer-alarm-notifier'
end
end
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::alarm-notifier' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the alarm-notifier package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-alarm-notifier'
end
it 'starts the alarm-notifier service' do
expect(chef_run).to start_service 'openstack-ceilometer-alarm-notifier'
end
end
end

View File

@ -1,29 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::alarm-notifier' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'installs the alarm-notifier package' do
expect(chef_run).to upgrade_package 'ceilometer-alarm-notifier'
end
it 'starts and enables the alarm-notifier service' do
expect(chef_run).to enable_service('ceilometer-alarm-notifier')
expect(chef_run).to start_service('ceilometer-alarm-notifier')
end
describe 'ceilometer-alarm-notifier' do
it 'subscribes to its config file' do
expect(chef_run.service('ceilometer-alarm-notifier')).to subscribe_to('template[/etc/ceilometer/ceilometer.conf]').delayed
end
end
end
end

View File

@ -11,14 +11,6 @@ describe 'openstack-telemetry::api' do
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'creates the /var/cache/ceilometer directory' do
expect(chef_run).to create_directory('/var/cache/ceilometer').with(
user: 'ceilometer',
group: 'ceilometer',
mode: 0700
)
end
it 'installs the api package' do
expect(chef_run).to upgrade_package('openstack-ceilometer-api')
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::api' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the api package' do
expect(chef_run).to upgrade_package('openstack-ceilometer-api')
end
it 'starts api service' do
expect(chef_run).to start_service('openstack-ceilometer-api')
end
end
end

View File

@ -11,14 +11,6 @@ describe 'openstack-telemetry::api' do
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'creates the /var/cache/ceilometer directory' do
expect(chef_run).to create_directory('/var/cache/ceilometer').with(
user: 'ceilometer',
group: 'ceilometer',
mode: 0700
)
end
it 'installs the api package' do
expect(chef_run).to upgrade_package 'ceilometer-api'
end

View File

@ -8,8 +8,12 @@ describe 'openstack-telemetry::client' do
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
it 'installs packages' do
it do
expect(chef_run).to upgrade_package('python-ceilometerclient')
end
it do
expect(chef_run).to upgrade_package('python-gnocchiclient')
end
end
end

View File

@ -11,14 +11,6 @@ describe 'openstack-telemetry::collector' do
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'executes ceilometer dbsync' do
node.set['openstack']['telemetry']['dbsync_timeout'] = 36000
command = 'ceilometer-dbsync --config-file /etc/ceilometer/ceilometer.conf'
expect(chef_run).to run_execute(command).with(
timeout: 36000
)
end
it 'installs the collector package' do
expect(chef_run).to upgrade_package('openstack-ceilometer-collector')
end

View File

@ -1,21 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::collector' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs the collector package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer-collector'
end
it 'starts the collector service' do
expect(chef_run).to start_service 'openstack-ceilometer-collector'
end
end
end

View File

@ -11,24 +11,25 @@ describe 'openstack-telemetry::collector' do
include_context 'telemetry-stubs'
include_examples 'expect-runs-common-recipe'
it 'installs the collector package' do
it do
expect(chef_run).to upgrade_package 'ceilometer-collector'
end
it 'executes ceilometer dbsync' do
node.set['openstack']['telemetry']['dbsync_timeout'] = 36000
command = 'ceilometer-dbsync --config-file /etc/ceilometer/ceilometer.conf'
expect(chef_run).to run_execute(command).with(
timeout: 36000
it do
expect(chef_run).to run_execute(
'ceilometer-dbsync --config-file /etc/ceilometer/ceilometer.conf'
)
end
it 'installs python-mysqldb' do
it do
expect(chef_run).to upgrade_package('python-mysqldb')
end
it 'starts and enables the collector service' do
it do
expect(chef_run).to enable_service('ceilometer-collector')
end
it do
expect(chef_run).to start_service('ceilometer-collector')
end

View File

@ -1,26 +0,0 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::common' do
describe 'suse' do
let(:runner) { ChefSpec::SoloRunner.new(SUSE_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it 'installs mysql python packages by default' do
expect(chef_run).to upgrade_package 'python-mysql'
end
it 'installs postgresql python packages if explicitly told' do
node.set['openstack']['db']['telemetry']['service_type'] = 'postgresql'
expect(chef_run).to upgrade_package 'python-psycopg2'
end
it 'installs the common package' do
expect(chef_run).to upgrade_package 'openstack-ceilometer'
end
end
end

View File

@ -56,352 +56,77 @@ describe 'openstack-telemetry::common' do
)
end
it 'has default values' do
node.set['openstack']['telemetry']['syslog']['use'] = true
[%r{^os_auth_url = http://127.0.0.1:5000/v2.0$},
/^os_tenant_name = service$/,
/^os_password = ceilometer-pass$/,
/^os_username = ceilometer$/,
/^verbose = true$/,
/^debug = false$/,
%r{^log_config = /etc/openstack/logging.conf$},
/^glance_registry_host = 127.0.0.1$/,
/^periodic_interval = 600$/].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('DEFAULT', line)
end
it do
expect(chef_run).to render_config_file(file.name)
.with_section_content('DEFAULT', /^meter_dispatchers = gnocchi$/)
end
it 'has default sample_source set' do
expect(chef_run).to render_file(file.name).with_content(
/^sample_source = openstack$/)
end
it 'has default os_region_name set' do
expect(chef_run).to render_file(file.name).with_content(
/^os_region_name = RegionOne$/)
end
it 'has sample_source set' do
node.set['openstack']['telemetry']['sample_source'] = 'RegionOne'
expect(chef_run).to render_file(file.name).with_content(
/^sample_source = RegionOne$/)
end
context 'rabbit mq backend' do
before do
node.set['openstack']['mq']['telemetry']['service_type'] = 'rabbitmq'
end
it 'has default RPC/AMQP options set' do
[/^amqp_durable_queues=false$/,
/^amqp_auto_delete=false$/,
/^heartbeat_timeout_threshold=0$/,
/^heartbeat_rate=2$/].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
describe 'ha rabbit disabled' do
before do
node.override['openstack']['mq']['telemetry']['rabbit']['ha'] = false
end
it 'has default rabbit_* options set' do
[
/^rabbit_userid = guest$/,
/^rabbit_password = mq-pass$/,
/^rabbit_port = 5672$/,
/^rabbit_host = 127.0.0.1$/,
%r{^rabbit_virtual_host = /$},
/^rabbit_max_retries = 0$/,
/^rabbit_retry_interval = 1$/
].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
it 'does not have ha rabbit options set' do
[/^rabbit_hosts = /,
/^rabbit_ha_queues = /].each do |line|
expect(chef_run).not_to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
end
describe 'ha rabbit enabled' do
before do
node.override['openstack']['mq']['telemetry']['rabbit']['ha'] = true
end
it 'sets ha rabbit options correctly' do
[
/^rabbit_userid = guest$/,
/^rabbit_password = mq-pass$/,
/^rabbit_hosts = 1.1.1.1:5672,2.2.2.2:5672$/,
/^rabbit_ha_queues = True$/,
%r{^rabbit_virtual_host = /$}
].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
it 'does not have non-ha rabbit options set' do
[/^rabbit_host = /,
/^rabbit_port = /].each do |line|
expect(chef_run).not_to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
end
it 'does not have ssl config set' do
[/^rabbit_use_ssl=/,
/^kombu_ssl_version=/,
/^kombu_ssl_keyfile=/,
/^kombu_ssl_certfile=/,
/^kombu_ssl_ca_certs=/,
/^kombu_reconnect_delay=/,
/^kombu_reconnect_timeout=/].each do |line|
expect(chef_run).not_to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
it 'sets ssl config' do
node.set['openstack']['mq']['telemetry']['rabbit']['use_ssl'] = true
node.set['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_version'] = 'TLSv1.2'
node.set['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_keyfile'] = 'keyfile'
node.set['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_certfile'] = 'certfile'
node.set['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_ca_certs'] = 'certsfile'
node.set['openstack']['mq']['telemetry']['rabbit']['kombu_reconnect_delay'] = 123.123
node.set['openstack']['mq']['telemetry']['rabbit']['kombu_reconnect_timeout'] = 123
[/^rabbit_use_ssl=true/,
/^kombu_ssl_version=TLSv1.2$/,
/^kombu_ssl_keyfile=keyfile$/,
/^kombu_ssl_certfile=certfile$/,
/^kombu_ssl_ca_certs=certsfile$/,
/^kombu_reconnect_delay=123.123$/,
/^kombu_reconnect_timeout=123$/].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('oslo_messaging_rabbit', line)
end
end
end
context 'qpid mq backend' do
before do
node.set['openstack']['mq']['telemetry']['service_type'] = 'qpid'
node.set['openstack']['mq']['telemetry']['qpid']['username'] = 'guest'
end
it 'has default RPC/AMQP options set' do
[/^amqp_durable_queues=false$/,
/^amqp_auto_delete=false$/].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('oslo_messaging_qpid', line)
end
end
it 'has default qpid_* options set' do
[
/^qpid_hostname=127.0.0.1$/,
/^qpid_port=5672$/,
/^qpid_username=guest$/,
/^qpid_password=mq-pass$/,
/^qpid_sasl_mechanisms=$/,
/^qpid_reconnect=true$/,
/^qpid_reconnect_timeout=0$/,
/^qpid_reconnect_limit=0$/,
/^qpid_reconnect_interval_min=0$/,
/^qpid_reconnect_interval_max=0$/,
/^qpid_reconnect_interval_max=0$/,
/^qpid_reconnect_interval=0$/,
/^qpid_heartbeat=60$/,
/^qpid_protocol=tcp$/,
/^qpid_tcp_nodelay=true$/,
/^qpid_topology_version=1$/
].each do |line|
expect(chef_run).to render_config_file(file.name).with_section_content('oslo_messaging_qpid', line)
end
end
end
context 'database' do
it 'has connection set' do
expect(chef_run).to render_config_file(file.name)\
.with_section_content('database', /^#{Regexp.quote('connection=mysql://ceilometer:@127.0.0.1:3306/ceilometer?charset=utf8')}$/)
end
it 'has time_to_live set' do
expect(chef_run).to render_config_file(file.name)\
.with_section_content('database', /^time_to_live=1800$/)
end
end
context 'service_credentials attributes with default values' do
it 'sets cafile' do
expect(chef_run).not_to render_file(file.name).with_content(/^os_cacert = $/)
end
it 'sets insecure' do
expect(chef_run).to render_file(file.name).with_content(/^insecure = false$/)
end
end
context 'service_credentials attributes' do
it 'sets cafile' do
node.set['openstack']['telemetry']['service-credentials']['cafile'] = 'dir/to/path'
expect(chef_run).to render_file(file.name).with_content(%r{^os_cacert = dir/to/path$})
end
it 'sets insecure' do
node.set['openstack']['telemetry']['service-credentials']['insecure'] = true
expect(chef_run).to render_file(file.name).with_content(/^insecure = true$/)
end
end
context 'keystone authtoken attributes with default values' do
it 'sets memcached server(s)' do
expect(chef_run).not_to render_file(file.name).with_content(/^memcached_servers = $/)
end
it 'sets memcache security strategy' do
expect(chef_run).not_to render_file(file.name).with_content(/^memcache_security_strategy = $/)
end
it 'sets memcache secret key' do
expect(chef_run).not_to render_file(file.name).with_content(/^memcache_secret_key = $/)
end
it 'sets cafile' do
expect(chef_run).not_to render_file(file.name).with_content(/^cafile = $/)
end
it 'sets token hash algorithms' do
expect(chef_run).to render_file(file.name).with_content(/^hash_algorithms = md5$/)
end
end
context 'has keystone authtoken configuration' do
it 'has auth_uri' do
expect(chef_run).to render_file(file.name).with_content(
/^#{Regexp.quote('auth_uri = http://127.0.0.1:5000/v2.0')}$/)
end
it 'has identity_uri' do
expect(chef_run).to render_file(file.name).with_content(
/^#{Regexp.quote('identity_uri = http://127.0.0.1:35357/')}$/)
end
it 'has no auth_version' do
expect(chef_run).not_to render_file(file.name).with_content(
/^auth_version = v2.0$/)
end
it 'has admin_tenant_name' do
expect(chef_run).to render_file(file.name).with_content(
/^admin_tenant_name = service$/)
end
it 'has admin_user' do
expect(chef_run).to render_file(file.name).with_content(
/^admin_user = ceilometer$/)
end
it 'has admin_password' do
expect(chef_run).to render_file(file.name).with_content(
/^admin_password = ceilometer-pass$/)
end
it 'has signing_dir' do
expect(chef_run).to render_file(file.name).with_content(
/^#{Regexp.quote('signing_dir = /var/cache/ceilometer/api')}$/)
end
it 'sets memcached server(s)' do
node.set['openstack']['telemetry']['api']['auth']['memcached_servers'] = 'localhost:11211'
expect(chef_run).to render_file(file.name).with_content(/^memcached_servers = localhost:11211$/)
end
it 'sets memcache security strategy' do
node.set['openstack']['telemetry']['api']['auth']['memcache_security_strategy'] = 'MAC'
expect(chef_run).to render_file(file.name).with_content(/^memcache_security_strategy = MAC$/)
end
it 'sets memcache secret key' do
node.set['openstack']['telemetry']['api']['auth']['memcache_secret_key'] = '0123456789ABCDEF'
expect(chef_run).to render_file(file.name).with_content(/^memcache_secret_key = 0123456789ABCDEF$/)
end
it 'sets cafile' do
node.set['openstack']['telemetry']['api']['auth']['cafile'] = 'dir/to/path'
expect(chef_run).to render_file(file.name).with_content(%r{^cafile = dir/to/path$})
end
it 'sets insecure' do
node.set['openstack']['telemetry']['api']['auth']['insecure'] = true
expect(chef_run).to render_file(file.name).with_content(/^insecure = true$/)
end
it 'sets token hash algorithm' do
node.set['openstack']['telemetry']['api']['auth']['hash_algorithms'] = 'sha2'
expect(chef_run).to render_file(file.name).with_content(/^hash_algorithms = sha2$/)
end
end
context 'set correct os_auth_url' do
it 'set default value for os_auth_url' do
node.set['openstack']['telemetry']['api']['auth']['version'] = 'v3.0'
expect(chef_run).to render_config_file(file.name)\
.with_section_content('DEFAULT', %r{^os_auth_url = http://127.0.0.1:5000/v2.0$})
end
it 'set customized os_auth_url' do
node.set['openstack']['endpoints']['identity-internal']['scheme'] = 'https'
node.set['openstack']['endpoints']['identity-internal']['host'] = 'fakehost'
node.set['openstack']['endpoints']['identity-internal']['port'] = '8888'
node.set['openstack']['endpoints']['identity-internal']['path'] = '/v3'
expect(chef_run).to render_config_file(file.name)\
.with_section_content('DEFAULT', %r{^os_auth_url = https://fakehost:8888/v3$})
end
end
it 'has metering secret' do
r = /^metering_secret = metering_secret$/
expect(chef_run).to render_file(file.name).with_content(r)
end
it 'has hypervisor inspector' do
r = /^hypervisor_inspector = libvirt$/
expect(chef_run).to render_file(file.name).with_content(r)
end
it 'has bind_host set' do
node.set['openstack']['endpoints']['telemetry-api-bind']['host'] = '1.1.1.1'
expect(chef_run).to render_file(file.name).with_content(
/^host = 1.1.1.1$/)
end
it 'has bind_port set' do
node.set['openstack']['endpoints']['telemetry-api-bind']['port'] = '9999'
expect(chef_run).to render_file(file.name).with_content(/^port = 9999$/)
end
it 'has vmware section' do
node.set['openstack']['compute']['driver'] = 'vmwareapi.VMwareVCDriver'
it do
[
/^host_ip = $/,
/^host_username = $/,
/^host_password = vmware_secret_name$/,
/^task_poll_interval = 0.5$/,
/^api_retry_count = 10$/
/^username = ceilometer$/,
/^project_name = service$/,
/^auth_type = password$/,
/^region_name = RegionOne$/,
%r{auth_url = http://127\.0\.0\.1:5000/v2\.0},
/^password = ceilometer-pass$/
].each do |line|
expect(chef_run).to render_file(file.name).with_content(line)
expect(chef_run).to render_config_file(file.name)
.with_section_content('keystone_authtoken', line)
end
end
context 'notification' do
it 'has store_events option' do
expect(chef_run).to render_config_file(file.name)\
.with_section_content('notification', /^store_events = false$/)
it do
[
/^username = ceilometer$/,
/^project_name = service$/,
/^auth_type = password$/,
/^interface = internal$/,
/^region_name = RegionOne$/,
%r{auth_url = http://127\.0\.0\.1:5000/v2\.0},
/^password = ceilometer-pass$/
].each do |line|
expect(chef_run).to render_config_file(file.name)
.with_section_content('service_credentials', line)
end
end
it do
[
/^host = 127\.0\.0\.1$/,
/^port = 8777$/
].each do |line|
expect(chef_run).to render_config_file(file.name)
.with_section_content('api', line)
end
end
it do
[
%r{url = http://127\.0\.0\.1:8041},
/^filter_project = service$/
].each do |line|
expect(chef_run).to render_config_file(file.name)
.with_section_content('dispatcher_gnocchi', line)
end
end
it do
[
/^rabbit_userid = guest$/,
/^rabbit_password = mq-pass$/
].each do |line|
expect(chef_run).to render_config_file(file.name)
.with_section_content('oslo_messaging_rabbit', line)
end
end
it do
expect(chef_run).to render_config_file(file.name)
.with_section_content(
'database',
%r{^connection = mysql://ceilometer:ceilometer-dbpass@127\.0\.0\.1:3306/ceilometer\?charset=utf8$}
)
end
end
end
end

View File

@ -0,0 +1,125 @@
require_relative 'spec_helper'
describe 'openstack-telemetry::gnocchi_configure' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
describe 'gnocchi.conf' do
let(:file) { chef_run.template('/etc/gnocchi/gnocchi.conf') }
it do
expect(chef_run).to create_template(file.name).with(
user: 'gnocchi',
group: 'gnocchi',
mode: 0640
)
end
it do
[
/^username = gnocchi$/,
/^project_name = service$/,
/^auth_type = password$/,
/^region_name = RegionOne$/,
%r{auth_url = http://127\.0\.0\.1:5000/v2\.0},
/^password = gnocchi-pass$/
].each do |line|
expect(chef_run).to render_config_file(file.name)
.with_section_content('keystone_authtoken', line)
end
end
it do
[
/^host = 127\.0\.0\.1$/,
/^port = 8041$/
].each do |line|
expect(chef_run).to render_config_file(file.name)
.with_section_content('api', line)
end
end
it do
expect(chef_run).to render_config_file(file.name)
.with_section_content(
'database',
%r{^connection = mysql://gnocchi:gnocchi-dbpass@127\.0\.0\.1:3306/gnocchi\?charset=utf8$}
)
end
it do
expect(chef_run).to render_config_file(file.name)
.with_section_content(
'indexer',
%r{^url = mysql://gnocchi:gnocchi-dbpass@127\.0\.0\.1:3306/gnocchi\?charset=utf8$}
)
end
end
it do
expect(chef_run).to create_cookbook_file('/etc/ceilometer/gnocchi_resources.yaml')
.with(
source: 'gnocchi_resources.yaml',
owner: 'ceilometer',
group: 'ceilometer',
mode: 00640
)
end
it do
expect(chef_run).to create_cookbook_file('/etc/gnocchi/api-paste.ini')
.with(
source: 'api-paste.ini',
owner: 'gnocchi',
group: 'gnocchi',
mode: 00640
)
end
%w(tmp measure cache).each do |dir|
describe "gnocchi #{dir} dir" do
context 'file as storage backend' do
it do
expect(chef_run).to create_directory("/var/lib/gnocchi/#{dir}")
.with(
user: 'gnocchi',
group: 'gnocchi',
mode: 0750
)
end
end
context 'other storage backend' do
before do
node.set['openstack']['telemetry-metric']['conf']['storage']['driver'] = 'ceph'
end
it do
expect(chef_run).to_not create_directory("/var/lib/gnocchi/#{dir}")
.with(
user: 'gnocchi',
group: 'gnocchi',
mode: 0750
)
end
end
end
end
it do
expect(chef_run).to run_execute('gnocchi-upgrade')
.with(user: 'gnocchi')
end
%w(gnocchi-api gnocchi-metricd).each do |service|
it do
expect(chef_run).to enable_service(service)
end
it do
expect(chef_run).to start_service(service)
end
end
end
end

View File

@ -0,0 +1,21 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-telemetry::gnocchi_install' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) }
include_context 'telemetry-stubs'
it do
expect(chef_run).to upgrade_package 'gnocchi-api'
end
it do
expect(chef_run).to upgrade_package 'gnocchi-metricd'
end
end
end

View File

@ -10,157 +10,80 @@ describe 'openstack-telemetry::identity_registration' do
include_context 'telemetry-stubs'
it 'registers service tenant' do
expect(chef_run).to create_tenant_openstack_identity_register(
'Register Service Tenant'
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
tenant_name: 'service',
tenant_description: 'Service Tenant'
)
end
%w(telemetry telemetry-metric).each do |telemetry_service|
case telemetry_service
when 'telemetry'
service_name = 'ceilometer'
service_type = 'metering'
user_pass = 'ceilometer-pass'
port = 8777
when 'telemetry-metric'
service_name = 'gnocchi'
service_type = 'metric'
user_pass = 'gnocchi-pass'
port = 8041
end
it 'registers service user' do
expect(chef_run).to create_user_openstack_identity_register(
'Register Service User'
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
tenant_name: 'service',
user_name: 'ceilometer',
user_pass: 'ceilometer-pass'
)
end
it 'grants admin role to service user for service tenant' do
expect(chef_run).to grant_role_openstack_identity_register(
"Grant 'admin' Role to Service User for Service Tenant"
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
tenant_name: 'service',
user_name: 'ceilometer',
role_name: 'admin'
)
end
it 'registers metering service' do
expect(chef_run).to create_service_openstack_identity_register(
'Register Metering Service'
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_name: 'ceilometer',
service_type: 'metering'
)
end
context 'registers metering endpoint' do
it 'with default values' do
expect(chef_run).to create_endpoint_openstack_identity_register(
'Register Metering Endpoint'
it do
expect(chef_run).to create_tenant_openstack_identity_register(
"Register Service Tenant for #{telemetry_service}"
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_type: 'metering',
endpoint_region: 'RegionOne',
endpoint_adminurl: 'http://127.0.0.1:8777',
endpoint_internalurl: 'http://127.0.0.1:8777',
endpoint_publicurl: 'http://127.0.0.1:8777'
tenant_name: 'service',
tenant_description: 'Service Tenant'
)
end
it 'with different admin URL' do
admin_url = 'https://admin.host:123/admin_path'
general_url = 'http://general.host:456/general_path'
# Set general endpoint
node.set['openstack']['endpoints']['telemetry-api']['uri'] = general_url
# Set the admin endpoint override
node.set['openstack']['endpoints']['admin']['telemetry-api']['uri'] = admin_url
expect(chef_run).to create_endpoint_openstack_identity_register(
'Register Metering Endpoint'
it do
expect(chef_run).to create_user_openstack_identity_register(
"Register #{service_name} User"
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_type: 'metering',
endpoint_region: 'RegionOne',
endpoint_adminurl: admin_url,
endpoint_internalurl: general_url,
endpoint_publicurl: general_url
tenant_name: 'service',
user_name: service_name,
user_pass: user_pass
)
end
it 'with different public URL' do
general_url = 'http://general.host:456/general_path'
public_url = 'https://public.host:789/public_path'
# Set general endpoint
node.set['openstack']['endpoints']['telemetry-api']['uri'] = general_url
# Set the public endpoint override
node.set['openstack']['endpoints']['public']['telemetry-api']['uri'] = public_url
expect(chef_run).to create_endpoint_openstack_identity_register(
'Register Metering Endpoint'
it do
expect(chef_run).to grant_role_openstack_identity_register(
"Grant 'admin' Role to #{service_name} User for Service Tenant"
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_type: 'metering',
endpoint_region: 'RegionOne',
endpoint_adminurl: general_url,
endpoint_internalurl: general_url,
endpoint_publicurl: public_url
tenant_name: 'service',
user_name: service_name,
role_name: 'admin'
)
end
it 'with different internal URL' do
general_url = 'http://general.host:456/general_path'
internal_url = 'http://internal.host:456/internal_path'
# Set general endpoint
node.set['openstack']['endpoints']['telemetry-api']['uri'] = general_url
# Set the internal endpoint override
node.set['openstack']['endpoints']['internal']['telemetry-api']['uri'] = internal_url
expect(chef_run).to create_endpoint_openstack_identity_register(
'Register Metering Endpoint'
it do
expect(chef_run).to create_service_openstack_identity_register(
"Register Service #{telemetry_service}"
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_type: 'metering',
endpoint_region: 'RegionOne',
endpoint_adminurl: general_url,
endpoint_internalurl: internal_url,
endpoint_publicurl: general_url
service_name: service_name,
service_type: service_type
)
end
it 'with all different URLs' do
admin_url = 'https://admin.host:123/admin_path'
internal_url = 'http://internal.host:456/internal_path'
public_url = 'https://public.host:789/public_path'
node.set['openstack']['endpoints']['admin']['telemetry-api']['uri'] = admin_url
node.set['openstack']['endpoints']['internal']['telemetry-api']['uri'] = internal_url
node.set['openstack']['endpoints']['public']['telemetry-api']['uri'] = public_url
expect(chef_run).to create_endpoint_openstack_identity_register(
'Register Metering Endpoint'
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_type: 'metering',
endpoint_region: 'RegionOne',
endpoint_adminurl: admin_url,
endpoint_internalurl: internal_url,
endpoint_publicurl: public_url
)
end
it 'with custom region override' do
node.set['openstack']['telemetry']['region'] = 'meteringRegion'
expect(chef_run).to create_endpoint_openstack_identity_register(
'Register Metering Endpoint'
).with(endpoint_region: 'meteringRegion')
context "registers #{service_type} endpoint" do
it do
expect(chef_run).to create_endpoint_openstack_identity_register(
"Register #{service_type} Endpoint"
).with(
auth_uri: 'http://127.0.0.1:35357/v2.0',
bootstrap_token: 'bootstrap-token',
service_type: service_type,
endpoint_region: 'RegionOne',
endpoint_adminurl: "http://127.0.0.1:#{port}",
endpoint_internalurl: "http://127.0.0.1:#{port}",
endpoint_publicurl: "http://127.0.0.1:#{port}"
)
end
end
end
end

View File

@ -7,11 +7,6 @@ ChefSpec::Coverage.start! { add_filter 'openstack-telemetry' }
require 'chef/application'
LOG_LEVEL = :fatal
SUSE_OPTS = {
platform: 'suse',
version: '11.3',
log_level: ::LOG_LEVEL
}
REDHAT_OPTS = {
platform: 'redhat',
version: '7.1',
@ -29,23 +24,23 @@ shared_context 'telemetry-stubs' do
.and_return '1.1.1.1:5672,2.2.2.2:5672'
allow_any_instance_of(Chef::Recipe).to receive(:memcached_servers).and_return([])
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('db', anything)
.and_return('')
.with('db', 'ceilometer')
.and_return('ceilometer-dbpass')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('service', 'openstack-ceilometer')
.with('db', 'gnocchi')
.and_return('gnocchi-dbpass')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('service', 'openstack-telemetry')
.and_return('ceilometer-pass')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('service', 'openstack-telemetry-metric')
.and_return('gnocchi-pass')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('user', 'guest')
.and_return('mq-pass')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('token', 'openstack_identity_bootstrap_token')
.and_return('bootstrap-token')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('token', 'openstack_metering_secret')
.and_return('metering_secret')
allow_any_instance_of(Chef::Recipe).to receive(:get_password)
.with('token', 'openstack_vmware_secret_name')
.and_return 'vmware_secret_name'
allow(Chef::Application).to receive(:fatal!)
end
end

View File

@ -1,198 +0,0 @@
[DEFAULT]
os_auth_url = <%= @identity_endpoint %>
os_tenant_name = <%= @service_tenant_name %>
os_password = <%= @service_pass %>
os_username = <%= @service_user %>
policy_file = /etc/ceilometer/policy.json
verbose = <%= node["openstack"]["telemetry"]["verbose"] %>
debug = <%= node["openstack"]["telemetry"]["debug"] %>
<% if node["openstack"]["telemetry"]["hypervisor_inspector"] %>
hypervisor_inspector = <%= node["openstack"]["telemetry"]["hypervisor_inspector"] %>
<% end %>
<% if node["openstack"]["telemetry"]["syslog"]["use"] %>
log_config = /etc/openstack/logging.conf
<% end %>
sample_source = <%= node["openstack"]["telemetry"]["sample_source"] %>
##### AMQP #####
notification_topics = notifications,glance_notifications
glance_registry_host = <%= @image_endpoint.host %>
periodic_interval = <%= node["openstack"]["telemetry"]["periodic_interval"] %>
[database]
connection=<%= @database_connection %>
time_to_live=<%= node["openstack"]["telemetry"]["database"]["time_to_live"] %>
[api]
host = <%= @api_bind_host %>
port = <%= @api_bind_port %>
[keystone_authtoken]
auth_uri = <%= @auth_uri %>
identity_uri = <%= @identity_uri %>
<% if node['openstack']['telemetry']['api']['auth']['version'] != 'v2.0' %>
auth_version = <%= node['openstack']['telemetry']['api']['auth']['version'] %>
<% end %>
admin_tenant_name = <%= @service_tenant_name %>
admin_user = <%= @service_user %>
admin_password = <%= @service_pass %>
signing_dir = <%= node["openstack"]["telemetry"]["api"]["auth"]["cache_dir"] %>
# A list of memcached server(s) to use for caching.
<% if node['openstack']['telemetry']['api']['auth']['memcached_servers'] %>
memcached_servers = <%= node['openstack']['telemetry']['api']['auth']['memcached_servers'] %>
<% end %>
# Whether token data should be authenticated or authenticated and encrypted. Acceptable values are MAC or ENCRYPT.
<% if node['openstack']['telemetry']['api']['auth']['memcache_security_strategy'] %>
memcache_security_strategy = <%= node['openstack']['telemetry']['api']['auth']['memcache_security_strategy'] %>
<% end %>
# This string is used for key derivation.
<% if node['openstack']['telemetry']['api']['auth']['memcache_secret_key'] %>
memcache_secret_key = <%= node['openstack']['telemetry']['api']['auth']['memcache_secret_key'] %>
<% end %>
# Hash algorithms to use for hashing PKI tokens.
hash_algorithms = <%= node['openstack']['telemetry']['api']['auth']['hash_algorithms'] %>
# A PEM encoded Certificate Authority to use when verifying HTTPs connections.
<% if node['openstack']['telemetry']['api']['auth']['cafile'] %>
cafile = <%= node['openstack']['telemetry']['api']['auth']['cafile'] %>
<% end %>
# Verify HTTPS connections. (boolean value)
insecure = <%= node['openstack']['telemetry']['api']['auth']['insecure'] %>
<% if @mq_service_type == "qpid" %>
[oslo_messaging_qpid]
#
# From oslo.messaging
#
# Use durable queues in AMQP. (boolean value)
amqp_durable_queues=<%= node["openstack"]["mq"]["telemetry"]["durable_queues"] %>
# Auto-delete queues in AMQP. (boolean value)
amqp_auto_delete=<%= node["openstack"]["mq"]["telemetry"]["auto_delete"] %>
##### QPID #####
rpc_backend=ceilometer.openstack.common.rpc.impl_qpid
qpid_hostname=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["host"] %>
qpid_port=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["port"] %>
qpid_password=<%= @mq_password %>
qpid_username=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["username"] %>
qpid_sasl_mechanisms=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["sasl_mechanisms"] %>
qpid_reconnect=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["reconnect"] %>
qpid_reconnect_timeout=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["reconnect_timeout"] %>
qpid_reconnect_limit=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["reconnect_limit"] %>
qpid_reconnect_interval_min=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["reconnect_interval_min"] %>
qpid_reconnect_interval_max=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["reconnect_interval_max"] %>
qpid_reconnect_interval=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["reconnect_interval"] %>
qpid_heartbeat=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["heartbeat"] %>
# qpid protocol. default 'tcp'. set to 'ssl' to enable SSL
qpid_protocol=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["protocol"] %>
qpid_tcp_nodelay=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["tcp_nodelay"] %>
qpid_topology_version=<%= node["openstack"]["mq"]["telemetry"]["qpid"]["topology_version"] %>
<% end %>
<% if @mq_service_type == "rabbitmq" %>
[oslo_messaging_rabbit]
#
# From oslo.messaging
#
# Number of seconds after which the Rabbit broker is considered down if heartbeat's keep-alive fails (0 disable the heartbeat)
heartbeat_timeout_threshold=<%= node['openstack']['mq']['telemetry']['rabbit']['heartbeat_timeout_threshold'] %>
# How often times during the heartbeat_timeout_threshold we check the heartbeat
heartbeat_rate=<%= node['openstack']['mq']['telemetry']['rabbit']['heartbeat_rate'] %>
# Use durable queues in AMQP. (boolean value)
amqp_durable_queues=<%= node["openstack"]["mq"]["telemetry"]["durable_queues"] %>
# Auto-delete queues in AMQP. (boolean value)
amqp_auto_delete=<%= node["openstack"]["mq"]["telemetry"]["auto_delete"] %>
<% if node['openstack']['mq']['telemetry']['rabbit']['use_ssl'] -%>
# Connect over SSL for RabbitMQ. (boolean value)
rabbit_use_ssl=true
<% if node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_version'] -%>
# SSL version to use (valid only if SSL enabled). valid values
# are TLSv1 and SSLv23. SSLv2 and SSLv3 may be available on
# some distributions. (string value)
kombu_ssl_version=<%= node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_version'] %>
<% end -%>
<% if node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_keyfile'] -%>
# SSL key file (valid only if SSL enabled)
kombu_ssl_keyfile=<%= node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_keyfile'] %>
<% end -%>
<% if node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_certfile'] -%>
# SSL cert file (valid only if SSL enabled)
kombu_ssl_certfile=<%= node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_certfile'] %>
<% end -%>
<% if node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_ca_certs'] -%>
# SSL certification authority file (valid only if SSL enabled)
kombu_ssl_ca_certs=<%= node['openstack']['mq']['telemetry']['rabbit']['kombu_ssl_ca_certs'] %>
<% end -%>
# How long to wait before reconnecting in response to an AMQP consumer cancel notification
kombu_reconnect_delay=<%= node['openstack']['mq']['telemetry']['rabbit']['kombu_reconnect_delay'] %>
# How long to wait before considering a reconnect attempt to have failed.
# This value should not be longer than rpc_response_timeout
kombu_reconnect_timeout=<%= node['openstack']['mq']['telemetry']['rabbit']['kombu_reconnect_timeout'] %>
<% end -%>
##### RABBITMQ #####
rabbit_userid = <%= node["openstack"]["mq"]["telemetry"]["rabbit"]["userid"] %>
rabbit_password = <%= @mq_password %>
<% if node["openstack"]["mq"]["telemetry"]["rabbit"]["ha"] %>
rabbit_hosts = <%= @rabbit_hosts %>
rabbit_ha_queues = True
<% else %>
rabbit_port = <%= node["openstack"]["mq"]["telemetry"]["rabbit"]["port"] %>
rabbit_host = <%= node["openstack"]["mq"]["telemetry"]["rabbit"]["host"] %>
<% end %>
rabbit_virtual_host = <%= node["openstack"]["mq"]["telemetry"]["rabbit"]["vhost"] %>
rpc_backend = ceilometer.openstack.common.rpc.impl_kombu
# Maximum retries with trying to connect to RabbitMQ
# (the default of 0 implies an infinite retry count)
rabbit_max_retries = <%= node["openstack"]["mq"]["telemetry"]["rabbit"]["rabbit_max_retries"] %>
# RabbitMQ connection retry interval
rabbit_retry_interval = <%= node["openstack"]["mq"]["telemetry"]["rabbit"]["rabbit_retry_interval"] %>
<% end %>
[publisher_rpc]
metering_secret = <%= @metering_secret %>
<% if node["openstack"]["telemetry"]["hypervisor_inspector"] == 'vsphere'%>
[vmware]
host_ip = <%= node['openstack']['compute']['vmware']['host_ip'] %>
host_username = <%= node['openstack']['compute']['vmware']['host_username'] %>
host_password = <%= @vmware_host_pass %>
task_poll_interval = <%= node['openstack']['compute']['vmware']['task_poll_interval'] %>
api_retry_count = <%= node['openstack']['compute']['vmware']['api_retry_count'] %>
<% if node['openstack']['compute']['vmware']['wsdl_location'] %>
wsdl_location = <%= node['openstack']['compute']['vmware']['wsdl_location'] %>
<% end %>
<% end %>
[service_credentials]
os_region_name = <%= node['openstack']['telemetry']['region'] %>
# A PEM encoded Certificate Authority to use when verifying HTTPs connections. (for service polling authentication)
<% if node['openstack']['telemetry']['service-credentials']['cafile'] %>
os_cacert = <%= node['openstack']['telemetry']['service-credentials']['cafile'] %>
<% end %>
# Verify HTTPS connections. (boolean value, for service polling authentication)
insecure = <%= node['openstack']['telemetry']['service-credentials']['insecure'] %>
[notification]
store_events = <%= node['openstack']['telemetry']['notification']['store_events'] %>