Add lma_collector::collectd::openstack

This adds an lma_collector::collectd::openstack define that, when
declared, configures collectd to collect statistics from an OpenStack
service endpoint.

Usage example:

lma_collector::collectd::openstack { 'nova':
  keystone_url => 'http://example.com/keystone'
}

Works for 'nova', 'cinder', 'glance', 'keystone', and 'neutron'.

Change-Id: I200a1b3de3b2385292e7b17489621382dc2b2e62
This commit is contained in:
Éric Lemoine 2016-01-07 17:31:00 +01:00
parent b7b0857d56
commit b6c3c1d62d
4 changed files with 173 additions and 0 deletions

View File

@ -0,0 +1,58 @@
# Copyright 2016 Mirantis, Inc.
#
# 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.
#
define lma_collector::collectd::openstack (
$user,
$password,
$tenant,
$keystone_url,
$timeout = undef,
$pacemaker_master_resource = undef,
) {
include lma_collector::params
include lma_collector::collectd::python_openstack_base
$service = $title
$supported_services = ['nova', 'cinder', 'glance', 'keystone', 'neutron']
if ! member($supported_services, $service) {
fail("service '${service}' is not supported")
}
$real_timeout = $timeout ? {
undef => $lma_collector::params::openstack_client_timeout,
default => $timeout,
}
$config = {
'Username' => "\"${user}\"",
'Password' => "\"${password}\"",
'Tenant' => "\"${tenant}\"",
'KeystoneUrl' => "\"${keystone_url}\"",
'Timeout' => "\"${real_timeout}\"",
}
if $pacemaker_master_resource {
$real_config = merge($config, {'DependsOnResource' => "\"${pacemaker_master_resource}\""})
} else {
$real_config = $config
}
lma_collector::collectd::python { "openstack_${title}":
config => $real_config,
}
}

View File

@ -0,0 +1,39 @@
# Copyright 2016 Mirantis, Inc.
#
# 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.
#
class lma_collector::collectd::python_openstack_base {
include collectd::params
include lma_collector::collectd::python_base
$modulepath = $lma_collector::collectd::python_base::modulepath
# The collectd module does not provide a way to add a Python file to Python
# directory without declaring a corresponding module in the collectd Python
# configuration file. For that reason we need to use a "file" resource and
# notify the "collectd" service resource ourselves. The "collectd" service
# resource is private to the "collectd" module, but we have no choice.
file { 'openstack.script':
ensure => 'present',
path => "${modulepath}/openstack.py",
owner => 'root',
group => $collectd::params::root_group,
mode => '0640',
source => 'puppet:///modules/lma_collector/collectd/openstack.py',
require => Class['lma_collector::collectd::python_base'],
notify => Service['collectd'],
}
}

View File

@ -0,0 +1,31 @@
# Copyright 2016 Mirantis, Inc.
#
# 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.
require 'spec_helper'
describe 'lma_collector::collectd::python_openstack_base' do
let(:facts) do
{:kernel => 'Linux', :operatingsystem => 'Ubuntu',
:osfamily => 'Debian', :concat_basedir => '/foo'}
end
describe 'with defaults' do
it { is_expected.to contain_file('openstack.script').with({
:ensure => 'present',
:path => '/usr/lib/collectd/openstack.py',
:owner => 'root',
:group => 'root',
:mode => '0640',
}) }
end
end

View File

@ -0,0 +1,45 @@
# Copyright 2016 Mirantis, Inc.
#
# 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.
require 'spec_helper'
describe 'lma_collector::collectd::openstack' do
let(:title) { :nova }
let(:facts) do
{:kernel => 'Linux', :operatingsystem => 'Ubuntu',
:osfamily => 'Debian', :concat_basedir => '/foo'}
end
describe 'with required params' do
let(:title) { :nova }
let(:params) {{:user => "user", :password => "password", :tenant => "tenant",
:keystone_url => "http://example.com/keystone"}}
it { is_expected.to contain_lma_collector__collectd__python('openstack_nova') \
.with_config({"Username" => '"user"', "Password" => '"password"',
"Tenant" => '"tenant"',
"KeystoneUrl" => '"http://example.com/keystone"',
"Timeout" => '"5"'}) }
end
describe 'with required and optional params' do
let(:title) { :nova }
let(:params) {{:user => "user", :password => "password", :tenant => "tenant",
:keystone_url => "http://example.com/keystone",
:timeout => 10, :pacemaker_master_resource => "vip__management"}}
it { is_expected.to contain_lma_collector__collectd__python('openstack_nova') \
.with_config({"Username" => '"user"', "Password" => '"password"',
"Tenant" => '"tenant"',
"KeystoneUrl" => '"http://example.com/keystone"',
"Timeout" => '"10"', "DependsOnResource" => '"vip__management"'}) }
end
end