Skip to content

Commit

Permalink
Spec/Test updates
Browse files Browse the repository at this point in the history
- Split out systemd platforms to their own kitchen config file
  After spending a non-trivial amount of effort attempting to get
  kitchen-docker to play nice with systemd and CircleCI, leaving these
  platforms to vagrant-based kitchen testing is the current best
  solution in order to move forward.
- Reorganized some of the spec test assertions and layouts to better
  match the DRY approach of shared_examples
- Added a fixture recipe to set up repos and add packages f needed for
  ktichen tests
  • Loading branch information
miketheman committed Apr 24, 2016
1 parent 298ab51 commit bcf2b81
Show file tree
Hide file tree
Showing 16 changed files with 100 additions and 90 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
.kitchen/
.ruby-gemset
.ruby-version
.tags*
.vagrant
.yardoc/
*.un~
Expand Down
6 changes: 1 addition & 5 deletions .kitchen.docker.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
---
driver:
name: docker
use_sudo: false
Expand All @@ -14,8 +15,3 @@ platforms:
disable_upstart: false
run_command: /sbin/init
<% end %>

# @todo figure out how to run service via systemd
# - name: ubuntu-15.04
# driver:
# run_command: /lib/systemd/systemd
8 changes: 8 additions & 0 deletions .kitchen.systemd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
driver:
name: vagrant

platforms:
- name: centos-7.2
- name: debian-8.3
- name: ubuntu-15.10
15 changes: 8 additions & 7 deletions .kitchen.yml
Original file line number Diff line number Diff line change
@@ -1,34 +1,35 @@
---
driver:
name: vagrant

provisioner:
name: chef_zero

platforms:
- name: debian-7
- name: debian-7.9
- name: ubuntu-12.04
- name: ubuntu-14.04
# - name: ubuntu-15.04
# - name: centos-5.11
# - name: centos-6.6
- name: centos-7.1
run_list:
- recipe[nginx_service_test::nginx_repo]
- name: centos-6.7
- name: centos-7.2

suites:
- name: example
run_list:
- recipe[nginx_service_test::common]
- recipe[nginx::example]

- name: service_single
run_list:
- recipe[nginx_service_test::common]
- recipe[nginx_service_test::single]

- name: service_multi
run_list:
- recipe[nginx_service_test::common]
- recipe[nginx_service_test::multi]

- name: service_single_upstream
run_list:
- recipe[nginx_service_test::common]
- recipe[nginx_service_test::nginx_repo]
- recipe[nginx_service_test::single]
5 changes: 3 additions & 2 deletions circle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@ machine:

dependencies:
override:
- curl -L https://www.chef.io/chef/install.sh | sudo bash -s -- -P chefdk -v 0.11.2
- curl -L https://www.chef.io/chef/install.sh | sudo bash -s -- -P chefdk -v 0.12.0
- chef gem install kitchen-docker -v '~> 2.3.0'
cache_directories:
- "~/.chefdk"

test:
pre:
- docker version && docker info
- eval "$(/opt/chefdk/bin/chef shell-init bash)"
override:
- chef --version
- gem query -d chefspec rubocop foodcritic rake
- chef gem query -d chefspec rubocop foodcritic rake
- chef exec rake circle:
parallel: true
timeout: 900
Expand Down
1 change: 1 addition & 0 deletions libraries/helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def res_name
new_resource.name
end

# @param [Chef::Node] An Object that responds to a `['platform']` call
# @return [String] Name of the user that runs nginx
def user_for_platform(node)
case node['platform']
Expand Down
20 changes: 10 additions & 10 deletions libraries/provider_nginx_service_sysvinit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ class NginxServiceSysVinit < Chef::Provider::NginxServiceBase
# Start up the service
service "#{nginx_instance_name} :start" do
service_name nginx_instance_name
provider Chef::Provider::Service::Init::Insserv if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
provider Chef::Provider::Service::Init::Debian if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
supports status: true, restart: true
action [:start, :enable]
end
Expand All @@ -33,8 +33,8 @@ class NginxServiceSysVinit < Chef::Provider::NginxServiceBase
action :stop do
service "#{nginx_instance_name} :stop" do
service_name nginx_instance_name
provider Chef::Provider::Service::Init::Insserv if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
provider Chef::Provider::Service::Init::Debian if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
supports status: true, restart: true
action [:stop, :disable]
end
Expand All @@ -49,8 +49,8 @@ class NginxServiceSysVinit < Chef::Provider::NginxServiceBase

