From 3c7b5c9f3942ae389870b8c18011c208280e2963 Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Mon, 15 Jun 2015 16:07:55 -0700 Subject: [PATCH 1/9] Update broken tests for Berks3/Serverspec2 Current .kitchen.yml, Berksfile, and serverspec files require updates to allow "kitchen test" to complete. - moved current .kitchen.yml file to .kitchen.cloud.yml to avoid cloud provider missing key errors - created a new .kitchen.yml file using vagrant driver, chef_zero provisioner, updated centos platforms, and added ubuntu-14.04 - updated Berksfile to use source location as site location has been deprecated in Berkshelf 3 - updated instance_spec.rb for Serverspec V2 and added a few more simple tests --- .kitchen.cloud.yml | 72 +++++++++++++++++++ .kitchen.yml | 62 +++------------- Berksfile | 2 +- .../helpers/serverspec/spec_helper.rb | 3 + .../instance/serverspec/instance_spec.rb | 21 +++--- 5 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 .kitchen.cloud.yml create mode 100644 test/integration/helpers/serverspec/spec_helper.rb diff --git a/.kitchen.cloud.yml b/.kitchen.cloud.yml new file mode 100644 index 0000000..6b86dd8 --- /dev/null +++ b/.kitchen.cloud.yml @@ -0,0 +1,72 @@ +--- +driver_plugin: vagrant +driver_plugin: digitalocean +driver_config: + digitalocean_client_id: <%= ENV['DIGITAL_OCEAN_CLIENT_ID'] %> + digitalocean_api_key: <%= ENV['DIGITAL_OCEAN_API_KEY'] %> + aws_access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> + aws_secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> + aws_ssh_key_id: <%= ENV['AWS_KEYPAIR_NAME'] %> + ssh_key: <%= ENV['AWS_PRIVATE_KEY_PATH'] %> + rackspace_username: <%= ENV['RACKSPACE_USERNAME'] %> + rackspace_api_key: <%= ENV['RACKSPACE_API_KEY'] %> + require_chef_omnibus: latest + +platforms: +- name: centos-5.8 + driver_plugin: digitalocean + driver_config: + image_id: 1601 + flavor_id: 63 + region_id: 1 + ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> + +- name: centos-6.4 + driver_plugin: digitalocean + driver_config: + image_id: 562354 + flavor_id: 63 + region_id: 1 + ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> + +- name: amazon-2013.09 + driver_plugin: ec2 + driver_config: + image_id: ami-3be4bc52 + username: ec2-user + +# - name: fedora-19 +# driver_plugin: digitalocean +# driver_config: +# image_id: 696598 +# flavor_id: 63 +# region_id: 1 +# ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> + +- name: ubuntu-1004 + driver_plugin: digitalocean + driver_config: + image_id: 14097 + flavor_id: 63 + region_id: 1 + ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> + run_list: + - recipe[apt] + +- name: ubuntu-1204 + driver_plugin: digitalocean + driver_config: + image_id: 1505447 + flavor_id: 63 + region_id: 1 + ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> + run_list: + - recipe[apt] + +suites: + - name: default + run_list: + - recipe[memcached::default] + - name: instance + run_list: + - recipe[fake::instance] diff --git a/.kitchen.yml b/.kitchen.yml index 6b86dd8..b30d4de 100644 --- a/.kitchen.yml +++ b/.kitchen.yml @@ -1,65 +1,23 @@ --- driver_plugin: vagrant -driver_plugin: digitalocean -driver_config: - digitalocean_client_id: <%= ENV['DIGITAL_OCEAN_CLIENT_ID'] %> - digitalocean_api_key: <%= ENV['DIGITAL_OCEAN_API_KEY'] %> - aws_access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> - aws_secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> - aws_ssh_key_id: <%= ENV['AWS_KEYPAIR_NAME'] %> - ssh_key: <%= ENV['AWS_PRIVATE_KEY_PATH'] %> - rackspace_username: <%= ENV['RACKSPACE_USERNAME'] %> - rackspace_api_key: <%= ENV['RACKSPACE_API_KEY'] %> - require_chef_omnibus: latest -platforms: -- name: centos-5.8 - driver_plugin: digitalocean - driver_config: - image_id: 1601 - flavor_id: 63 - region_id: 1 - ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> +provisioner: + name: chef_zero -- name: centos-6.4 - driver_plugin: digitalocean - driver_config: - image_id: 562354 - flavor_id: 63 - region_id: 1 - ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> +platforms: +- name: centos-5.10 -- name: amazon-2013.09 - driver_plugin: ec2 - driver_config: - image_id: ami-3be4bc52 - username: ec2-user +- name: centos-6.6 -# - name: fedora-19 -# driver_plugin: digitalocean -# driver_config: -# image_id: 696598 -# flavor_id: 63 -# region_id: 1 -# ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> +- name: ubuntu-10.04 + run_list: + - recipe[apt] -- name: ubuntu-1004 - driver_plugin: digitalocean - driver_config: - image_id: 14097 - flavor_id: 63 - region_id: 1 - ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> +- name: ubuntu-12.04 run_list: - recipe[apt] -- name: ubuntu-1204 - driver_plugin: digitalocean - driver_config: - image_id: 1505447 - flavor_id: 63 - region_id: 1 - ssh_key_ids: <%= ENV['DIGITAL_OCEAN_SSH_KEY_IDS'] %> +- name: ubuntu-14.04 run_list: - recipe[apt] diff --git a/Berksfile b/Berksfile index b3df8b4..4c06e45 100644 --- a/Berksfile +++ b/Berksfile @@ -1,4 +1,4 @@ -site 'https://supermarket.chef.io' +source 'https://supermarket.chef.io' metadata group :integration do diff --git a/test/integration/helpers/serverspec/spec_helper.rb b/test/integration/helpers/serverspec/spec_helper.rb new file mode 100644 index 0000000..37af1b4 --- /dev/null +++ b/test/integration/helpers/serverspec/spec_helper.rb @@ -0,0 +1,3 @@ +require 'serverspec' + +set :backend, :exec diff --git a/test/integration/instance/serverspec/instance_spec.rb b/test/integration/instance/serverspec/instance_spec.rb index 80688a8..b8975d4 100644 --- a/test/integration/instance/serverspec/instance_spec.rb +++ b/test/integration/instance/serverspec/instance_spec.rb @@ -1,10 +1,15 @@ -require 'serverspec' -include Serverspec::Helper::Exec -include Serverspec::Helper::DetectOS +require 'spec_helper' +set :path, '$PATH:/sbin' if os[:family] == 'redhat' && os[:release].match(/^5\.\d+/) -describe 'memcached_instance definition' do - it 'is running with the correct attributes' do - expect(service('memcached')).to be_running - expect(port(11_211)).to be_listening - end +describe package('memcached') do + it { should be_installed } +end + +describe service('memcached') do + it { should be_enabled } + it { should be_running } +end + +describe port(11211) do + it { should be_listening.with('tcp') } end From b06d2dc2a0d94bc4875a7b026a3aad6018e04fa4 Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Wed, 17 Jun 2015 23:05:19 -0700 Subject: [PATCH 2/9] Deconflict memcached_instance runit definition from default init - split `default.rb` recipe into `install.rb` and `configure.rb` to allow memcached_instance definition to proceed without default init configuration - install `libmemcached-dev` instead of `libmemcache-dev` if debian family - modify memcached_instance to only include `install.rb` recipe, disable and stop service, set instance name to `memcached` if specified as `memcached` and add missing options `udp_port`, `threads`, `max_object_size`, and `experimental_options` - add missing `max_object_size` option to `sv-memcached-run` template as well as `experimental_options` and `threads` if specified - add serverspec test to `default` test suite - update `instance` serverspec test to check that memcached is running under runit --- README.md | 4 +- definitions/memcached_instance.rb | 18 ++++- recipes/configure.rb | 69 +++++++++++++++++ recipes/default.rb | 74 +------------------ recipes/install.rb | 42 +++++++++++ templates/default/sv-memcached-run.erb | 14 +++- .../cookbooks/fake/recipes/instance.rb | 6 +- .../default/serverspec/default_spec.rb | 16 ++++ .../instance/serverspec/instance_spec.rb | 8 +- 9 files changed, 167 insertions(+), 84 deletions(-) create mode 100644 recipes/configure.rb create mode 100644 recipes/install.rb create mode 100644 test/integration/default/serverspec/default_spec.rb diff --git a/README.md b/README.md index 042e3b1..106b882 100644 --- a/README.md +++ b/README.md @@ -41,9 +41,9 @@ Usage ----- Simply set the attributes and it will configure the `/etc/memcached.conf` file. If you want to use multiple memcached instances, you'll need to modify the recipe to disable the startup script and the template in the default recipe. -Use the definition, `memcached_instance`, to set up a runit service for the named memcached instance. +Use the definition, `memcached_instance`, to set up a runit service for the named memcached instance. (If the instance name is `memcached` the service name will be `memcached` otherwise it will be `memcached-#{service_name}`) -```ruby +``` memcached_instance 'myproj' ``` diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index 983d07d..f829198 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -18,21 +18,31 @@ # define :memcached_instance do - include_recipe 'runit::default' - include_recipe 'memcached::default' + include_recipe 'runit' + include_recipe 'memcached::install' + + service 'memcached' do + action [:disable, :stop] + end + + instance_name = params[:name] == 'memcached' ? 'memcached' : "memcached-#{params[:name]}" opts = params - runit_service "memcached-#{params[:name]}" do + runit_service instance_name do run_template_name 'memcached' default_logger true cookbook 'memcached' options({ :memory => node['memcached']['memory'], :port => node['memcached']['port'], + :udp_port => node['memcached']['udp_port'], :listen => node['memcached']['listen'], :maxconn => node['memcached']['maxconn'], - :user => node['memcached']['user'] + :user => node['memcached']['user'], + :threads => node['memcached']['threads'], + :max_object_size => node['memcached']['max_object_size'], + :experimental_options => Array(node['memcached']['experimental_options']) }.merge(opts)) end end diff --git a/recipes/configure.rb b/recipes/configure.rb new file mode 100644 index 0000000..5d71da4 --- /dev/null +++ b/recipes/configure.rb @@ -0,0 +1,69 @@ +# +# Cookbook Name:: memcached +# Recipe:: default +# +# Copyright 2009-2013, Chef Software, 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. +# + +service 'memcached' do + action :enable + supports :status => true, :start => true, :stop => true, :restart => true, :enable => true +end + +case node['platform_family'] +when 'rhel', 'fedora', 'suse' + family = node['platform_family'] == 'suse' ? 'suse' : 'redhat' + template '/etc/sysconfig/memcached' do + source "memcached.sysconfig.#{family}.erb" + owner 'root' + group 'root' + mode '0644' + variables( + :listen => node['memcached']['listen'], + :user => node['memcached']['user'], + :group => node['memcached']['group'], + :port => node['memcached']['port'], + :udp_port => node['memcached']['udp_port'], + :maxconn => node['memcached']['maxconn'], + :memory => node['memcached']['memory'], + :max_object_size => node['memcached']['max_object_size'], + :logfilename => node['memcached']['logfilename'] + ) + notifies :restart, 'service[memcached]' + end +when 'smartos' + # SMF directly configures memcached with no opportunity to alter settings + # If you need custom parameters, use the memcached_instance provider + service 'memcached' do + action :enable + end +else + template '/etc/memcached.conf' do + source 'memcached.conf.erb' + owner 'root' + group 'root' + mode '0644' + variables( + :listen => node['memcached']['listen'], + :user => node['memcached']['user'], + :port => node['memcached']['port'], + :udp_port => node['memcached']['udp_port'], + :maxconn => node['memcached']['maxconn'], + :memory => node['memcached']['memory'], + :max_object_size => node['memcached']['max_object_size'] + ) + notifies :restart, 'service[memcached]' + end +end diff --git a/recipes/default.rb b/recipes/default.rb index 5082729..d2960ee 100644 --- a/recipes/default.rb +++ b/recipes/default.rb @@ -17,75 +17,5 @@ # limitations under the License. # -# include epel on redhat/centos 5 and below in order to get the memcached packages -include_recipe 'yum-epel' if node['platform_family'] == 'rhel' && node['platform_version'].to_i == 5 - -package 'memcached' - -package 'libmemcache-dev' do - case node['platform_family'] - when 'rhel', 'fedora' - package_name 'libmemcached-devel' - when 'smartos' - package_name 'libmemcached' - when 'suse' - if node['platform_version'].to_f < 12 - package_name 'libmemcache-devel' - else - package_name 'libmemcached-devel' - end - else - package_name 'libmemcache-dev' - end -end - -service 'memcached' do - action :enable - supports :status => true, :start => true, :stop => true, :restart => true, :enable => true -end - -case node['platform_family'] -when 'rhel', 'fedora', 'suse' - family = node['platform_family'] == 'suse' ? 'suse' : 'redhat' - template '/etc/sysconfig/memcached' do - source "memcached.sysconfig.#{family}.erb" - owner 'root' - group 'root' - mode '0644' - variables( - :listen => node['memcached']['listen'], - :user => node['memcached']['user'], - :group => node['memcached']['group'], - :port => node['memcached']['port'], - :udp_port => node['memcached']['udp_port'], - :maxconn => node['memcached']['maxconn'], - :memory => node['memcached']['memory'], - :max_object_size => node['memcached']['max_object_size'], - :logfilename => node['memcached']['logfilename'] - ) - notifies :restart, 'service[memcached]' - end -when 'smartos' - # SMF directly configures memcached with no opportunity to alter settings - # If you need custom parameters, use the memcached_instance provider - service 'memcached' do - action :enable - end -else - template '/etc/memcached.conf' do - source 'memcached.conf.erb' - owner 'root' - group 'root' - mode '0644' - variables( - :listen => node['memcached']['listen'], - :user => node['memcached']['user'], - :port => node['memcached']['port'], - :udp_port => node['memcached']['udp_port'], - :maxconn => node['memcached']['maxconn'], - :memory => node['memcached']['memory'], - :max_object_size => node['memcached']['max_object_size'] - ) - notifies :restart, 'service[memcached]' - end -end +include_recipe 'memcached::install' +include_recipe 'memcached::configure' diff --git a/recipes/install.rb b/recipes/install.rb new file mode 100644 index 0000000..71ef37a --- /dev/null +++ b/recipes/install.rb @@ -0,0 +1,42 @@ +# +# Cookbook Name:: memcached +# Recipe:: default +# +# Copyright 2009-2013, Chef Software, 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. +# + +# include epel on redhat/centos 5 and below in order to get the memcached packages +include_recipe 'yum-epel' if node['platform_family'] == 'rhel' && node['platform_version'].to_i == 5 + +package 'memcached' + +package 'libmemcache-dev' do + case node['platform_family'] + when 'rhel', 'fedora' + package_name 'libmemcached-devel' + when 'smartos' + package_name 'libmemcached' + when 'suse' + if node['platform_version'].to_f < 12 + package_name 'libmemcache-devel' + else + package_name 'libmemcached-devel' + end + when 'debian' + package_name 'libmemcached-dev' + else + package_name 'libmemcache-dev' + end +end diff --git a/templates/default/sv-memcached-run.erb b/templates/default/sv-memcached-run.erb index 01c68ad..f5c6197 100644 --- a/templates/default/sv-memcached-run.erb +++ b/templates/default/sv-memcached-run.erb @@ -1,3 +1,15 @@ #!/bin/sh exec 2>&1 -exec chpst -u <%= @options[:user] %> /usr/bin/memcached -v -m <%= @options[:memory] %> -U <%= @options[:udp_port] %> -p <%= @options[:port] %> -u <%= @options[:user] %> -l <%= @options[:listen] %> -c <%= @options[:maxconn] %> + +exec chpst -u <%= @options[:user] %> \ + /usr/bin/memcached -v \ + -m <%= @options[:memory] %> \ + -U <%= @options[:udp_port] %> \ + -p <%= @options[:port] %> \ + -u <%= @options[:user] %> \ + -l <%= @options[:listen] %> \ + -c <%= @options[:maxconn] %> \ + -I <%= @options[:max_object_size] %><% if @options[:experimental_options].any? %> \ + -o <%= @options[:experimental_options].join(', ') %><% end %><% if @options[:threads] %> \ + -t <%= @options[:threads] %> + <% end %> diff --git a/test/fixtures/cookbooks/fake/recipes/instance.rb b/test/fixtures/cookbooks/fake/recipes/instance.rb index 5fd0574..c89cdf4 100644 --- a/test/fixtures/cookbooks/fake/recipes/instance.rb +++ b/test/fixtures/cookbooks/fake/recipes/instance.rb @@ -1,9 +1,9 @@ -include_recipe 'memcached::default' +#include_recipe 'memcached::default' # m = resources('service[memcached]') # m.action :stop -memcached_instance 'myproj' do - port 11_212 +memcached_instance 'memcached' do + port 11212 memory 128 end diff --git a/test/integration/default/serverspec/default_spec.rb b/test/integration/default/serverspec/default_spec.rb new file mode 100644 index 0000000..7470bd3 --- /dev/null +++ b/test/integration/default/serverspec/default_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +set :path, '$PATH:/sbin' if os[:family] == 'redhat' && os[:release].match(/^5\.\d+/) + +describe package('memcached') do + it { should be_installed } +end + +describe service('memcached') do + it { should be_enabled } + it { should be_running } +end + +describe port(11211) do + it { should be_listening.with('tcp') } +end diff --git a/test/integration/instance/serverspec/instance_spec.rb b/test/integration/instance/serverspec/instance_spec.rb index b8975d4..8516851 100644 --- a/test/integration/instance/serverspec/instance_spec.rb +++ b/test/integration/instance/serverspec/instance_spec.rb @@ -1,4 +1,5 @@ require 'spec_helper' + set :path, '$PATH:/sbin' if os[:family] == 'redhat' && os[:release].match(/^5\.\d+/) describe package('memcached') do @@ -6,10 +7,13 @@ end describe service('memcached') do - it { should be_enabled } it { should be_running } end -describe port(11211) do +describe command('service memcached status') do + its(:stdout) { should match /^run: memcached/ } +end + +describe port(11212) do it { should be_listening.with('tcp') } end From 680a183b1968f059cd4ff3115a45ff23a2b0bde9 Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Thu, 18 Jun 2015 14:41:32 -0700 Subject: [PATCH 3/9] Add threads and experimental_options to default init config Add guard to memcached_instance definition to avoid service stop --- definitions/memcached_instance.rb | 7 ++++--- recipes/configure.rb | 10 +++++++--- templates/default/memcached.conf.erb | 8 +++++++- templates/default/memcached.sysconfig.redhat.erb | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index f829198..852cd55 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -21,12 +21,13 @@ include_recipe 'runit' include_recipe 'memcached::install' + instance_name = params[:name] == 'memcached' ? 'memcached' : "memcached-#{params[:name]}" + service 'memcached' do action [:disable, :stop] + not_if { File.exists?("/etc/service/#{instance_name}/run") } end - instance_name = params[:name] == 'memcached' ? 'memcached' : "memcached-#{params[:name]}" - opts = params runit_service instance_name do @@ -45,4 +46,4 @@ :experimental_options => Array(node['memcached']['experimental_options']) }.merge(opts)) end -end + end diff --git a/recipes/configure.rb b/recipes/configure.rb index 5d71da4..5086c48 100644 --- a/recipes/configure.rb +++ b/recipes/configure.rb @@ -38,8 +38,9 @@ :udp_port => node['memcached']['udp_port'], :maxconn => node['memcached']['maxconn'], :memory => node['memcached']['memory'], - :max_object_size => node['memcached']['max_object_size'], - :logfilename => node['memcached']['logfilename'] + :logfilename => node['memcached']['logfilename'], + :threads => node['memcached']['threads'], + :max_object_size => node['memcached']['max_object_size'] ) notifies :restart, 'service[memcached]' end @@ -62,7 +63,10 @@ :udp_port => node['memcached']['udp_port'], :maxconn => node['memcached']['maxconn'], :memory => node['memcached']['memory'], - :max_object_size => node['memcached']['max_object_size'] + :logfilename => node['memcached']['logfilename'], + :threads => node['memcached']['threads'], + :max_object_size => node['memcached']['max_object_size'], + :experimental_options => Array(node['memcached']['experimental_options']) ) notifies :restart, 'service[memcached]' end diff --git a/templates/default/memcached.conf.erb b/templates/default/memcached.conf.erb index 9455979..474f39a 100644 --- a/templates/default/memcached.conf.erb +++ b/templates/default/memcached.conf.erb @@ -12,7 +12,7 @@ -d # Log memcached's output to /var/log/memcached -logfile /var/log/memcached.log +logfile /var/log/<%= @logfilename %> # Be verbose -v @@ -52,3 +52,9 @@ logfile /var/log/memcached.log # Max object size -I <%= @max_object_size %> + +# Number of threads to use to process incoming requests. The default is 4. +<% if @threads %>-t <%= @threads %><% end %> + +# Comma separated list of extended or experimental options. +<% if @experimental_options.any? %>-o <%= @experimental_options.join(', ') %><% end %> diff --git a/templates/default/memcached.sysconfig.redhat.erb b/templates/default/memcached.sysconfig.redhat.erb index 98cde35..9f1d422 100644 --- a/templates/default/memcached.sysconfig.redhat.erb +++ b/templates/default/memcached.sysconfig.redhat.erb @@ -10,4 +10,4 @@ PORT="<%= @port %>" USER="<%= @user %>" MAXCONN="<%= @maxconn %>" CACHESIZE="<%= @memory %>" -OPTIONS="-U <%= @udp_port %> -l <%= @listen %> -I <%= @max_object_size %> >> /var/log/<%= @logfilename %> 2>&1" +OPTIONS="-U <%= @udp_port %> -l <%= @listen %> -I <%= @max_object_size %> <% if @threads %>-t <%= @threads %><% end %> >> /var/log/<%= @logfilename %> 2>&1" From 3935f593d4bd35e88a2e88325e7e6d207f89c51f Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Fri, 19 Jun 2015 10:42:23 -0700 Subject: [PATCH 4/9] Add optional ulimit attribute When a large `maxconn` parameter are specified, the ulimit needs to be increased. Currently only used with runit. --- definitions/memcached_instance.rb | 3 ++- templates/default/sv-memcached-run.erb | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index 852cd55..4c6b0e3 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -43,7 +43,8 @@ :user => node['memcached']['user'], :threads => node['memcached']['threads'], :max_object_size => node['memcached']['max_object_size'], - :experimental_options => Array(node['memcached']['experimental_options']) + :experimental_options => Array(node['memcached']['experimental_options']), + :ulimit => node['memcached']['ulimit'] }.merge(opts)) end end diff --git a/templates/default/sv-memcached-run.erb b/templates/default/sv-memcached-run.erb index f5c6197..780c55d 100644 --- a/templates/default/sv-memcached-run.erb +++ b/templates/default/sv-memcached-run.erb @@ -1,6 +1,8 @@ #!/bin/sh exec 2>&1 +<% if @options[:ulimit] == true %>ulimit -n <%= @options[:maxconn] %><% end %> + exec chpst -u <%= @options[:user] %> \ /usr/bin/memcached -v \ -m <%= @options[:memory] %> \ From 97d2a99f36edb193059c5775d0c867f3504b6ac7 Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Fri, 19 Jun 2015 12:19:58 -0700 Subject: [PATCH 5/9] Add optional package version and rename install.rb to package.rb --- definitions/memcached_instance.rb | 2 +- recipes/default.rb | 2 +- recipes/{install.rb => package.rb} | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) rename recipes/{install.rb => package.rb} (93%) diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index 4c6b0e3..651d01e 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -19,7 +19,7 @@ define :memcached_instance do include_recipe 'runit' - include_recipe 'memcached::install' + include_recipe 'memcached::package' instance_name = params[:name] == 'memcached' ? 'memcached' : "memcached-#{params[:name]}" diff --git a/recipes/default.rb b/recipes/default.rb index d2960ee..50f3a11 100644 --- a/recipes/default.rb +++ b/recipes/default.rb @@ -17,5 +17,5 @@ # limitations under the License. # -include_recipe 'memcached::install' +include_recipe 'memcached::package' include_recipe 'memcached::configure' diff --git a/recipes/install.rb b/recipes/package.rb similarity index 93% rename from recipes/install.rb rename to recipes/package.rb index 71ef37a..3e5498a 100644 --- a/recipes/install.rb +++ b/recipes/package.rb @@ -20,7 +20,10 @@ # include epel on redhat/centos 5 and below in order to get the memcached packages include_recipe 'yum-epel' if node['platform_family'] == 'rhel' && node['platform_version'].to_i == 5 -package 'memcached' +package 'memcached' do + version node['memcached']['version'] + action :install +end package 'libmemcache-dev' do case node['platform_family'] From 2e8342a8cffecee98f8f21f2c2ee9e8a68fec59b Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Fri, 19 Jun 2015 12:36:57 -0700 Subject: [PATCH 6/9] update README and add nil default value to default attributes --- README.md | 4 +++- attributes/default.rb | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 106b882..d41bbc6 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,9 @@ The following are node attributes passed to the template for the runit service. - `memcached['maxconn']` - maximum number of connections to accept (defaults to 1024) - `memcached['max_object_size']` - maximum size of an object to cache (defaults to 1MB) - `memcached['logfilename']` - logfile to which memcached output will be redirected in /var/log/$logfilename. - +- `memcached['threads']` - Number of threads to use to process incoming requests. The default is 4. +- `memcached['experimental_options']` - Comma separated list of extended or experimental options. (array) +- `memcached['ulimit']` - boolean `true` will set the ulimit to the `maxconn` value Usage ----- diff --git a/attributes/default.rb b/attributes/default.rb index cedac73..f3adbee 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -17,6 +17,7 @@ # limitations under the License. # +default['memcached']['version'] = nil default['memcached']['memory'] = 64 default['memcached']['port'] = 11_211 default['memcached']['udp_port'] = 11_211 From f0fc6f109fe52d3bc2def005a0c07187cfcc4d75 Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Fri, 19 Jun 2015 23:16:38 -0700 Subject: [PATCH 7/9] Ugly fix to deal with debian family starting service on install Debian family distributions automatically start services on install which can cause weird states, especially when switching to runit. - added logic to check whether memcached package is installed: if no, disable autostart, install, re-enable autostart if yes, execute package provider as normal (to allow upgrades) --- definitions/memcached_instance.rb | 5 ----- recipes/package.rb | 25 ++++++++++++++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index 651d01e..d69c415 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -23,11 +23,6 @@ instance_name = params[:name] == 'memcached' ? 'memcached' : "memcached-#{params[:name]}" - service 'memcached' do - action [:disable, :stop] - not_if { File.exists?("/etc/service/#{instance_name}/run") } - end - opts = params runit_service instance_name do diff --git a/recipes/package.rb b/recipes/package.rb index 3e5498a..fcade0c 100644 --- a/recipes/package.rb +++ b/recipes/package.rb @@ -20,11 +20,30 @@ # include epel on redhat/centos 5 and below in order to get the memcached packages include_recipe 'yum-epel' if node['platform_family'] == 'rhel' && node['platform_version'].to_i == 5 -package 'memcached' do - version node['memcached']['version'] - action :install +if node['platform_family'] == 'debian' && shell_out('dpkg -l memcached | grep "^ii memcached"').error? + # dpkg, imma let you finish but don't start services automatically + # https://jpetazzo.github.io/2013/10/06/policy-rc-d-do-not-start-services-automatically/ + execute 'disable auto-start' do + command 'echo exit 101 > /usr/sbin/policy-rc.d ; chmod +x /usr/sbin/policy-rc.d' + end + + package 'memcached' do + version node['memcached']['version'] + action :install + end + + execute 'undo service disable hack' do + command 'echo exit 0 > /usr/sbin/policy-rc.d' + end + +else + package 'memcached' do + version node['memcached']['version'] + action :install + end end + package 'libmemcache-dev' do case node['platform_family'] when 'rhel', 'fedora' From 742e271f169c2ca2d12cd47722c89a8207a4559d Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Sat, 20 Jun 2015 22:42:36 -0700 Subject: [PATCH 8/9] add conditional logic for unspecified runit_service instance name --- definitions/memcached_instance.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index d69c415..77118b1 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -21,7 +21,7 @@ include_recipe 'runit' include_recipe 'memcached::package' - instance_name = params[:name] == 'memcached' ? 'memcached' : "memcached-#{params[:name]}" + instance_name = params[:name] == 'memcached' || params[:name] == nil ? 'memcached' : "memcached-#{params[:name]}" opts = params From 22dd8186d9d5a421c19039c1211813bf97a6bb1c Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Tue, 23 Jun 2015 22:21:14 -0700 Subject: [PATCH 9/9] add `logfilepath` attribute --- attributes/default.rb | 1 + definitions/memcached_instance.rb | 18 +++++++++--------- recipes/configure.rb | 4 ++++ templates/default/memcached.conf.erb | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/attributes/default.rb b/attributes/default.rb index f3adbee..d0e9426 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -24,6 +24,7 @@ default['memcached']['listen'] = '0.0.0.0' default['memcached']['maxconn'] = 1024 default['memcached']['max_object_size'] = '1m' +default['memcached']['logfilepath'] = '/var/log/' default['memcached']['logfilename'] = 'memcached.log' case node['platform_family'] diff --git a/definitions/memcached_instance.rb b/definitions/memcached_instance.rb index 77118b1..d763e10 100644 --- a/definitions/memcached_instance.rb +++ b/definitions/memcached_instance.rb @@ -30,16 +30,16 @@ default_logger true cookbook 'memcached' options({ - :memory => node['memcached']['memory'], - :port => node['memcached']['port'], - :udp_port => node['memcached']['udp_port'], - :listen => node['memcached']['listen'], - :maxconn => node['memcached']['maxconn'], - :user => node['memcached']['user'], - :threads => node['memcached']['threads'], - :max_object_size => node['memcached']['max_object_size'], + :memory => node['memcached']['memory'], + :port => node['memcached']['port'], + :udp_port => node['memcached']['udp_port'], + :listen => node['memcached']['listen'], + :maxconn => node['memcached']['maxconn'], + :user => node['memcached']['user'], + :threads => node['memcached']['threads'], + :max_object_size => node['memcached']['max_object_size'], :experimental_options => Array(node['memcached']['experimental_options']), - :ulimit => node['memcached']['ulimit'] + :ulimit => node['memcached']['ulimit'] }.merge(opts)) end end diff --git a/recipes/configure.rb b/recipes/configure.rb index 5086c48..301b477 100644 --- a/recipes/configure.rb +++ b/recipes/configure.rb @@ -17,6 +17,8 @@ # limitations under the License. # +directory node['memcached']['logfilepath'] + service 'memcached' do action :enable supports :status => true, :start => true, :stop => true, :restart => true, :enable => true @@ -38,6 +40,7 @@ :udp_port => node['memcached']['udp_port'], :maxconn => node['memcached']['maxconn'], :memory => node['memcached']['memory'], + :logfilepath => node['memcached']['logfilepath'], :logfilename => node['memcached']['logfilename'], :threads => node['memcached']['threads'], :max_object_size => node['memcached']['max_object_size'] @@ -63,6 +66,7 @@ :udp_port => node['memcached']['udp_port'], :maxconn => node['memcached']['maxconn'], :memory => node['memcached']['memory'], + :logfilepath => node['memcached']['logfilepath'], :logfilename => node['memcached']['logfilename'], :threads => node['memcached']['threads'], :max_object_size => node['memcached']['max_object_size'], diff --git a/templates/default/memcached.conf.erb b/templates/default/memcached.conf.erb index 474f39a..78b7f76 100644 --- a/templates/default/memcached.conf.erb +++ b/templates/default/memcached.conf.erb @@ -12,7 +12,7 @@ -d # Log memcached's output to /var/log/memcached -logfile /var/log/<%= @logfilename %> +logfile <%= @logfilepath %><%= @logfilename %> # Be verbose -v