From 253d29bcef905723459df1a54424fea61db78566 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 1 Mar 2018 15:57:45 +0100 Subject: [PATCH] Rewrite ModuleBuild methods to get all streams and all builds using the latest version, not build id. --- module_build_service/models.py | 34 +++++++++++++----------------- module_build_service/utils.py | 6 ++---- tests/test_models/test_models.py | 22 ++++++++++--------- tests/test_utils/test_utils_mse.py | 11 ++++++---- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/module_build_service/models.py b/module_build_service/models.py index 19b82682..93be5ca0 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -246,11 +246,12 @@ class ModuleBuild(MBSBase): @staticmethod def get_last_build_in_all_streams(session, name): """ - Returns list of all last ModuleBuilds in "ready" state for all + Returns list of all latest ModuleBuilds in "ready" state for all streams for given module `name`. """ subq = session.query( - func.max(ModuleBuild.id).label('id') + ModuleBuild.id, + func.max(ModuleBuild.version.cast(db.Integer)) ).group_by(ModuleBuild.name, ModuleBuild.stream).filter_by( name=name, state=BUILD_STATES["ready"]).subquery('t2') query = session.query(ModuleBuild).join( @@ -258,25 +259,20 @@ class ModuleBuild(MBSBase): return query.all() @staticmethod - def get_last_build_in_stream(session, name, stream): + def get_last_builds_in_stream(session, name, stream): """ - Returns the last build in "ready" state for given name:stream. + Returns the latest builds in "ready" state for given name:stream. """ - query = session.query(ModuleBuild) - query = query.filter_by(name=name, stream=stream, - state=BUILD_STATES["ready"]) - query = query.order_by(ModuleBuild.id.desc()) - return query.first() - - @staticmethod - def get_builds_in_version(session, name, stream, version): - """ - Returns list of all module builds in "ready" state for given - name:stream:version - it means all the contexts of this module. - """ - query = session.query(ModuleBuild) - query = query.filter_by(name=name, stream=stream, version=version, - state=BUILD_STATES["ready"]) + subq = session.query( + ModuleBuild.version, + func.max(ModuleBuild.version.cast(db.Integer)) + ).group_by(ModuleBuild.name, ModuleBuild.stream).filter_by( + name=name, state=BUILD_STATES["ready"], stream=stream).subquery('t2') + query = session.query(ModuleBuild).join( + subq, and_( + ModuleBuild.name == name, + ModuleBuild.stream == stream, + ModuleBuild.version == subq.c.version)) return query.all() def mmd(self): diff --git a/module_build_service/utils.py b/module_build_service/utils.py index 9e512cf4..2dff4dec 100644 --- a/module_build_service/utils.py +++ b/module_build_service/utils.py @@ -1428,7 +1428,7 @@ def _get_mmds_from_requires(session, requires, mmds, recursive=False): # b) there is at least one stream without '-' prefix. In this case, we can # ignore all the streams with '-' prefix and just add those without # '-' prefix to the list of valid streams. - streams_is_blacklist = all([stream[0] == "-" for stream in streams.get()]) + streams_is_blacklist = all(stream.startswith("-") for stream in streams.get()) if streams_is_blacklist or len(streams.get()) == 0: builds = models.ModuleBuild.get_last_build_in_all_streams( session, name) @@ -1451,10 +1451,8 @@ def _get_mmds_from_requires(session, requires, mmds, recursive=False): if ns in mmds: continue - last_build_in_stream = models.ModuleBuild.get_last_build_in_stream( + builds = models.ModuleBuild.get_last_builds_in_stream( session, name, stream) - builds = models.ModuleBuild.get_builds_in_version( - session, name, stream, last_build_in_stream.version) mmds[ns] = [build.mmd() for build in builds] added_mmds[ns] = mmds[ns] diff --git a/tests/test_models/test_models.py b/tests/test_models/test_models.py index a9290607..d26cbfa9 100644 --- a/tests/test_models/test_models.py +++ b/tests/test_models/test_models.py @@ -77,10 +77,9 @@ class TestModels: assert build.context == 'e7a3d35e' class TestModelsGetStreamsContexts: - def setup_method(self, test_method): - init_data_contexts(contexts=True) def test_get_last_build_in_all_streams(self): + init_data_contexts(contexts=True) with make_session(conf) as session: builds = ModuleBuild.get_last_build_in_all_streams( session, "nginx") @@ -88,17 +87,20 @@ class TestModelsGetStreamsContexts: for build in builds] assert builds == ["nginx:%d:%d" % (i, i + 2) for i in range(10)] - def test_get_last_build_in_stream(self): + def test_get_last_build_in_all_stream_last_version(self): + init_data_contexts(contexts=False) with make_session(conf) as session: - build = ModuleBuild.get_last_build_in_stream( - session, "nginx", "1") - build = "%s:%s:%s" % (build.name, build.stream, str(build.version)) - assert build == 'nginx:1:3' + builds = ModuleBuild.get_last_build_in_all_streams( + session, "nginx") + builds = ["%s:%s:%s" % (build.name, build.stream, str(build.version)) + for build in builds] + assert builds == ["nginx:1:11"] - def test_get_builds_in_version(self): + def test_get_last_builds_in_stream(self): + init_data_contexts(contexts=True) with make_session(conf) as session: - builds = ModuleBuild.get_builds_in_version( - session, "nginx", "1", "3") + builds = ModuleBuild.get_last_builds_in_stream( + session, "nginx", "1") builds = ["%s:%s:%s:%s" % (build.name, build.stream, str(build.version), build.context) for build in builds] assert builds == ['nginx:1:3:d5a6c0fa', 'nginx:1:3:795e97c1'] diff --git a/tests/test_utils/test_utils_mse.py b/tests/test_utils/test_utils_mse.py index 5229243a..da96764b 100644 --- a/tests/test_utils/test_utils_mse.py +++ b/tests/test_utils/test_utils_mse.py @@ -18,16 +18,19 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. + +from datetime import datetime +import hashlib + import gi gi.require_version('Modulemd', '1.0') # noqa from gi.repository import Modulemd +from mock import patch +import pytest + import module_build_service.utils from module_build_service import models, conf from tests import (db, clean_database) -from datetime import datetime -import hashlib -from mock import patch -import pytest class TestUtilsModuleStreamExpansion: