 d239e198a9
			
		
	
	d239e198a9
	
	
	
		
			
			Do not use the puppet file resource from within the swiftinit service provider. In puppet versions 4.4.0+ it has unexpected results. Instead use ruby File to write the init/service files directly. Change-Id: If0dc56e0742e591e3db3ed18154edf3489d5ef1a
		
			
				
	
	
		
			206 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # swift-init service management
 | |
| #
 | |
| # author Adam Vinsh <adam.vinsh@twcable.com>
 | |
| Puppet::Type.type(:service).provide :swiftinit, :parent => :service do
 | |
|   desc 'Manage swift services using swift-init'
 | |
| 
 | |
|   has_feature :enableable
 | |
|   has_feature :refreshable
 | |
| 
 | |
|   confine :any => [
 | |
|     Facter.value(:osfamily) == 'Debian',
 | |
|     Facter.value(:osfamily) == 'RedHat'
 | |
|   ]
 | |
| 
 | |
|   # Check if swift service is running using swift-init
 | |
|   def status
 | |
|     if swiftinit_run('status', false).exitstatus == 0
 | |
|       return :running
 | |
|     else
 | |
|       # Transition block for systemd systems.  If swift-init reports service is
 | |
|       # not running then send stop to systemctl so that service can be started
 | |
|       # with swift-init and fully managed by this provider.
 | |
|       if !default_provider_upstart?
 | |
|         systemctl_run('stop', [resource[:pattern]], false)
 | |
|         systemctl_run('disable', [resource[:pattern]], false)
 | |
|       end
 | |
|       return :stopped
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Start this swift service using swift-init
 | |
|   def start
 | |
|     swiftinit_run('start', true)
 | |
|   end
 | |
| 
 | |
|   # Stop this swift service using swift-init allowing
 | |
|   # current requests to finish on supporting servers
 | |
|   def stop
 | |
|     swiftinit_run('shutdown', true)
 | |
|   end
 | |
| 
 | |
|   # Restart this swift service using swift-init reload,
 | |
|   # graceful shutdown then restart on supporting servers
 | |
|   def restart
 | |
|     swiftinit_run('reload', true)
 | |
|   end
 | |
| 
 | |
|   def refresh
 | |
|     if (@paramaters[:ensure] == running)
 | |
|       provider.restart
 | |
|     else
 | |
|       debug 'Skipping restart, service is not running'
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Returns service enabled status first checking for init/systemd file
 | |
|   # presence then checking if file content matches this provider and not
 | |
|   # distro provided.  Also on Redhat/Debian checks systemctl status.
 | |
|   def enabled?
 | |
|     if default_provider_upstart?
 | |
|       if Puppet::FileSystem.exist?("/etc/init/#{resource[:pattern]}.conf")
 | |
|         current_conf = File.read("/etc/init/#{resource[:pattern]}.conf")
 | |
|         if current_conf.eql? upstart_template
 | |
|           return :true
 | |
|         end
 | |
|       else
 | |
|         return :false
 | |
|       end
 | |
|     elsif Puppet::FileSystem.exist?("/etc/systemd/system/#{resource[:pattern]}.service")
 | |
|       current_conf = File.read("/etc/systemd/system/#{resource[:pattern]}.service")
 | |
|       if !current_conf.eql? systemd_template
 | |
|         return :false
 | |
|       end
 | |
|       if systemctl_run('is-enabled', [resource[:pattern]], false).exitstatus == 0
 | |
|         return :true
 | |
|       end
 | |
|     else
 | |
|       return :false
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Enable the service at boot.  For Redhat and Debian create services
 | |
|   # file and notify systemctl.  For Ubuntu < 16.04 create init file.
 | |
|   def enable
 | |
|     if default_provider_upstart?
 | |
|       File.open("/etc/init/#{resource[:pattern]}.conf", 'w') { |file| file.write(upstart_template) }
 | |
|     else
 | |
|       File.open("/etc/systemd/system/#{resource[:pattern]}.service", 'w') { |file| file.write(systemd_template) }
 | |
|       systemctl_run('daemon-reload', nil, true)
 | |
|       systemctl_run('enable', [resource[:pattern]], false)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Disable the service at boot. For Redhat and Debain,
 | |
|   # delete services file and notify systemctl.  For Ubuntu < 16.04
 | |
|   # remove init file.
 | |
|   def disable
 | |
|     if default_provider_upstart?
 | |
|       File.delete("/etc/init/#{resource[:pattern]}.conf")
 | |
|     else
 | |
|       systemctl_run('disable', [resource[:pattern]], false)
 | |
|       File.delete("/etc/systemd/system/#{resource[:pattern]}.service")
 | |
|       systemctl_run('daemon-reload', nil, true)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Wrapper to handle swift-init calls on supported osfamily
 | |
|   def swiftinit_run(command, failonfail)
 | |
|     execute([['swift-init'], ["#{type}-#{subtype}#{manifest}"], [command]],
 | |
|             :failonfail => failonfail)
 | |
|   rescue Puppet::ExecutionFailure => detail
 | |
|     @resource.fail Puppet::Error,
 | |
|                    "swift-init #{type}-#{subtype}#{manifest} #{command}
 | |
|                    failed with: #{@resource.ref}: #{detail}", detail
 | |
|   end
 | |
| 
 | |
|   # Wrapper to handle systemctl calls on supported osfamily
 | |
|   def systemctl_run(command, unit_file, failonfail)
 | |
|     if unit_file
 | |
|       execute([['systemctl'], [command], [unit_file]], :failonfail => failonfail)
 | |
|     else
 | |
|       execute([['systemctl'], [command]], :failonfail => failonfail)
 | |
|     end
 | |
|   rescue Puppet::ExecutionFailure => detail
 | |
|     @resource.fail Puppet::Error,
 | |
|                    "systemctl #{command} #{unit_file}
 | |
|                    failed with: #{@resource.ref}: #{detail}", detail
 | |
|   end
 | |
| 
 | |
|   # Split the service type off of name
 | |
|   # type can be object, account, container.
 | |
|   def type
 | |
|     resource[:name].split(/-/)[1]
 | |
|   end
 | |
| 
 | |
|   # Split the service subtype off of name
 | |
|   # subtype can be:
 | |
|   # For type account:   auditor, reaper, replicator, server.
 | |
|   # For type container: auditor, replicator, server, sync, updater.
 | |
|   # For type object:    auditor, replicator, server, updater, expirer.
 | |
|   # For type proxy:     server.
 | |
|   def subtype
 | |
|     resource[:name].split(/-/)[2]
 | |
|   end
 | |
| 
 | |
|   # In this provider 'manifest' is the name of the config file that the service
 | |
|   # uses to run. If the config file is a default name ex: object-server.conf.
 | |
|   # then swift-init can be called without specifying the config file.
 | |
|   # TODO add logic to start servers using multiple config files, used to run
 | |
|   # swift with a dedicated replication network.
 | |
|   def manifest
 | |
|     if "#{resource[:manifest]}" == "#{type}-server.conf"
 | |
|       return nil
 | |
|     elsif "#{resource[:manifest]}" == 'object-expirer.conf'
 | |
|       return nil
 | |
|     else return ".#{resource[:manifest].split('.conf')[1]}"
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # If OS is ubuntu and < 16 then assume upstart default provider.
 | |
|   def default_provider_upstart?
 | |
|     if Facter.value(:operatingsystem) == 'Ubuntu' && Facter.value(:operatingsystemmajrelease) < '16'
 | |
|       return true
 | |
|     else
 | |
|       return false
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Begin service template boot section.
 | |
|   def upstart_template
 | |
|     %(# swift-#{type}-#{subtype}
 | |
| #
 | |
| # Starts the swift-#{type}-#{subtype}.
 | |
| 
 | |
| description     "SWIFT #{type} #{subtype}"
 | |
| author          "Puppet"
 | |
| 
 | |
| start on runlevel [2345]
 | |
| stop on runlevel [016]
 | |
| 
 | |
| pre-start script
 | |
| if [ -f /etc/swift/#{resource[:manifest]} ]; then
 | |
|   exec /usr/bin/swift-init #{type}-#{subtype} start
 | |
| else
 | |
|   exit 1
 | |
| fi
 | |
| end script
 | |
| 
 | |
| post-stop exec /usr/bin/swift-init #{type}-#{subtype} stop)
 | |
|   end
 | |
| 
 | |
|   def systemd_template
 | |
|     %([Unit]
 | |
| Description=OpenStack "SWIFT #{type} #{subtype}"
 | |
| After=syslog.target network.target
 | |
| 
 | |
| [Service]
 | |
| Type=forking
 | |
| User=root
 | |
| ExecStart=/usr/bin/swift-init #{type}-#{subtype} start
 | |
| 
 | |
| [Install]
 | |
| WantedBy=multi-user.target)
 | |
|   end
 | |
| end
 |