# # Cookbook Name:: swift # Recipe:: ring-repo # # Copyright 2012, Rackspace US, 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. # # This recipe creates a git ring repository on the management node # for purposes of ring synchronization # platform_options = node["swift"]["platform"] ring_options = node["swift"]["ring"] platform_options["git_packages"].each do |pkg| package pkg do action :install end end service "xinetd" do supports :status => false, :restart => true action [ :enable, :start ] only_if { platform?(%w{centos redhat fedora}) } end execute "create empty git repo" do cwd "/tmp" umask 022 command "mkdir $$; cd $$; git init; echo \"backups\" \> .gitignore; git add .gitignore; git commit -m 'initial commit' --author='chef '; git push file:///#{platform_options["git_dir"]}/rings master" user "swift" action :nothing end directory "git-directory" do path "#{platform_options["git_dir"]}/rings" owner "swift" group "swift" mode "0755" recursive true action :create end execute "initialize git repo" do cwd "#{platform_options["git_dir"]}/rings" umask 022 user "swift" command "git init --bare && touch git-daemon-export-ok" creates "#{platform_options["git_dir"]}/rings/config" action :run notifies :run, "execute[create empty git repo]", :immediately end # epel/f-17 missing systemd-ified inits # https://bugzilla.redhat.com/show_bug.cgi?id=737183 template "/etc/systemd/system/git.service" do owner "root" group "root" mode "0644" source "simple-systemd-config.erb" variables({ :description => "Git daemon service", :user => "nobody", :exec => "/usr/libexec/git-core/git-daemon " + "--base-path=/var/lib/git --export-all --user-path=public_git" + "--syslog --verbose" }) only_if { platform?(%w{fedora}) } end case node["platform"] when "centos","redhat","fedora" service "git-daemon" do service_name platform_options["git_service"] action [ :enable ] end when "ubuntu","debian" service "git-daemon" do service_name platform_options["git_service"] action [ :enable, :start ] end end cookbook_file "/etc/default/git-daemon" do owner "root" group "root" mode "644" source "git-daemon.default" action :create notifies :restart, "service[git-daemon]", :immediately not_if { platform?(%w{fedora centos redhat}) } end directory "/etc/swift/ring-workspace" do owner "swift" group "swift" mode "0755" action :create end execute "checkout-rings" do cwd "/etc/swift/ring-workspace" command "git clone file://#{platform_options["git_dir"]}/rings" user "swift" creates "/etc/swift/ring-workspace/rings" end [ "account", "container", "object" ].each do |ring_type| part_power = ring_options["part_power"] min_part_hours = ring_options["min_part_hours"] replicas = ring_options["replicas"] Chef::Log.info("Building initial ring #{ring_type} using part_power=#{part_power}, " + "min_part_hours=#{min_part_hours}, replicas=#{replicas}") execute "add #{ring_type}.builder" do cwd "/etc/swift/ring-workspace/rings" command "git add #{ring_type}.builder && git commit -m 'initial ring builders' --author='chef '" user "swift" action :nothing end execute "create #{ring_type} builder" do cwd "/etc/swift/ring-workspace/rings" command "swift-ring-builder #{ring_type}.builder create #{part_power} #{replicas} #{min_part_hours}" user "swift" creates "/etc/swift/ring-workspace/rings/#{ring_type}.builder" notifies :run, "execute[add #{ring_type}.builder]", :immediate end end bash "rebuild-rings" do action :nothing cwd "/etc/swift/ring-workspace/rings" user "swift" code <<-EOF set -x # Should this be done? git reset --hard git clean -df ../generate-rings.sh for d in object account container; do swift-ring-builder ${d}.builder; done add=0 if test -n "$(find . -maxdepth 1 -name '*gz' -print -quit)" then git add *builder *gz add=1 else git add *builder add=1 fi if [ $add -ne 0 ] then git commit -m "Autobuild of rings on $(date +%Y%m%d) by Chef" --author="chef " git push fi EOF end openstack_object_storage_ring_script "/etc/swift/ring-workspace/generate-rings.sh" do owner "swift" group "swift" mode "0700" ring_path "/etc/swift/ring-workspace/rings" action :ensure_exists notifies :run, "bash[rebuild-rings]", :immediate end