]> review.fuel-infra Code Review - puppet-modules/puppet-ceilometer.git/commitdiff
WSGI: make it work, and test it with acceptance
authorEmilien Macchi <emilien@redhat.com>
Wed, 5 Aug 2015 02:36:47 +0000 (22:36 -0400)
committerEmilien Macchi <emilien@redhat.com>
Thu, 13 Aug 2015 17:31:59 +0000 (13:31 -0400)
* Finalize httpd service name support in API class following
  puppet-keystone model.
* Implement unit tests.
* Implement separated acceptance tests that deploy Ceilometer API in
  WSGI.

This patch aims to finalize and validate we can deploy Ceilometer API in
WSGI with puppet-ceilometer.
Also that we can update from eventlet to WSGI (it's tested in our beaker jobs).

Closes-bug: #1481532
Change-Id: I3695acf5522457837e079c36d68a0e35dbf6b72c

manifests/api.pp
manifests/params.pp
spec/acceptance/ceilometer_wsgi_apache_spec.rb [new file with mode: 0644]
spec/classes/ceilometer_api_spec.rb
spec/classes/ceilometer_wsgi_apache_spec.rb

index b0bbde65060888dcb8af36b87779d7dd5eff55f5..cc67d6f989e038a61cad9da2e0e5d9f4484dfa18 100644 (file)
 #    (optional) ensure state for package.
 #    Defaults to 'present'
 #
+# [*service_name*]
+#   (optional) Name of the service that will be providing the
+#   server functionality of ceilometer-api.
+#   If the value is 'httpd', this means ceilometer-api will be a web
+#   service, and you must use another class to configure that
+#   web service. For example, use class { 'ceilometer::wsgi::apache'...}
+#   to make keystone be a web app using apache mod_wsgi.
+#   Defaults to '$::ceilometer::params::api_service_name'
+#
 class ceilometer::api (
   $manage_service             = true,
   $enabled                    = true,
@@ -75,22 +84,23 @@ class ceilometer::api (
   $keystone_identity_uri      = false,
   $host                       = '0.0.0.0',
   $port                       = '8777',
+  $service_name               = $::ceilometer::params::api_service_name,
   # DEPRECATED PARAMETERS
   $keystone_host              = '127.0.0.1',
   $keystone_port              = '35357',
   $keystone_auth_admin_prefix = false,
   $keystone_protocol          = 'http',
-) {
+) inherits ceilometer::params {
 
   include ::ceilometer::params
   include ::ceilometer::policy
 
   validate_string($keystone_password)
 
-  Ceilometer_config<||> ~> Service['ceilometer-api']
-  Class['ceilometer::policy'] ~> Service['ceilometer-api']
+  Ceilometer_config<||> ~> Service[$service_name]
+  Class['ceilometer::policy'] ~> Service[$service_name]
 
-  Package['ceilometer-api'] -> Service['ceilometer-api']
+  Package['ceilometer-api'] -> Service[$service_name]
   Package['ceilometer-api'] -> Class['ceilometer::policy']
   package { 'ceilometer-api':
     ensure => $package_ensure,
@@ -105,17 +115,30 @@ class ceilometer::api (
       $service_ensure = 'stopped'
     }
   }
-
-  Package['ceilometer-common'] -> Service['ceilometer-api']
-  service { 'ceilometer-api':
-    ensure     => $service_ensure,
-    name       => $::ceilometer::params::api_service_name,
-    enable     => $enabled,
-    hasstatus  => true,
-    hasrestart => true,
-    require    => Class['ceilometer::db'],
-    subscribe  => Exec['ceilometer-dbsync'],
-    tag        => 'ceilometer-service',
+  Package['ceilometer-common'] -> Service[$service_name]
+
+  if $service_name == $::ceilometer::params::api_service_name {
+    service { 'ceilometer-api':
+      ensure     => $service_ensure,
+      name       => $::ceilometer::params::api_service_name,
+      enable     => $enabled,
+      hasstatus  => true,
+      hasrestart => true,
+      require    => Class['ceilometer::db'],
+      subscribe  => Exec['ceilometer-dbsync'],
+      tag        => 'ceilometer-service',
+    }
+  } elsif $service_name == 'httpd' {
+    include ::apache::params
+    service { 'ceilometer-api':
+      ensure => 'stopped',
+      name   => $::ceilometer::params::api_service_name,
+      enable => false,
+      tag    => 'ceilometer-service',
+    }
+    Class['ceilometer::db'] -> Service[$service_name]
+  } else {
+    fail('Invalid service_name. Either keystone/openstack-ceilometer-api for running as a standalone service, or httpd for being run by a httpd server')
   }
 
   ceilometer_config {
index 524c2f902abe154f9ee6cac1652b6c5582968cdc..a1923230bb7031e7d9829f9509f93172edba6822 100644 (file)
@@ -68,7 +68,7 @@ class ceilometer::params {
         }
       }
       $ceilometer_wsgi_script_path    = '/usr/lib/cgi-bin/ceilometer'
-      $ceilometer_wsgi_script_source  = '/usr/share/ceilometer/app.wsgi'
+      $ceilometer_wsgi_script_source  = '/usr/lib/python2.7/dist-packages/ceilometer/api/app.wsgi'
     }
     default: {
       fail("Unsupported osfamily: ${::osfamily} operatingsystem: \
diff --git a/spec/acceptance/ceilometer_wsgi_apache_spec.rb b/spec/acceptance/ceilometer_wsgi_apache_spec.rb
new file mode 100644 (file)
index 0000000..d731de2
--- /dev/null
@@ -0,0 +1,133 @@
+require 'spec_helper_acceptance'
+
+describe 'ceilometer with mysql' do
+
+  context 'default parameters' do
+
+    it 'should work with no errors' do
+      pp= <<-EOS
+      Exec { logoutput => 'on_failure' }
+
+      # Common resources
+      case $::osfamily {
+        'Debian': {
+          include ::apt
+          class { '::openstack_extras::repo::debian::ubuntu':
+            release         => 'kilo',
+            package_require => true,
+          }
+          $package_provider = 'apt'
+        }
+        'RedHat': {
+          class { '::openstack_extras::repo::redhat::redhat':
+            release => 'kilo',
+          }
+          package { 'openstack-selinux': ensure => 'latest' }
+          $package_provider = 'yum'
+        }
+        default: {
+          fail("Unsupported osfamily (${::osfamily})")
+        }
+      }
+
+      class { '::mysql::server': }
+
+      class { '::rabbitmq':
+        delete_guest_user => true,
+        package_provider  => $package_provider,
+      }
+
+      rabbitmq_vhost { '/':
+        provider => 'rabbitmqctl',
+        require  => Class['rabbitmq'],
+      }
+
+      rabbitmq_user { 'ceilometer':
+        admin    => true,
+        password => 'an_even_bigger_secret',
+        provider => 'rabbitmqctl',
+        require  => Class['rabbitmq'],
+      }
+
+      rabbitmq_user_permissions { 'ceilometer@/':
+        configure_permission => '.*',
+        write_permission     => '.*',
+        read_permission      => '.*',
+        provider             => 'rabbitmqctl',
+        require              => Class['rabbitmq'],
+      }
+
+
+      # Keystone resources, needed by Ceilometer to run
+      class { '::keystone::db::mysql':
+        password => 'keystone',
+      }
+      class { '::keystone':
+        verbose             => true,
+        debug               => true,
+        database_connection => 'mysql://keystone:keystone@127.0.0.1/keystone',
+        admin_token         => 'admin_token',
+        enabled             => true,
+      }
+      class { '::keystone::roles::admin':
+        email    => 'test@example.tld',
+        password => 'a_big_secret',
+      }
+      class { '::keystone::endpoint':
+        public_url => "https://${::fqdn}:5000/",
+        admin_url  => "https://${::fqdn}:35357/",
+      }
+
+      # Ceilometer resources
+      class { '::ceilometer':
+        metering_secret     => 'secrete',
+        rabbit_userid       => 'ceilometer',
+        rabbit_password     => 'an_even_bigger_secret',
+        rabbit_host         => '127.0.0.1',
+      }
+      # Until https://review.openstack.org/177593 is merged:
+      Package<| title == 'python-mysqldb' |> -> Class['ceilometer::db']
+      class { '::ceilometer::db::mysql':
+        password => 'a_big_secret',
+      }
+      class { '::ceilometer::db':
+        database_connection => 'mysql://ceilometer:a_big_secret@127.0.0.1/ceilometer?charset=utf8',
+      }
+      class { '::ceilometer::keystone::auth':
+        password => 'a_big_secret',
+      }
+      class { '::ceilometer::client': }
+      class { '::ceilometer::collector': }
+      class { '::ceilometer::expirer': }
+      class { '::ceilometer::alarm::evaluator': }
+      class { '::ceilometer::alarm::notifier': }
+      class { '::ceilometer::agent::central': }
+      class { '::ceilometer::agent::notification': }
+      class { '::ceilometer::api':
+        enabled               => true,
+        keystone_password     => 'a_big_secret',
+        keystone_identity_uri => 'http://127.0.0.1:35357/',
+        service_name          => 'httpd',
+      }
+      include ::apache
+      class { '::ceilometer::wsgi::apache':
+        ssl => false,
+      }
+      EOS
+
+
+      # Run it twice and test for idempotency
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :catch_changes => true)
+    end
+
+    describe port(8777) do
+      it { is_expected.to be_listening }
+    end
+
+    describe cron do
+      it { is_expected.to have_entry('1 0 * * * ceilometer-expirer').with_user('ceilometer') }
+    end
+
+  end
+end
index e0d0b3687ce52643c7fb206b9ba6aaaee1a18fc7..e9f7f3d13ff2ea21c26a10d57c7edd9b1b07eee7 100644 (file)
@@ -3,7 +3,8 @@ require 'spec_helper'
 describe 'ceilometer::api' do
 
   let :pre_condition do
-    "class { 'ceilometer': metering_secret => 's3cr3t' }"
+    "class { 'ceilometer': metering_secret => 's3cr3t' }
+     include ::ceilometer::db"
   end
 
   let :params do
@@ -115,11 +116,51 @@ describe 'ceilometer::api' do
         )
       end
     end
+
+    context 'when running ceilometer-api in wsgi' do
+      before do
+        params.merge!({ :service_name   => 'httpd' })
+      end
+
+      let :pre_condition do
+        "include ::apache
+         include ::ceilometer::db
+         class { 'ceilometer': metering_secret => 's3cr3t' }"
+      end
+
+      it 'configures ceilometer-api service with Apache' do
+        is_expected.to contain_service('ceilometer-api').with(
+          :ensure     => 'stopped',
+          :name       => platform_params[:api_service_name],
+          :enable     => false,
+          :tag        => 'ceilometer-service',
+        )
+      end
+    end
+
+    context 'when service_name is not valid' do
+      before do
+        params.merge!({ :service_name   => 'foobar' })
+      end
+
+      let :pre_condition do
+        "include ::apache
+         include ::ceilometer::db
+         class { 'ceilometer': metering_secret => 's3cr3t' }"
+      end
+
+      it_raises 'a Puppet::Error', /Invalid service_name/
+    end
   end
 
   context 'on Debian platforms' do
     let :facts do
-      { :osfamily => 'Debian' }
+      { :osfamily               => 'Debian',
+        :operatingsystem        => 'Debian',
+        :operatingsystemrelease => '8.0',
+        :concat_basedir         => '/var/lib/puppet/concat',
+        :fqdn                   => 'some.host.tld',
+        :processorcount         => 2 }
     end
 
     let :platform_params do
@@ -132,7 +173,12 @@ describe 'ceilometer::api' do
 
   context 'on RedHat platforms' do
     let :facts do
-      { :osfamily => 'RedHat' }
+      { :osfamily               => 'RedHat',
+        :operatingsystem        => 'RedHat',
+        :operatingsystemrelease => '7.1',
+        :fqdn                   => 'some.host.tld',
+        :concat_basedir         => '/var/lib/puppet/concat',
+        :processorcount         => 2 }
     end
 
     let :platform_params do
index b7c689900913b61f1df87a1ce421b6a42f8479cf..ad4c076542c6c74dc2dfebbc32d4dd611dd1de68 100644 (file)
@@ -119,7 +119,7 @@ describe 'ceilometer::wsgi::apache' do
         :httpd_service_name => 'apache2',
         :httpd_ports_file   => '/etc/apache2/ports.conf',
         :wsgi_script_path   => '/usr/lib/cgi-bin/ceilometer',
-        :wsgi_script_source => '/usr/share/ceilometer/app.wsgi'
+        :wsgi_script_source => '/usr/lib/python2.7/dist-packages/ceilometer/api/app.wsgi'
       }
     end