service "#{res_name} :delete #{nginx_instance_name}" do
service_name nginx_instance_name
provider Chef::Provider::Service::Init::Insserv if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
provider Chef::Provider::Service::Init::Debian if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
supports status: true
action [:stop, :disable]
end
Expand All @@ -61,8 +61,8 @@ class NginxServiceSysVinit < Chef::Provider::NginxServiceBase
service "#{res_name} :restart #{nginx_instance_name}" do
service_name nginx_instance_name
supports status: true, restart: true
provider Chef::Provider::Service::Init::Insserv if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
provider Chef::Provider::Service::Init::Debian if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
action :restart
end
end
Expand All @@ -71,8 +71,8 @@ class NginxServiceSysVinit < Chef::Provider::NginxServiceBase
# @todo create recipes and tests for this
service "#{res_name} :reload #{nginx_instance_name}" do
service_name nginx_instance_name
provider Chef::Provider::Service::Init::Insserv if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
provider Chef::Provider::Service::Init::Debian if node['platform_family'] == 'debian'
provider Chef::Provider::Service::Init::Redhat if node['platform_family'] == 'redhat'
supports status: true, reload: true
action :reload
end
Expand Down
10 changes: 8 additions & 2 deletions recipes/example.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@

nginx_service 'example'

file '/tmp/index.htm' do
root_dir = '/var/www/example'

directory root_dir do
recursive true
end

file File.join(root_dir, 'index.htm') do
content <<-EOF.gsub(/^ {4}/, '')
<html>
<body>
Expand All @@ -21,7 +27,7 @@
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /tmp;
root #{root_dir};
index index.html index.htm;
# Make site accessible from http://localhost/
Expand Down
6 changes: 5 additions & 1 deletion spec/recipes_specs/example_spec.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
describe 'nginx::example' do
cached(:chef_run) { ChefSpec::SoloRunner.converge described_recipe }

it 'creates an example web directory' do
expect(chef_run).to create_directory('/var/www/example')
end

it 'creates a sample web file' do
expect(chef_run).to create_file('/tmp/index.htm')
expect(chef_run).to create_file('/var/www/example/index.htm')
end

it_behaves_like 'create a named nginx_service', 'example'
Expand Down
7 changes: 7 additions & 0 deletions test/fixtures/cookbooks/nginx_service_test/recipes/common.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
include_recipe 'apt' if platform_family? 'debian' # needed for `apt-get update`
include_recipe 'yum-epel' if platform_family? 'rhel' # nginx package is part of EPEL

# Any utilities expected to be available for verifcation purposes
package 'curl' do
action :install
end
20 changes: 6 additions & 14 deletions test/fixtures/cookbooks/nginx_service_test/recipes/nginx_repo.rb
Original file line number Diff line number Diff line change
@@ -1,23 +1,15 @@
# apt_repository 'nginx' do
# uri 'ppa:nginx/stable'
# distribution node['lsb']['codename']
# end

case node['platform']
when 'ubuntu', 'debian'
case node['platform_family']
when 'debian'
apt_repository 'nginx.org' do
uri "http://nginx.org/packages/#{node['platform']}"
distribution node['lsb']['codename']
components ['nginx']
key 'http://nginx.org/keys/nginx_signing.key'
only_if { node['platform_family'] == 'debian' }
end
when 'centos'
yum_repository 'nginx repo' do
description 'Official Red Hat/CentOS packages'
mirrorlist 'http://nginx.org/packages/centos/$releasever/$basearch/'
when 'rhel'
yum_repository 'nginx.org' do
description 'nginx repo'
baseurl "http://nginx.org/packages/#{node['platform']}/$releasever/$basearch/"
gpgcheck false
enabled true
action :create
end
end
13 changes: 3 additions & 10 deletions test/integration/example/serverspec/example_spec.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
require 'serverspec'

