| |
@@ -26,6 +26,7 @@
|
| |
import module_build_service.scm
|
| |
|
| |
from mock import patch, PropertyMock
|
| |
+ from werkzeug.datastructures import FileStorage
|
| |
from shutil import copyfile
|
| |
from os import path, mkdir
|
| |
from os.path import dirname
|
| |
@@ -129,6 +130,8 @@
|
| |
assert data['context'] == '00000000'
|
| |
assert data['name'] == 'nginx'
|
| |
assert data['owner'] == 'Moe Szyslak'
|
| |
+ assert data['scratch'] is False
|
| |
+ assert data['srpms'] == []
|
| |
assert data['stream'] == '1'
|
| |
assert data['siblings'] == []
|
| |
assert data['state'] == 5
|
| |
@@ -190,6 +193,8 @@
|
| |
assert data['owner'] == 'Moe Szyslak'
|
| |
assert data['scmurl'] == ('git://pkgs.domain.local/modules/nginx'
|
| |
'?#ba95886c7a443b36a9ce31abda1f9bef22f2f8c9')
|
| |
+ assert data['scratch'] is False
|
| |
+ assert data['srpms'] == []
|
| |
assert data['siblings'] == []
|
| |
assert data['state'] == 5
|
| |
assert data['state_name'] == 'ready'
|
| |
@@ -274,7 +279,9 @@
|
| |
"rebuild_strategy": "changed-and-after",
|
| |
"scmurl": ("git://pkgs.domain.local/modules/testmodule"
|
| |
"?#ca95886c7a443b36a9ce31abda1f9bef22f2f8c9"),
|
| |
+ "scratch": False,
|
| |
"siblings": [],
|
| |
+ "srpms": [],
|
| |
"state": 1,
|
| |
"state_name": "wait",
|
| |
"state_reason": None,
|
| |
@@ -311,7 +318,9 @@
|
| |
"rebuild_strategy": "changed-and-after",
|
| |
"scmurl": ("git://pkgs.domain.local/modules/postgressql"
|
| |
"?#aa95886c7a443b36a9ce31abda1f9bef22f2f8c9"),
|
| |
+ "scratch": False,
|
| |
"siblings": [],
|
| |
+ "srpms": [],
|
| |
"state": 3,
|
| |
"state_name": "done",
|
| |
"state_reason": None,
|
| |
@@ -358,7 +367,9 @@
|
| |
"rebuild_strategy": "changed-and-after",
|
| |
"scmurl": ("git://pkgs.domain.local/modules/nginx"
|
| |
"?#ba95886c7a443b36a9ce31abda1f9bef22f2f8c9"),
|
| |
+ "scratch": False,
|
| |
"siblings": [2],
|
| |
+ "srpms": [],
|
| |
"state": 5,
|
| |
"state_name": "ready",
|
| |
"state_reason": None,
|
| |
@@ -1666,3 +1677,180 @@
|
| |
|
| |
assert br_modulea == buildrequires.get('modulea')
|
| |
assert br_moduleb == buildrequires.get('moduleb')
|
| |
+
|
| |
+ @pytest.mark.parametrize('api_version', [1, 2])
|
| |
+ @patch('module_build_service.auth.get_user', return_value=user)
|
| |
+ @patch('module_build_service.scm.SCM')
|
| |
+ @patch('module_build_service.config.Config.modules_allow_scratch',
|
| |
+ new_callable=PropertyMock, return_value=True)
|
| |
+ def test_submit_scratch_build(self, mocked_allow_scratch, mocked_scm, mocked_get_user,
|
| |
+ api_version):
|
| |
+ FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
|
| |
+ '620ec77321b2ea7b0d67d82992dda3e1d67055b4')
|
| |
+
|
| |
+ post_url = '/module-build-service/{0}/module-builds/'.format(api_version)
|
| |
+ post_data = {
|
| |
+ 'branch': 'master',
|
| |
+ 'scmurl': 'https://src.stg.fedoraproject.org/modules/'
|
| |
+ 'testmodule.git?#68931c90de214d9d13feefbd35246a81b6cb8d49',
|
| |
+ 'scratch': True,
|
| |
+ }
|
| |
+ rv = self.client.post(post_url, data=json.dumps(post_data))
|
| |
+ data = json.loads(rv.data)
|
| |
+
|
| |
+ if api_version >= 2:
|
| |
+ assert isinstance(data, list)
|
| |
+ assert len(data) == 1
|
| |
+ data = data[0]
|
| |
+
|
| |
+ assert 'component_builds' in data, data
|
| |
+ assert data['component_builds'] == []
|
| |
+ assert data['name'] == 'testmodule'
|
| |
+ assert data['scmurl'] == ('https://src.stg.fedoraproject.org/modules/testmodule.git'
|
| |
+ '?#68931c90de214d9d13feefbd35246a81b6cb8d49')
|
| |
+ assert data['scratch'] is True
|
| |
+ assert data['version'] == '281'
|
| |
+ assert data['time_submitted'] is not None
|
| |
+ assert data['time_modified'] is not None
|
| |
+ assert data['time_completed'] is None
|
| |
+ assert data['stream'] == 'master'
|
| |
+ assert data['owner'] == 'Homer J. Simpson'
|
| |
+ assert data['id'] == 8
|
| |
+ assert data['rebuild_strategy'] == 'changed-and-after'
|
| |
+ assert data['state_name'] == 'init'
|
| |
+ assert data['state_url'] == '/module-build-service/{0}/module-builds/8'.format(api_version)
|
| |
+ assert len(data['state_trace']) == 1
|
| |
+ assert data['state_trace'][0]['state'] == 0
|
| |
+ assert data['tasks'] == {}
|
| |
+ assert data['siblings'] == []
|
| |
+ mmd = Modulemd.Module().new_from_string(data['modulemd'])
|
| |
+ mmd.upgrade()
|
| |
+
|
| |
+ # Make sure the buildrequires entry was created
|
| |
+ module = ModuleBuild.query.get(8)
|
| |
+ assert len(module.buildrequires) == 1
|
| |
+ assert module.buildrequires[0].name == 'platform'
|
| |
+ assert module.buildrequires[0].stream == 'f28'
|
| |
+ assert module.buildrequires[0].version == '3'
|
| |
+ assert module.buildrequires[0].context == '00000000'
|
| |
+ assert module.buildrequires[0].stream_version == 280000
|
| |
+
|
| |
+ @pytest.mark.parametrize('api_version', [1, 2])
|
| |
+ @patch('module_build_service.auth.get_user', return_value=user)
|
| |
+ @patch('module_build_service.scm.SCM')
|
| |
+ @patch('module_build_service.config.Config.modules_allow_scratch',
|
| |
+ new_callable=PropertyMock, return_value=False)
|
| |
+ def test_submit_scratch_build_not_allowed(self, mocked_allow_scratch,
|
| |
+ mocked_scm, mocked_get_user,
|
| |
+ api_version):
|
| |
+ FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
|
| |
+ '620ec77321b2ea7b0d67d82992dda3e1d67055b4')
|
| |
+
|
| |
+ post_url = '/module-build-service/{0}/module-builds/'.format(api_version)
|
| |
+ post_data = {
|
| |
+ 'branch': 'master',
|
| |
+ 'scmurl': 'https://src.stg.fedoraproject.org/modules/'
|
| |
+ 'testmodule.git?#68931c90de214d9d13feefbd35246a81b6cb8d49',
|
| |
+ 'scratch': True,
|
| |
+ }
|
| |
+ rv = self.client.post(post_url, data=json.dumps(post_data))
|
| |
+ data = json.loads(rv.data)
|
| |
+ expected_error = {
|
| |
+ 'error': 'Forbidden',
|
| |
+ 'message': 'Scratch builds are not enabled',
|
| |
+ 'status': 403
|
| |
+ }
|
| |
+ assert data == expected_error
|
| |
+ assert rv.status_code == expected_error['status']
|
| |
+
|
| |
+ @pytest.mark.parametrize('api_version', [1, 2])
|
| |
+ @patch('module_build_service.auth.get_user', return_value=user)
|
| |
+ @patch('module_build_service.config.Config.modules_allow_scratch',
|
| |
+ new_callable=PropertyMock, return_value=True)
|
| |
+ @patch('module_build_service.config.Config.yaml_submit_allowed',
|
| |
+ new_callable=PropertyMock, return_value=True)
|
| |
+ def test_submit_scratch_build_with_mmd(self, mocked_allow_yaml,
|
| |
+ mocked_allow_scratch,
|
| |
+ mocked_get_user,
|
| |
+ api_version):
|
| |
+ base_dir = path.abspath(path.dirname(__file__))
|
| |
+ mmd_path = path.join(base_dir, '..', 'staged_data', 'testmodule.yaml')
|
| |
+ post_url = '/module-build-service/{0}/module-builds/'.format(api_version)
|
| |
+ with open(mmd_path, 'rb') as f:
|
| |
+ yaml_file = FileStorage(f)
|
| |
+ post_data = {
|
| |
+ 'branch': 'master',
|
| |
+ 'scratch': True,
|
| |
+ 'yaml': yaml_file,
|
| |
+ }
|
| |
+ rv = self.client.post(post_url, content_type='multipart/form-data', data=post_data)
|
| |
+ data = json.loads(rv.data)
|
| |
+
|
| |
+ if api_version >= 2:
|
| |
+ assert isinstance(data, list)
|
| |
+ assert len(data) == 1
|
| |
+ data = data[0]
|
| |
+
|
| |
+ assert 'component_builds' in data, data
|
| |
+ assert data['component_builds'] == []
|
| |
+ assert data['name'] == 'testmodule'
|
| |
+ assert data['scmurl'] is None
|
| |
+ # generated modulemd is nondeterministic, so just make sure it is set
|
| |
+ assert data['modulemd'] is not None
|
| |
+ assert data['scratch'] is True
|
| |
+ # generated version is nondeterministic, so just make sure it is set
|
| |
+ assert data['version'] is not None
|
| |
+ assert data['time_submitted'] is not None
|
| |
+ assert data['time_modified'] is not None
|
| |
+ assert data['time_completed'] is None
|
| |
+ assert data['stream'] == 'master'
|
| |
+ assert data['owner'] == 'Homer J. Simpson'
|
| |
+ assert data['id'] == 8
|
| |
+ assert data['rebuild_strategy'] == 'changed-and-after'
|
| |
+ assert data['state_name'] == 'init'
|
| |
+ assert data['state_url'] == '/module-build-service/{0}/module-builds/8'.format(api_version)
|
| |
+ assert len(data['state_trace']) == 1
|
| |
+ assert data['state_trace'][0]['state'] == 0
|
| |
+ assert data['tasks'] == {}
|
| |
+ assert data['siblings'] == []
|
| |
+ mmd = Modulemd.Module().new_from_string(data['modulemd'])
|
| |
+ mmd.upgrade()
|
| |
+
|
| |
+ # Make sure the buildrequires entry was created
|
| |
+ module = ModuleBuild.query.get(8)
|
| |
+ assert len(module.buildrequires) == 1
|
| |
+ assert module.buildrequires[0].name == 'platform'
|
| |
+ assert module.buildrequires[0].stream == 'f28'
|
| |
+ assert module.buildrequires[0].version == '3'
|
| |
+ assert module.buildrequires[0].context == '00000000'
|
| |
+ assert module.buildrequires[0].stream_version == 280000
|
| |
+
|
| |
+ @pytest.mark.parametrize('api_version', [1, 2])
|
| |
+ @patch('module_build_service.auth.get_user', return_value=user)
|
| |
+ @patch('module_build_service.config.Config.modules_allow_scratch',
|
| |
+ new_callable=PropertyMock, return_value=True)
|
| |
+ @patch('module_build_service.config.Config.yaml_submit_allowed',
|
| |
+ new_callable=PropertyMock, return_value=False)
|
| |
+ def test_submit_scratch_build_with_mmd_not_allowed(self, mocked_allow_yaml,
|
| |
+ mocked_allow_scratch,
|
| |
+ mocked_get_user,
|
| |
+ api_version):
|
| |
+ base_dir = path.abspath(path.dirname(__file__))
|
| |
+ mmd_path = path.join(base_dir, '..', 'staged_data', 'testmodule.yaml')
|
| |
+ post_url = '/module-build-service/{0}/module-builds/'.format(api_version)
|
| |
+ with open(mmd_path, 'rb') as f:
|
| |
+ yaml_file = FileStorage(f)
|
| |
+ post_data = {
|
| |
+ 'branch': 'master',
|
| |
+ 'scratch': True,
|
| |
+ 'yaml': yaml_file,
|
| |
+ }
|
| |
+ rv = self.client.post(post_url, content_type='multipart/form-data', data=post_data)
|
| |
+ data = json.loads(rv.data)
|
| |
+ expected_error = {
|
| |
+ 'error': 'Forbidden',
|
| |
+ 'message': 'YAML submission is not enabled',
|
| |
+ 'status': 403
|
| |
+ }
|
| |
+ assert data == expected_error
|
| |
+ assert rv.status_code == expected_error['status']
|
| |
I'm wondering if it'd be better to make this configurable like
conf.default_dist_tag_prefix
or if it makes sense to just continue usingconf.default_dist_tag_prefix
but add "scr+" after it. What do you think @merlinm and @jkaluza?