cdc0266de5
python-tempestconf doesn't provide any way how to define a different flavor memory and disk size but provides an option for defining a custom image (not cirros which is default). However, when using custom image the default flavor size is not enough. Therefore the review adds two arguments which can be used for defining flavor minimum memory and minimum disk size. The review also edits the documentation and fixes a few typos. Change-Id: Iba14b65ff8e147765e47d223dea6231ab649135f Story: 2001536 Task: 6341
168 lines
7.1 KiB
Python
168 lines
7.1 KiB
Python
# Copyright 2018 Red Hat, Inc.
|
|
# 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.
|
|
|
|
from fixtures import MonkeyPatch
|
|
import logging
|
|
import mock
|
|
|
|
from config_tempest import constants as C
|
|
from config_tempest.flavors import Flavors
|
|
from config_tempest.tests.base import BaseConfigTempestTest
|
|
|
|
# disable logging when running unit tests
|
|
logging.disable(logging.CRITICAL)
|
|
|
|
|
|
class TestFlavors(BaseConfigTempestTest):
|
|
"""Flavors test class
|
|
|
|
Tests for create_tempest_flavors and find_or_create_flavor methods.
|
|
"""
|
|
|
|
CLIENT_MOCK = 'tempest.lib.services.compute.flavors_client.FlavorsClient'
|
|
FLAVORS_LIST = [
|
|
{"id": "Fakeid", "name": "Name"},
|
|
{"id": "MyFakeID", "name": "MyID"}
|
|
]
|
|
|
|
def setUp(self):
|
|
super(TestFlavors, self).setUp()
|
|
self.conf = self._get_conf("v2.0", "v3")
|
|
self.client = self._get_clients(self.conf).flavors
|
|
return_value = {"flavors": [{"id": "MyFakeID", "name": "MyID"}]}
|
|
mock_function = mock.Mock(return_value=return_value)
|
|
self.useFixture(MonkeyPatch(self.CLIENT_MOCK + '.list_flavors',
|
|
mock_function))
|
|
self.Service = Flavors(self.client, True, self.conf, 64, 1)
|
|
|
|
def test_create_tempest_flavors(self):
|
|
self.Service.flavor_list = []
|
|
mock_function = mock.Mock(return_value="FakeID")
|
|
func2mock = 'config_tempest.flavors.Flavors.create_flavor'
|
|
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
|
self.Service.create_tempest_flavors()
|
|
self.assertEqual(self.conf.get('compute', 'flavor_ref'), "FakeID")
|
|
self.assertEqual(self.conf.get('compute', 'flavor_ref_alt'), "FakeID")
|
|
calls = [mock.call('m1.nano', 64, 1, 1, no_rng=False),
|
|
mock.call('m1.micro', 128, 1, 1, no_rng=False)]
|
|
mock_function.assert_has_calls(calls, any_order=True)
|
|
|
|
def check_call_of_discover_smallest_flavor(self):
|
|
self.Service.flavor_list = [{'id': 'FAKE', 'name': 'Fake_flavor'},
|
|
{'id': 'FAKE_1', 'name': 'Fake_flavor_1'}]
|
|
self.Service.allow_creation = False
|
|
func2mock = 'config_tempest.flavors.Flavors.discover_smallest_flavor'
|
|
mock_function = mock.Mock()
|
|
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
|
self.Service.create_flavor('nano', C.DEFAULT_FLAVOR_RAM,
|
|
C.DEFAULT_FLAVOR_VCPUS,
|
|
C.DEFAULT_FLAVOR_DISK)
|
|
calls = [mock.call('nano')]
|
|
mock_function.assert_has_calls(calls, any_order=True)
|
|
|
|
def test_create_tempest_flavors_overwrite_flavor_ref_not_exist(self):
|
|
self.conf.set('compute', 'flavor_ref', "FAKE_ID")
|
|
try:
|
|
self.Service.create_tempest_flavors()
|
|
except Exception:
|
|
return
|
|
# it should have ended in the except block above
|
|
self.assertTrue(False)
|
|
|
|
def test_create_tempest_flavors_overwrite_flavor_ref_alt_not_exist(self):
|
|
self.Service.flavor_list = [{'id': 'FAKE', 'name': 'Fake_flavor'}]
|
|
self.conf.set('compute', 'flavor_ref', 'FAKE')
|
|
self.conf.set('compute', 'flavor_ref_alt', 'FAKE_ID')
|
|
try:
|
|
self.Service.create_tempest_flavors()
|
|
except Exception:
|
|
self.assertEqual(self.conf.get('compute', 'flavor_ref'), 'FAKE')
|
|
return
|
|
# it should have ended in the except block above
|
|
self.assertTrue(False)
|
|
|
|
def test_create_flavor_not_allowed(self):
|
|
# mock list_flavors() to return empty list
|
|
self.Service.allow_creation = False
|
|
self.Service.flavor_list = []
|
|
try:
|
|
self.Service.create_flavor('name', C.DEFAULT_FLAVOR_RAM,
|
|
C.DEFAULT_FLAVOR_VCPUS,
|
|
C.DEFAULT_FLAVOR_DISK)
|
|
except Exception:
|
|
return
|
|
# it should have ended in the except block above
|
|
self.assertTrue(False)
|
|
|
|
# not enough flavors found
|
|
self.Service.flavor_list = [{'id': 'FAKE', 'name': 'fake_name'}]
|
|
try:
|
|
self.Service.create_flavor('name', C.DEFAULT_FLAVOR_RAM,
|
|
C.DEFAULT_FLAVOR_VCPUS,
|
|
C.DEFAULT_FLAVOR_DISK)
|
|
except Exception:
|
|
return
|
|
# it should have ended in the except block above
|
|
self.assertTrue(False)
|
|
|
|
def _test_create_flavor(self, no_rng=False):
|
|
return_value = {"flavor": {"id": "MyFakeID", "name": "MyID"}}
|
|
self.Service.flavor_list = []
|
|
client = self.CLIENT_MOCK
|
|
mock_function = mock.Mock(return_value=return_value)
|
|
self.useFixture(MonkeyPatch(client + '.create_flavor', mock_function))
|
|
mock_function = mock.Mock(return_value={})
|
|
self.useFixture(MonkeyPatch(client + '.set_flavor_extra_spec',
|
|
mock_function))
|
|
resp = self.Service.create_flavor("MyID", C.DEFAULT_FLAVOR_RAM,
|
|
C.DEFAULT_FLAVOR_VCPUS,
|
|
C.DEFAULT_FLAVOR_DISK,
|
|
no_rng=no_rng)
|
|
self.assertEqual(resp, return_value['flavor']['id'])
|
|
return mock_function
|
|
|
|
def test_create_flavor_rng(self):
|
|
mock_function = self._test_create_flavor()
|
|
calls = [mock.call(flavor_id='MyFakeID', **{'hw_rng:allowed': 'True'})]
|
|
mock_function.assert_has_calls(calls, any_order=True)
|
|
|
|
def test_create_flavor_no_rng(self):
|
|
self.Service.no_rng = True
|
|
mock_function = self._test_create_flavor(no_rng=True)
|
|
calls = [mock.call(flavor_id='MyFakeID')]
|
|
mock_function.assert_has_calls(calls, any_order=True)
|
|
|
|
def test_find_flavor_by_id(self):
|
|
return_value = {"flavors": self.FLAVORS_LIST}
|
|
mock_function = mock.Mock(return_value=return_value)
|
|
self.useFixture(MonkeyPatch(self.CLIENT_MOCK + '.list_flavors',
|
|
mock_function))
|
|
resp = self.Service.find_flavor_by_id("MyFakeID")
|
|
self.assertEqual(resp, "MyFakeID")
|
|
# test no flavor found case
|
|
resp = self.Service.find_flavor_by_id("NotExist")
|
|
self.assertEqual(resp, None)
|
|
|
|
def test_find_flavor_by_name(self):
|
|
return_value = {"flavors": self.FLAVORS_LIST}
|
|
mock_function = mock.Mock(return_value=return_value)
|
|
self.useFixture(MonkeyPatch(self.CLIENT_MOCK + '.list_flavors',
|
|
mock_function))
|
|
resp = self.Service.find_flavor_by_name("MyID")
|
|
self.assertEqual(resp, "MyFakeID")
|
|
# test no flavor found case
|
|
resp = self.Service.find_flavor_by_name("NotExist")
|
|
self.assertEqual(resp, None)
|