Remove the dependency on vcrpy in unit tests and modernize some of the test data

This commit is contained in:
mprahl
2018-02-05 11:45:20 -05:00
parent ea650047a1
commit 8f024e6b04
36 changed files with 1020 additions and 1126 deletions

1
.gitignore vendored
View File

@@ -15,7 +15,6 @@ module_build_service.db
server.crt
server.key
test_module_build_service.db
tests/vcr-request-data
.vscode
.ropeproject
tests/test_module_build_service.db-journal

View File

@@ -8,5 +8,4 @@ recursive-include docs *.txt *.rst *.md
recursive-include module_build_service *
recursive-include fedmsg.d *
recursive-include tests *.yaml *.json
recursive-include tests/vcr-request-data *
recursive-include tests/scm_data *

View File

@@ -213,8 +213,7 @@ def wait(config, session, msg):
on failure.
"""
cg_build_koji_tag = conf.koji_cg_default_build_tag
if conf.system != "koji":
if conf.system not in ['koji', 'test']:
# In case of non-koji backend, we want to get the dependencies
# of the local module build based on ModuleMetadata, because the
# local build is not stored in PDC and therefore we cannot query

View File

@@ -3,6 +3,5 @@
copr
mock
pytest
vcrpy
flake8
tox

View File

@@ -21,16 +21,16 @@
# Written by Matt Prahl <mprahl@redhat.com
import os
import tarfile
from datetime import datetime, timedelta
from mock import patch
import modulemd
import koji
import module_build_service
from module_build_service import db
from module_build_service.utils import get_rpm_release
from module_build_service.config import init_config
from module_build_service.models import ModuleBuild, ComponentBuild, make_session
from module_build_service.models import ModuleBuild, ComponentBuild, make_session, BUILD_STATES
base_dir = os.path.dirname(__file__)
@@ -50,34 +50,6 @@ def patch_config():
patch_config()
def get_vcr_path(file_path, test_method):
cassette_dir = os.path.join(base_dir, 'vcr-request-data')
# In pytest style unit tests, we don't have access to self.id so this code replicates that
# value
filename_prefix = [os.path.abspath(os.path.dirname(file_path))]
while True:
if os.path.basename(filename_prefix[0]) == 'tests':
break
filename_prefix.insert(0, os.path.abspath(os.path.join(filename_prefix[0], os.pardir)))
filename_prefix = [os.path.basename(dir_path) for dir_path in filename_prefix]
filename = '.'.join(filename_prefix + [
os.path.splitext(os.path.basename(file_path))[0],
test_method.im_class.__name__,
test_method.im_func.__name__])
return os.path.join(cassette_dir, filename)
def uncompress_vcrpy_cassette():
cassette_dir = os.path.join(base_dir, 'vcr-request-data')
if not os.path.exists(cassette_dir):
archive = cassette_dir.rstrip('/') + ".tar.gz"
with tarfile.open(archive, mode='r:gz') as t:
t.extractall(base_dir)
uncompress_vcrpy_cassette()
def clean_database():
db.session.remove()
db.drop_all()
@@ -96,7 +68,7 @@ def _populate_data(session):
build_one.name = 'nginx'
build_one.stream = '1'
build_one.version = 2
build_one.state = 3
build_one.state = BUILD_STATES['done']
with open(os.path.join(base_dir, "staged_data", "nginx_mmd.yaml")) as mmd:
build_one.modulemd = mmd.read()
build_one.koji_tag = 'module-nginx-1.2'
@@ -123,7 +95,7 @@ def _populate_data(session):
'#ga95886c8a443b36a9ce31abda1f9bed22f2f8c3')
component_one_build_one.format = 'rpms'
component_one_build_one.task_id = 12312345 + index
component_one_build_one.state = 1
component_one_build_one.state = koji.BUILD_STATES['COMPLETE']
component_one_build_one.nvr = 'nginx-1.10.1-2.{0}'.format(build_one_component_release)
component_one_build_one.batch = 1
component_one_build_one.module_id = 1 + index * 3
@@ -137,7 +109,7 @@ def _populate_data(session):
'module-build-macros-0.1-1.module_nginx_1_2.src.rpm')
component_two_build_one.format = 'rpms'
component_two_build_one.task_id = 12312321 + index
component_two_build_one.state = 1
component_two_build_one.state = koji.BUILD_STATES['COMPLETE']
component_two_build_one.nvr = \
'module-build-macros-01-1.{0}'.format(build_one_component_release)
component_two_build_one.batch = 2
@@ -149,7 +121,7 @@ def _populate_data(session):
build_two.name = 'postgressql'
build_two.stream = '1'
build_two.version = 2
build_two.state = 3
build_two.state = BUILD_STATES['done']
build_two.modulemd = '' # Skipping since no tests rely on it
build_two.koji_tag = 'module-postgressql-1.2'
build_two.scmurl = ('git://pkgs.domain.local/modules/postgressql?'
@@ -174,7 +146,7 @@ def _populate_data(session):
'#dc95586c4a443b26a9ce38abda1f9bed22f2f8c3')
component_one_build_two.format = 'rpms'
component_one_build_two.task_id = 2433433 + index
component_one_build_two.state = 1
component_one_build_two.state = koji.BUILD_STATES['COMPLETE']
component_one_build_two.nvr = 'postgresql-9.5.3-4.{0}'.format(build_two_component_release)
component_one_build_two.batch = 2
component_one_build_two.module_id = 2 + index * 3
@@ -188,7 +160,7 @@ def _populate_data(session):
'module-build-macros-0.1-1.module_postgresql_1_2.src.rpm')
component_two_build_two.format = 'rpms'
component_two_build_two.task_id = 47383993 + index
component_two_build_two.state = 1
component_two_build_two.state = koji.BUILD_STATES['COMPLETE']
component_two_build_two.nvr = \
'module-build-macros-01-1.{0}'.format(build_two_component_release)
component_two_build_two.batch = 1
@@ -200,7 +172,7 @@ def _populate_data(session):
build_three.name = 'testmodule'
build_three.stream = '4.3.43'
build_three.version = 6
build_three.state = 1
build_three.state = BUILD_STATES['wait']
build_three.modulemd = '' # Skipping because no tests rely on it
build_three.koji_tag = None
build_three.scmurl = ('git://pkgs.domain.local/modules/testmodule?'
@@ -224,7 +196,7 @@ def _populate_data(session):
'#dd55886c4a443b26a9ce38abda1f9bed22f2f8c3')
component_one_build_three.format = 'rpms'
component_one_build_three.task_id = 2433433 + index
component_one_build_three.state = 3
component_one_build_three.state = koji.BUILD_STATES['FAILED']
component_one_build_three.nvr = \
'postgresql-9.5.3-4.{0}'.format(build_three_component_release)
component_one_build_three.batch = 2
@@ -237,7 +209,7 @@ def _populate_data(session):
'module-build-macros-0.1-1.module_testmodule_1_2.src.rpm')
component_two_build_three.format = 'rpms'
component_two_build_three.task_id = 47383993 + index
component_two_build_three.state = 1
component_two_build_three.state = koji.BUILD_STATES['COMPLETE']
component_two_build_three.nvr = \
'module-build-macros-01-1.{0}'.format(build_three_component_release)
component_two_build_three.batch = 1
@@ -254,96 +226,37 @@ def _populate_data(session):
session.commit()
def scheduler_init_data(communicator_state=None):
clean_database()
current_dir = os.path.dirname(__file__)
star_command_yml_path = os.path.join(
current_dir, 'staged_data', 'formatted_starcommand.yaml')
with open(star_command_yml_path, 'r') as f:
yaml = f.read()
build_one = module_build_service.models.ModuleBuild()
build_one.name = 'starcommand'
build_one.stream = '1'
build_one.version = 3
build_one.state = 2
build_one.modulemd = yaml
build_one.koji_tag = 'module-starcommand-1.3'
build_one.scmurl = ('git://pkgs.domain.local/modules/star-command?'
'#da95886b7a443b36a9ce31abda1f9bef22f2f8c6')
build_one.batch = 2
# https://www.youtube.com/watch?v=iOKymYVSaJE
build_one.owner = 'Buzz Lightyear'
build_one.time_submitted = datetime(2016, 12, 9, 11, 23, 20)
build_one.time_modified = datetime(2016, 12, 9, 11, 25, 32)
build_one.rebuild_strategy = 'changed-and-after'
build_one_component_release = get_rpm_release(build_one)
component_one_build_one = module_build_service.models.ComponentBuild()
component_one_build_one.package = 'communicator'
component_one_build_one.scmurl = \
('git://pkgs.domain.local/rpms/communicator?'
'#da95886c8a443b36a9ce31abda1f9bed22f2f9c2')
component_one_build_one.format = 'rpms'
component_one_build_one.task_id = 12312345
component_one_build_one.state = communicator_state
if component_one_build_one.state == 1:
component_one_build_one.tagged = True
component_one_build_one.tagged_in_final = True
component_one_build_one.nvr = 'communicator-1.10.1-2.{0}'.format(build_one_component_release)
component_one_build_one.batch = 2
component_one_build_one.module_id = 1
component_two_build_one = module_build_service.models.ComponentBuild()
component_two_build_one.package = 'module-build-macros'
component_two_build_one.scmurl = \
('/tmp/module_build_service-build-macrosWZUPeK/SRPMS/'
'module-build-macros-0.1-1.module_starcommand_1_3.src.rpm')
component_two_build_one.format = 'rpms'
component_two_build_one.task_id = 12312321
component_two_build_one.state = 1
if component_two_build_one.state == 1:
component_two_build_one.tagged = True
component_two_build_one.tagged_in_final = True
component_two_build_one.nvr = \
'module-build-macros-01-1.{0}'.format(build_one_component_release)
component_two_build_one.batch = 2
component_two_build_one.module_id = 1
with make_session(conf) as session:
session.add(build_one)
session.add(component_one_build_one)
session.add(component_two_build_one)
session.commit()
def test_reuse_component_init_data():
def scheduler_init_data(tangerine_state=None):
""" Creates a testmodule in the building state with all the components in the same batch
"""
clean_database()
current_dir = os.path.dirname(__file__)
formatted_testmodule_yml_path = os.path.join(
current_dir, 'staged_data', 'formatted_testmodule.yaml')
with open(formatted_testmodule_yml_path, 'r') as f:
yaml = f.read()
mmd = modulemd.ModuleMetadata()
mmd.load(formatted_testmodule_yml_path)
mmd.components.rpms['tangerine'].buildorder = 0
build_one = module_build_service.models.ModuleBuild()
build_one.name = 'testmodule'
build_one.stream = 'master'
build_one.version = 20170109091357
build_one.state = 5
build_one.state = BUILD_STATES['build']
build_one.build_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.runtime_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.modulemd = yaml
build_one.koji_tag = 'module-testmodule-master-20170109091357'
build_one.scmurl = ('git://pkgs.stg.fedoraproject.org/modules/testmodule.'
'git?#7fea453')
build_one.batch = 3
build_one.owner = 'Tom Brady'
build_one.koji_tag = 'module-95b214a704c984be'
build_one.scmurl = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#ff1ea79'
if tangerine_state:
build_one.batch = 3
else:
build_one.batch = 2
# https://www.youtube.com/watch?v=iOKymYVSaJE
build_one.owner = 'Buzz Lightyear'
build_one.time_submitted = datetime(2017, 2, 15, 16, 8, 18)
build_one.time_modified = datetime(2017, 2, 15, 16, 19, 35)
build_one.time_completed = datetime(2017, 2, 15, 16, 19, 35)
build_one.rebuild_strategy = 'changed-and-after'
build_one.modulemd = mmd.dumps()
build_one_component_release = get_rpm_release(build_one)
component_one_build_one = module_build_service.models.ComponentBuild()
@@ -353,7 +266,7 @@ def test_reuse_component_init_data():
'?#4ceea43add2366d8b8c5a622a2fb563b625b9abf')
component_one_build_one.format = 'rpms'
component_one_build_one.task_id = 90276227
component_one_build_one.state = 1
component_one_build_one.state = koji.BUILD_STATES['COMPLETE']
component_one_build_one.nvr = \
'perl-Tangerine-0.23-1.{0}'.format(build_one_component_release)
component_one_build_one.batch = 2
@@ -369,7 +282,7 @@ def test_reuse_component_init_data():
'?#76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb')
component_two_build_one.format = 'rpms'
component_two_build_one.task_id = 90276228
component_two_build_one.state = 1
component_two_build_one.state = koji.BUILD_STATES['COMPLETE']
component_two_build_one.nvr = \
'perl-List-Compare-0.53-5.{0}'.format(build_one_component_release)
component_two_build_one.batch = 2
@@ -384,15 +297,17 @@ def test_reuse_component_init_data():
('git://pkgs.fedoraproject.org/rpms/tangerine'
'?#fbed359411a1baa08d4a88e0d12d426fbf8f602c')
component_three_build_one.format = 'rpms'
component_three_build_one.task_id = 90276315
component_three_build_one.state = 1
component_three_build_one.nvr = \
'tangerine-0.22-3.{0}'.format(build_one_component_release)
component_three_build_one.batch = 3
component_three_build_one.module_id = 1
component_three_build_one.ref = 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'
component_three_build_one.tagged = True
component_three_build_one.tagged_in_final = True
component_three_build_one.state = tangerine_state
if tangerine_state:
component_three_build_one.task_id = 90276315
component_three_build_one.nvr = \
'tangerine-0.22-3.{0}'.format(build_one_component_release)
if tangerine_state == koji.BUILD_STATES['COMPLETE']:
component_three_build_one.tagged = True
component_three_build_one.tagged_in_final = True
component_four_build_one = module_build_service.models.ComponentBuild()
component_four_build_one.package = 'module-build-macros'
@@ -401,7 +316,7 @@ def test_reuse_component_init_data():
'macros-0.1-1.module_testmodule_master_20170109091357.src.rpm')
component_four_build_one.format = 'rpms'
component_four_build_one.task_id = 90276181
component_four_build_one.state = 1
component_four_build_one.state = koji.BUILD_STATES['COMPLETE']
component_four_build_one.nvr = \
'module-build-macros-0.1-1.{0}'.format(build_one_component_release)
component_four_build_one.batch = 1
@@ -409,26 +324,124 @@ def test_reuse_component_init_data():
component_four_build_one.tagged = True
component_four_build_one.build_time_only = True
with make_session(conf) as session:
session.add(build_one)
session.add(component_one_build_one)
session.add(component_two_build_one)
session.add(component_three_build_one)
session.add(component_four_build_one)
session.commit()
def test_reuse_component_init_data():
clean_database()
current_dir = os.path.dirname(__file__)
formatted_testmodule_yml_path = os.path.join(
current_dir, 'staged_data', 'formatted_testmodule.yaml')
mmd = modulemd.ModuleMetadata()
mmd.loads(yaml)
mmd.xmd['mbs']['commit'] = '55f4a0a2e6cc255c88712a905157ab39315b8fd8'
mmd.load(formatted_testmodule_yml_path)
build_one = module_build_service.models.ModuleBuild()
build_one.name = 'testmodule'
build_one.stream = 'master'
build_one.version = 20170109091357
build_one.state = BUILD_STATES['ready']
build_one.build_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.runtime_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.koji_tag = 'module-de3adf79caf3e1b8'
build_one.scmurl = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#ff1ea79'
build_one.batch = 3
build_one.owner = 'Tom Brady'
build_one.time_submitted = datetime(2017, 2, 15, 16, 8, 18)
build_one.time_modified = datetime(2017, 2, 15, 16, 19, 35)
build_one.time_completed = datetime(2017, 2, 15, 16, 19, 35)
build_one.rebuild_strategy = 'changed-and-after'
build_one_component_release = get_rpm_release(build_one)
mmd.version = build_one.version
mmd.xmd['mbs']['scmurl'] = build_one.scmurl
mmd.xmd['mbs']['commit'] = 'ff1ea79fc952143efeed1851aa0aa006559239ba'
build_one.modulemd = mmd.dumps()
component_one_build_one = module_build_service.models.ComponentBuild()
component_one_build_one.package = 'perl-Tangerine'
component_one_build_one.scmurl = \
('git://pkgs.fedoraproject.org/rpms/perl-Tangerine'
'?#4ceea43add2366d8b8c5a622a2fb563b625b9abf')
component_one_build_one.format = 'rpms'
component_one_build_one.task_id = 90276227
component_one_build_one.state = koji.BUILD_STATES['COMPLETE']
component_one_build_one.nvr = \
'perl-Tangerine-0.23-1.{0}'.format(build_one_component_release)
component_one_build_one.batch = 2
component_one_build_one.module_id = 1
component_one_build_one.ref = '4ceea43add2366d8b8c5a622a2fb563b625b9abf'
component_one_build_one.tagged = True
component_one_build_one.tagged_in_final = True
component_two_build_one = module_build_service.models.ComponentBuild()
component_two_build_one.package = 'perl-List-Compare'
component_two_build_one.scmurl = \
('git://pkgs.fedoraproject.org/rpms/perl-List-Compare'
'?#76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb')
component_two_build_one.format = 'rpms'
component_two_build_one.task_id = 90276228
component_two_build_one.state = koji.BUILD_STATES['COMPLETE']
component_two_build_one.nvr = \
'perl-List-Compare-0.53-5.{0}'.format(build_one_component_release)
component_two_build_one.batch = 2
component_two_build_one.module_id = 1
component_two_build_one.ref = '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'
component_two_build_one.tagged = True
component_two_build_one.tagged_in_final = True
component_three_build_one = module_build_service.models.ComponentBuild()
component_three_build_one.package = 'tangerine'
component_three_build_one.scmurl = \
('git://pkgs.fedoraproject.org/rpms/tangerine'
'?#fbed359411a1baa08d4a88e0d12d426fbf8f602c')
component_three_build_one.format = 'rpms'
component_three_build_one.task_id = 90276315
component_three_build_one.state = koji.BUILD_STATES['COMPLETE']
component_three_build_one.nvr = \
'tangerine-0.22-3.{0}'.format(build_one_component_release)
component_three_build_one.batch = 3
component_three_build_one.module_id = 1
component_three_build_one.ref = 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'
component_three_build_one.tagged = True
component_three_build_one.tagged_in_final = True
component_four_build_one = module_build_service.models.ComponentBuild()
component_four_build_one.package = 'module-build-macros'
component_four_build_one.scmurl = \
('/tmp/module_build_service-build-macrosqr4AWH/SRPMS/module-build-'
'macros-0.1-1.module_testmodule_master_20170109091357.src.rpm')
component_four_build_one.format = 'rpms'
component_four_build_one.task_id = 90276181
component_four_build_one.state = koji.BUILD_STATES['COMPLETE']
component_four_build_one.nvr = \
'module-build-macros-0.1-1.{0}'.format(build_one_component_release)
component_four_build_one.batch = 1
component_four_build_one.module_id = 1
component_four_build_one.tagged = True
component_four_build_one.build_time_only = True
build_two = module_build_service.models.ModuleBuild()
build_two.name = 'testmodule'
build_two.stream = 'master'
build_two.version = 20170219191323
build_two.state = 2
build_two.state = BUILD_STATES['build']
build_two.build_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_two.runtime_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_two.modulemd = mmd.dumps()
build_two.koji_tag = 'module-testmodule'
build_two.scmurl = ('git://pkgs.stg.fedoraproject.org/modules/testmodule.'
'git?#55f4a0a')
build_two.koji_tag = 'module-fe3adf73caf3e1b7'
build_two.scmurl = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#55f4a0a'
build_two.batch = 1
build_two.owner = 'Tom Brady'
build_two.time_submitted = datetime(2017, 2, 19, 16, 8, 18)
build_two.time_modified = datetime(2017, 2, 19, 16, 8, 18)
build_two.rebuild_strategy = 'changed-and-after'
build_two_component_release = get_rpm_release(build_two)
mmd.version = build_one.version
mmd.xmd['mbs']['scmurl'] = build_one.scmurl
mmd.xmd['mbs']['commit'] = '55f4a0a2e6cc255c88712a905157ab39315b8fd8'
build_two.modulemd = mmd.dumps()
component_one_build_two = module_build_service.models.ComponentBuild()
component_one_build_two.package = 'perl-Tangerine'
@@ -439,7 +452,6 @@ def test_reuse_component_init_data():
component_one_build_two.batch = 2
component_one_build_two.module_id = 2
component_one_build_two.ref = '4ceea43add2366d8b8c5a622a2fb563b625b9abf'
component_two_build_two = module_build_service.models.ComponentBuild()
component_two_build_two.package = 'perl-List-Compare'
component_two_build_two.scmurl = \
@@ -449,7 +461,6 @@ def test_reuse_component_init_data():
component_two_build_two.batch = 2
component_two_build_two.module_id = 2
component_two_build_two.ref = '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'
component_three_build_two = module_build_service.models.ComponentBuild()
component_three_build_two.package = 'tangerine'
component_three_build_two.scmurl = \
@@ -459,7 +470,6 @@ def test_reuse_component_init_data():
component_three_build_two.batch = 3
component_three_build_two.module_id = 2
component_three_build_two.ref = 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'
component_four_build_two = module_build_service.models.ComponentBuild()
component_four_build_two.package = 'module-build-macros'
component_four_build_two.scmurl = \
@@ -467,7 +477,7 @@ def test_reuse_component_init_data():
'macros-0.1-1.module_testmodule_master_20170219191323.src.rpm')
component_four_build_two.format = 'rpms'
component_four_build_two.task_id = 90276186
component_four_build_two.state = 1
component_four_build_two.state = koji.BUILD_STATES['COMPLETE']
component_four_build_two.nvr = \
'module-build-macros-0.1-1.{0}'.format(build_two_component_release)
component_four_build_two.batch = 1
@@ -510,7 +520,7 @@ def test_reuse_shared_userspace_init_data():
build_one.version = mmd.version
build_one.build_context = 'e046b867a400a06a3571f3c71142d497895fefbe'
build_one.runtime_context = '50dd3eb5dde600d072e45d4120e1548ce66bc94a'
build_one.state = 5
build_one.state = BUILD_STATES['ready']
build_one.modulemd = yaml
build_one.koji_tag = 'module-testmodule-master-20170109091357'
build_one.scmurl = ('git://pkgs.stg.fedoraproject.org/modules/testmodule.'
@@ -562,7 +572,7 @@ def test_reuse_shared_userspace_init_data():
build_one.version = mmd.version
build_one.build_context = 'e046b867a400a06a3571f3c71142d497895fefbe'
build_one.runtime_context = '50dd3eb5dde600d072e45d4120e1548ce66bc94a'
build_one.state = 3
build_one.state = BUILD_STATES['done']
build_one.modulemd = yaml
build_one.koji_tag = 'module-testmodule-master-20170109091357'
build_one.scmurl = ('git://pkgs.stg.fedoraproject.org/modules/testmodule.'

201
tests/conftest.py Normal file
View File

@@ -0,0 +1,201 @@
# Copyright (c) 2018 Red Hat, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Written by Matt Prahl <mprahl@redhat.com>
import os
import math
import copy
import six
import pytest
import mock
import pdc_client.test_helpers
import modulemd
BASE_DIR = os.path.dirname(__file__)
STAGED_DATA_DIR = os.path.join(BASE_DIR, 'staged_data')
with open(os.path.join(STAGED_DATA_DIR, 'platform.yaml')) as f:
PLATFORM_MODULEMD = f.read()
with open(os.path.join(STAGED_DATA_DIR, 'formatted_testmodule.yaml')) as f:
TESTMODULE_MODULEMD = f.read()
class MockPDCFilterAPI(pdc_client.test_helpers.MockAPI):
""" A modified pdc_client.test_helpers.MockAPI that supports basic filtering on GET requests
"""
def _handle_get(self, filters):
# Code taken from pdc_client/test_helpers.py
data = self.endpoints[self.will_call]['GET']
if callable(data):
data = data()
self.calls.setdefault(self.will_call, []).append(('GET', filters))
page_size = filters.get('page_size', 20)
# End of code taken from pdc_client/test_helpers.py
if not (isinstance(data, list) and page_size > 0):
return data
# Keep track of indexes to pop since we can't pop them during the loop
indexes_to_pop = []
for index, result in enumerate(data):
for filter_key, filter_value in filters.items():
if filter_key in ('page', 'page_size'):
continue
if filter_key not in result:
raise ValueError('An unsupported filter was specified')
# If it's a string, do a case insensitive match like the API does
if isinstance(filter_value, six.string_types) and \
isinstance(result[filter_key], six.string_types):
if result[filter_key].lower() != filter_value.lower():
indexes_to_pop.append(index)
break
else:
if result[filter_key] != filter_value:
indexes_to_pop.append(index)
break
# Only copy the data if we need to modify it based on the filters
if indexes_to_pop:
rv_data = copy.deepcopy(data)
else:
rv_data = data
# Remove all the results that didn't match the filter. This is reversed so the index
# values remain valid as we pop them.
for index in sorted(indexes_to_pop, reverse=True):
rv_data.pop(index)
# Code taken from pdc_client/test_helpers.py
page = filters.get('page', 1)
pages = int(math.ceil(float(len(rv_data)) / page_size))
rv_data = rv_data[(page - 1) * page_size:(page - 1) * page_size + page_size]
return {
'count': len(rv_data),
'next': None if (page == pages or not pages) else self._fmt_url(page + 1),
'previous': None if (page == 1 or not pages) else self._fmt_url(page - 1),
'results': rv_data
}
# End of code taken from pdc_client/test_helpers.py
# This is scoped to the function in case certain tests must alter PDC
@pytest.fixture
def pdc():
# Mock the PDC client
pdc = MockPDCFilterAPI()
# TODO: change this to the modules API when PDC > 1.9.0 is released
pdc.add_endpoint('unreleasedvariants', 'GET', [{
'variant_id': 'platform',
'variant_uid': 'platform-f28-3',
'variant_name': 'platform',
'variant_type': 'module',
'variant_version': 'f28',
'variant_release': '3',
'variant_context': '00000000',
'koji_tag': 'module-f28-build',
'modulemd': PLATFORM_MODULEMD,
'runtime_deps': [],
'build_deps': [],
'active': True,
'rpms': []
}])
pdc_patcher = mock.patch('pdc_client.PDCClient', return_value=pdc)
pdc_patcher.start()
yield pdc
pdc_patcher.stop()
@pytest.fixture(scope='function')
def pdc_module_inactive(pdc):
pdc.endpoints['unreleasedvariants']['GET'].append({
'variant_id': 'testmodule',
'variant_uid': 'testmodule:master:20180205135154',
'variant_name': 'testmodule',
'variant_type': 'module',
'variant_version': 'master',
'variant_release': '20180205135154',
'koji_tag': 'module-95b214a704c984be',
'modulemd': TESTMODULE_MODULEMD,
'runtime_deps': [
{
'dependency': 'platform',
'stream': 'f28'
}
],
'build_deps': [
{
'dependency': 'platform',
'stream': 'f28'
}
],
'rpms': [],
'active': False,
})
return pdc
@pytest.fixture(scope='function')
def pdc_module_active(pdc_module_inactive):
# Rename it for clarity
pdc_module_active = pdc_module_inactive
pdc_module_active.endpoints['unreleasedvariants']['GET'][-1].update({
'active': True,
'rpms': [
'tangerine-0:0.22-6.module+0+814cfa39.noarch.rpm',
'tangerine-0:0.22-6.module+0+814cfa39.src.rpm',
'perl-Tangerine-0:0.22-2.module+0+814cfa39.noarch.rpm',
'perl-Tangerine-0:0.22-2.module+0+814cfa39.src.rpm',
'perl-List-Compare-0:0.53-8.module+0+814cfa39.noarch.rpm',
'perl-List-Compare-0:0.53-8.module+0+814cfa39.src.rpm'
]
})
return pdc_module_active
@pytest.fixture(scope='function')
def pdc_module_reuse(pdc_module_active):
# Rename it for clarity
pdc_module_reuse = pdc_module_active
mmd = modulemd.ModuleMetadata()
mmd.loads(TESTMODULE_MODULEMD)
mmd.version = 20170219191323
mmd.xmd['mbs']['scmurl'] = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#ff1ea79'
mmd.xmd['mbs']['commit'] = 'ff1ea79fc952143efeed1851aa0aa006559239ba'
pdc_module_reuse.endpoints['unreleasedvariants']['GET'].append(
copy.deepcopy(pdc_module_reuse.endpoints['unreleasedvariants']['GET'][-1]))
pdc_module_reuse.endpoints['unreleasedvariants']['GET'][-1].update({
'variant_uid': 'testmodule:master:{0}'.format(mmd.version),
'variant_release': str(mmd.version),
'modulemd': mmd.dumps(),
'koji_tag': 'module-de3adf79caf3e1b8'
})
mmd.version = 20180205135154
mmd.xmd['mbs']['scmurl'] = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#55f4a0a'
mmd.xmd['mbs']['commit'] = '55f4a0a2e6cc255c88712a905157ab39315b8fd8'
pdc_module_reuse.endpoints['unreleasedvariants']['GET'].append(
copy.deepcopy(pdc_module_reuse.endpoints['unreleasedvariants']['GET'][-1]))
pdc_module_reuse.endpoints['unreleasedvariants']['GET'][-1].update({
'variant_uid': 'testmodule:master:{0}'.format(mmd.version),
'variant_release': str(mmd.version),
'modulemd': mmd.dumps(),
'koji_tag': 'module-fe3adf73caf3e1b7',
'rpms': [],
'active': False
})
return pdc_module_reuse

View File

@@ -1,181 +0,0 @@
document: modulemd
version: 1
data:
name: base-runtime
stream: "0.25"
version: 1
summary: The base application runtime and hardware enablement layer
description: >
A project closely linked to the Modularity Initiative, base-runtime
is about the defining the common shared package and feature set of
the operating system, providing both the hardware enablement layer
and the minimal application runtime environment other modules can
build upon.
license:
module: [ MIT ]
dependencies:
# Build-require self for now.
# TODO: Don't forget to update this once we're no longer self-hosted
buildrequires:
base-runtime: "0.25"
references:
community: https://fedoraproject.org/wiki/BaseRuntime
documentation: https://pagure.io/base-runtime
tracker: https://pagure.io/base-runtime/issues
profiles:
# The default profile currently consists of the Linux kernel, the
# systemd init system and all the POSIX userspace utilities that
# are available in Fedora.
default:
rpms:
# at, batch
- at
# sh
- bash
# bc
- bc
# ar, nm, strings, strip
- binutils
# yacc
- byacc
# cflow
- cflow
# basename, cat, chgrp, chmod, chown, cksum, comm, cp, csplit,
# cut, date, dd, df, dirname, du, echo, env, expand, expr,
# false, fold, head, id, join, link, ln, logname, ls, mkdir,
# mkfifo, mv, nice, nl, nohup, od, paste, pathchk, pr, printf,
# pwd, rm, rmdir, sleep, sort, split, stty, talk, tee, test,
# touch, tr, true, tsort, tty, uname, unexpand, uniq, unlink,
# wc, who
- coreutils
# crontab
- cronie
# ctags
- ctags
# lp
- cups-client
# cmp, diff
- diffutils
# ed
- ed
# file
- file
# flex
- flex
# find, xargs
- findutils
# awk
- gawk
# cc, c89, c99
- gcc
# f95, gfortran
- gcc-gfortran
# gencat, getconf, iconv, locale, localedef
- glibc-common
# grep
- grep
# zcat
- gzip
# the Linux kernel
- kernel
# m4
- m4
# mailx
- mailx
# make
- make
# man
- man-db
# compress, uncompress
- ncompress
# tabs, tput
- ncurses
# patch
- patch
# fuser
- psmisc
# ps
- procps-ng
# sed
- sed
# newgrp
- shadow-utils
# uudecode, uuencode
- sharutils
# pax
- spax
# the chosen init system
- systemd
# talk
- talk
# time
- time
# qmove, qmsg, qrerun, qsig
- torque-client
# cal, ipcrm, ipcs, kill, logger, mesg, more, renice, write
- util-linux
# uucp, uustat, uux
- uucp
# ex, vi
- vim-minimal
api:
rpms:
- at
- bash
- bc
- binutils
- byacc
- cflow
- coreutils
- cronie
- ctags
- cups-client
- diffutils
- ed
- file
- flex
- findutils
- gawk
- gcc
- gcc-gfortran
- glibc-common
- grep
- gzip
- kernel
- m4
- mailx
- make
- man-db
- ncompress
- ncurses
- patch
- psmisc
- procps-ng
- sed
- shadow-utils
- sharutils
- spax
- systemd
- talk
- time
- torque-client
- util-linux
- uucp
- vim-minimal
components:
rpms:
CUnit2:
rationale: Part of the first base-runtime prototype.
ref: 2fb6e8f0529a1196a4bd0897e9bfcd93719e686c
Canna:
rationale: Part of the first base-runtime prototype.
ref: 8d636177ba858cfabf02df029b2089cf192d683e
Cython:
rationale: Part of the first base-runtime prototype.
ref: 6c9d7cad8ac0a840b18b495c4fe152967d808600
DevIL:
rationale: Part of the first base-runtime prototype.
ref: de58614c0febb5032b710739f34f7344679668f6
GConf2:
rationale: Part of the first base-runtime prototype.
ref: a13087720a27b17b61bd0a1cbd6042a1d0ab98b7

View File

@@ -0,0 +1,53 @@
# This module is left empty because python3 is contained in the
# Platform module.
# Other modules can depend on this empty one so that, when the
# implementation of python3 is moved out of the Platform module,
# other modules should not be affected.
document: modulemd
version: 1
data:
summary: Python programming language, version 3
description: >-
Python is an interpreted, interactive, object-oriented programming
language often compared to Tcl, Perl, Scheme or Java. Python includes
modules, classes, exceptions, very high level dynamic data types
and dynamic typing. Python supports interfaces to many system calls and
libraries, as well as to various windowing systems (X11, Motif, Tk,
Mac and MFC).
Programmers can write new built-in modules for Python in C or C++.
Python can be used as an extension language for applications that
need a programmable interface.
license:
module:
- MIT
dependencies:
buildrequires:
platform: f28
requires:
platform: f28
references:
community: https://www.python.org/
documentation: https://docs.python.org/3/
tracker: https://src.fedoraproject.org/modules/python3
xmd:
mbs:
buildrequires:
platform:
filtered_rpms: []
ref: virtual
stream: f28
version: '3'
commit: 620ec77321b2ea7b0d67d82992dda3e1d67055b4
requires:
platform:
filtered_rpms: []
ref: virtual
stream: f28
version: '3'
rpms:
ed:
ref: 51f529a5cde2b843ed9c7870689d707eaab3a9d1
scmurl: https://src.fedoraproject.org/modules/testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4

View File

@@ -1,38 +0,0 @@
document: modulemd
version: 1
data:
summary: Buzz Lightyear's Star Command Communicator
description: Buzz Lightyear's Star Command Communicator
name: starcommand
stream: teststream
version: 1
license:
module: [ MIT ]
dependencies:
buildrequires:
base-runtime: master
requires:
base-runtime: master
xmd:
mbs:
buildrequires: {base-runtime: {ref: ae993ba84f4bce554471382ccba917ef16265f11, stream: master, version: '20170315134803', 'filtered_rpms': []}}
requires: {base-runtime: {ref: ae993ba84f4bce554471382ccba917ef16265f11, stream: master, version: '20170315134803', 'filtered_rpms': []}}
commit: 7fea453bc362cc8e5aa41e129e689baea853653d
scmurl: git://pkgs.stg.fedoraproject.org/modules/starcommand.git?#7fea453
references:
community: https://fedoraproject.org/wiki/Modularity
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
tracker: https://taiga.fedorainfracloud.org/project/modularity
profiles:
default:
rpms:
- communicator
api:
rpms:
- communicator
components:
rpms:
communicator:
rationale: Provides the API for this module.
buildorder: 10
ref: f25

View File

@@ -0,0 +1,60 @@
document: modulemd
version: 1
data:
name: testmodule-more-components
stream: master
version: 20180205135154
context: c2c572ec
summary: A test module in all its beautiful beauty
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
module:
- MIT
dependencies:
buildrequires:
platform: f28
requires:
platform: f28
references:
community: https://docs.pagure.org/modularity/
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
xmd:
mbs:
buildrequires:
platform:
filtered_rpms: []
ref: virtual
stream: f28
version: '3'
commit: 620ec77321b2ea7b0d67d82992dda3e1d67055b4
requires:
platform:
filtered_rpms: []
ref: virtual
stream: f28
version: '3'
rpms:
ed:
ref: 51f529a5cde2b843ed9c7870689d707eaab3a9d1
mksh:
ref: c7df9926cbe7bd8ffbd0ed35108814d7e037d1e3
ed2:
ref: 61f529a5cde2b843ed9c7870689d707eaab3a9d1
mksh2:
ref: d7df9926cbe7bd8ffbd0ed35108814d7e037d1e3
scmurl: https://src.fedoraproject.org/modules/testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
ref: f25
perl-Tangerine:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f25
perl-List-Compare1:
rationale: A dependency of tangerine.
ref: f25
perl-Tangerine1:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f25

View File

@@ -1,39 +1,70 @@
data:
api:
rpms: [tangerine, perl-Tangerine]
components:
rpms:
perl-List-Compare: {cache: 'http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare',
rationale: A dependency of tangerine., ref: 76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb,
repository: 'git://pkgs.fedoraproject.org/rpms/perl-List-Compare'}
perl-Tangerine: {cache: 'http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine',
rationale: Provides API for this module and is a dependency of tangerine.,
ref: 4ceea43add2366d8b8c5a622a2fb563b625b9abf, repository: 'git://pkgs.fedoraproject.org/rpms/perl-Tangerine'}
tangerine: {buildorder: 10, cache: 'http://pkgs.fedoraproject.org/repo/pkgs/tangerine',
rationale: Provides API for this module., ref: fbed359411a1baa08d4a88e0d12d426fbf8f602c,
repository: 'git://pkgs.fedoraproject.org/rpms/tangerine'}
dependencies:
buildrequires: {base-runtime: master}
requires: {base-runtime: master}
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
filter: {}
license:
module: [MIT]
name: testmodule
profiles:
default:
rpms: [tangerine]
references: {community: 'https://fedoraproject.org/wiki/Modularity', documentation: 'https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules',
tracker: 'https://taiga.fedorainfracloud.org/project/modularity'}
stream: master
summary: A test module in all its beautiful beauty
version: 20170109091357
xmd:
mbs:
buildrequires: {base-runtime: {ref: ae993ba84f4bce554471382ccba917ef16265f11, stream: master, version: 20170315134803, 'filtered_rpms': []}}
requires: {base-runtime: {ref: ae993ba84f4bce554471382ccba917ef16265f11, stream: master, version: 20170315134803, 'filtered_rpms': []}}
commit: 7fea453bc362cc8e5aa41e129e689baea853653d
scmurl: git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#7fea453
document: modulemd
version: 1
data:
name: testmodule
stream: master
version: 20180205135154
context: c2c572ec
summary: A test module in all its beautiful beauty
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
module:
- MIT
dependencies:
buildrequires:
platform: f28
requires:
platform: f28
references:
community: https://docs.pagure.org/modularity/
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
xmd:
mbs:
buildrequires:
platform:
filtered_rpms: []
ref: virtual
stream: f28
version: '3'
commit: 65a7721ee4eff44d2a63fb8f3a8da6e944ab7f4d
requires:
platform:
filtered_rpms: []
ref: virtual
stream: f28
version: '3'
rpms:
perl-List-Compare:
ref: ac0f3bccca9dcb8465c434ac4c38974bf6205c28
perl-Tangerine:
ref: 7e96446223f1ad84a26c7cf23d6591cd9f6326c6
tangerine:
ref: c0f9a7dbd8cf823a2bdc19eeeed20d22b0aa52bf
scmurl: https://src.fedoraproject.org/modules/testmodule.git?#65a7721ee4eff44d2a63fb8f3a8da6e944ab7f4d
profiles:
default:
rpms:
- tangerine
api:
rpms:
- perl-Tangerine
- tangerine
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
repository: git://pkgs.fedoraproject.org/rpms/perl-List-Compare
ref: master
cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-List-Compare
tangerine:
rationale: Provides API for this module.
buildorder: 10
repository: git://pkgs.fedoraproject.org/rpms/tangerine
ref: master
cache: http://pkgs.fedoraproject.org/repo/pkgs/tangerine
perl-Tangerine:
rationale: Provides API for this module and is a dependency of tangerine.
repository: git://pkgs.fedoraproject.org/rpms/perl-Tangerine
ref: master
cache: http://pkgs.fedoraproject.org/repo/pkgs/perl-Tangerine

View File

@@ -21,12 +21,12 @@ data:
components:
rpms:
file:
rationale: It's here to test the whole thing!
rationale: file
ref: 70fa7516b83768595a4f3280ae890a7ac957e0c7
buildorder: 10
ed:
rationale: ed
ref: 123
foo:
rationale: foo
ref: 80fa7516b83768595b4f3280ae890a7ac957e0c8
modules:
fakemodule:
rationale: foobar

View File

@@ -1,44 +0,0 @@
---
data:
api:
rpms: [ed, mksh]
artifacts:
rpms: [ed-debuginfo-1.14.1-4.module_92fc48de.x86_64, ed-1.14.1-4.module_92fc48de.x86_64,
module-build-macros-0.1-1.module_92fc48de.src, module-build-macros-0.1-1.module_92fc48de.noarch,
ed-1.14.1-4.module_92fc48de.src]
components:
rpms:
ed: {cache: 'http://pkgs.fedoraproject.org/repo/pkgs/ed', rationale: A build
dependency of mksh., ref: master, repository: 'git://pkgs.fedoraproject.org/rpms/ed'}
dependencies:
buildrequires: {base-runtime: master}
requires: {base-runtime: master}
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
module: [MIT]
name: base-runtime
profiles:
default:
rpms: [mksh]
buildroot:
rpms:
- foo
srpm-buildroot:
rpms:
- bar
references: {community: 'https://docs.pagure.org/modularity/', documentation: 'https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules'}
stream: master
summary: A test module in all its beautiful beauty
version: 20170816080815
xmd:
mbs:
buildrequires:
base-runtime: {ref: 147dca4ca65aa9a1ac51f71b7e687f9178ffa5df, stream: master,
version: '20170616125652'}
commit: 722fd739fd6cf66faf29f6fb95dd64f60ba3e39a
rpms:
ed: {ref: 01bf8330812fea798671925cc537f2f29b0bd216}
scmurl: file:///home/hanzz/modules/testmodule/
document: modulemd
version: 1

View File

@@ -12,7 +12,7 @@ data:
dependency of mksh., ref: master, repository: 'git://pkgs.fedoraproject.org/rpms/ed'}
dependencies:
buildrequires: {testmodule: master}
requires: {base-runtime: master}
requires: {platform: f28}
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
@@ -31,8 +31,7 @@ data:
testmodule: {ref: 147dca4ca65aa9a1ac51f71b7e687f9178ffa5df, stream: master,
version: '20170616125652'}
requires:
base-runtime: {ref: 147dca4ca65aa9a1ac51f71b7e687f9178ffa5df, stream: master,
version: '20170616125652'}
platform: {ref: virtual, stream: f28, version: '3'}
commit: 722fd739fd6cf66faf29f6fb95dd64f60ba3e39a
rpms:
ed: {ref: 01bf8330812fea798671925cc537f2f29b0bd216}

View File

@@ -0,0 +1,53 @@
---
data:
api:
rpms: [ed, mksh]
artifacts:
rpms: ['ed-debuginfo-0:1.14.2-1.module_1+df67fa84.x86_64', 'ed-0:1.14.2-1.module_1+df67fa84.x86_64',
'ed-debugsource-0:1.14.2-1.module_1+df67fa84.x86_64', 'ed-0:1.14.2-1.module_1+df67fa84.src',
'mksh-debugsource-0:56c-1.module_1+df67fa84.x86_64', 'mksh-0:56c-1.module_1+df67fa84.x86_64',
'mksh-debuginfo-0:56c-1.module_1+df67fa84.x86_64', 'mksh-0:56c-1.module_1+df67fa84.src',
'module-build-macros-0.1-1.module_1+df67fa84.src', 'module-build-macros-0.1-1.module_1+df67fa84.noarch']
components:
rpms:
ed:
rationale: A build dependency of mksh, to test buildorder.
repository: git://pkgs.fedoraproject.org/rpms/ed
ref: master
cache: http://pkgs.fedoraproject.org/repo/pkgs/ed
mksh:
rationale: The main component of this module.
buildorder: 1
repository: git://pkgs.fedoraproject.org/rpms/mksh
ref: master
cache: http://pkgs.fedoraproject.org/repo/pkgs/mksh
dependencies:
buildrequires: {}
requires: {}
description: Fedora 28 traditional base
license:
module: [MIT]
name: platform
profiles:
default:
rpms: [mksh]
buildroot:
rpms:
- foo
srpm-buildroot:
rpms:
- bar
references: {community: 'https://docs.pagure.org/modularity/', documentation: 'https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules'}
stream: f28
summary: A test module in all its beautiful beauty
version: 3
xmd:
mbs:
buildrequires:
platform: {}
commit: virtual
rpms:
ed: {}
scmurl: file:///home/hanzz/modules/testmodule/
document: modulemd
version: 1

View File

@@ -11,8 +11,8 @@ data:
ed: {cache: 'http://pkgs.fedoraproject.org/repo/pkgs/ed', rationale: A build
dependency of mksh., ref: master, repository: 'git://pkgs.fedoraproject.org/rpms/ed'}
dependencies:
buildrequires: {base-runtime: master}
requires: {base-runtime: master}
buildrequires: {platform: f28}
requires: {platform: f28}
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
@@ -28,8 +28,7 @@ data:
xmd:
mbs:
buildrequires:
base-runtime: {ref: 147dca4ca65aa9a1ac51f71b7e687f9178ffa5df, stream: master,
version: '20170616125652'}
platform: {ref: virtual, stream: f28, version: '3'}
commit: 722fd739fd6cf66faf29f6fb95dd64f60ba3e39a
rpms:
ed: {ref: 01bf8330812fea798671925cc537f2f29b0bd216}

View File

@@ -11,8 +11,8 @@ data:
ed: {cache: 'http://pkgs.fedoraproject.org/repo/pkgs/ed', rationale: A build
dependency of mksh., ref: master, repository: 'git://pkgs.fedoraproject.org/rpms/ed'}
dependencies:
buildrequires: {base-runtime: master}
requires: {base-runtime: master}
buildrequires: {platform: f28}
requires: {platform: f28}
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
@@ -28,8 +28,7 @@ data:
xmd:
mbs:
buildrequires:
base-runtime: {ref: 147dca4ca65aa9a1ac51f71b7e687f9178ffa5df, stream: master,
version: '20170616125652'}
platform: {ref: virtual, stream: f28, version: '3'}
commit: 722fd739fd6cf66faf29f6fb95dd64f60ba3e39a
rpms:
ed: {ref: 01bf8330812fea798671925cc537f2f29b0bd216}

View File

@@ -18,8 +18,8 @@ data:
mksh: {cache: 'http://pkgs.fedoraproject.org/repo/pkgs/mksh', rationale: A build
dependency of mksh., ref: master, repository: 'git://pkgs.fedoraproject.org/rpms/mksh'}
dependencies:
buildrequires: {base-runtime: master, testmodule: master}
requires: {base-runtime: master}
buildrequires: {platform: f28, testmodule: master}
requires: {platform: f28}
description: This module demonstrates how to write simple modulemd files And can
be used for testing the build and release pipeline.
license:
@@ -35,8 +35,7 @@ data:
xmd:
mbs:
buildrequires:
base-runtime: {ref: 147dca4ca65aa9a1ac51f71b7e687f9178ffa5df, stream: master,
version: '20170616125652'}
platform: {ref: virtual, stream: f28, version: '3'}
testmodule: {stream: master, version: '20170816080815'}
commit: null
rpms:

View File

@@ -0,0 +1,21 @@
data:
description: Fedora 28 traditional base
name: platform
profiles:
buildroot:
rpms: [bash, bzip2, coreutils, cpio, diffutils, fedora-release, findutils, gawk,
gcc, gcc-c++, grep, gzip, info, make, patch, redhat-rpm-config, rpm-build,
sed, shadow-utils, tar, unzip, util-linux, which, xz]
srpm-buildroot:
rpms: [bash, fedora-release, fedpkg-minimal, gnupg2, redhat-rpm-config, rpm-build,
shadow-utils]
stream: f28
summary: Fedora 28 traditional base
version: 3
xmd:
mbs:
buildrequires: {}
commit: virtual
requires: {}
document: modulemd
version: 1

View File

@@ -1,5 +1,5 @@
# This module is left empty because python3 is contained in the
# Platform module of Fedora 27 Modular Server edition.
# Platform module.
# Other modules can depend on this empty one so that, when the
# implementation of python3 is moved out of the Platform module,
@@ -25,9 +25,9 @@ data:
- MIT
dependencies:
buildrequires:
bootstrap: master
platform: f28
requires:
platform: master
platform: f28
references:
community: https://www.python.org/
documentation: https://docs.python.org/3/

View File

@@ -1,36 +0,0 @@
document: modulemd
version: 1
data:
summary: A test module in all its beauty
description: This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline.
license:
module: [ MIT ]
dependencies:
buildrequires:
bootstrap: master
requires:
bootstrap: master
references:
community: https://fedoraproject.org/wiki/Modularity
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
tracker: https://taiga.fedorainfracloud.org/project/modularity
profiles:
default:
rpms:
- tangerine
api:
rpms:
- perl-Tangerine
- tangerine
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
ref: f25
perl-Tangerine:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f25
tangerine:
rationale: Provides API for this module.
buildorder: 10
ref: f25

View File

@@ -1,38 +1,31 @@
document: modulemd
version: 1
data:
summary: A test module in all its beauty
description: This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline.
summary: A test module in all its beautiful beauty
description: >-
This module demonstrates how to write simple modulemd files And
can be used for testing the build and release pipeline.
license:
module: [ MIT ]
dependencies:
buildrequires:
bootstrap: master
platform: f28
requires:
bootstrap: master
platform: f28
references:
community: https://fedoraproject.org/wiki/Modularity
community: https://docs.pagure.org/modularity/
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
tracker: https://taiga.fedorainfracloud.org/project/modularity
profiles:
default:
rpms:
- tangerine
api:
rpms:
- perl-Tangerine
- tangerine
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
ref: f25
ref: master
perl-Tangerine:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f25
ref: master
perl-List-Compare1:
rationale: A dependency of tangerine.
ref: f25
ref: master
perl-Tangerine1:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f25
ref: master

View File

@@ -1,32 +0,0 @@
document: modulemd
version: 1
data:
name: testmodule-variant
summary: A test module in all its whackiness
description: This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline.
license:
module: [ MIT ]
dependencies:
buildrequires:
base-runtime: master
requires:
base-runtime: master
references:
community: https://fedoraproject.org/wiki/Modularity
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
tracker: https://taiga.fedorainfracloud.org/project/modularity
profiles:
default:
rpms:
- python
api:
rpms:
- python
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
ref: f25
python:
rationale: This is irrational
ref: f24

View File

@@ -1,37 +0,0 @@
document: modulemd
version: 1
data:
name: wrong_name
summary: A test module in all its beauty
description: This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline.
license:
module: [ MIT ]
dependencies:
buildrequires:
base-runtime: master
requires:
base-runtime: master
references:
community: https://fedoraproject.org/wiki/Modularity
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
tracker: https://taiga.fedorainfracloud.org/project/modularity
profiles:
default:
rpms:
- tangerine
api:
rpms:
- perl-Tangerine
- tangerine
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
ref: f25
perl-Tangerine:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f25
tangerine:
rationale: Provides API for this module.
buildorder: 10
ref: f25

View File

@@ -1,36 +1,37 @@
document: modulemd
version: 1
data:
summary: A test module in all its beauty
description: This module demonstrates how to write simple modulemd files And can be used for testing the build and release pipeline.
summary: A test module in all its beautiful beauty
description: >-
This module demonstrates how to write simple modulemd files And
can be used for testing the build and release pipeline.
license:
module: [ MIT ]
dependencies:
buildrequires:
base-runtime: master
platform: f28
requires:
base-runtime: master
platform: f28
references:
community: https://fedoraproject.org/wiki/Modularity
community: https://docs.pagure.org/modularity/
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
tracker: https://taiga.fedorainfracloud.org/project/modularity
profiles:
default:
rpms:
- tangerine
- tangerine
api:
rpms:
- perl-Tangerine
- tangerine
- perl-Tangerine
- tangerine
components:
rpms:
perl-List-Compare:
rationale: A dependency of tangerine.
ref: f25
ref: master
perl-Tangerine:
rationale: Provides API for this module and is a dependency of tangerine.
ref: f24
ref: master
tangerine:
rationale: Provides API for this module.
buildorder: 10
ref: f23
ref: master

View File

@@ -21,7 +21,6 @@
# Written by Jan Kaluza <jkaluza@redhat.com>
import koji
import vcr
import os
from os import path, mkdir
from os.path import dirname
@@ -34,7 +33,6 @@ import module_build_service.scheduler.handlers.repos
import module_build_service.utils
from module_build_service.errors import Forbidden
from module_build_service import db, models, conf, build_logs
from tests import get_vcr_path
from mock import patch, PropertyMock, Mock
from werkzeug.datastructures import FileStorage
@@ -55,10 +53,11 @@ user = ('Homer J. Simpson', set(['packager']))
class FakeSCM(object):
def __init__(self, mocked_scm, name, mmd_filename, commit=None):
def __init__(self, mocked_scm, name, mmd_filename, commit=None, version=20180205135154):
self.mocked_scm = mocked_scm
self.name = name
self.commit = commit
self.version = version
self.mmd_filename = mmd_filename
self.sourcedir = None
@@ -67,6 +66,7 @@ class FakeSCM(object):
self.mocked_scm.return_value.branch = 'master'
self.mocked_scm.return_value.get_latest = self.get_latest
self.mocked_scm.return_value.commit = self.commit
self.mocked_scm.return_value.version = self.version
self.mocked_scm.return_value.repository_root = "git://pkgs.stg.fedoraproject.org/modules/"
self.mocked_scm.return_value.sourcedir = self.sourcedir
self.mocked_scm.return_value.get_module_yaml = self.get_module_yaml
@@ -305,13 +305,9 @@ class TestBuild:
self.client = app.test_client()
clean_database()
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
def teardown_method(self, test_method):
FakeModuleBuilder.reset()
cleanup_moksha()
self.vcr.__exit__()
for i in range(20):
try:
os.remove(build_logs.path(i))
@@ -320,7 +316,8 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
"""
Tests the build of testmodule.yaml using FakeModuleBuilder which
succeeds everytime.
@@ -330,7 +327,7 @@ class TestBuild:
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -381,19 +378,47 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_no_components(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build_no_components(self, mocked_scm, mocked_get_user, conf_system, dbg, pdc):
"""
Tests the build of a module with no components
"""
FakeSCM(mocked_scm, 'python3', 'python3-no-components.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
python3_yaml_path = os.path.join(
base_dir, 'staged_data', 'formatted_python3-no-components.yaml')
with open(python3_yaml_path) as f:
python3_yaml = f.read()
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
pdc.endpoints['unreleasedvariants']['GET'].append({
'variant_id': 'python3',
'variant_uid': 'python3:master:20180205135154',
'variant_name': 'python3',
'variant_type': 'module',
'variant_version': 'master',
'variant_release': '20180205135154',
'koji_tag': 'module-95b214a704c984be',
'modulemd': python3_yaml,
'runtime_deps': [
{
'dependency': 'platform',
'stream': 'f28'
}
],
'build_deps': [
{
'dependency': 'platform',
'stream': 'f28'
}
],
'rpms': [],
'active': False,
})
msgs = []
stop = module_build_service.scheduler.make_simple_stop_condition(db.session)
@@ -426,8 +451,10 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_from_yaml_allowed(self, mocked_scm, mocked_get_user, conf_system, dbg):
FakeSCM(mocked_scm, "testmodule", "testmodule.yaml")
def test_submit_build_from_yaml_allowed(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
testmodule = os.path.join(base_dir, 'staged_data', 'testmodule.yaml')
with patch.object(module_build_service.config.Config, 'yaml_submit_allowed',
@@ -440,14 +467,23 @@ class TestBuild:
data = json.loads(rv.data)
assert data['id'] == 1
# Since the module's version is derived a submission for direct yaml submissions, we must
# alter PDC with the correct version that MBS generated
version = models.ModuleBuild.query.first().version
pdc_module_inactive.endpoints['unreleasedvariants']['GET'][1]['variant_release'] = version
uid = pdc_module_inactive.endpoints['unreleasedvariants']['GET'][1]['variant_uid']
new_uid = ':'.join([uid.rsplit(':', 1)[0], version])
pdc_module_inactive.endpoints['unreleasedvariants']['GET'][1]['variant_uid'] = new_uid
msgs = []
stop = module_build_service.scheduler.make_simple_stop_condition(db.session)
module_build_service.scheduler.main(msgs, stop)
assert models.ModuleBuild.query.first().state == models.BUILD_STATES['ready']
@patch('module_build_service.auth.get_user', return_value=user)
def test_submit_build_with_optional_params(self, mocked_get_user, conf_system, dbg):
params = {'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}
def submit(data):
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(data))
@@ -463,7 +499,8 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_cancel(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build_cancel(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
"""
Submit all builds for a module and cancel the module build later.
"""
@@ -472,7 +509,7 @@ class TestBuild:
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -514,7 +551,8 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_instant_complete(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build_instant_complete(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
"""
Tests the build of testmodule.yaml using FakeModuleBuilder which
succeeds everytime.
@@ -524,7 +562,7 @@ class TestBuild:
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -547,7 +585,7 @@ class TestBuild:
new_callable=PropertyMock, return_value=1)
def test_submit_build_concurrent_threshold(self, conf_num_concurrent_builds,
mocked_scm, mocked_get_user,
conf_system, dbg):
conf_system, dbg, pdc_module_inactive):
"""
Tests the build of testmodule.yaml using FakeModuleBuilder with
num_concurrent_builds set to 1.
@@ -557,7 +595,7 @@ class TestBuild:
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -591,7 +629,7 @@ class TestBuild:
new_callable=PropertyMock, return_value=2)
def test_try_to_reach_concurrent_threshold(self, conf_num_concurrent_builds,
mocked_scm, mocked_get_user,
conf_system, dbg):
conf_system, dbg, pdc_module_inactive):
"""
Tests that we try to submit new component build right after
the previous one finished without waiting for all
@@ -599,10 +637,21 @@ class TestBuild:
"""
FakeSCM(mocked_scm, 'testmodule-more-components', 'testmodule-more-components.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
# Modify the modulemd in PDC
current_dir = os.path.dirname(__file__)
formatted_yml_path = os.path.join(
current_dir, '..', 'staged_data', 'formatted_testmodule-more-components.yaml')
with open(formatted_yml_path) as f:
yaml = f.read()
pdc_module_inactive.endpoints['unreleasedvariants']['GET'][-1].update({
'variant_id': 'testmodule-more-components',
'variant_name': 'testmodule-more-components',
'modulemd': yaml
})
self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
# Holds the number of concurrent component builds during
# the module build.
@@ -641,7 +690,7 @@ class TestBuild:
@patch("module_build_service.config.Config.num_concurrent_builds",
new_callable=PropertyMock, return_value=1)
def test_build_in_batch_fails(self, conf_num_concurrent_builds, mocked_scm,
mocked_get_user, conf_system, dbg):
mocked_get_user, conf_system, dbg, pdc_module_inactive):
"""
Tests that if the build in batch fails, other components in a batch
are still build, but next batch is not started.
@@ -651,7 +700,7 @@ class TestBuild:
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -700,7 +749,7 @@ class TestBuild:
@patch("module_build_service.config.Config.num_concurrent_builds",
new_callable=PropertyMock, return_value=1)
def test_all_builds_in_batch_fail(self, conf_num_concurrent_builds, mocked_scm,
mocked_get_user, conf_system, dbg):
mocked_get_user, conf_system, dbg, pdc_module_inactive):
"""
Tests that if the build in batch fails, other components in a batch
are still build, but next batch is not started.
@@ -710,7 +759,7 @@ class TestBuild:
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -744,8 +793,8 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_reuse_all(self, mocked_scm, mocked_get_user,
conf_system, dbg):
def test_submit_build_reuse_all(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_reuse):
"""
Tests that we do not try building module-build-macros when reusing all
components in a module build.
@@ -796,7 +845,7 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_reuse_all_without_build_macros(self, mocked_scm, mocked_get_user,
conf_system, dbg):
conf_system, dbg, pdc_module_reuse):
"""
Tests that we can reuse components even when the reused module does
not have module-build-macros component.
@@ -848,7 +897,8 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_resume(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build_resume(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
"""
Tests that resuming the build works even when previous batches
are already built.
@@ -859,7 +909,7 @@ class TestBuild:
build_one = models.ModuleBuild()
build_one.name = 'testmodule'
build_one.stream = 'master'
build_one.version = 1
build_one.version = 20180205135154
build_one.build_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.runtime_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.state = models.BUILD_STATES['failed']
@@ -868,7 +918,7 @@ class TestBuild:
current_dir, '..', 'staged_data', 'formatted_testmodule.yaml')
with open(formatted_testmodule_yml_path, 'r') as f:
build_one.modulemd = f.read()
build_one.koji_tag = 'module-testmodule-master-1'
build_one.koji_tag = 'module-95b214a704c984be'
build_one.scmurl = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#7fea453'
build_one.batch = 2
build_one.owner = 'Homer J. Simpson'
@@ -891,19 +941,20 @@ class TestBuild:
component_one = models.ComponentBuild()
component_one.package = 'perl-Tangerine'
component_one.format = 'rpms'
component_one.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/perl-Tangerine.git?#f24'
component_one.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/perl-Tangerine.git?#master'
component_one.state = koji.BUILD_STATES['COMPLETE']
component_one.nvr = 'perl-Tangerine-0.23-1.module_testmodule_master_1'
component_one.nvr = 'perl-Tangerine-0:0.22-2.module+0+814cfa39'
component_one.batch = 2
component_one.module_id = 1
component_one.ref = '4ceea43add2366d8b8c5a622a2fb563b625b9abf'
component_one.ref = '7e96446223f1ad84a26c7cf23d6591cd9f6326c6'
component_one.tagged = True
component_one.tagged_in_final = True
# Failed component
component_two = models.ComponentBuild()
component_two.package = 'perl-List-Compare'
component_two.format = 'rpms'
component_two.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/perl-List-Compare.git?#f24'
component_two.scmurl = \
'git://pkgs.stg.fedoraproject.org/rpms/perl-List-Compare.git?#master'
component_two.state = koji.BUILD_STATES['FAILED']
component_two.batch = 2
component_two.module_id = 1
@@ -911,7 +962,7 @@ class TestBuild:
component_three = models.ComponentBuild()
component_three.package = 'tangerine'
component_three.format = 'rpms'
component_three.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/tangerine.git?#f24'
component_three.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/tangerine.git?#master'
component_three.batch = 3
component_three.module_id = 1
# module-build-macros
@@ -935,11 +986,12 @@ class TestBuild:
db.session.commit()
db.session.expire_all()
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml', '7fea453')
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
# Resubmit the failed module
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#7fea453'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']
@@ -980,7 +1032,7 @@ class TestBuild:
build_one = models.ModuleBuild()
build_one.name = 'testmodule'
build_one.stream = 'master'
build_one.version = 1
build_one.version = 20180205135154
build_one.build_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.runtime_context = 'ac4de1c346dcf09ce77d38cd4e75094ec1c08eb0'
build_one.state = models.BUILD_STATES['failed']
@@ -989,7 +1041,7 @@ class TestBuild:
current_dir, '..', 'staged_data', 'formatted_testmodule.yaml')
with open(formatted_testmodule_yml_path, 'r') as f:
build_one.modulemd = f.read()
build_one.koji_tag = 'module-testmodule-master-1'
build_one.koji_tag = 'module-95b214a704c984be'
build_one.scmurl = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#7fea453'
build_one.batch = 2
build_one.owner = 'Homer J. Simpson'
@@ -1012,19 +1064,20 @@ class TestBuild:
component_one = models.ComponentBuild()
component_one.package = 'perl-Tangerine'
component_one.format = 'rpms'
component_one.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/perl-Tangerine.git?#f24'
component_one.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/perl-Tangerine.git?#master'
component_one.batch = 2
component_one.module_id = 1
component_two = models.ComponentBuild()
component_two.package = 'perl-List-Compare'
component_two.format = 'rpms'
component_two.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/perl-List-Compare.git?#f24'
component_two.scmurl = \
'git://pkgs.stg.fedoraproject.org/rpms/perl-List-Compare.git?#master'
component_two.batch = 2
component_two.module_id = 1
component_three = models.ComponentBuild()
component_three.package = 'tangerine'
component_three.format = 'rpms'
component_three.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/tangerine.git?#f24'
component_three.scmurl = 'git://pkgs.stg.fedoraproject.org/rpms/tangerine.git?#master'
component_three.batch = 3
component_three.module_id = 1
# Failed module-build-macros
@@ -1034,7 +1087,7 @@ class TestBuild:
component_four.state = koji.BUILD_STATES['FAILED']
component_four.scmurl = (
'/tmp/module_build_service-build-macrosqr4AWH/SRPMS/module-build-macros-0.1-1.'
'module_testmodule_master_20170109091357.src.rpm')
'module_testmodule_master_20180205135154.src.rpm')
component_four.batch = 1
component_four.module_id = 1
component_four.build_time_only = True
@@ -1078,11 +1131,13 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_resume_failed_init(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build_resume_failed_init(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
"""
Tests that resuming the build works when the build failed during the init step
"""
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml', '7fea453')
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
stop = module_build_service.scheduler.make_simple_stop_condition(db.session)
with patch('module_build_service.utils.format_mmd') as mock_format_mmd:
@@ -1090,7 +1145,7 @@ class TestBuild:
'Custom component repositories aren\'t allowed.')
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#7fea453'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
# Run the backend so that it fails in the "init" handler
module_build_service.scheduler.main([], stop)
cleanup_moksha()
@@ -1105,8 +1160,9 @@ class TestBuild:
# Resubmit the failed module
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': ('git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#7fea453')}))
{'branch': 'master',
'scmurl': ('git://pkgs.stg.fedoraproject.org/modules/testmodule.git?'
'#620ec77321b2ea7b0d67d82992dda3e1d67055b4')}))
module_build = models.ModuleBuild.query.filter_by(id=module_build_id).one()
components = models.ComponentBuild.query.filter_by(
@@ -1130,7 +1186,8 @@ class TestBuild:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build_resume_init_fail(self, mocked_scm, mocked_get_user, conf_system, dbg):
def test_submit_build_resume_init_fail(self, mocked_scm, mocked_get_user, conf_system, dbg,
pdc_module_inactive):
"""
Tests that resuming the build fails when the build is in init state
"""
@@ -1139,7 +1196,7 @@ class TestBuild:
# Post so a module is in the init phase
rv = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
assert rv.status_code == 201
# Run the backend
stop = module_build_service.scheduler.make_simple_stop_condition(db.session)
@@ -1147,7 +1204,7 @@ class TestBuild:
# Post again and make sure it fails
rv2 = self.client.post('/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master', 'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv2.data)
expected = {
'error': 'Conflict',
@@ -1169,13 +1226,9 @@ class TestLocalBuild:
self.client = app.test_client()
clean_database()
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
def teardown_method(self, test_method):
FakeModuleBuilder.reset()
cleanup_moksha()
self.vcr.__exit__()
for i in range(20):
try:
os.remove(build_logs.path(i))
@@ -1193,7 +1246,7 @@ class TestLocalBuild:
Tests local module build dependency.
"""
with app.app_context():
module_build_service.utils.load_local_builds(["base-runtime"])
module_build_service.utils.load_local_builds(["platform"])
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
@@ -1201,7 +1254,7 @@ class TestLocalBuild:
'/module-build-service/1/module-builds/', data=json.dumps(
{'branch': 'master',
'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/'
'testmodule.git?#68932c90de214d9d13feefbd35246a81b6cb8d49'}))
'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'}))
data = json.loads(rv.data)
module_build_id = data['id']

View File

@@ -21,7 +21,6 @@
# Written by Stanislav Ochotnicky <sochotnicky@redhat.com>
import json
import vcr
import os
from os import path
@@ -32,7 +31,7 @@ from module_build_service import models, conf, build_logs
from mock import patch, Mock, MagicMock, call
from tests import init_data, get_vcr_path
from tests import init_data
from module_build_service.builder.KojiContentGenerator import KojiContentGenerator
@@ -53,9 +52,6 @@ class TestBuild:
module.cg_build_koji_tag = "f27-module-candidate"
self.cg = KojiContentGenerator(module, conf)
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
# Ensure that there is no build log from other tests
try:
file_path = build_logs.path(self.cg.module)
@@ -70,7 +66,6 @@ class TestBuild:
del sys.modules['moksha.hub.reactor']
del sys.modules['moksha.hub']
import moksha.hub.reactor # noqa
self.vcr.__exit__()
try:
file_path = build_logs.path(self.cg.module)
os.remove(file_path)

View File

@@ -21,15 +21,14 @@
# Written by Ralph Bean <rbean@redhat.com>
import os
import copy
from mock import patch, PropertyMock
import vcr
import module_build_service.resolver as mbs_resolver
import module_build_service.utils
import module_build_service.models
from module_build_service import app, db
from tests import get_vcr_path
import tests
import modulemd
@@ -40,15 +39,6 @@ base_dir = os.path.join(os.path.dirname(__file__), "..")
class TestPDCModule:
def setup_method(self, test_method):
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
self.resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
def teardown_method(self, test_method):
self.vcr.__exit__()
def test_get_variant_dict_module_dict_active(self):
"""
Tests that "active" is honored by get_variant_dict(...).
@@ -64,48 +54,66 @@ class TestPDCModule:
'variant_version': 'master'
}
variant_dict = self.resolver._get_variant_dict(dep)
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
variant_dict = resolver._get_variant_dict(dep)
assert variant_dict == expected
def test_get_module_simple_as_dict(self):
def test_get_module_simple_as_dict(self, pdc_module_active):
query = {'name': 'testmodule', 'version': 'master'}
result = self.resolver._get_module(query)
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
result = resolver._get_module(query)
assert result['variant_name'] == 'testmodule'
assert result['variant_version'] == 'master'
assert 'build_deps' in result
def test_get_module_build_dependencies(self):
"""
Tests that we return proper koji_tags with base-runtime
build-time dependencies.
"""
query = {
'name': 'base-runtime',
'version': 'master',
'release': '20170315134803',
}
result = self.resolver.get_module_build_dependencies(query).keys()
expected = [
u'module-bootstrap-rawhide',
]
assert set(result) == set(expected)
def test_get_module_build_dependencies_single_level(self):
def test_get_module_build_dependencies(self, pdc_module_active):
"""
Tests that we return just direct build-time dependencies of testmodule.
It means just testmodule itself and base-runtime, but no f26-modularity
(koji tag of bootstrap module which is build-require of base-runtime).
"""
query = {
'name': 'testmodule',
'version': 'master',
'release': '20170322155247'
'release': '20180205135154',
}
result = self.resolver.get_module_build_dependencies(query).keys()
expected = [
u'module-base-runtime-master-20170315134803',
]
assert set(result) == set(expected)
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
result = resolver.get_module_build_dependencies(query).keys()
assert set(result) == set(['module-f28-build'])
def test_get_module_build_dependencies_recursive(self, pdc_module_active):
"""
Tests that we return just direct build-time dependencies of testmodule.
"""
# Add testmodule2 that requires testmodule
pdc_module_active.endpoints['unreleasedvariants']['GET'].append(
copy.deepcopy(pdc_module_active.endpoints['unreleasedvariants']['GET'][-1]))
pdc_item = pdc_module_active.endpoints['unreleasedvariants']['GET'][-1]
mmd = modulemd.ModuleMetadata()
mmd.loads(pdc_item['modulemd'])
mmd.name = 'testmodule2'
mmd.version = 20180123171545
mmd.requires['testmodule'] = 'master'
mmd.xmd['mbs']['requires']['testmodule'] = {
'filtered_rpms': [],
'ref': '620ec77321b2ea7b0d67d82992dda3e1d67055b4',
'stream': 'master',
'version': '20180205135154'
}
pdc_item.update({
'variant_id': 'testmodule2',
'variant_name': 'testmodule2',
'variant_release': str(mmd.version),
'koji_tag': 'module-ae2adf69caf0e1b6',
'modulemd': mmd.dumps()
})
query = {
'name': 'testmodule2',
'version': 'master',
'release': '20180123171545',
}
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
result = resolver.get_module_build_dependencies(query).keys()
assert set(result) == set(['module-f28-build'])
@patch("module_build_service.config.Config.system",
new_callable=PropertyMock, return_value="test")
@@ -120,40 +128,42 @@ class TestPDCModule:
"""
with app.app_context():
module_build_service.utils.load_local_builds(
["base-runtime", "parent", "child", "testmodule"])
["platform", "parent", "child", "testmodule"])
build = module_build_service.models.ModuleBuild.local_modules(
db.session, "child", "master")
result = self.resolver.get_module_build_dependencies(build[0].mmd()).keys()
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
result = resolver.get_module_build_dependencies(build[0].mmd()).keys()
local_path = os.path.join(base_dir, 'staged_data', "local_builds")
expected = [
os.path.join(
local_path,
'module-base-runtime-master-20170816080815/results'),
'module-platform-f28-3/results'),
os.path.join(
local_path,
'module-parent-master-20170816080815/results'),
]
assert set(result) == set(expected)
def test_resolve_profiles(self):
def test_resolve_profiles(self, pdc_module_active):
yaml_path = os.path.join(
base_dir, 'staged_data', 'formatted_testmodule.yaml')
mmd = modulemd.ModuleMetadata()
mmd.load(yaml_path)
result = self.resolver.resolve_profiles(mmd, ('buildroot', 'srpm-buildroot'))
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
result = resolver.resolve_profiles(mmd, ('buildroot', 'srpm-buildroot'))
expected = {
'buildroot':
set(['unzip', 'tar', 'cpio', 'gawk', 'gcc', 'xz', 'sed',
'findutils', 'util-linux', 'bash', 'info', 'bzip2',
'grep', 'redhat-rpm-config', 'fedora-modular-release',
'grep', 'redhat-rpm-config', 'fedora-release',
'diffutils', 'make', 'patch', 'shadow-utils', 'coreutils',
'which', 'rpm-build', 'gzip', 'gcc-c++']),
'srpm-buildroot':
set(['shadow-utils', 'redhat-rpm-config', 'rpm-build',
'fedora-modular-release', 'fedpkg-minimal', 'gnupg2',
'fedora-release', 'fedpkg-minimal', 'gnupg2',
'bash'])
}
assert result == expected
@@ -165,13 +175,14 @@ class TestPDCModule:
return_value=os.path.join(base_dir, 'staged_data', "local_builds"))
def test_resolve_profiles_local_module(self, local_builds, conf_system):
with app.app_context():
module_build_service.utils.load_local_builds(["base-runtime"])
module_build_service.utils.load_local_builds(['platform'])
yaml_path = os.path.join(
base_dir, 'staged_data', 'formatted_testmodule.yaml')
mmd = modulemd.ModuleMetadata()
mmd.load(yaml_path)
result = self.resolver.resolve_profiles(mmd, ('buildroot', 'srpm-buildroot'))
resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='pdc')
result = resolver.resolve_profiles(mmd, ('buildroot', 'srpm-buildroot'))
expected = {
'buildroot':
set(['foo']),

View File

@@ -22,9 +22,8 @@
import os
from mock import patch, PropertyMock
import vcr
from tests import conf, clean_database, get_vcr_path
from tests import conf, clean_database
from tests.test_views.test_views import FakeSCM
import module_build_service.messaging
import module_build_service.scheduler.handlers.modules
@@ -42,17 +41,13 @@ class TestModuleInit:
self.staged_data_dir, 'testmodule.yaml')
with open(testmodule_yml_path, 'r') as f:
yaml = f.read()
scmurl = ('git://pkgs.domain.local/modules/testmodule?#da95886')
scmurl = 'git://pkgs.domain.local/modules/testmodule?#620ec77'
clean_database()
with make_session(conf) as session:
ModuleBuild.create(
session, conf, 'testmodule', '1', 3, yaml, scmurl, 'mprahl')
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
def teardown_method(self, test_method):
self.vcr.__exit__()
try:
path = build_logs.path(1)
os.remove(path)
@@ -60,7 +55,7 @@ class TestModuleInit:
pass
@patch('module_build_service.scm.SCM')
def test_init_basic(self, mocked_scm):
def test_init_basic(self, mocked_scm, pdc):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
msg = module_build_service.messaging.MBSModule(
@@ -74,7 +69,7 @@ class TestModuleInit:
assert type(build.mmd().xmd['mbs']) is dict
@patch('module_build_service.scm.SCM')
def test_init_scm_not_available(self, mocked_scm):
def test_init_scm_not_available(self, mocked_scm, pdc):
def mocked_scm_get_latest():
raise RuntimeError("Failed in mocked_scm_get_latest")
@@ -93,13 +88,13 @@ class TestModuleInit:
@patch("module_build_service.config.Config.modules_allow_repository",
new_callable=PropertyMock, return_value=True)
@patch('module_build_service.scm.SCM')
def test_init_includedmodule(self, mocked_scm, mocked_mod_allow_repo):
def test_init_includedmodule(self, mocked_scm, mocked_mod_allow_repo, pdc):
FakeSCM(mocked_scm, "includedmodules", ['testmodule.yaml'])
includedmodules_yml_path = os.path.join(
self.staged_data_dir, 'includedmodules.yaml')
with open(includedmodules_yml_path, 'r') as f:
yaml = f.read()
scmurl = ('git://pkgs.domain.local/modules/includedmodule?#da95886')
scmurl = 'git://pkgs.domain.local/modules/includedmodule?#da95886'
with make_session(conf) as session:
ModuleBuild.create(
session, conf, 'includemodule', '1', 3, yaml, scmurl, 'mprahl')
@@ -112,24 +107,24 @@ class TestModuleInit:
batches = {}
for comp_build in ComponentBuild.query.filter_by(module_id=2).all():
batches[comp_build.package] = comp_build.batch
assert batches['ed'] == 2
assert batches['perl-List-Compare'] == 2
assert batches['perl-Tangerine'] == 2
assert batches['foo'] == 2
assert batches['tangerine'] == 3
assert batches['file'] == 4
# Test that the RPMs are properly merged in xmd
xmd_rpms = {
'ed': {'ref': '40bd001563'},
'perl-List-Compare': {'ref': '2ee8474e44'},
'tangerine': {'ref': 'd29d5c24b8'},
'perl-List-Compare': {'ref': '4f26aeafdb'},
'perl-Tangerine': {'ref': '4f26aeafdb'},
'tangerine': {'ref': '4f26aeafdb'},
'foo': {'ref': '93dea37599'},
'file': {'ref': 'a2740663f8'},
'perl-Tangerine': {'ref': '27785f9f05'}
}
assert build.mmd().xmd['mbs']['rpms'] == xmd_rpms
@patch('module_build_service.models.ModuleBuild.from_module_event')
@patch('module_build_service.scm.SCM')
def test_init_when_get_latest_raises(self, mocked_scm, mocked_from_module_event):
def test_init_when_get_latest_raises(self, mocked_scm, mocked_from_module_event, pdc):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'7035bd33614972ac66559ac1fdd019ff6027ad22',
get_latest_raise=True)

