cookbooks/fb_timers/libraries/timers.rb (71 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
#
# Copyright (c) 2016-present, Facebook, Inc.
# All rights reserved.
#
# 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.
#
module FB
class Systemd
# Path on the system where systemd units live.
# This should be the path that `systemctl link` places the unit files at.
UNIT_PATH = '/etc/systemd/system'.freeze
# Sensible defaults for timer attributes.
TIMER_DEFAULTS = {
# name is inferred from the name within node['fb_timers']['jobs']
# commands is required
# calendar is required (unless one of the On... options below are set)
'accuracy' => '1s',
'autostart' => true,
'command' => nil,
'description' => nil,
'only_if' => nil,
'persistent' => false,
'service_options' => {},
'service_unit_options' => {},
'splay' => '0s',
'syslog' => false,
'timeout_stop' => '90s',
'timeout' => nil,
'timer_options' => {},
'timer_unit_options' => {},
}.freeze
REQUIRED_TIMER_KEYS = ['calendar', 'commands', 'name'].freeze
ALTERNATE_CALENDAR_KEYS = [
'OnActiveSec',
'OnBootSec',
'OnStartupSec',
'OnUnitActiveSec',
'OnUnitInactiveSec',
].freeze
TIMER_COOKBOOK_KEYS = (TIMER_DEFAULTS.keys + REQUIRED_TIMER_KEYS).freeze
module Calendar
def every(value = nil)
Every.new(value)
end
class Every
def initialize(value = nil)
@value = value
end
# Plural generators (do take a value):
def hours
fail "A value is required for #{__method__}" unless @value
fail 'A value cannot be > 24' if @value > 24
fail 'A value cannot be <= 0' if @value <= 0
return 'daily' if @value == 24
"0/#{@value}:0:0"
end
def minutes
fail "A value is required for #{__method__}" unless @value
fail 'A value cannot be > 60' if @value > 60
fail 'A value cannot be <= 0' if @value <= 0
return 'hourly' if @value == 60
"*:0/#{@value}:0"
end
# Singular generators (don't take a value):
def weekday
fail "A value cannot be provided for #{__method__}" if @value
'Mon..Fri'
end
def week
fail "A value cannot be provided for #{__method__}" if @value
'weekly'
end
def day
fail "A value cannot be provided for #{__method__}" if @value
'daily'
end
def month
fail "A value cannot be provided for #{__method__}" if @value
'monthly'
end
end
module_function :every
end
end
end