From bfbe779b17a9d53b26f1d246d35d44b29637f0ce Mon Sep 17 00:00:00 2001 From: Emilien Macchi Date: Tue, 4 Nov 2014 23:48:31 +0100 Subject: [PATCH] Implement Service Validation Service Validations aims to be used in all OpenStack modules to validate that services are actually running. Example in nova::api where we could validate the Nova API is really working. If it's the case, a Puppet Anchor will be created. This Anchor could be consummed by external tools to validate a deployment workflow and improve the orchestration during an OpenStack deployment. Change-Id: Ia74677b1402c8f872183f873cf9cb73702253874 --- README.md | 42 +++++++++++ manifests/service_validation.pp | 69 ++++++++++++++++++ .../openstacklib_service_validation_spec.rb | 73 +++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 manifests/service_validation.pp create mode 100644 spec/defines/openstacklib_service_validation_spec.rb diff --git a/README.md b/README.md index 79fc5d69..a56c9eab 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,48 @@ array or string; optional; default to undef Privileges given to the database user; string or array of strings; optional; default to 'ALL' + +#### Defined type: openstacklib::service_validation + +The service_validation resource is a library resource that can be used by nova, cinder, +ceilometer, etc., to validate that a resource is actually up and running. + +For example, in nova::api you might declare: + +``` +::openstacklib::service_validation { 'nova-api': + command => 'nova list', + } +``` +This defined resource creates an exec-anchor pair where the anchor depends upon +the successful exec run. + +** Parameters for openstacklib::service_validation: ** + +#####`command` +Command to run for validating the service; +string; required + +#####`service_name` +The name of the service to validate; +string; optional; default to the $title of the resource, i.e. 'nova-api' + +#####`path` +The path of the command to validate the service; +string; optional; default to '/usr/bin:/bin:/usr/sbin:/sbin' + +#####`provider` +The provider to use for the exec command; +string; optional; default to 'shell' + +#####`tries` +Number of times to retry validation; +string; optional; default to '10' + +#####`try_sleep` +Number of seconds between validation attempts; +string; optional; default to '2' + ### Types and Providers #### Aviator diff --git a/manifests/service_validation.pp b/manifests/service_validation.pp new file mode 100644 index 00000000..8a9ccd05 --- /dev/null +++ b/manifests/service_validation.pp @@ -0,0 +1,69 @@ +# +# Copyright (C) 2014 eNovance SAS +# +# Author: Emilien Macchi +# +# 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. +# +# == Definition: openstacklib::service_validation +# +# This resource does service validation for an OpenStack service. +# +# == Parameters: +# +# [*command*] +# Command to run for validating the service; +# string; required +# +# [*service_name*] +# The name of the service to validate; +# string; optional; default to the $title of the resource, i.e. 'nova-api' +# +# [*path*] +# The path of the command to validate the service; +# string; optional; default to '/usr/bin:/bin:/usr/sbin:/sbin' +# +# [*provider*] +# The provider to use for the exec command; +# string; optional; default to 'shell' +# +# [*tries*] +# Number of times to retry validation; +# string; optional; default to '10' +# +# [*try_sleep*] +# Number of seconds between validation attempts; +# string; optional; default to '2' +# +define openstacklib::service_validation( + $command, + $service_name = $name, + $path = '/usr/bin:/bin:/usr/sbin:/sbin', + $provider = shell, + $tries = '10', + $try_sleep = '2', +) { + + exec { "execute ${service_name} validation": + path => $path, + provider => $provider, + command => $command, + tries => $tries, + try_sleep => $try_sleep, + } + + anchor { "create ${service_name} anchor": + require => Exec["execute ${service_name} validation"], + } + +} diff --git a/spec/defines/openstacklib_service_validation_spec.rb b/spec/defines/openstacklib_service_validation_spec.rb new file mode 100644 index 00000000..17e4389a --- /dev/null +++ b/spec/defines/openstacklib_service_validation_spec.rb @@ -0,0 +1,73 @@ +# +# Copyright (C) 2014 eNovance SAS +# +# Author: Emilien Macchi +# +# 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 'openstacklib::service_validation' do + + let (:title) { 'nova-api' } + + let :required_params do + { :command => 'nova list' } + end + + shared_examples 'openstacklib::service_validation examples' do + + context 'with only required parameters' do + let :params do + required_params + end + + it { should contain_exec("execute #{title} validation").with( + :path => '/usr/bin:/bin:/usr/sbin:/sbin', + :provider => 'shell', + :command => 'nova list', + :tries => '10', + :try_sleep => '2', + )} + + it { should contain_anchor("create #{title} anchor").with( + :require => "Exec[execute #{title} validation]", + )} + + end + + context 'when omitting a required parameter command' do + let :params do + required_params.delete(:command) + end + it { expect { should raise_error(Puppet::Error) } } + end + + end + + context 'on a Debian osfamily' do + let :facts do + { :osfamily => "Debian" } + end + + include_examples 'openstacklib::service_validation examples' + end + + context 'on a RedHat osfamily' do + let :facts do + { :osfamily => 'RedHat' } + end + + include_examples 'openstacklib::service_validation examples' + end +end