Merge "Reduce memory assigned to CentOS servers to 256MB"

This commit is contained in:
Zuul 2020-11-24 15:03:32 +00:00 committed by Gerrit Code Review
commit c1cdca0ee9
6 changed files with 63 additions and 20 deletions

View File

@ -14,7 +14,6 @@
from __future__ import absolute_import
import collections
import json
import time
from oslo_log import log
@ -41,6 +40,7 @@ def cloud_config(*args, **kwargs):
def combine_cloud_configs(objs):
packages = []
runcmd = []
extra_params = {}
for obj in objs:
if obj:
if not isinstance(obj, collections.abc.Mapping):
@ -54,12 +54,11 @@ def combine_cloud_configs(objs):
if cmdline:
runcmd.append(cmdline)
if obj:
message = ('Invalid cloud-init parameters:\n' +
json.dumps(obj, indent=4, sort_keys=True))
raise ValueError(message)
extra_params.update(obj)
return CloudConfig.create(packages=packages or None,
runcmd=runcmd or None)
runcmd=runcmd or None,
**extra_params)
class CloudConfig(dict):

View File

@ -39,7 +39,7 @@ class CentosImageFixture(glance.URLGlanceImageFixture):
class CentosFlavorStackFixture(_nova.FlavorStackFixture):
ram = 512
ram = 256
class CentosServerStackFixture(_nova.ServerStackFixture):
@ -49,3 +49,6 @@ class CentosServerStackFixture(_nova.ServerStackFixture):
#: Flavor used to create a Nova server instance
flavor_stack = tobiko.required_setup_fixture(CentosFlavorStackFixture)
#: Setup SWAP file in bytes
swap_maxsize = 1 * 1024 * 1024 * 1024 # 1 GB

View File

@ -263,12 +263,30 @@ class ServerStackFixture(heat.HeatStackFixture):
return nova.get_console_output(server=self.server_id,
length=self.max_console_output_length)
cloud_config = nova.cloud_config()
@property
def user_data(self):
return nova.user_data(self.cloud_config)
#: SWAP file name
swap_filename: str = '/swap.img'
#: SWAP file size in bytes
swap_size: typing.Optional[int] = None
#: nax SWAP file size in bytes
swap_maxsize: typing.Optional[int] = None
@property
def cloud_config(self):
cloud_config = nova.cloud_config()
# default is to not create any swap files,
# because 'swap_file_max_size' is set to None
if self.swap_maxsize is not None:
cloud_config = nova.cloud_config(
cloud_config,
swap={'filename': self.swap_filename,
'size': self.swap_size or 'auto',
'maxsize': self.swap_maxsize})
return cloud_config
def ensure_server_status(self, status):
tobiko.setup_fixture(self)
try:

View File

@ -15,9 +15,12 @@
# under the License.
from __future__ import absolute_import
import yaml
import tobiko
from tobiko.shell import sh
from tobiko.openstack import keystone
from tobiko.openstack import nova
from tobiko.openstack import stacks
from tobiko.tests.functional.openstack.stacks import test_cirros
@ -29,9 +32,19 @@ class CentosServerStackTest(test_cirros.CirrosServerStackTest):
#: Stack of resources with a server attached to a floating IP
stack = tobiko.required_setup_fixture(stacks.CentosServerStackFixture)
def test_user_data(self):
user_data = self.stack.user_data
self.assertIsInstance(user_data, str)
self.assertTrue(user_data.startswith('#cloud-config\n'), user_data)
self.assertEqual(self.stack.cloud_config,
yaml.safe_load(user_data))
def test_platform_python(self):
python_version = sh.execute(['/usr/libexec/platform-python',
'--version'],
ssh_client=self.stack.ssh_client).stdout
self.assertTrue(python_version.startswith('Python 3.'),
python_version)
def test_cloud_init_done(self):
nova.wait_for_cloud_init_done(ssh_client=self.stack.ssh_client)

View File

@ -22,6 +22,7 @@ import testtools
import tobiko
from tobiko.openstack import keystone
from tobiko.openstack import nova
from tobiko.openstack import stacks
from tobiko.shell import ping
from tobiko.shell import sh
@ -60,6 +61,27 @@ class CirrosServerStackTest(testtools.TestCase):
output = self.stack.console_output
self.assertTrue(output)
def test_swap_file(self):
if self.stack.swap_maxsize is None:
self.skipTest('Swap maxsize is None')
cloud_config = self.stack.cloud_config
self.assertEqual({'filename': self.stack.swap_filename,
'size': self.stack.swap_size or "auto",
'maxsize': self.stack.swap_maxsize},
cloud_config['swap'])
nova.wait_for_cloud_init_done(ssh_client=self.stack.ssh_client)
# check swap file exists
sh.execute(f"ls -lh '{self.stack.swap_filename}'",
ssh_client=self.stack.ssh_client)
# check swap file is mounted
swaps_table = sh.execute("cat /proc/swaps",
ssh_client=self.stack.ssh_client).stdout
mounted_filenames = [line.split()[0]
for line in swaps_table.splitlines()[1:]]
self.assertIn(self.stack.swap_filename, mounted_filenames, swaps_table)
def test_ipv4_subnet_nameservers(self):
self._test_subnet_nameservers(
subnet=self.stack.network_stack.ipv4_subnet_details,

View File

@ -36,12 +36,6 @@ class TestUserData(testtools.TestCase):
['echo', '2']]},
user_data)
def test_user_data_with_invalid(self):
ex = self.assertRaises(ValueError, nova.user_data, wrong='mistake')
self.assertEqual(
'Invalid cloud-init parameters:\n{\n "wrong": "mistake"\n}',
str(ex))
def assert_equal_cloud_config(self, expected, actual):
self.assertTrue(actual.startswith('#cloud-config'))
self.assertEqual(expected, yaml.load(actual))
@ -62,9 +56,3 @@ class TestCloudConfig(testtools.TestCase):
self.assertEqual({'runcmd': [['echo', '1'],
['echo', '2']]},
cloud_config)
def test_cloud_config_with_invalid(self):
ex = self.assertRaises(ValueError, nova.cloud_config, wrong='mistake')
self.assertEqual(
'Invalid cloud-init parameters:\n{\n "wrong": "mistake"\n}',
str(ex))