From f1480feec25319155ee9f44dee2a7d4d467acc50 Mon Sep 17 00:00:00 2001 From: mprahl Date: Wed, 3 Apr 2019 17:17:49 -0400 Subject: [PATCH] Allow importing modules without a Koji tag These module builds will basically act as metadata-only module builds. This will be more useful as additional features stem from these types of builds. --- docs/VIRTUAL_MODULES.rst | 3 +- module_build_service/resolver/DBResolver.py | 5 +++ module_build_service/resolver/MBSResolver.py | 8 ++++ module_build_service/utils/general.py | 36 +++++++++++---- .../34/a463979786199c1b41ca21eb309cf3ce5ce789 | Bin 0 -> 291 bytes .../48/83b004d723a15cdc266c0280fe26c424ae10db | Bin 0 -> 291 bytes .../60/5345608fcc41d4e297cf062c653ebfdfe52476 | 2 + .../6c/d6a18e15a4f23a1eaa7040e7f4da9be1aed36d | Bin 0 -> 807 bytes .../6e/a27c8576449ad5a12c1b6d27b50ff32c854ee5 | Bin 0 -> 726 bytes .../7f/96fc61223e4bc4c93c7c286cca98f6efaa3716 | 1 + .../8b/43f38cdafdd773e7d0308e758105bf9f0f67a8 | Bin 0 -> 223 bytes .../e3/ca243c664440cdb8b704b0d5c32ed433bee4da | Bin 0 -> 192 bytes .../e4/75d55e2b78ad81f1b08bcb33a0a15ad24ef8a9 | Bin 0 -> 291 bytes .../e9/742ed681f82e3ef5281fc652b4e68a3826cea6 | 2 + .../f7/c5c7218c9a197d7fd245eeb4eee3d7abffd75d | 2 + .../fb/9351bd6f2439a73d78de0822fefe64410f905c | Bin 0 -> 808 bytes .../fc/399d16e46feb3af72a692b316a241c21bae1d0 | Bin 0 -> 291 bytes tests/scm_data/mariadb/refs/heads/master | 1 + tests/staged_data/build_metadata_module.yaml | 28 ++++++++++++ .../testmodule_br_metadata_module.yaml | 38 ++++++++++++++++ tests/test_build/test_build.py | 42 +++++++++++++++++- tests/test_utils/test_utils.py | 26 +++++++++++ tests/test_views/test_views.py | 22 ++------- 23 files changed, 187 insertions(+), 29 deletions(-) create mode 100644 tests/scm_data/mariadb/objects/34/a463979786199c1b41ca21eb309cf3ce5ce789 create mode 100644 tests/scm_data/mariadb/objects/48/83b004d723a15cdc266c0280fe26c424ae10db create mode 100644 tests/scm_data/mariadb/objects/60/5345608fcc41d4e297cf062c653ebfdfe52476 create mode 100644 tests/scm_data/mariadb/objects/6c/d6a18e15a4f23a1eaa7040e7f4da9be1aed36d create mode 100644 tests/scm_data/mariadb/objects/6e/a27c8576449ad5a12c1b6d27b50ff32c854ee5 create mode 100644 tests/scm_data/mariadb/objects/7f/96fc61223e4bc4c93c7c286cca98f6efaa3716 create mode 100644 tests/scm_data/mariadb/objects/8b/43f38cdafdd773e7d0308e758105bf9f0f67a8 create mode 100644 tests/scm_data/mariadb/objects/e3/ca243c664440cdb8b704b0d5c32ed433bee4da create mode 100644 tests/scm_data/mariadb/objects/e4/75d55e2b78ad81f1b08bcb33a0a15ad24ef8a9 create mode 100644 tests/scm_data/mariadb/objects/e9/742ed681f82e3ef5281fc652b4e68a3826cea6 create mode 100644 tests/scm_data/mariadb/objects/f7/c5c7218c9a197d7fd245eeb4eee3d7abffd75d create mode 100644 tests/scm_data/mariadb/objects/fb/9351bd6f2439a73d78de0822fefe64410f905c create mode 100644 tests/scm_data/mariadb/objects/fc/399d16e46feb3af72a692b316a241c21bae1d0 create mode 100644 tests/scm_data/mariadb/refs/heads/master create mode 100644 tests/staged_data/build_metadata_module.yaml create mode 100644 tests/staged_data/testmodule_br_metadata_module.yaml diff --git a/docs/VIRTUAL_MODULES.rst b/docs/VIRTUAL_MODULES.rst index b1d5d8d5..e66e2228 100644 --- a/docs/VIRTUAL_MODULES.rst +++ b/docs/VIRTUAL_MODULES.rst @@ -67,7 +67,8 @@ Custom fields in xmd: - ``mse`` - this is an internal identifier used by MBS to know if this is a legacy module build prior to module stream expansion. This should always be ``TRUE``. - ``koji_tag`` - this defines the Koji tag with the RPMs that are part of this module. For base - modules this will likely be a tag representing a buildroot. + modules this will likely be a tag representing a buildroot. If this is a metadata-only module, + then this can be left unset. - ``virtual_streams`` - the list of streams which groups multiple modules together. For more information on this field, see the ``Virtual Streams`` section below. - ``disttag_marking`` - if this module is a base module, then MBS will use the stream of the base diff --git a/module_build_service/resolver/DBResolver.py b/module_build_service/resolver/DBResolver.py index 9e17fd9f..80a8e916 100644 --- a/module_build_service/resolver/DBResolver.py +++ b/module_build_service/resolver/DBResolver.py @@ -245,6 +245,11 @@ class DBResolver(GenericResolver): if not build: raise RuntimeError( 'Buildrequired module %s %r does not exist in MBS db' % (br_name, details)) + + # If the buildrequire is a meta-data only module with no Koji tag set, then just + # skip it + if build.koji_tag is None: + continue module_tags.setdefault(build.koji_tag, []) module_tags[build.koji_tag].append(build.mmd()) diff --git a/module_build_service/resolver/MBSResolver.py b/module_build_service/resolver/MBSResolver.py index efa260b2..c538796f 100644 --- a/module_build_service/resolver/MBSResolver.py +++ b/module_build_service/resolver/MBSResolver.py @@ -294,6 +294,10 @@ class MBSResolver(GenericResolver): db.session, name, details['stream']) if local_modules: for m in local_modules: + # If the buildrequire is a meta-data only module with no Koji tag set, then just + # skip it + if m.koji_tag is None: + continue module_tags[m.koji_tag] = m.mmd() continue @@ -305,6 +309,10 @@ class MBSResolver(GenericResolver): for m in modules: if m["koji_tag"] in module_tags: continue + # If the buildrequire is a meta-data only module with no Koji tag set, then just + # skip it + if m["koji_tag"] is None: + continue module_tags.setdefault(m["koji_tag"], []) module_tags[m["koji_tag"]].append(self.extract_modulemd(m["modulemd"])) diff --git a/module_build_service/utils/general.py b/module_build_service/utils/general.py index 6fdadfd3..b8504acd 100644 --- a/module_build_service/utils/general.py +++ b/module_build_service/utils/general.py @@ -364,14 +364,29 @@ def import_mmd(session, mmd): log.error(msg) raise UnprocessableEntity(msg) - # Get the koji_tag. - try: - xmd = mmd.get_xmd() - koji_tag = xmd["mbs"]["koji_tag"] - except KeyError: - msg = "'koji_tag' is not set in xmd['mbs'] for module {}".format(nsvc) - log.error(msg) - raise UnprocessableEntity(msg) + if len(mmd.get_dependencies()) > 1: + raise UnprocessableEntity( + "The imported module's dependencies list should contain just one element") + + xmd = glib.from_variant_dict(mmd.get_xmd()) + # Set some defaults in xmd["mbs"] if they're not provided by the user + if "mbs" not in xmd: + xmd["mbs"] = {"mse": True} + + if mmd.get_dependencies(): + brs = set(mmd.get_dependencies()[0].get_buildrequires().keys()) + xmd_brs = set(xmd["mbs"].get("buildrequires", {}).keys()) + if brs - xmd_brs: + raise UnprocessableEntity( + 'The imported module buildrequires other modules, but the metadata in the ' + 'xmd["mbs"]["buildrequires"] dictionary is missing entries') + elif "buildrequires" not in xmd["mbs"]: + xmd["mbs"]["buildrequires"] = {} + mmd.set_xmd(glib.dict_values(xmd)) + + koji_tag = xmd['mbs'].get('koji_tag') + if koji_tag is None: + log.warning("'koji_tag' is not set in xmd['mbs'] for module {}".format(nsvc)) # Get the ModuleBuild from DB. build = models.ModuleBuild.get_build_from_nsvc( @@ -397,6 +412,11 @@ def import_mmd(session, mmd): build.time_completed = datetime.utcnow() if build.name in conf.base_module_names: build.stream_version = models.ModuleBuild.get_stream_version(stream) + + # Record the base modules this module buildrequires + for base_module in build.get_buildrequired_base_modules(): + build.buildrequires.append(base_module) + session.add(build) session.commit() msg = "Module {} imported".format(nsvc) diff --git a/tests/scm_data/mariadb/objects/34/a463979786199c1b41ca21eb309cf3ce5ce789 b/tests/scm_data/mariadb/objects/34/a463979786199c1b41ca21eb309cf3ce5ce789 new file mode 100644 index 0000000000000000000000000000000000000000..7ab09b50bd9e15632bfad5fe2fa5369746c688f8 GIT binary patch literal 291 zcmV+;0o?w00V^p=O;s>9GGZ_^FfcPQQP4}zEXhpI%P&f0csBRZ>`fQ1IeT|&t}Bna zap*};@IuUIPBUwfqjs>;XH+11b4mEnC| z-5<`AR|*eL{181geOjglM}z}ZiEmSrUTzA5#govV=W5=U8tGNMxU&NVRr0)?Xd{1S#QftT3M&Q+R|{&4j=GpEUis#47TpvDyEmlh?b p7Gw20#DtR6;*w$pE*Y)TD%sQbZmo9GGZ_^FfcPQQP4}zEXhpI%P&f0csBRZ>`fQ1IeT|&t}Bna zap*};@IuUIPBUwfqjs>;XH+11b4mEnC| z-5<`AR|*eL{181geOjglM}z}ZiEmSrUTzA5#govV=W5=U8tGNM4rOeje$E-7Z{k|hASaYl2iZy literal 0 HcmV?d00001 diff --git a/tests/scm_data/mariadb/objects/60/5345608fcc41d4e297cf062c653ebfdfe52476 b/tests/scm_data/mariadb/objects/60/5345608fcc41d4e297cf062c653ebfdfe52476 new file mode 100644 index 00000000..46ee1aad --- /dev/null +++ b/tests/scm_data/mariadb/objects/60/5345608fcc41d4e297cf062c653ebfdfe52476 @@ -0,0 +1,2 @@ +x]j1S)*jNCEy`xu`mM'?&yd$#Xp& +r`fH&bƒ"ɋH!+eon7ڲ4_6 3 Lp3 jF;.Ge˿Q;D 3G \ No newline at end of file diff --git a/tests/scm_data/mariadb/objects/6c/d6a18e15a4f23a1eaa7040e7f4da9be1aed36d b/tests/scm_data/mariadb/objects/6c/d6a18e15a4f23a1eaa7040e7f4da9be1aed36d new file mode 100644 index 0000000000000000000000000000000000000000..ca45778f600ab7026ab2d4eda04adc16bd931dce GIT binary patch literal 807 zcmV+?1K9j{0hLuvZ`&{o-8sKPKrwU!X2*7%=HoaF7z!+hVZ9AQp%2EGT|-^f8g(4cpZHbD#(@EGYdU4u zqL4faOMZF7)qkE-j&iw@UR|x*ZYl2u<68Ak0wBx1_DeX7}sokMxwr5rpa+CzIZS z`9k7qf%Sq@WeXwr{)aAzDmhChhQtSXljqtye;rP3QP{qE{CTiJJZrLbuCwdu6bFY*J6iV!($>_|z#Hr6 zcGIE8hv5<$JG$1=ZF`m?=yYFTFo{%Ha646T!i*TsU@yR&^&Vp;v225Xpn!c3l^%;G zprR<^al_x|aLotKhZ~+84ZFjx{~b<}DB!_0zP=0mB}7#0yC6b%+R4%BG@*g=!1dKc z;`IA3u!NyZwr@fvHEqDqU=tMEcJ7&oPnjypO^Z|a?-8tL`_c4xQJTtubtHa2P(fX* z@ut5Cd2#4u_>1CY{@e|`3GuZ8A4n)8cbo~H=Fhe!plfEIl!q;7H`sNfd7x{fJZpDu@Q^X(Lf>rFBxbo)|r% zT~iYj6uQ4r2m9EGw}fheN^7i7HVqiWBRu3GgXvpC6{?`cHBKi{1|z|yP{ zCvCxVaa3wc9Nt)m@zmUaII6S^D&ERUTF_u5k2;e^c9~q zeh)4J2G9aDM~<@}8)YX9JdVp9v0p@1( zoHL2CP4R&OzI#x57EM4yv59Acm&*+5OjmF5C%G8gXp7(JCW#F^l^g%Q2>fq|*s(8y z2@N&In`I;AHL-V5Ke0{&FGR7|oydytA(XQ)x zQl{%P!!L5IE__ZN&yxJ;7Y%hF{=tssg2QTCZA!M{Th0pxO8Bqww\<F¾fM@i@ #*$N99bc%':C*cJ22fә3]3v痯jR|"0I~ Q*Wn gIaH>R[dw֑ mU:RlcZ'g ;._ ]]Jn/鷲^]RZe,:$0/&I(#ܗ,vp+f2x&=F-!d%*%|07X`f%gob$47l1d{sX~Z%g$vOkURj literal 0 HcmV?d00001 diff --git a/tests/scm_data/mariadb/objects/e4/75d55e2b78ad81f1b08bcb33a0a15ad24ef8a9 b/tests/scm_data/mariadb/objects/e4/75d55e2b78ad81f1b08bcb33a0a15ad24ef8a9 new file mode 100644 index 0000000000000000000000000000000000000000..b074e155b4535feba108aad22994baa8ce010474 GIT binary patch literal 291 zcmV+;0o?w00V^p=O;s>9GGZ_^FfcPQQP4}zEXhpI%P&f0csBRZ>`fQ1IeT|&t}Bna zap*};@IuUIPBUwfqjs>;XH+11b4mEnC| z-5<`AR|*eL{181geOjglM}z}ZiEmSrUTzA5#govV=W5=U8tGNMmF&Ea zoV2OY$T>CR+xu1KVkQPapiq>bU&8Pu@DkhExk_`=AFf_!<}~?GRf@SE)R^M@(xT+l pVyu3Lm{5{hTvE)yC8JeZC42hbt(DP1^XopbUwAs@5&$M@hWAfjn2G=Z literal 0 HcmV?d00001 diff --git a/tests/scm_data/mariadb/objects/e9/742ed681f82e3ef5281fc652b4e68a3826cea6 b/tests/scm_data/mariadb/objects/e9/742ed681f82e3ef5281fc652b4e68a3826cea6 new file mode 100644 index 00000000..a03c8243 --- /dev/null +++ b/tests/scm_data/mariadb/objects/e9/742ed681f82e3ef5281fc652b4e68a3826cea6 @@ -0,0 +1,2 @@ +x]J1D]+z/H' {30/bpݹ8۶ p= +Gʜ9EsEՉ0FECQNٜu&ORje&劄I9$aja,Ϙ˺)kvuRlHֹ\uq\vvW?+xb /˼ϲ)ܵ/n~KF4 \ No newline at end of file diff --git a/tests/scm_data/mariadb/objects/f7/c5c7218c9a197d7fd245eeb4eee3d7abffd75d b/tests/scm_data/mariadb/objects/f7/c5c7218c9a197d7fd245eeb4eee3d7abffd75d new file mode 100644 index 00000000..1f5b42af --- /dev/null +++ b/tests/scm_data/mariadb/objects/f7/c5c7218c9a197d7fd245eeb4eee3d7abffd75d @@ -0,0 +1,2 @@ +x]j!Ds+XVS>a0cfؿ_R*zPhm. +#Wfm%RjN=@ѣ0 ta5$#?c=:|mv]n+|vK98@{xh8澝]nbO1&IM^vDk \ No newline at end of file diff --git a/tests/scm_data/mariadb/objects/fb/9351bd6f2439a73d78de0822fefe64410f905c b/tests/scm_data/mariadb/objects/fb/9351bd6f2439a73d78de0822fefe64410f905c new file mode 100644 index 0000000000000000000000000000000000000000..0b94117d6e84140006ef22ef030474ac9007538e GIT binary patch literal 808 zcmV+@1K0d`0hLuvZ`&{o-8sKPKrwU!X2*7%&*Ly)D6kxc^)?KJK4?d+CA*SbG{AoR zC^@#9CJj~{(ncg7AIT?%RW&17vRr;LsTu=3Y3^Ufw8jI8R-!}q85FbQ z7k}|k-^)8k%OP##Q$@$<(Gj2z^M|#v5(XYyY2X#AH#Ze^MQzk^K5y}-kd*@i;?6Y6 zZpiOHfoo?QKMfQc@+6IGX?512?@y7f&f14|UC*x1It)F#?rZG)Y^!h%`wiLpX?*)i zwqbGsLxAN*HZIJsw@XVX;k8n&mTpf3JV8}AAP6&5^Bt)Rvfcms`6E81aRi~-%E_p; zV7`#kY;>E(K1%eJ(+!?eRM>;N*M9ED%KO$9wy2A_VX(Lf>rFBx5o)|r# zol+AN6uN&>d;3_4&xC4$`qWsTEDD^Tc7%sKq%n1AsKPF2af(w(Y=eT6AeitM@$eX;>-udTn>Wjkm-QzEl4dU65opX)dOsBXwY~0YYH4xXPoCe<5 zN4K92J?@uF80;8YO1EoSjG)s)gTX{nVZ-fIbsJ{Ha0X`q=4|wsGwRwl#0LsE_t5FF zX#xt0A|5aNdk)Wh;M~9P=xEvXxBl;7i8=ufq21Safxm|66#FiSke)Vj3_2}npgeGW zvyg84{TEooP$s*JkWoo1Ff{lC#nz2`A>vb}igHuq*8O_~>)C!ZEk2a0a9|xtf*BRm z)EZyw%S9GGZ_^FfcPQQP4}zEXhpI%P&f0csBRZ>`fQ1IeT|&t}Bna zap*};@IuUIPBUwfqjs>;XH+11b4mEnC| z-5<`AR|*eL{181geOjglM}z}ZiEmSrUTzA5#govV=W5=U8tGNM zF4U3ERo}}0S*O+Ssfhs)C=})AmoR(@yu@~PuF{- + 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 + build: product1.2 + requires: + platform: f28 + references: + community: https://docs.pagure.org/modularity/ + documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules + profiles: + default: + rpms: + - tangerine + api: + rpms: + - perl-Tangerine + - tangerine + components: + rpms: + perl-List-Compare: + rationale: A dependency of tangerine. + ref: master + perl-Tangerine: + rationale: Provides API for this module and is a dependency of tangerine. + ref: master + tangerine: + rationale: Provides API for this module. + buildorder: 10 + ref: master diff --git a/tests/test_build/test_build.py b/tests/test_build/test_build.py index 41cffc0e..eea8ccda 100644 --- a/tests/test_build/test_build.py +++ b/tests/test_build/test_build.py @@ -106,6 +106,7 @@ class FakeModuleBuilder(GenericBuilder): on_finalize_cb = None on_buildroot_add_artifacts_cb = None on_tag_artifacts_cb = None + on_buildroot_add_repos_cb = None @module_build_service.utils.validate_koji_tag('tag_name') def __init__(self, owner, module, config, tag_name, components): @@ -122,6 +123,7 @@ class FakeModuleBuilder(GenericBuilder): FakeModuleBuilder.on_finalize_cb = None FakeModuleBuilder.on_buildroot_add_artifacts_cb = None FakeModuleBuilder.on_tag_artifacts_cb = None + FakeModuleBuilder.on_buildroot_add_repos_cb = None FakeModuleBuilder.DEFAULT_GROUPS = None FakeModuleBuilder.backend = 'test' @@ -172,7 +174,8 @@ class FakeModuleBuilder(GenericBuilder): self._send_repo_done() def buildroot_add_repos(self, dependencies): - pass + if FakeModuleBuilder.on_buildroot_add_repos_cb: + FakeModuleBuilder.on_buildroot_add_repos_cb(self, dependencies) def tag_artifacts(self, artifacts, dest_tag=True): if FakeModuleBuilder.on_tag_artifacts_cb: @@ -1372,6 +1375,43 @@ class TestBuild: module = db.session.query(models.ModuleBuild).get(module_build_id) assert module.state == models.BUILD_STATES['build'] + @patch('module_build_service.auth.get_user', return_value=user) + @patch('module_build_service.scm.SCM') + def test_submit_br_metadata_only_module( + self, mocked_scm, mocked_get_user, conf_system, dbg, hmsc): + """ + Test that when a build is submitted with a buildrequire without a Koji tag, + MBS doesn't supply it as a dependency to the builder. + """ + metadata_mmd = module_build_service.utils.load_mmd( + path.join(base_dir, 'staged_data', 'build_metadata_module.yaml'), True) + module_build_service.utils.import_mmd(db.session, metadata_mmd) + + FakeSCM(mocked_scm, 'testmodule', 'testmodule_br_metadata_module.yaml', + '620ec77321b2ea7b0d67d82992dda3e1d67055b4') + post_url = '/module-build-service/1/module-builds/' + post_data = { + 'branch': 'master', + 'scmurl': 'https://src.stg.fedoraproject.org/modules/' + 'testmodule.git?#620ec77321b2ea7b0d67d82992dda3e1d67055b4', + } + rv = self.client.post(post_url, data=json.dumps(post_data)) + assert rv.status_code == 201 + + data = json.loads(rv.data) + module_build_id = data['id'] + + def on_buildroot_add_repos_cb(cls, dependencies): + # Make sure that the metadata module is not present since it doesn't have a Koji tag + assert dependencies.keys() == ['module-f28-build'] + + FakeModuleBuilder.on_buildroot_add_repos_cb = on_buildroot_add_repos_cb + stop = module_build_service.scheduler.make_simple_stop_condition(db.session) + module_build_service.scheduler.main([], stop) + + module = db.session.query(models.ModuleBuild).get(module_build_id) + assert module.state == models.BUILD_STATES['ready'] + @patch("module_build_service.config.Config.system", new_callable=PropertyMock, return_value="testlocal") diff --git a/tests/test_utils/test_utils.py b/tests/test_utils/test_utils.py index b3ddfdd3..9f5db09e 100644 --- a/tests/test_utils/test_utils.py +++ b/tests/test_utils/test_utils.py @@ -321,6 +321,32 @@ class TestUtils: assert mmd_context == models.DEFAULT_MODULE_CONTEXT assert build.context == models.DEFAULT_MODULE_CONTEXT + def test_import_mmd_multiple_dependencies(self): + mmd = Modulemd.Module().new_from_file( + path.join(BASE_DIR, '..', 'staged_data', 'formatted_testmodule.yaml')) + mmd.upgrade() + mmd.add_dependencies(mmd.get_dependencies()[0]) + + expected_error = 'The imported module\'s dependencies list should contain just one element' + with pytest.raises(UnprocessableEntity) as e: + module_build_service.utils.import_mmd(db.session, mmd) + assert str(e.value) == expected_error + + def test_import_mmd_no_xmd_buildrequires(self): + mmd = Modulemd.Module().new_from_file( + path.join(BASE_DIR, '..', 'staged_data', 'formatted_testmodule.yaml')) + mmd.upgrade() + xmd = glib.from_variant_dict(mmd.get_xmd()) + del xmd['mbs']['buildrequires'] + mmd.set_xmd(glib.dict_values(xmd)) + + expected_error = ( + 'The imported module buildrequires other modules, but the metadata in the ' + 'xmd["mbs"]["buildrequires"] dictionary is missing entries') + with pytest.raises(UnprocessableEntity) as e: + module_build_service.utils.import_mmd(db.session, mmd) + assert str(e.value) == expected_error + @pytest.mark.parametrize('stream, disttag_marking, error_msg', ( ('f28', None, None), ('f28', 'fedora28', None), diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 7449d8ed..7993fdb8 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -1575,7 +1575,7 @@ class TestViews: rv = self.client.post( post_url, data=json.dumps({'scmurl': 'file://' + scm_base_dir + ( - '/mariadb?#7cf8fb26db8dbfea075eb5f898cc053139960250')})) + '/mariadb?#e9742ed681f82e3ef5281fc652b4e68a3826cea6')})) data = json.loads(rv.data) assert 'Module mariadb:10.2:20180724000000:00000000 imported' in data['messages'] @@ -1605,7 +1605,7 @@ class TestViews: rv = self.client.post( post_url, data=json.dumps({'scmurl': 'file://' + scm_base_dir + ( - '/mariadb?#1a43ea22cd32f235c2f119de1727a37902a49f20')})) + '/mariadb?#8b43f38cdafdd773e7d0308e758105bf9f0f67a8')})) data = json.loads(rv.data) assert 'Module mariadb:10.2:20180724065109:00000000 imported' in data['messages'] @@ -1651,29 +1651,13 @@ class TestViews: rv = self.client.post( post_url, data=json.dumps({'scmurl': 'file://' + scm_base_dir + ( - '/mariadb?#cb7cf7069059141e0797ad2cf5a559fb673ef43d')})) + '/mariadb?#f7c5c7218c9a197d7fd245eeb4eee3d7abffd75d')})) data = json.loads(rv.data) assert data['error'] == 'Unprocessable Entity' assert re.match(r'The modulemd .* is invalid\. Please verify the syntax is correct', data['message']) - @pytest.mark.parametrize('api_version', [1, 2]) - @patch('module_build_service.auth.get_user', return_value=import_module_user) - @patch.object(module_build_service.config.Config, 'scmurls', - new_callable=PropertyMock, return_value=['file://']) - def test_import_build_scm_missing_koji_tag(self, mocked_scmurls, mocked_get_user, - api_version): - post_url = '/module-build-service/{0}/import-module/'.format(api_version) - rv = self.client.post( - post_url, - data=json.dumps({'scmurl': 'file://' + scm_base_dir + ( - '/mariadb?#9ab5fdeba83eb3382413ee8bc06299344ef4477d')})) - data = json.loads(rv.data) - - assert data['error'] == 'Unprocessable Entity' - assert data['message'].startswith('\'koji_tag\' is not set in xmd[\'mbs\'] for module') - def test_buildrequires_is_included_in_json_output(self): # Inject xmd/mbs/buildrequires into an existing module build for # assertion later.