set :backend, :exec
require 'spec_helper'

describe 'example service' do
it 'installs nginx package' do
expect(package('nginx')).to be_installed
end
it_behaves_like 'nginx package'

it 'stops the default nginx service' do
expect(service('nginx')).to_not be_running
Expand All @@ -19,10 +15,7 @@
expect(nginx_example_conf.content).to match(/user (www-data|nginx);/)
end

it 'starts & enables the example nginx service' do
expect(service('nginx-example')).to be_running
expect(service('nginx-example')).to be_enabled
end
it_behaves_like 'nginx service', 'example'
end

describe 'test page' do
Expand Down
16 changes: 16 additions & 0 deletions test/integration/helpers/serverspec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
require 'serverspec'

set :backend, :exec

RSpec.shared_examples_for 'nginx package' do
describe package('nginx') do
it { should be_installed }
end
end

RSpec.shared_examples_for 'nginx service' do |resource_name|
describe service("nginx-#{resource_name}") do
it { should be_running }
it { should be_enabled }
end
end
19 changes: 4 additions & 15 deletions test/integration/service_multi/serverspec/default_spec.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
require 'serverspec'

set :backend, :exec
require 'spec_helper'

describe 'multi service' do
it 'installs nginx package' do
expect(package('nginx')).to be_installed
end

it 'starts & enables nginx multi1 service' do
expect(service('nginx-multi1')).to be_running
expect(service('nginx-multi1')).to be_enabled
end
it_behaves_like 'nginx package'

it 'starts & enables nginx multi2 service' do
expect(service('nginx-multi2')).to be_running
expect(service('nginx-multi2')).to be_enabled
end
it_behaves_like 'nginx service', 'multi1'
it_behaves_like 'nginx service', 'multi2'
end
14 changes: 3 additions & 11 deletions test/integration/service_single/serverspec/default_spec.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
require 'serverspec'

set :backend, :exec
require 'spec_helper'

describe 'single service' do
it 'installs nginx package' do
expect(package('nginx')).to be_installed
end

it 'starts & enables nginx service' do
expect(service('nginx-single')).to be_running
expect(service('nginx-single')).to be_enabled
end
it_behaves_like 'nginx package'
it_behaves_like 'nginx service', 'single'
end
29 changes: 16 additions & 13 deletions test/integration/service_single_upstream/serverspec/default_spec.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
require 'serverspec'

set :backend, :exec
require 'spec_helper'

describe 'single service, upstream repo' do
it 'creates the apt repo file' do
listfile = '/etc/apt/sources.list.d/nginx.org.list'
expect(file(listfile)).to be_a_file
expect(file(listfile).content).to match(%r{http://nginx.org/packages/})
case os[:family]
when 'debian', 'ubuntu'
repo_file = '/etc/apt/sources.list.d/nginx.org.list'
repo_installed_command = 'grep -q nginx.org /var/lib/dpkg/status'
when 'redhat'
repo_file = '/etc/yum.repos.d/nginx.org.repo'
repo_installed_command = 'yum info nginx | grep -q "From repo\s.*nginx.org$"'
end

it 'installs nginx package' do
expect(package('nginx')).to be_installed
expect(command('grep -q nginx.org /var/lib/dpkg/status').exit_status).to eq 0
describe file(repo_file) do
it { should be_file }
its(:content) { should match(%r{http://nginx.org/packages/}) }
end

it 'starts & enables nginx service' do
expect(service('nginx-single')).to be_running
expect(service('nginx-single')).to be_enabled
describe command(repo_installed_command) do
its(:exit_status) { should eq 0 }
end

it_behaves_like 'nginx package'
it_behaves_like 'nginx service', 'single'
end

0 comments on commit bcf2b81

Please sign in to comment.