Rewrite ModuleBuild methods to get all streams and all builds using the latest version, not build id.

This commit is contained in:
Jan Kaluza
2018-03-01 15:57:45 +01:00
committed by mprahl
parent 28e821fee0
commit 253d29bcef
4 changed files with 36 additions and 37 deletions

View File

@@ -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):

View File

@@ -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]

View File

@@ -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']

View File

@@ -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: