Browse Source

Merge "Remove ReloadOnSighupTest"

changes/62/538462/1
Zuul 5 years ago committed by Gerrit Code Review
parent
commit
5ea1460c9f
  1. 10
      heat_integrationtests/common/config.py
  2. 142
      heat_integrationtests/functional/test_reload_on_sighup.py
  3. 11
      heat_integrationtests/prepare_test_env.sh

10
heat_integrationtests/common/config.py

@ -117,16 +117,6 @@ HeatGroup = [
default=120,
help="Timeout in seconds to wait for connectivity to "
"server."),
cfg.IntOpt('sighup_timeout',
default=120,
help="Timeout in seconds to wait for adding or removing child "
"process after receiving of sighup signal"),
cfg.IntOpt('sighup_config_edit_retries',
default=10,
help='Count of retries to edit config file during sighup. If '
'another worker already edit config file, file can be '
'busy, so need to wait and try edit file again.'),
]

142
heat_integrationtests/functional/test_reload_on_sighup.py

@ -1,142 +0,0 @@
# 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.
import re
import subprocess
import time
import eventlet
from oslo_concurrency import processutils
from six.moves import configparser
from heat_integrationtests.functional import functional_base
class ReloadOnSighupTest(functional_base.FunctionalTestsBase):
def setUp(self):
self.config_file = "/etc/heat/heat.conf"
super(ReloadOnSighupTest, self).setUp()
def _is_mod_wsgi_daemon(self, service):
process = ''.join(['wsgi:',
service[:9]]).replace('_', '-').encode('utf-8')
s = subprocess.Popen(["ps", "ax"], stdout=subprocess.PIPE)
for x in s.stdout:
if re.search(process, x):
return True
def _set_config_value(self, service, key, value):
config = configparser.ConfigParser()
# NOTE(prazumovsky): If there are several workers, there can be
# situation, when one thread opens self.config_file for writing
# (so config_file erases with opening), in that moment other thread
# intercepts to this file and try to set config option value, i.e.
# write to file, which is already erased by first thread, so,
# NoSectionError raised. So, should wait until first thread writes to
# config_file.
retries_count = self.conf.sighup_config_edit_retries
while True:
config.read(self.config_file)
try:
config.set(service, key, str(value))
except configparser.NoSectionError:
if retries_count <= 0:
raise
retries_count -= 1
eventlet.sleep(1)
else:
break
with open(self.config_file, 'w') as f:
config.write(f)
def _get_config_value(self, service, key):
config = configparser.ConfigParser()
config.read(self.config_file)
val = config.get(service, key)
return val
def _get_heat_api_pids(self, service):
# get the pids of all heat-api processes
if service == "heat_api":
process = "heat-api|grep -Ev 'grep|cloudwatch|cfn'"
else:
process = "%s|grep -Ev 'grep'" % service.replace('_', '-')
cmd = "ps -ef|grep %s|awk '{print $2}'" % process
out, err = processutils.execute(cmd, shell=True)
self.assertIsNotNone(out, "heat-api service not running. %s" % err)
pids = filter(None, out.split('\n'))
# get the parent pids of all heat-api processes
cmd = "ps -ef|grep %s|awk '{print $3}'" % process
out, _ = processutils.execute(cmd, shell=True)
parent_pids = filter(None, out.split('\n'))
heat_api_parent = list(set(pids) & set(parent_pids))[0]
heat_api_children = list(set(pids) - set(parent_pids))
return heat_api_parent, heat_api_children
def _change_config(self, service, old_workers, new_workers):
pre_reload_parent, pre_reload_children = self._get_heat_api_pids(
service)
self.assertEqual(old_workers, len(pre_reload_children))
# change the config values
self._set_config_value(service, 'workers', new_workers)
cmd = "kill -HUP %s" % pre_reload_parent
processutils.execute(cmd, shell=True)
# wait till heat-api reloads
start_time = time.time()
while time.time() - start_time < self.conf.sighup_timeout:
post_reload_parent, post_reload_children = self._get_heat_api_pids(
service)
intersect = set(post_reload_children) & set(pre_reload_children)
if (new_workers == len(post_reload_children)
and pre_reload_parent == post_reload_parent
and intersect == set()):
break
eventlet.sleep(1)
self.assertEqual(pre_reload_parent, post_reload_parent)
self.assertEqual(new_workers, len(post_reload_children))
# test if all child processes are newly created
self.assertEqual(set(post_reload_children) & set(pre_reload_children),
set())
def _reload(self, service):
old_workers = int(self._get_config_value(service, 'workers'))
new_workers = old_workers + 1
self.addCleanup(self._set_config_value, service, 'workers',
old_workers)
self._change_config(service, old_workers, new_workers)
# revert all the changes made
self._change_config(service, new_workers, old_workers)
def _reload_on_sighup(self, service):
if not self._is_mod_wsgi_daemon(service):
self._reload(service)
else:
self.skipTest('Skipping Test, Service running under httpd.')
def test_api_reload_on_sighup(self):
self._reload_on_sighup('heat_api')
def test_api_cfn_reload_on_sighup(self):
self._reload_on_sighup('heat_api_cfn')
def test_api_cloudwatch_on_sighup(self):
self._reload_on_sighup('heat_api_cloudwatch')

11
heat_integrationtests/prepare_test_env.sh

@ -51,11 +51,6 @@ function _config_iniset {
iniset $conf_file heat_plugin image_ref Fedora-Cloud-Base-26-1.5.x86_64
iniset $conf_file heat_plugin minimal_image_ref cirros-0.3.5-x86_64-disk
# Skip ReloadOnSighupTest. Most jobs now run with apache+uwsgi, so the test has no significance
# Skip NotificationTest till bug #1721202 is fixed
# Skip StackCancelTest till the python-heatclient is bumped
iniset $conf_file heat_plugin skip_functional_test_list 'ReloadOnSighupTest, NotificationTest, StackCancelTest'
if [ "$DISABLE_CONVERGENCE" == "true" ]; then
iniset $conf_file heat_plugin convergence_engine_enabled false
fi
@ -66,6 +61,11 @@ function _config_functionaltests
{
local conf_file=$DEST/heat/heat_integrationtests/heat_integrationtests.conf
_config_iniset $conf_file
# Skip NotificationTest till bug #1721202 is fixed
# Skip StackCancelTest till the python-heatclient is bumped
iniset $conf_file heat_plugin skip_functional_test_list 'NotificationTest, StackCancelTest'
cat $conf_file
}
@ -80,6 +80,7 @@ function _config_tempest_plugin
# Skip VolumeBackupRestoreIntegrationTest skipped until failure rate can be reduced ref bug #1382300
# Skip test_server_signal_userdata_format_software_config is skipped untill bug #1651768 is resolved
iniset $conf_file heat_plugin skip_scenario_test_list 'SoftwareConfigIntegrationTest, VolumeBackupRestoreIntegrationTest'
iniset $conf_file heat_plugin skip_functional_test_list ''
cat $conf_file
}

Loading…
Cancel
Save