Add support for microversions for compute

The review adds code which sets microversions for compute
service.
The change also adds method for filtering microversions
to service base class. In order to save one query, the
new filtering method doesn't query the cloud for versions,
it reuses the version response from the previous query
by set_versions method.

Story: 2004378
Task: 27990

Depends-On: https://review.openstack.org/#/c/641510/
Change-Id: I33f6df0995739fdcb12419d4dc08b257e430ca36
This commit is contained in:
Martin Kopec 2019-03-05 16:32:03 +00:00
parent 87a4e8128d
commit 19783839ab
4 changed files with 37 additions and 50 deletions

View File

@ -38,6 +38,7 @@ class Service(object):
self.extensions = []
self.versions = []
self.versions_body = {'versions': []}
def do_get(self, url, top_level=False, top_level_path=""):
parts = list(urllib.parse.urlparse(url))
@ -150,8 +151,8 @@ class Service(object):
class VersionedService(Service):
def set_versions(self, top_level=True):
body = self.do_get(self.service_url, top_level=top_level)
body = json.loads(body)
self.versions = self.deserialize_versions(body)
self.versions_body = json.loads(body)
self.versions = self.deserialize_versions(self.versions_body)
def deserialize_versions(self, body):
versions = []
@ -160,6 +161,26 @@ class VersionedService(Service):
versions.append(version)
return list(map(lambda x: x['id'], versions))
def filter_api_microversions(self):
min_microversion = ''
max_microversion = ''
for version in self.versions_body['versions']:
if version['status'] != "DEPRECATED":
if max_microversion == '':
max_microversion = version['version']
else:
max_microversion = max(max_microversion,
version['version'])
if 'min_version' not in version:
continue
if min_microversion == '':
min_microversion = version['min_version']
else:
min_microversion = min(min_microversion,
version['min_version'])
return {'max_microversion': max_microversion,
'min_microversion': min_microversion}
def no_port_cut_url(self):
# if there is no port defined, cut the url from version to the end
u = urllib3.util.parse_url(self.service_url)

View File

@ -30,8 +30,8 @@ class ComputeService(VersionedService):
def set_versions(self):
url, top_level = self.no_port_cut_url()
body = self.do_get(url, top_level=top_level)
body = json.loads(body)
self.versions = self.deserialize_versions(body)
self.versions_body = json.loads(body)
self.versions = self.deserialize_versions(self.versions_body)
def set_default_tempest_options(self, conf):
conf.set('compute-feature-enabled', 'console_output', 'True')
@ -42,6 +42,10 @@ class ComputeService(VersionedService):
# compute nodes
if self._get_number_of_hosts() >= 2:
conf.set('compute-feature-enabled', 'resize', 'True')
# set microversions
m_versions = self.filter_api_microversions()
conf.set('compute', 'min_microversion', m_versions['min_microversion'])
conf.set('compute', 'max_microversion', m_versions['max_microversion'])
def get_service_extension_key(self):
return 'api_extensions'

View File

@ -13,37 +13,16 @@
# License for the specific language governing permissions and limitations
# under the License.
import json
from config_tempest.services.base import VersionedService
from config_tempest.utils import get_base_url
class ShareService(VersionedService):
def get_api_microversion(self):
version_url = get_base_url(self.service_url)
body = self.do_get(version_url)
body = json.loads(body)
return body
def set_default_tempest_options(self, conf):
if 'v2' in self.service_url:
microversions = self.get_api_microversion()
min_microversion = {
version['min_version'] for version in microversions['versions']
if version['id'] == 'v2.0'
}
max_microversion = {
version['version'] for version in microversions['versions']
if version['id'] == 'v2.0'
}
conf.set('share', 'min_api_microversion',
''.join(min_microversion))
conf.set('share', 'max_api_microversion',
''.join(max_microversion))
m_vs = self.filter_api_microversions()
conf.set('share', 'min_api_microversion', m_vs['min_microversion'])
conf.set('share', 'max_api_microversion', m_vs['max_microversion'])
def get_unversioned_service_name(self):
return 'share'

View File

@ -17,7 +17,6 @@ import json
from config_tempest import constants as C
from config_tempest.services.base import VersionedService
from config_tempest.utils import get_base_url
from tempest.lib import exceptions
@ -31,30 +30,14 @@ class VolumeService(VersionedService):
def set_versions(self):
url, top_level = self.no_port_cut_url()
body = self.do_get(url, top_level=top_level)
body = json.loads(body)
self.versions = self.deserialize_versions(body)
def set_api_microversion(self):
version_url = get_base_url(self.service_url)
body = self.do_get(version_url)
body = json.loads(body)
return body
self.versions_body = json.loads(body)
self.versions = self.deserialize_versions(self.versions_body)
def set_default_tempest_options(self, conf):
if 'v3' in self.service_url:
microversions = self.set_api_microversion()
min_microversion = {
version['min_version'] for version in microversions['versions']
if version['id'] == 'v3.0'
}
max_microversion = {
version['version'] for version in microversions['versions']
if version['id'] == 'v3.0'
}
conf.set('volume', 'min_microversion', ''.join(min_microversion))
conf.set('volume', 'max_microversion', ''.join(max_microversion))
m_vs = self.filter_api_microversions()
conf.set('volume', 'min_microversion', m_vs['min_microversion'])
conf.set('volume', 'max_microversion', m_vs['max_microversion'])
def get_service_extension_key(self):
return 'api_extensions'