perfkitbenchmarker/linux_packages/tomcat.py (54 lines of code) (raw):
# Copyright 2016 PerfKitBenchmarker Authors. 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 containing Apache Tomcat installation and cleanup functions.
Installing Tomcat via this module makes some changes to the default settings:
* Http11Nio2Protocol is used (non-blocking).
* Request logging is disabled.
* The session timeout is decreased to 1 minute.
https://tomcat.apache.org/
"""
import posixpath
from absl import flags
from perfkitbenchmarker import linux_packages
TOMCAT_URL = (
'https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.28/bin/'
'apache-tomcat-8.0.28.tar.gz'
)
TOMCAT_DIR = posixpath.join(linux_packages.INSTALL_DIR, 'tomcat')
TOMCAT_HTTP_PORT = 8080
flags.DEFINE_string('tomcat_url', TOMCAT_URL, 'Tomcat 8 download URL.')
FLAGS = flags.FLAGS
# Start / stop scripts
_TOMCAT_START = posixpath.join(TOMCAT_DIR, 'bin', 'startup.sh')
_TOMCAT_STOP = posixpath.join(TOMCAT_DIR, 'bin', 'shutdown.sh')
_TOMCAT_SERVER_CONF = posixpath.join(TOMCAT_DIR, 'conf', 'server.xml')
_TOMCAT_LOGGING_CONF = posixpath.join(TOMCAT_DIR, 'conf', 'logging.properties')
_TOMCAT_WEB_CONF = posixpath.join(TOMCAT_DIR, 'conf', 'web.xml')
_TOMCAT_PROTOCOL = 'org.apache.coyote.http11.Http11Nio2Protocol'
def _Install(vm):
vm.Install('openjdk')
vm.Install('curl')
vm.RemoteCommand(
(
'mkdir -p {0} && curl -L {1} | tar -C {0} --strip-components 1 -xzf -'
).format(TOMCAT_DIR, FLAGS.tomcat_url)
)
# Use a non-blocking protocool, and disable access logging (which isn't very
# helpful during load tests).
vm.RemoteCommand(
(
"""sed -i.bak -e '/Connector port="8080"/ """
's/protocol="[^"]\\+"/protocol="{}"/\' '
'-e "/org.apache.catalina.valves.AccessLogValve/,+3d" '
'{}'
).format(_TOMCAT_PROTOCOL, _TOMCAT_SERVER_CONF)
)
# Quiet down localhost logs.
vm.RemoteCommand(
(
'sed -i.bak '
r"-e 's/\(2localhost.org.apache.*.level\)\s\+=.*$/\1 = WARN/' "
' {}'
).format(_TOMCAT_LOGGING_CONF)
)
# Expire sessions quickly.
vm.RemoteCommand(
(
'sed -i.bak '
r"-e 's,\(<session-timeout>\)30\(</session-timeout>\),\11\2,' "
' {}'
).format(_TOMCAT_WEB_CONF)
)
def YumInstall(vm):
"""Installs the Tomcat package on the VM."""
_Install(vm)
def AptInstall(vm):
"""Installs the Tomcat package on the VM."""
_Install(vm)
def Start(vm):
"""Starts Tomcat on "vm"."""
vm.RemoteCommand('bash ' + _TOMCAT_START)
def Stop(vm):
"""Stops Tomcat on "vm"."""
vm.RemoteCommand('bash ' + _TOMCAT_STOP)