lib/taste_tester/state.rb (115 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
# Copyright 2013-present Facebook
#
# 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.
require 'fileutils'
require 'socket'
require 'timeout'
require 'chef/mash'
require 'between_meals/util'
require 'taste_tester/config'
module TasteTester
# State of taste-tester processes
class State
include TasteTester::Config
extend TasteTester::Logging
include ::BetweenMeals::Util
def initialize
ref_dir = File.dirname(File.expand_path(TasteTester::Config.ref_file))
unless File.directory?(ref_dir)
begin
FileUtils.mkpath(ref_dir)
rescue StandardError => e
logger.error("Chef temp dir #{ref_dir} missing and can't be created")
logger.error(e)
exit(1)
end
end
end
def port
TasteTester::State.read(:port)
end
def port=(port)
write(:port, port)
end
def ssl
TasteTester::State.read(:ssl)
end
def ssl=(ssl)
write(:ssl, ssl)
end
def logging
TasteTester::State.read(:logging)
end
def logging=(logging)
write(:logging, logging)
end
def ssh
TasteTester::State.read(:ssh)
end
def ssh=(ssh)
write(:ssh, ssh)
end
def ref
TasteTester::State.read(:ref)
end
def ref=(ref)
write(:ref, ref)
end
def last_upload_time
TasteTester::State.read(:last_upload_time)
end
def last_upload_time=(time)
write(:last_upload_time, time)
end
def bundle
val = TasteTester::State.read(:bundle)
# promote value to symbol to match config value.
return :compatible if val == 'compatible'
val
end
def bundle=(bundle)
write(:bundle, bundle)
end
def update(vals)
merge(vals)
end
def self.port
TasteTester::State.read(:port)
end
def wipe
# Save port between restarts. It might not be free when we restart, but
# at least we'll try to keep the same
port = self.port
real_wipe
write(:port, port)
end
def real_wipe
if TasteTester::Config.ref_file &&
File.exist?(TasteTester::Config.ref_file)
File.delete(TasteTester::Config.ref_file)
end
end
def self.read(key)
JSON.parse(File.read(TasteTester::Config.ref_file))[key.to_s]
rescue StandardError => e
logger.debug(e)
nil
end
private
def write(key, val)
merge({ key => val })
end
def merge(vals)
# we generally use symbols for the keys, but to/from JSON will
# give us strings, and thus duplicate keys, which is bad. So
# use a Mash
state = Mash.new
begin
state = JSON.parse(File.read(TasteTester::Config.ref_file))
rescue StandardError
state = {}
end
state.merge!(vals)
ff = File.open(
TasteTester::Config.ref_file,
'w',
)
ff.write(state.to_json)
ff.close
rescue StandardError => e
logger.error('Unable to write the reffile')
logger.debug(e)
exit 0
end
end
end