View File

@@ -26,9 +26,8 @@ import module_build_service.messaging
import module_build_service.scheduler.handlers.modules
import modulemd as _modulemd
import os
import vcr
import koji
from tests import conf, db, app, scheduler_init_data, get_vcr_path
from tests import conf, db, app, scheduler_init_data
from module_build_service import build_logs
from module_build_service.models import ComponentBuild, ModuleBuild
@@ -41,11 +40,7 @@ class TestModuleWait:
self.session = mock.Mock()
self.fn = module_build_service.scheduler.handlers.modules.wait
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
def teardown_method(self, test_method):
self.vcr.__exit__()
try:
path = build_logs.path(1)
os.remove(path)

View File

@@ -18,7 +18,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
from os import path
from mock import patch
from module_build_service import models, conf
from tests import test_reuse_component_init_data, init_data, db
@@ -28,10 +27,6 @@ from module_build_service.scheduler.producer import MBSProducer
import six.moves.queue as queue
from datetime import datetime, timedelta
BASE_DIR = path.abspath(path.dirname(__file__))
CASSETTES_DIR = path.join(
path.abspath(path.dirname(__file__)), '..', 'vcr-request-data')
@patch("module_build_service.builder.GenericBuilder.default_buildroot_groups",
return_value={'build': [], 'srpm-build': []})
@@ -115,7 +110,7 @@ class TestPoller:
poller = MBSProducer(hub)
poller.poll()
koji_session.newRepo.assert_called_once_with("module-testmodule-build")
koji_session.newRepo.assert_called_once_with("module-fe3adf73caf3e1b7-build")
def test_trigger_new_repo_when_succeded(self, create_builder,
koji_get_session, global_consumer,

View File

@@ -20,16 +20,12 @@
#
# Written by Ralph Bean <rbean@redhat.com>
from os.path import dirname
import mock
import vcr
import module_build_service.messaging
import module_build_service.scheduler.handlers.repos
import module_build_service.models
from tests import conf, db, app, scheduler_init_data, get_vcr_path
base_dir = dirname(dirname(__file__))
from tests import conf, db, app, scheduler_init_data
class TestRepoDone:
@@ -37,12 +33,6 @@ class TestRepoDone:
def setup_method(self, test_method):
scheduler_init_data()
self.vcr = vcr.use_cassette(get_vcr_path(__file__, test_method))
self.vcr.__enter__()
def teardown_method(self, test_method):
self.vcr.__exit__()
@mock.patch('module_build_service.models.ModuleBuild.from_repo_done_event')
def test_no_match(self, from_repo_done_event):
""" Test that when a repo msg hits us and we have no match,
@@ -71,20 +61,20 @@ class TestRepoDone:
@mock.patch('module_build_service.builder.KojiModuleBuilder.'
'KojiModuleBuilder.buildroot_connect')
def test_a_single_match(self, connect, build_fn, get_session, ready, list_tasks_fn, mock_gabt,
mock_uea):
mock_uea, pdc):
""" Test that when a repo msg hits us and we have a single match.
"""
get_session.return_value = mock.Mock(), 'development'
build_fn.return_value = 1234, 1, '', None
msg = module_build_service.messaging.KojiRepoChange(
'some_msg_id', 'module-starcommand-1.3-build')
'some_msg_id', 'module-95b214a704c984be-build')
module_build_service.scheduler.handlers.repos.done(
config=conf, session=db.session, msg=msg)
build_fn.assert_called_once_with(
artifact_name='communicator',
source=('git://pkgs.domain.local/rpms/communicator'
'?#da95886c8a443b36a9ce31abda1f9bed22f2f9c2'))
artifact_name='tangerine',
source=('git://pkgs.fedoraproject.org/rpms/tangerine?'
'#fbed359411a1baa08d4a88e0d12d426fbf8f602c'))
@mock.patch('module_build_service.builder.KojiModuleBuilder.'
'KojiModuleBuilder.recover_orphaned_artifact', return_value=[])
@@ -103,24 +93,24 @@ class TestRepoDone:
@mock.patch('module_build_service.builder.KojiModuleBuilder.'
'KojiModuleBuilder.buildroot_connect')
def test_a_single_match_build_fail(self, connect, build_fn, config, ready, list_tasks_fn,
mock_gabt, mock_uea):
mock_gabt, mock_uea, pdc):
""" Test that when a KojiModuleBuilder.build fails, the build is
marked as failed with proper state_reason.
"""
config.return_value = mock.Mock(), 'development'
build_fn.return_value = None, 4, 'Failed to submit artifact communicator to Koji', None
build_fn.return_value = None, 4, 'Failed to submit artifact tangerine to Koji', None
msg = module_build_service.messaging.KojiRepoChange(
'some_msg_id', 'module-starcommand-1.3-build')
'some_msg_id', 'module-95b214a704c984be-build')
module_build_service.scheduler.handlers.repos.done(
config=conf, session=db.session, msg=msg)
build_fn.assert_called_once_with(
artifact_name='communicator',
source=('git://pkgs.domain.local/rpms/communicator'
'?#da95886c8a443b36a9ce31abda1f9bed22f2f9c2'))
artifact_name='tangerine',
source=('git://pkgs.fedoraproject.org/rpms/tangerine?'
'#fbed359411a1baa08d4a88e0d12d426fbf8f602c'))
component_build = module_build_service.models.ComponentBuild.query\
.filter_by(package='communicator').one()
assert component_build.state_reason == 'Failed to submit artifact communicator to Koji'
.filter_by(package='tangerine').one()
assert component_build.state_reason == 'Failed to submit artifact tangerine to Koji'
@mock.patch('module_build_service.scheduler.handlers.repos.log.info')
def test_erroneous_regen_repo_received(self, mock_log_info):
@@ -129,9 +119,9 @@ class TestRepoDone:
"""
scheduler_init_data(1)
msg = module_build_service.messaging.KojiRepoChange(
'some_msg_id', 'module-starcommand-1.3-build')
'some_msg_id', 'module-95b214a704c984be-build')
component_build = module_build_service.models.ComponentBuild.query\
.filter_by(package='communicator').one()
.filter_by(package='tangerine').one()
component_build.tagged = False
db.session.add(component_build)
db.session.commit()
@@ -166,10 +156,9 @@ class TestRepoDone:
build_fn.return_value = None, 4, 'Failed to submit artifact communicator to Koji', None
msg = module_build_service.messaging.KojiRepoChange(
'some_msg_id', 'module-starcommand-1.3-build')
'some_msg_id', 'module-95b214a704c984be-build')
module_build_service.scheduler.handlers.repos.done(
config=conf, session=db.session, msg=msg)
module_build = module_build_service.models.ModuleBuild.query\
.filter_by(name='starcommand').one()
module_build = module_build_service.models.ModuleBuild.query.first()
assert module_build.state == module_build_service.models.BUILD_STATES["failed"]

