mirror of https://github.com/zulip/zulip.git
puppet: Pull in pinned puppet modules.
Using puppet modules from the puppet forge judiciously will allow us to simplify the configuration somewhat; this specifically pulls in the stdlib module, which we were already using parts of.
This commit is contained in:
parent
6107679f61
commit
87a109e3e0
|
@ -28,11 +28,6 @@ Files: docs/code-of-conduct.md
|
||||||
Copyright: 2017, Kandra Labs Inc.
|
Copyright: 2017, Kandra Labs Inc.
|
||||||
License: CC-BY-SA-4.0
|
License: CC-BY-SA-4.0
|
||||||
|
|
||||||
Files: puppet/zulip/lib/puppet/parser/functions/join.rb puppet/zulip/lib/puppet/parser/functions/range.rb
|
|
||||||
Copyright: 2011, Krzysztof Wilczynski
|
|
||||||
2011, Puppet Labs Inc
|
|
||||||
License: Apache-2.0
|
|
||||||
|
|
||||||
Files: puppet/zulip/files/nagios_plugins/zulip_base/check_debian_packages
|
Files: puppet/zulip/files/nagios_plugins/zulip_base/check_debian_packages
|
||||||
Copyright: 2005 Francesc Guasch
|
Copyright: 2005 Francesc Guasch
|
||||||
License: GPL-2.0
|
License: GPL-2.0
|
||||||
|
|
|
@ -256,6 +256,14 @@ wrapper to access the desired version conveniently and efficiently
|
||||||
`/srv/zulip-yarn`. We don't do anything special to try to manage
|
`/srv/zulip-yarn`. We don't do anything special to try to manage
|
||||||
multiple versions of `yarn`.
|
multiple versions of `yarn`.
|
||||||
|
|
||||||
|
## Puppet packages
|
||||||
|
|
||||||
|
Third-party puppet modules are downloaded from the Puppet Forge into
|
||||||
|
subdirectories under `/srv/zulip-puppet-cache`, hashed based on their
|
||||||
|
versions; the latest is always symlinked as
|
||||||
|
`/srv/zulip-puppet-cache/current`. `zulip-puppet-apply` installs
|
||||||
|
these dependencies immediately before they are needed.
|
||||||
|
|
||||||
## Other third-party and generated files
|
## Other third-party and generated files
|
||||||
|
|
||||||
In this section, we discuss the other third-party dependencies,
|
In this section, we discuss the other third-party dependencies,
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
puppetlabs-stdlib: 7.1.0
|
|
@ -1,43 +0,0 @@
|
||||||
# Taken from https://github.com/puppetlabs/puppetlabs-stdlib/blob/19cdf29f27c3e5005ee441d1ec46d7da27a0f777/lib/puppet/parser/functions/join.rb
|
|
||||||
#
|
|
||||||
# join.rb
|
|
||||||
#
|
|
||||||
module Puppet::Parser::Functions
|
|
||||||
newfunction(:join, :type => :rvalue, :doc => <<-DOC
|
|
||||||
This function joins an array into a string using a separator.
|
|
||||||
|
|
||||||
*Examples:*
|
|
||||||
|
|
||||||
join(['a','b','c'], ",")
|
|
||||||
|
|
||||||
Would result in: "a,b,c"
|
|
||||||
|
|
||||||
Note: from Puppet 5.4.0, the compatible function with the same name in Puppet core
|
|
||||||
will be used instead of this function.
|
|
||||||
DOC
|
|
||||||
) do |arguments|
|
|
||||||
|
|
||||||
# Technically we support two arguments but only first is mandatory ...
|
|
||||||
raise(Puppet::ParseError, "join(): Wrong number of arguments given (#{arguments.size} for 1)") if arguments.empty?
|
|
||||||
|
|
||||||
array = arguments[0]
|
|
||||||
|
|
||||||
unless array.is_a?(Array)
|
|
||||||
raise(Puppet::ParseError, 'join(): Requires array to work with')
|
|
||||||
end
|
|
||||||
|
|
||||||
suffix = arguments[1] if arguments[1]
|
|
||||||
|
|
||||||
if suffix
|
|
||||||
unless suffix.is_a?(String)
|
|
||||||
raise(Puppet::ParseError, 'join(): Requires string to work with')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
result = suffix ? array.join(suffix) : array.join
|
|
||||||
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# vim: set ts=2 sw=2 et :
|
|
|
@ -1,27 +0,0 @@
|
||||||
# Taken from https://github.com/puppetlabs/puppetlabs-stdlib/blob/19cdf29f27c3e5005ee441d1ec46d7da27a0f777/lib/puppet/parser/functions/keys.rb
|
|
||||||
#
|
|
||||||
# keys.rb
|
|
||||||
#
|
|
||||||
module Puppet::Parser::Functions
|
|
||||||
newfunction(:keys, :type => :rvalue, :doc => <<-DOC
|
|
||||||
Returns the keys of a hash as an array.
|
|
||||||
Note: from Puppet 5.5.0, the compatible function with the same name in Puppet core
|
|
||||||
will be used instead of this function.
|
|
||||||
DOC
|
|
||||||
) do |arguments|
|
|
||||||
|
|
||||||
raise(Puppet::ParseError, "keys(): Wrong number of arguments given (#{arguments.size} for 1)") if arguments.empty?
|
|
||||||
|
|
||||||
hash = arguments[0]
|
|
||||||
|
|
||||||
unless hash.is_a?(Hash)
|
|
||||||
raise(Puppet::ParseError, 'keys(): Requires hash to work with')
|
|
||||||
end
|
|
||||||
|
|
||||||
result = hash.keys
|
|
||||||
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# vim: set ts=2 sw=2 et :
|
|
|
@ -1,90 +0,0 @@
|
||||||
# Taken from https://github.com/puppetlabs/puppetlabs-stdlib/blob/19cdf29f27c3e5005ee441d1ec46d7da27a0f777/lib/puppet/parser/functions/range.rb
|
|
||||||
#
|
|
||||||
# range.rb
|
|
||||||
#
|
|
||||||
# TODO(Krzysztof Wilczynski): We probably need to approach numeric values differently ...
|
|
||||||
module Puppet::Parser::Functions
|
|
||||||
newfunction(:range, :type => :rvalue, :doc => <<-DOC
|
|
||||||
When given range in the form of (start, stop) it will extrapolate a range as
|
|
||||||
an array.
|
|
||||||
|
|
||||||
*Examples:*
|
|
||||||
|
|
||||||
range("0", "9")
|
|
||||||
|
|
||||||
Will return: [0,1,2,3,4,5,6,7,8,9]
|
|
||||||
|
|
||||||
range("00", "09")
|
|
||||||
|
|
||||||
Will return: [0,1,2,3,4,5,6,7,8,9] (Zero padded strings are converted to
|
|
||||||
integers automatically)
|
|
||||||
|
|
||||||
range("a", "c")
|
|
||||||
|
|
||||||
Will return: ["a","b","c"]
|
|
||||||
|
|
||||||
range("host01", "host10")
|
|
||||||
Will return: ["host01", "host02", ..., "host09", "host10"]
|
|
||||||
NB Be explicit in including trailing zeros. Otherwise the underlying ruby function will fail.
|
|
||||||
|
|
||||||
Passing a third argument will cause the generated range to step by that
|
|
||||||
interval, e.g.
|
|
||||||
|
|
||||||
range("0", "9", "2")
|
|
||||||
|
|
||||||
Will return: [0,2,4,6,8]
|
|
||||||
|
|
||||||
The Puppet Language support Integer and Float ranges by using the type system. Those are suitable for
|
|
||||||
iterating a given number of times. Also see the step() function in Puppet for skipping values.
|
|
||||||
|
|
||||||
Integer[0, 9].each |$x| { notice($x) } # notices 0, 1, 2, ... 9
|
|
||||||
DOC
|
|
||||||
) do |arguments|
|
|
||||||
|
|
||||||
raise(Puppet::ParseError, 'range(): Wrong number of arguments given (0 for 1)') if arguments.empty?
|
|
||||||
|
|
||||||
if arguments.size > 1
|
|
||||||
start = arguments[0]
|
|
||||||
stop = arguments[1]
|
|
||||||
step = arguments[2].nil? ? 1 : arguments[2].to_i.abs
|
|
||||||
|
|
||||||
type = '..' # Use the simplest type of Range available in Ruby
|
|
||||||
|
|
||||||
else # arguments.size == 1
|
|
||||||
value = arguments[0]
|
|
||||||
|
|
||||||
m = value.match(%r{^(\w+)(\.\.\.?|\-)(\w+)$})
|
|
||||||
if m
|
|
||||||
start = m[1]
|
|
||||||
stop = m[3]
|
|
||||||
|
|
||||||
type = m[2]
|
|
||||||
step = 1
|
|
||||||
elsif value =~ %r{^.+$}
|
|
||||||
raise(Puppet::ParseError, "range(): Unable to compute range from the value: #{value}")
|
|
||||||
else
|
|
||||||
raise(Puppet::ParseError, "range(): Unknown range format: #{value}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# If we were given an integer, ensure we work with one
|
|
||||||
if start.to_s =~ %r{^\d+$}
|
|
||||||
start = start.to_i
|
|
||||||
stop = stop.to_i
|
|
||||||
else
|
|
||||||
start = start.to_s
|
|
||||||
stop = stop.to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
range = case type
|
|
||||||
when %r{^(..|-)$} then (start..stop)
|
|
||||||
when '...' then (start...stop) # Exclusive of last element
|
|
||||||
end
|
|
||||||
|
|
||||||
result = range.step(step).to_a
|
|
||||||
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# vim: set ts=2 sw=2 et :
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from .zulip_tools import parse_os_release, run
|
||||||
|
|
||||||
|
ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
ZULIP_SRV_PATH = "/srv"
|
||||||
|
|
||||||
|
PUPPET_MODULES_CACHE_PATH = os.path.join(ZULIP_SRV_PATH, "zulip-puppet-cache")
|
||||||
|
PUPPET_DEPS_FILE_PATH = os.path.join(ZULIP_PATH, "puppet/deps.yaml")
|
||||||
|
PUPPET_THIRDPARTY = os.path.join(PUPPET_MODULES_CACHE_PATH, "current")
|
||||||
|
|
||||||
|
|
||||||
|
def generate_sha1sum_puppet_modules() -> str:
|
||||||
|
data = {}
|
||||||
|
with open(PUPPET_DEPS_FILE_PATH, "r") as fb:
|
||||||
|
data["deps.yaml"] = fb.read().strip()
|
||||||
|
data["puppet-version"] = subprocess.check_output(
|
||||||
|
# This is 10x faster than `puppet --version`
|
||||||
|
["ruby", "-r", "puppet/version", "-e", "puts Puppet.version"],
|
||||||
|
universal_newlines=True,
|
||||||
|
).strip()
|
||||||
|
|
||||||
|
sha1sum = hashlib.sha1()
|
||||||
|
sha1sum.update(json.dumps(data, sort_keys=True).encode("utf-8"))
|
||||||
|
return sha1sum.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def setup_puppet_modules() -> None:
|
||||||
|
sha1sum = generate_sha1sum_puppet_modules()
|
||||||
|
target_path = os.path.join(PUPPET_MODULES_CACHE_PATH, sha1sum)
|
||||||
|
success_stamp = os.path.join(target_path, ".success-stamp")
|
||||||
|
# Check if a cached version already exists
|
||||||
|
if not os.path.exists(success_stamp):
|
||||||
|
do_puppet_module_install(target_path, success_stamp)
|
||||||
|
|
||||||
|
if os.path.islink(PUPPET_THIRDPARTY):
|
||||||
|
os.remove(PUPPET_THIRDPARTY)
|
||||||
|
elif os.path.isdir(PUPPET_THIRDPARTY):
|
||||||
|
shutil.rmtree(PUPPET_THIRDPARTY)
|
||||||
|
os.symlink(target_path, PUPPET_THIRDPARTY)
|
||||||
|
|
||||||
|
|
||||||
|
def do_puppet_module_install(
|
||||||
|
target_path: str,
|
||||||
|
success_stamp: str,
|
||||||
|
) -> None:
|
||||||
|
# This is to suppress Puppet warnings with ruby 2.7.
|
||||||
|
distro_info = parse_os_release()
|
||||||
|
puppet_env = os.environ.copy()
|
||||||
|
if (distro_info["ID"], distro_info["VERSION_ID"]) in [("ubuntu", "20.04")]:
|
||||||
|
puppet_env["RUBYOPT"] = "-W0"
|
||||||
|
|
||||||
|
os.makedirs(target_path, exist_ok=True)
|
||||||
|
with open(PUPPET_DEPS_FILE_PATH, "r") as yaml_file:
|
||||||
|
deps = yaml.safe_load(yaml_file)
|
||||||
|
for module, version in deps.items():
|
||||||
|
run(
|
||||||
|
[
|
||||||
|
"puppet",
|
||||||
|
"module",
|
||||||
|
"--modulepath",
|
||||||
|
target_path,
|
||||||
|
"install",
|
||||||
|
module,
|
||||||
|
"--version",
|
||||||
|
version,
|
||||||
|
],
|
||||||
|
env=puppet_env,
|
||||||
|
)
|
||||||
|
with open(success_stamp, "w"):
|
||||||
|
pass
|
|
@ -9,6 +9,7 @@ import tempfile
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
|
from lib.puppet_cache import setup_puppet_modules
|
||||||
from lib.zulip_tools import assert_running_as_root, parse_os_release
|
from lib.zulip_tools import assert_running_as_root, parse_os_release
|
||||||
|
|
||||||
assert_running_as_root()
|
assert_running_as_root()
|
||||||
|
@ -25,6 +26,8 @@ args, extra_args = parser.parse_known_args()
|
||||||
config = configparser.RawConfigParser()
|
config = configparser.RawConfigParser()
|
||||||
config.read(args.config)
|
config.read(args.config)
|
||||||
|
|
||||||
|
setup_puppet_modules()
|
||||||
|
|
||||||
distro_info = parse_os_release()
|
distro_info = parse_os_release()
|
||||||
puppet_config = """
|
puppet_config = """
|
||||||
Exec { path => "/usr/sbin:/usr/bin:/sbin:/bin" }
|
Exec { path => "/usr/sbin:/usr/bin:/sbin:/bin" }
|
||||||
|
@ -36,7 +39,13 @@ for pclass in re.split(r"\s*,\s*", config.get("machine", "puppet_classes")):
|
||||||
# We use the Puppet configuration from the same Zulip checkout as this script
|
# We use the Puppet configuration from the same Zulip checkout as this script
|
||||||
scripts_path = os.path.join(BASE_DIR, "scripts")
|
scripts_path = os.path.join(BASE_DIR, "scripts")
|
||||||
puppet_module_path = os.path.join(BASE_DIR, "puppet")
|
puppet_module_path = os.path.join(BASE_DIR, "puppet")
|
||||||
puppet_cmd = ["puppet", "apply", f"--modulepath={puppet_module_path}", "-e", puppet_config]
|
puppet_cmd = [
|
||||||
|
"puppet",
|
||||||
|
"apply",
|
||||||
|
f"--modulepath={puppet_module_path}:/srv/zulip-puppet-cache/current",
|
||||||
|
"-e",
|
||||||
|
puppet_config,
|
||||||
|
]
|
||||||
if args.noop:
|
if args.noop:
|
||||||
puppet_cmd += ["--noop"]
|
puppet_cmd += ["--noop"]
|
||||||
puppet_cmd += extra_args
|
puppet_cmd += extra_args
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
# Exclude some directories and files from lint checking
|
# Exclude some directories and files from lint checking
|
||||||
EXCLUDED_FILES = [
|
EXCLUDED_FILES = [
|
||||||
# Third-party code that doesn't match our style
|
# Third-party code that doesn't match our style
|
||||||
"puppet/zulip/lib/puppet/parser/functions/join.rb",
|
|
||||||
"puppet/zulip/lib/puppet/parser/functions/range.rb",
|
|
||||||
"puppet/zulip/files/nagios_plugins/zulip_nagios_server/check_website_response.sh",
|
"puppet/zulip/files/nagios_plugins/zulip_nagios_server/check_website_response.sh",
|
||||||
"scripts/lib/third",
|
"scripts/lib/third",
|
||||||
"static/third",
|
"static/third",
|
||||||
|
|
Loading…
Reference in New Issue