View File

@@ -54,7 +54,7 @@ class TestTagTagged:
that we do nothing gracefully.
"""
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "artifact")
'id', 'module-fe3adf73caf3e1b7-build', "artifact")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
@@ -75,7 +75,7 @@ class TestTagTagged:
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.buildroot_ready.return_value = False
builder.module_build_tag = {"name": "module-testmodule-build"}
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
@@ -94,12 +94,12 @@ class TestTagTagged:
# Tag the first component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7-build', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the first component to the final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
@@ -109,7 +109,7 @@ class TestTagTagged:
# Tag the second component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7-build', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
@@ -119,12 +119,12 @@ class TestTagTagged:
# Tag the first component to the final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# newRepo should be called now - all components have been tagged.
koji_session.newRepo.assert_called_once_with("module-testmodule-build")
koji_session.newRepo.assert_called_once_with("module-fe3adf73caf3e1b7-build")
# Refresh our module_build object.
db.session.expunge(module_build)
@@ -151,7 +151,7 @@ class TestTagTagged:
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.buildroot_ready.return_value = False
builder.module_build_tag = {"name": "module-testmodule-build"}
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
@@ -163,12 +163,12 @@ class TestTagTagged:
# Tag the perl-List-Compare component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7-build', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the perl-List-Compare component to final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
@@ -193,7 +193,7 @@ class TestTagTagged:
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.buildroot_ready.return_value = False
builder.module_build_tag = {"name": "module-testmodule-build"}
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
@@ -216,18 +216,18 @@ class TestTagTagged:
# Tag the perl-List-Compare component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7-build', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the perl-List-Compare component to final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# newRepo should be called now - all successfully built
# components have been tagged.
koji_session.newRepo.assert_called_once_with("module-testmodule-build")
koji_session.newRepo.assert_called_once_with("module-fe3adf73caf3e1b7-build")
# Refresh our module_build object.
db.session.expunge(module_build)
@@ -257,7 +257,7 @@ class TestTagTagged:
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.buildroot_ready.return_value = False
builder.module_build_tag = {"name": "module-testmodule-build"}
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
@@ -272,12 +272,12 @@ class TestTagTagged:
# Tag the first component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7-build', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the first component to the final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
@@ -287,12 +287,12 @@ class TestTagTagged:
# Tag the second component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7-build', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the second component to final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
@@ -302,17 +302,17 @@ class TestTagTagged:
# Tag the component from first batch to final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "module-build-macros")
'id', 'module-fe3adf73caf3e1b7', "module-build-macros")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the component from first batch to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "module-build-macros")
'id', 'module-fe3adf73caf3e1b7-build', "module-build-macros")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# newRepo should be called now - all components have been tagged.
koji_session.newRepo.assert_called_once_with("module-testmodule-build")
koji_session.newRepo.assert_called_once_with("module-fe3adf73caf3e1b7-build")
# Refresh our module_build object.
db.session.expunge(module_build)
@@ -340,7 +340,7 @@ class TestTagTagged:
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.buildroot_ready.return_value = False
builder.module_build_tag = {"name": "module-testmodule-build"}
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
@@ -366,24 +366,24 @@ class TestTagTagged:
# Tag the perl-Tangerine component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-Tangerine")
'id', 'module-fe3adf73caf3e1b7-build', "perl-Tangerine")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
assert not koji_session.newRepo.called
# Tag the perl-List-Compare component to the buildroot.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule-build', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7-build', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# Tag the perl-List-Compare component to final tag.
msg = module_build_service.messaging.KojiTagChange(
'id', 'module-testmodule', "perl-List-Compare")
'id', 'module-fe3adf73caf3e1b7', "perl-List-Compare")
module_build_service.scheduler.handlers.tags.tagged(
config=conf, session=db.session, msg=msg)
# newRepo should be called now - all successfully built
# components have been tagged.
koji_session.newRepo.assert_called_once_with("module-testmodule-build")
koji_session.newRepo.assert_called_once_with("module-fe3adf73caf3e1b7-build")
# Refresh our module_build object.
db.session.expunge(module_build)

View File

@@ -22,7 +22,6 @@ import tempfile
from os import path, mkdir
from shutil import copyfile, rmtree
from datetime import datetime
import vcr
import modulemd
from werkzeug.datastructures import FileStorage
from mock import patch
@@ -42,8 +41,6 @@ from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
from tests import app
BASE_DIR = path.abspath(path.dirname(__file__))
CASSETTES_DIR = path.join(
path.abspath(path.dirname(__file__)), '..', 'vcr-request-data')
class FakeSCM(object):
@@ -82,290 +79,117 @@ class FakeSCM(object):
class TestUtils:
def setup_method(self, test_method):
self.filtered_rpms = [
u'sqlite-tcl-0:3.17.0-2.module_5ccf9229',
u'sqlite-analyzer-0:3.17.0-2.module_5ccf9229',
u'emacs-gettext-0:0.19.8.1-8.module_5ccf9229',
u'msghack-0:0.19.8.1-8.module_5ccf9229',
u'modeline2fb-0:2.1-40.module_5ccf9229',
u'audit-libs-python-0:2.7.3-1.module_5ccf9229',
u'audit-libs-python3-0:2.7.3-1.module_5ccf9229',
u'audispd-plugins-zos-0:2.7.3-1.module_5ccf9229',
u'audit-0:2.7.3-1.module_5ccf9229',
u'audispd-plugins-0:2.7.3-1.module_5ccf9229',
u'librepo-devel-0:1.7.20-3.module_5ccf9229',
u'python2-librepo-0:1.7.20-3.module_5ccf9229',
u'libcap-ng-python-0:0.7.8-3.module_5ccf9229',
u'iptables-compat-0:1.6.1-2.module_5ccf9229',
u'gobject-introspection-devel-0:1.52.0-1.module_5ccf9229',
u'ntsysv-0:1.9-1.module_5ccf9229',
u'pyparsing-0:2.1.10-3.module_5ccf9229',
u'python2-pyparsing-0:2.1.10-3.module_5ccf9229',
u'python2-appdirs-0:1.4.0-10.module_5ccf9229',
u'krb5-server-ldap-0:1.15-9.module_5ccf9229',
u'krb5-server-0:1.15-9.module_5ccf9229',
u'python-libxml2-0:2.9.4-2.module_5ccf9229',
u'libsemanage-python-0:2.6-2.module_5ccf9229',
u'python2-setuptools-0:34.3.0-1.module_5ccf9229',
u'libpeas-loader-python-0:1.20.0-5.module_5ccf9229',
u'libpeas-devel-0:1.20.0-5.module_5ccf9229',
u'libpeas-loader-python3-0:1.20.0-5.module_5ccf9229',
u'libpeas-gtk-0:1.20.0-5.module_5ccf9229',
u'python2-six-0:1.10.0-8.module_5ccf9229',
u'libtool-0:2.4.6-17.module_5ccf9229',
u'libverto-tevent-0:0.2.6-7.module_5ccf9229',
u'libverto-libevent-devel-0:0.2.6-7.module_5ccf9229',
u'libverto-tevent-devel-0:0.2.6-7.module_5ccf9229',
u'libverto-libevent-0:0.2.6-7.module_5ccf9229',
u'emacs-nox-1:25.2-0.1.rc2.module_5ccf9229',
u'emacs-common-1:25.2-0.1.rc2.module_5ccf9229',
u'emacs-1:25.2-0.1.rc2.module_5ccf9229',
u'emacs-terminal-1:25.2-0.1.rc2.module_5ccf9229',
u'python2-rpm-0:4.13.0.1-3.module_5ccf9229',
u'rpm-cron-0:4.13.0.1-3.module_5ccf9229',
u'cryptsetup-python-0:1.7.3-3.module_5ccf9229',
u'kernel-rpm-macros-0:63-1.module_5ccf9229',
u'cracklib-python-0:2.9.6-5.module_5ccf9229',
u'gnupg2-smime-0:2.1.18-2.module_5ccf9229',
u'qt5-rpm-macros-0:5.8.0-2.module_5ccf9229',
u'qt5-devel-0:5.8.0-2.module_5ccf9229',
u'qt5-0:5.8.0-2.module_5ccf9229',
u'texinfo-0:6.3-2.module_5ccf9229',
u'texinfo-tex-0:6.3-2.module_5ccf9229',
u'python-magic-0:5.30-5.module_5ccf9229',
u'lvm2-dbusd-0:2.02.168-4.module_5ccf9229',
u'cmirror-standalone-0:2.02.168-4.module_5ccf9229',
u'lvm2-python-libs-0:2.02.168-4.module_5ccf9229',
u'lvm2-cluster-0:2.02.168-4.module_5ccf9229',
u'cmirror-0:2.02.168-4.module_5ccf9229',
u'lvm2-cluster-standalone-0:2.02.168-4.module_5ccf9229',
u'lvm2-lockd-0:2.02.168-4.module_5ccf9229',
u'libselinux-ruby-0:2.6-2.module_5ccf9229',
u'libselinux-python-0:2.6-2.module_5ccf9229',
u'hfsutils-x11-0:3.2.6-31.module_5ccf9229',
u'glib2-fam-0:2.52.0-1.module_5ccf9229',
u'glib2-static-0:2.52.0-1.module_5ccf9229',
u'glib2-devel-0:2.52.0-1.module_5ccf9229',
u'syslinux-perl-0:6.04-0.2.module_5ccf9229',
u'perl-solv-0:0.6.26-1.module_5ccf9229',
u'python2-solv-0:0.6.26-1.module_5ccf9229',
u'cyrus-sasl-sql-0:2.1.26-30.module_5ccf9229',
u'openssl-perl-1:1.1.0e-1.module_5ccf9229',
u'libidn-java-0:1.33-2.module_5ccf9229',
u'libidn-javadoc-0:1.33-2.module_5ccf9229',
u'libbabeltrace-devel-0:1.5.2-2.module_5ccf9229',
u'grub2-starfield-theme-1:2.02-0.38.module_5ccf9229',
u'util-linux-user-0:2.29.1-2.module_5ccf9229',
u'freetype-demos-0:2.7.1-2.module_5ccf9229',
u'python2-packaging-0:16.8-4.module_5ccf9229',
u'python-pwquality-0:1.3.0-8.module_5ccf9229',
u'python2-pip-0:9.0.1-7.module_5ccf9229',
u'gnutls-devel-0:3.5.10-1.module_5ccf9229',
u'gnutls-guile-0:3.5.10-1.module_5ccf9229',
u'gnutls-utils-0:3.5.10-1.module_5ccf9229',
u'gnutls-dane-0:3.5.10-1.module_5ccf9229',
u'python3-tkinter-0:3.6.0-21.module_5ccf9229',
u'python3-tools-0:3.6.0-21.module_5ccf9229',
u'python3-debug-0:3.6.0-21.module_5ccf9229',
u'python3-test-0:3.6.0-21.module_5ccf9229',
u'libssh2-devel-0:1.8.0-2.module_5ccf9229',
u'python2-gpg-0:1.9.0-1.module_5ccf9229',
u'qgpgme-devel-0:1.9.0-1.module_5ccf9229',
u'qgpgme-0:1.9.0-1.module_5ccf9229',
u'dbus-x11-1:1.11.10-2.module_5ccf9229',
u'libcroco-devel-0:0.6.11-3.module_5ccf9229',
u'kernel-devel-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'python-perf-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'perf-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'kernel-tools-libs-devel-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'kernel-lpae-devel-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'kernel-tools-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'kernel-PAEdebug-devel-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'kernel-PAE-devel-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'kernel-debug-devel-0:4.11.0-0.rc7.git0.1.module_5ccf9229',
u'openldap-servers-0:2.4.44-8.module_5ccf9229',
u'systemd-journal-remote-0:233-3.module_5ccf9229',
u'glibc-utils-0:2.25-4.module_5ccf9229',
u'glibc-benchtests-0:2.25-4.module_5ccf9229',
u'libdnf-devel-0:0.8.2-1.module_987f08f4',
u'python2-hawkey-0:0.8.2-1.module_987f08f4',
u'sssd-nfs-idmap-0:1.15.2-4.module_47fecbcd',
u'python3-libipa_hbac-0:1.15.2-4.module_47fecbcd',
u'sssd-ipa-0:1.15.2-4.module_47fecbcd',
u'libsss_simpleifp-devel-0:1.15.2-4.module_47fecbcd',
u'python2-libipa_hbac-0:1.15.2-4.module_47fecbcd',
u'sssd-libwbclient-0:1.15.2-4.module_47fecbcd',
u'python3-sss-murmur-0:1.15.2-4.module_47fecbcd',
u'libsss_nss_idmap-devel-0:1.15.2-4.module_47fecbcd',
u'python2-sss-0:1.15.2-4.module_47fecbcd',
u'libsss_simpleifp-0:1.15.2-4.module_47fecbcd',
u'sssd-ldap-0:1.15.2-4.module_47fecbcd',
u'python3-sss-0:1.15.2-4.module_47fecbcd',
u'sssd-common-0:1.15.2-4.module_47fecbcd',
u'sssd-krb5-0:1.15.2-4.module_47fecbcd',
u'sssd-libwbclient-devel-0:1.15.2-4.module_47fecbcd',
u'libipa_hbac-0:1.15.2-4.module_47fecbcd',
u'sssd-winbind-idmap-0:1.15.2-4.module_47fecbcd',
u'python2-sss-murmur-0:1.15.2-4.module_47fecbcd',
u'sssd-tools-0:1.15.2-4.module_47fecbcd',
u'sssd-dbus-0:1.15.2-4.module_47fecbcd',
u'sssd-ad-0:1.15.2-4.module_47fecbcd',
u'sssd-krb5-common-0:1.15.2-4.module_47fecbcd',
u'libsss_autofs-0:1.15.2-4.module_47fecbcd',
u'python2-libsss_nss_idmap-0:1.15.2-4.module_47fecbcd',
u'libsss_idmap-devel-0:1.15.2-4.module_47fecbcd',
u'sssd-common-pac-0:1.15.2-4.module_47fecbcd',
u'sssd-0:1.15.2-4.module_47fecbcd',
u'sssd-proxy-0:1.15.2-4.module_47fecbcd',
u'libsss_sudo-0:1.15.2-4.module_47fecbcd',
u'libipa_hbac-devel-0:1.15.2-4.module_47fecbcd',
u'python3-sssdconfig-0:1.15.2-4.module_47fecbcd',
u'python2-sssdconfig-0:1.15.2-4.module_47fecbcd',
u'dracut-live-0:044-182.module_bd7491c8',
u'dracut-fips-aesni-0:044-182.module_bd7491c8',
u'dracut-network-0:044-182.module_bd7491c8',
u'dracut-fips-0:044-182.module_bd7491c8',
u'iproute-tc-0:4.11.0-1.module_d6de39f1'
]
init_data()
def teardown_method(self, test_method):
init_data()
@vcr.use_cassette(
path.join(CASSETTES_DIR, 'tests.test_utils.TestUtils.test_format_mmd'))
@pytest.mark.parametrize('scmurl', [
('git://pkgs.stg.fedoraproject.org/modules/testmodule.git'
'?#620ec77321b2ea7b0d67d82992dda3e1d67055b4'),
None
])
@patch('module_build_service.scm.SCM')
def test_format_mmd(self, mocked_scm):
def test_format_mmd(self, mocked_scm, scmurl, pdc):
mocked_scm.return_value.commit = \
'620ec77321b2ea7b0d67d82992dda3e1d67055b4'
# For all the RPMs in testmodule, get_latest is called
mocked_scm.return_value.get_latest.side_effect = [
'4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'fbed359411a1baa08d4a88e0d12d426fbf8f602c']
hashes_returned = {
'f24': '4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'f23': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c',
'f25': '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'}
original_refs = ["f23", "f24", "f25"]
'master': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c',
'f28': '4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'f27': '5deef23acd2367d8b8d5a621a2fc568b695bc3bd'}
def mocked_get_latest(ref="master"):
return hashes_returned[ref]
mocked_scm.return_value.get_latest = mocked_get_latest
mmd = modulemd.ModuleMetadata()
with open(path.join(BASE_DIR, '..', 'staged_data', 'testmodule.yaml')) \
as mmd_file:
mmd.loads(mmd_file)
scmurl = \
('git://pkgs.stg.fedoraproject.org/modules/testmodule.git'
'?#620ec77321b2ea7b0d67d82992dda3e1d67055b4')
mmd.load(path.join(BASE_DIR, '..', 'staged_data', 'testmodule.yaml'))
# Modify the component branches so we can identify them later on
mmd.components.rpms['perl-Tangerine'].ref = 'f28'
mmd.components.rpms['tangerine'].ref = 'f27'
module_build_service.utils.format_mmd(mmd, scmurl)
# Make sure that original refs are not changed.
mmd_pkg_refs = [pkg.ref for pkg in mmd.components.rpms.values()]
assert set(mmd_pkg_refs) == set(original_refs)
assert set(mmd_pkg_refs) == set(hashes_returned.keys())
assert mmd.buildrequires == {'base-runtime': 'master'}
xmd = {
'mbs': {
'commit': '620ec77321b2ea7b0d67d82992dda3e1d67055b4',
'buildrequires': {
'base-runtime': {
'ref': '147dca4ca65aa9a1ac51f71b7e687f9178ffa5df',
'stream': 'master',
'version': '20170616125652',
'filtered_rpms': self.filtered_rpms}},
'requires': {
'base-runtime': {
'version': '20170616125652',
'ref': '147dca4ca65aa9a1ac51f71b7e687f9178ffa5df',
'stream': 'master',
'filtered_rpms': self.filtered_rpms}},
'rpms': {'perl-List-Compare': {'ref': '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'},
'perl-Tangerine': {'ref': '4ceea43add2366d8b8c5a622a2fb563b625b9abf'},
'tangerine': {'ref': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'}},
'scmurl': 'git://pkgs.stg.fedoraproject.org/modules/testmodule'
'.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4',
}
}
assert mmd.xmd == xmd
@vcr.use_cassette(
path.join(CASSETTES_DIR, 'tests.test_utils.TestUtils.test_format_mmd'))
@patch('module_build_service.scm.SCM')
def test_format_mmd_empty_scmurl(self, mocked_scm):
# For all the RPMs in testmodule, get_latest is called
hashes_returned = {
'f24': '4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'f23': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c',
'f25': '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'}
def mocked_get_latest(branch="master"):
return hashes_returned[branch]
mocked_scm.return_value.get_latest = mocked_get_latest
mmd = modulemd.ModuleMetadata()
with open(path.join(BASE_DIR, '..', 'staged_data', 'testmodule.yaml')) \
as mmd_file:
mmd.loads(mmd_file)
module_build_service.utils.format_mmd(mmd, scmurl=None)
assert mmd.buildrequires == {'platform': 'f28'}
xmd = {
'mbs': {
'commit': None,
'buildrequires': {
'base-runtime': {
'ref': '147dca4ca65aa9a1ac51f71b7e687f9178ffa5df',
'stream': 'master',
'version': '20170616125652',
'filtered_rpms': self.filtered_rpms}},
'platform': {
'ref': 'virtual',
'stream': 'f28',
'version': '3',
'filtered_rpms': []}},
'requires': {
'base-runtime': {
'version': '20170616125652',
'ref': '147dca4ca65aa9a1ac51f71b7e687f9178ffa5df',
'stream': 'master',
'filtered_rpms': self.filtered_rpms}},
'rpms': {'perl-List-Compare': {'ref': '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'},
'perl-Tangerine': {'ref': '4ceea43add2366d8b8c5a622a2fb563b625b9abf'},
'tangerine': {'ref': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'}},
'scmurl': None,
'platform': {
'version': '3',
'ref': 'virtual',
'stream': 'f28',
'filtered_rpms': []}},
'rpms': {
'perl-List-Compare': {'ref': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'},
'perl-Tangerine': {'ref': '4ceea43add2366d8b8c5a622a2fb563b625b9abf'},
'tangerine': {'ref': '5deef23acd2367d8b8d5a621a2fc568b695bc3bd'}},
'scmurl': None
}
}
if scmurl:
xmd['mbs']['commit'] = '620ec77321b2ea7b0d67d82992dda3e1d67055b4'
xmd['mbs']['scmurl'] = scmurl
assert mmd.xmd == xmd
def test_get_reusable_component_same(self):
test_reuse_component_init_data()
new_module = models.ModuleBuild.query.filter_by(id=2).one()
rv = module_build_service.utils.get_reusable_component(
db.session, new_module, 'tangerine')
assert rv.package == 'tangerine'
def test_get_reusable_component_different_perl_tangerine(self):
@pytest.mark.parametrize('changed_component', [
'perl-List-Compare', 'perl-Tangerine', 'tangerine', None
])
def test_get_reusable_component_different_component(self, changed_component):
test_reuse_component_init_data()
second_module_build = models.ModuleBuild.query.filter_by(id=2).one()
mmd = second_module_build.mmd()
mmd.components.rpms['perl-Tangerine'].ref = \
'00ea1da4192a2030f9ae023de3b3143ed647bbab'
second_module_build.modulemd = mmd.dumps()
second_module_perl_tangerine = models.ComponentBuild.query.filter_by(
package='perl-Tangerine', module_id=2).one()
second_module_perl_tangerine.ref = \
'00ea1da4192a2030f9ae023de3b3143ed647bbab'
db.session.commit()
# Shares the same build order as the changed perl-Tangerine, but none
# of the build orders before it are different (in this case there are
# none)
if changed_component:
mmd = second_module_build.mmd()
mmd.components.rpms[changed_component].ref = '00ea1da4192a2030f9ae023de3b3143ed647bbab'
second_module_build.modulemd = mmd.dumps()
second_module_changed_component = models.ComponentBuild.query.filter_by(
package=changed_component, module_id=2).one()
second_module_changed_component.ref = '00ea1da4192a2030f9ae023de3b3143ed647bbab'
db.session.add(second_module_changed_component)
db.session.commit()
plc_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'perl-List-Compare')
assert plc_rv.package == 'perl-List-Compare'
# perl-Tangerine has a different commit hash
pt_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'perl-Tangerine')
assert pt_rv is None
# tangerine is the same but its in a build order that is after the
# different perl-Tangerine, so it can't be reused
tangerine_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'tangerine')
assert tangerine_rv is None
if changed_component == 'perl-List-Compare':
# perl-Tangerine can be reused even though a component in its batch has changed
assert plc_rv is None
assert pt_rv.package == 'perl-Tangerine'
assert tangerine_rv is None
elif changed_component == 'perl-Tangerine':
# perl-List-Compare can be reused even though a component in its batch has changed
assert plc_rv.package == 'perl-List-Compare'
assert pt_rv is None
assert tangerine_rv is None
elif changed_component == 'tangerine':
# perl-List-Compare and perl-Tangerine can be reused since they are in an earlier
# buildorder than tangerine
assert plc_rv.package == 'perl-List-Compare'
assert pt_rv.package == 'perl-Tangerine'
assert tangerine_rv is None
elif changed_component is None:
# Nothing has changed so everthing can be used
assert plc_rv.package == 'perl-List-Compare'
assert pt_rv.package == 'perl-Tangerine'
assert tangerine_rv.package == 'tangerine'
def test_get_reusable_component_different_rpm_macros(self):
test_reuse_component_init_data()
@@ -379,7 +203,6 @@ class TestUtils:
db.session, second_module_build, 'perl-List-Compare')
assert plc_rv is None
# perl-Tangerine has a different commit hash
pt_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'perl-Tangerine')
assert pt_rv is None
@@ -388,7 +211,7 @@ class TestUtils:
test_reuse_component_init_data()
second_module_build = models.ModuleBuild.query.filter_by(id=2).one()
mmd = second_module_build.mmd()
mmd.xmd['mbs']['buildrequires']['base-runtime']['ref'] = \
mmd.xmd['mbs']['buildrequires']['platform']['ref'] = \
'da39a3ee5e6b4b0d3255bfef95601890afd80709'
second_module_build.modulemd = mmd.dumps()
second_module_build.build_context = '37c6c57bedf4305ef41249c1794760b5cb8fad17'
@@ -398,13 +221,10 @@ class TestUtils:
db.session, second_module_build, 'perl-List-Compare')
assert plc_rv is None
# perl-Tangerine has a different commit hash
pt_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'perl-Tangerine')
assert pt_rv is None
# tangerine is the same but its in a build order that is after the
# different perl-Tangerine, so it can't be reused
tangerine_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'tangerine')
assert tangerine_rv is None
@@ -429,13 +249,10 @@ class TestUtils:
db.session, second_module_build, 'perl-List-Compare')
assert plc_rv is None
# perl-Tangerine has a different commit hash
pt_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'perl-Tangerine')
assert pt_rv is None
# tangerine is the same but its in a build order that is after the
# different perl-Tangerine, so it can't be reused
tangerine_rv = module_build_service.utils.get_reusable_component(
db.session, second_module_build, 'tangerine')
assert tangerine_rv is None
@@ -558,42 +375,49 @@ class TestUtils:
validate_koji_tag_is_None(None)
assert str(cm.value).endswith(' No value provided.') is True
@vcr.use_cassette(
path.join(CASSETTES_DIR, ('tests.test_utils.TestUtils.'
'test_record_component_builds_duplicate_components')))
@patch('module_build_service.scm.SCM')
def test_record_component_builds_duplicate_components(self, mocked_scm):
def test_record_component_builds_duplicate_components(self, mocked_scm, pdc_module_inactive):
with app.app_context():
test_reuse_component_init_data()
clean_database()
mocked_scm.return_value.commit = \
'620ec77321b2ea7b0d67d82992dda3e1d67055b4'
# For all the RPMs in testmodule, get_latest is called
hashes_returned = {
'f25': '4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'f24': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'}
mocked_scm.return_value.get_latest.side_effect = [
'4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'fbed359411a1baa08d4a88e0d12d426fbf8f602c']
def mocked_get_latest(ref="master"):
return hashes_returned[ref]
mocked_scm.return_value.get_latest = mocked_get_latest
testmodule_variant_mmd_path = path.join(
BASE_DIR, '..', 'staged_data', 'testmodule-variant.yaml')
testmodule_variant_mmd = modulemd.ModuleMetadata()
with open(testmodule_variant_mmd_path) as mmd_file:
testmodule_variant_mmd.loads(mmd_file)
module_build = \
db.session.query(models.ModuleBuild).filter_by(id=1).one()
mmd = module_build.mmd()
testmodule_mmd_path = path.join(BASE_DIR, '..', 'staged_data', 'testmodule.yaml')
mmd = modulemd.ModuleMetadata()
mmd.load(testmodule_mmd_path)
mmd.name = 'testmodule-variant'
module_build = module_build_service.models.ModuleBuild()
module_build.name = 'testmodule-variant'
module_build.stream = 'master'
module_build.version = 20170109091357
module_build.state = models.BUILD_STATES['init']
module_build.scmurl = 'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#ff1ea79'
module_build.batch = 1
module_build.owner = 'Tom Brady'
module_build.time_submitted = datetime(2017, 2, 15, 16, 8, 18)
module_build.time_modified = datetime(2017, 2, 15, 16, 19, 35)
module_build.rebuild_strategy = 'changed-and-after'
module_build.modulemd = mmd.dumps()
db.session.add(module_build)
db.session.commit()
# Rename the the modulemd to include
mmd.name = 'testmodule'
# Remove perl-Tangerine and tangerine from the modulemd to include so only one
# component conflicts
mmd.components.rpms.pop('perl-Tangerine')
mmd.components.rpms.pop('tangerine')
error_msg = (
'The included module "testmodule-variant" in "testmodule" have '
'The included module "testmodule" in "testmodule-variant" have '
'the following conflicting components: perl-List-Compare')
with pytest.raises(UnprocessableEntity) as e:
module_build_service.utils.record_component_builds(
testmodule_variant_mmd, module_build, main_mmd=mmd)
assert str(e.value) == error_msg
mmd, module_build, main_mmd=module_build.mmd())
assert str(e.value) == error_msg
@patch("module_build_service.utils.submit_module_build")
def test_submit_module_build_from_yaml_with_skiptests(self, mock_submit):
@@ -630,37 +454,38 @@ class TestUtils:
assert username_arg == username
rmtree(module_dir)
@vcr.use_cassette(
path.join(CASSETTES_DIR, ('tests.test_utils.TestUtils.'
'test_record_component_builds_set_weight')))
@patch('module_build_service.scm.SCM')
def test_record_component_builds_set_weight(self, mocked_scm):
def test_record_component_builds_set_weight(self, mocked_scm, pdc_module_inactive):
with app.app_context():
clean_database()
mocked_scm.return_value.commit = \
'620ec77321b2ea7b0d67d82992dda3e1d67055b4'
# For all the RPMs in testmodule, get_latest is called
hashes_returned = {
'f25': '4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'f24': 'fbed359411a1baa08d4a88e0d12d426fbf8f602c'}
mocked_scm.return_value.get_latest.side_effect = [
'4ceea43add2366d8b8c5a622a2fb563b625b9abf',
'fbed359411a1baa08d4a88e0d12d426fbf8f602c',
'dbed259411a1baa08d4a88e0d12d426fbf8f6037']
def mocked_get_latest(branch="master"):
return hashes_returned[branch]
testmodule_mmd_path = path.join(
BASE_DIR, '..', 'staged_data', 'testmodule.yaml')
mmd = modulemd.ModuleMetadata()
mmd.load(testmodule_mmd_path)
module_build = module_build_service.models.ModuleBuild()
module_build.name = 'testmodule'
module_build.stream = 'master'
module_build.version = 20170109091357
module_build.state = models.BUILD_STATES['init']
module_build.scmurl = \
'git://pkgs.stg.fedoraproject.org/modules/testmodule.git?#ff1ea79'
module_build.batch = 1
module_build.owner = 'Tom Brady'
module_build.time_submitted = datetime(2017, 2, 15, 16, 8, 18)
module_build.time_modified = datetime(2017, 2, 15, 16, 19, 35)
module_build.rebuild_strategy = 'changed-and-after'
module_build.modulemd = mmd.dumps()
db.session.add(module_build)
db.session.commit()
mocked_scm.return_value.get_latest = mocked_get_latest
testmodule_variant_mmd_path = path.join(
BASE_DIR, '..', 'staged_data', 'testmodule-variant.yaml')
testmodule_variant_mmd = modulemd.ModuleMetadata()
with open(testmodule_variant_mmd_path) as mmd_file:
testmodule_variant_mmd.loads(mmd_file)
mmd = testmodule_variant_mmd
module_build = models.ModuleBuild.create(
db.session, conf, "test", "stream", "1", mmd.dumps(), "scmurl", "owner")
module_build_service.utils.record_component_builds(
mmd, module_build)
module_build_service.utils.record_component_builds(mmd, module_build)
assert module_build.state == models.BUILD_STATES['init']
db.session.refresh(module_build)
@@ -954,6 +779,7 @@ class TestBatches:
assert pt_component.reused_component_id is None
assert plc_component.state == koji.BUILD_STATES['BUILDING']
assert plc_component.reused_component_id is None
# Test the order of the scheduling
expected_calls = [mock.call(builder, plc_component), mock.call(builder, pt_component)]
assert mock_sbc.mock_calls == expected_calls
@@ -1056,22 +882,22 @@ class TestLocalBuilds:
module_build_service.utils.load_local_builds("testmodule:master:123")
models.ModuleBuild.local_modules(db.session)
def test_load_local_builds_base_runtime(
def test_load_local_builds_platform(
self, conf_system, conf_resultsdir):
with app.app_context():
module_build_service.utils.load_local_builds("base-runtime")
module_build_service.utils.load_local_builds("platform")
local_modules = models.ModuleBuild.local_modules(db.session)
assert len(local_modules) == 1
assert local_modules[0].koji_tag.endswith(
"/module-base-runtime-master-20170816080815/results")
"/module-platform-f28-3/results")
def test_load_local_builds_base_runtime_master(
def test_load_local_builds_platform_f28(
self, conf_system, conf_resultsdir):
with app.app_context():
module_build_service.utils.load_local_builds("base-runtime:master")
module_build_service.utils.load_local_builds("platform:f28")
local_modules = models.ModuleBuild.local_modules(db.session)
assert len(local_modules) == 1
assert local_modules[0].koji_tag.endswith(
"/module-base-runtime-master-20170816080815/results")
"/module-platform-f28-3/results")

View File

@@ -21,7 +21,6 @@
# Written by Matt Prahl <mprahl@redhat.com>
import json
import vcr
import modulemd as _modulemd
import module_build_service.scm
@@ -44,7 +43,6 @@ user = ('Homer J. Simpson', set(['packager']))
other_user = ('some_other_user', set(['packager']))
anonymous_user = ('anonymous', set(['packager']))
base_dir = dirname(dirname(__file__))
cassette_dir = base_dir + '/vcr-request-data/'
class FakeSCM(object):
@@ -116,16 +114,6 @@ class TestViews:
self.client = app.test_client()
init_data()
filename = '.'.join([
path.splitext(path.basename(__file__))[0],
test_method.im_class.__name__,
test_method.im_func.__name__])
self.vcr = vcr.use_cassette(path.join(cassette_dir, filename))
self.vcr.__enter__()
def teardown_method(self, test_method):
self.vcr.__exit__()
def test_query_build(self):
rv = self.client.get('/module-build-service/1/module-builds/1')
data = json.loads(rv.data)
@@ -518,7 +506,7 @@ class TestViews:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
def test_submit_build(self, mocked_scm, mocked_get_user):
def test_submit_build(self, mocked_scm, mocked_get_user, pdc):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
@@ -835,7 +823,7 @@ class TestViews:
@patch('module_build_service.scm.SCM')
@patch("module_build_service.config.Config.no_auth", new_callable=PropertyMock,
return_value=True)
def test_submit_build_no_auth_set_owner(self, mocked_conf, mocked_scm, mocked_get_user):
def test_submit_build_no_auth_set_owner(self, mocked_conf, mocked_scm, mocked_get_user, pdc):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
@@ -854,7 +842,7 @@ class TestViews:
@patch('module_build_service.auth.get_user', return_value=anonymous_user)
@patch('module_build_service.scm.SCM')
@patch("module_build_service.config.Config.no_auth", new_callable=PropertyMock)
def test_patch_set_different_owner(self, mocked_no_auth, mocked_scm, mocked_get_user):
def test_patch_set_different_owner(self, mocked_no_auth, mocked_scm, mocked_get_user, pdc):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
@@ -898,7 +886,7 @@ class TestViews:
@patch('module_build_service.auth.get_user', return_value=user)
@patch('module_build_service.scm.SCM')
@patch("module_build_service.config.Config.allow_custom_scmurls", new_callable=PropertyMock)
def test_submit_custom_scmurl(self, allow_custom_scmurls, mocked_scm, mocked_get_user):
def test_submit_custom_scmurl(self, allow_custom_scmurls, mocked_scm, mocked_get_user, pdc):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')

Binary file not shown.