From 0459e597025fb0a60b5fd64d8f9fc9fe658b3fbe Mon Sep 17 00:00:00 2001 From: Michal Hrusecky Date: Thu, 13 Feb 2014 15:58:12 +0100 Subject: [PATCH 1/4] Implement move using existing API calls --- osclib/stagingapi.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/osclib/stagingapi.py b/osclib/stagingapi.py index a84c0d85..5b8f30d4 100644 --- a/osclib/stagingapi.py +++ b/osclib/stagingapi.py @@ -78,25 +78,24 @@ class StagingAPI(object): def move_between_project(self, source_project, package, destination_project): """ Move selected package from one staging to another + :param source_project: Source project + :param package: Source package + :param destination_project: Destination project """ - # Get the relevant information from source - package_info = self.get_package_information('source_project', 'package') + # Get the relevant information about source + meta = get_prj_pseudometa(source_project) + req_id = -1 + for req in meta['requests']: + if req['package'] == package: + req_id = req['id'] + if req_id == -1: + raise oscerr.WrongArgs("Couldn't find request for package {0} in project {1}".format(package,source_project)) # Copy the package - #FIXME: add the data from orginal project yaml to the destination one - link_pac(package_info['project'], - package_info['package'], - destination_project, - package, - force=True, - rev=package_info['srcmd5']) - - # Delete the first location - message = 'moved to {0}'.format(destination_project) - delete_package(self.apiurl, source_project, package, msg=message) - #FIXME: delete the data from YAML - + sr_to_prj(req_id, destination_project) + # Delete the old one + rm_from_prj(package, source_project, 'Moved to {0}'.format(destination_project)) def get_staging_projects(self): """ @@ -289,6 +288,16 @@ class StagingAPI(object): self.set_prj_pseudometa(project, newdata) # FIXME Add sr to group request as well + def rm_from_prj(self, package, project, msg = None): + """ + Delete request from the project + :param project: project to remove from + :param package: package we want to remove + :param msg: message for the log + """ + + _remove_rq_from_prj_pseudometa(project, package) + delete_package(self.apiurl, project, package, force=True, msg=msg) def create_package_container(self, project, package, disable_build = False): """ From 5acae8f172ba2db3fc32da03934f3dd1eaf9dfdf Mon Sep 17 00:00:00 2001 From: Michal Hrusecky Date: Fri, 14 Feb 2014 18:49:50 +0100 Subject: [PATCH 2/4] Check whether everything is building Ok --- osclib/stagingapi.py | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/osclib/stagingapi.py b/osclib/stagingapi.py index 5b8f30d4..3a406965 100644 --- a/osclib/stagingapi.py +++ b/osclib/stagingapi.py @@ -316,6 +316,52 @@ class StagingAPI(object): url = makeurl(self.apiurl, ['source', project, package, '_meta'] ) http_PUT(url, data=dst_meta) + def check_project_status(self, project): + """ + Checks whether everything is built in project + :param project: project to check + """ + # Get build results + query = {} + query['lastbuild'] = 1 + u = makeurl(self.apiurl, ['build', project, '_result'], query=query) + f = http_GET(u) + root = ET.fromstring(''.join(f.readlines())) + + # Check them + broken = [] + working = [] + # Iterate through repositories + for results in root.findall('result'): + if results.get("state") not in [ "published", "unpublished" ]: + working.append({"path": "{0}/{1}".format(results.get("repository"), results.get("arch")), "state": results.get("state")}) + # Iterate through packages + for node in results: + result = node.get("code") + # Skip not built (yet) + if result in [ "blocked", "building", "disabled" "excluded", "finished", "unknown", "unpublished", "published" ]: + continue + # Find broken + if result in [ "broken", "failed", "unresolvable" ]: + broken.append({"pkg": node.get("package"), "state" : result, "path" : "{0}/{1}".format(results.get("repository"),results.get("arch"))}) + + # Print the results + if len(working) == 0 and len(broken) == 0: + print "Everything is green!" + else: + if len(working) != 0: + print "Following repositories are still building:" + for i in working: + print " {0}: {1}".format(i['path'], i['state']) + print + if len(broken) != 0: + print "Following packages are broken:" + for i in broken: + print " {0} ({1}): {2}".format(i['pkg'], i['path'], i['state']) + print + print "Found errors in staging project {0}!".format(project) + + def rq_to_prj(self, request_id, project): """ Links request to project - delete or submit From 7acc21607325079b40ab5aa800a6df386498e3a7 Mon Sep 17 00:00:00 2001 From: Michal Hrusecky Date: Fri, 14 Feb 2014 19:17:31 +0100 Subject: [PATCH 3/4] Tests for checking repository status --- tests/api_tests.py | 38 ++++++++++++++++++++ tests/fixtures/build-results-green.xml | 40 +++++++++++++++++++++ tests/fixtures/build-results-red.xml | 40 +++++++++++++++++++++ tests/fixtures/check_project_status_red.txt | 8 +++++ 4 files changed, 126 insertions(+) create mode 100644 tests/fixtures/build-results-green.xml create mode 100644 tests/fixtures/build-results-red.xml create mode 100644 tests/fixtures/check_project_status_red.txt diff --git a/tests/api_tests.py b/tests/api_tests.py index b4d7ff00..09743747 100644 --- a/tests/api_tests.py +++ b/tests/api_tests.py @@ -236,6 +236,44 @@ class TestApiCalls(unittest.TestCase): self.assertEqual(httpretty.last_request().body, '<description /><build><disable /></build></package>') self.assertEqual(httpretty.last_request().path, '/source/openSUSE:Factory:Staging:B/wine/_meta') + @httpretty.activate + def test_check_project_status_green(self): + """ + Test checking project status + """ + + # Initiate the pretty overrides + self._register_pretty_url_get('http://localhost/build/green/_result?lastbuild=1', + 'build-results-green.xml') + + # Initiate the api with mocked rings + with mock_generate_ring_packages(): + api = oscs.StagingAPI('http://localhost') + + # Check print output + api.check_project_status("green") + self.assertEqual(sys.stdout.getvalue().strip(), "Everything is green!") + + @httpretty.activate + def test_check_project_status_red(self): + """ + Test checking project status + """ + + # Initiate the pretty overrides + self._register_pretty_url_get('http://localhost/build/red/_result?lastbuild=1', + 'build-results-red.xml') + + # Initiate the api with mocked rings + with mock_generate_ring_packages(): + api = oscs.StagingAPI('http://localhost') + + # Check print output + api.check_project_status("red") + with open(self._get_fixtures_dir()+"/check_project_status_red.txt", "r") as f: + data = f.read().strip() + self.assertEqual(sys.stdout.getvalue().strip(), data) + # Here place all mockable functions @contextlib.contextmanager diff --git a/tests/fixtures/build-results-green.xml b/tests/fixtures/build-results-green.xml new file mode 100644 index 00000000..45af42d8 --- /dev/null +++ b/tests/fixtures/build-results-green.xml @@ -0,0 +1,40 @@ +<resultlist state="c7856c90c70c53fae88aacec964b80c0"> + <result project="green" repository="standard" arch="x86_64" code="published" state="published"> + <status package="glibc" code="unknown" /> + <status package="kiwi-image-livecd-gnome.i586" code="unknown" /> + <status package="kiwi-image-livecd-gnome.x86_64" code="succeeded" /> + <status package="kiwi-image-livecd-kde.i586" code="unknown" /> + <status package="kiwi-image-livecd-kde.x86_64" code="succeeded" /> + <status package="kiwi-image-livecd-x11" code="succeeded" /> + <status package="openSUSE-images" code="succeeded" /> + <status package="openSUSE-release" code="unknown" /> + <status package="package-lists-gnome.i586" code="unknown" /> + <status package="package-lists-gnome.x86_64" code="succeeded" /> + <status package="package-lists-images.i586" code="unknown" /> + <status package="package-lists-images.x86_64" code="succeeded" /> + <status package="package-lists-kde.i586" code="unknown" /> + <status package="package-lists-kde.x86_64" code="succeeded" /> + <status package="package-lists-x11.i586" code="unknown" /> + <status package="package-lists-x11.x86_64" code="succeeded" /> + <status package="promo-dvd-parts" code="succeeded" /> + </result> + <result project="green" repository="standard" arch="i586" code="unpublished" state="unpublished"> + <status package="glibc" code="unknown" /> + <status package="kiwi-image-livecd-gnome.i586" code="succeeded" /> + <status package="kiwi-image-livecd-gnome.x86_64" code="unknown" /> + <status package="kiwi-image-livecd-kde.i586" code="succeeded" /> + <status package="kiwi-image-livecd-kde.x86_64" code="unknown" /> + <status package="kiwi-image-livecd-x11" code="succeeded" /> + <status package="openSUSE-images" code="succeeded" /> + <status package="openSUSE-release" code="unknown" /> + <status package="package-lists-gnome.i586" code="succeeded" /> + <status package="package-lists-gnome.x86_64" code="unknown" /> + <status package="package-lists-images.i586" code="succeeded" /> + <status package="package-lists-images.x86_64" code="unknown" /> + <status package="package-lists-kde.i586" code="succeeded" /> + <status package="package-lists-kde.x86_64" code="unknown" /> + <status package="package-lists-x11.i586" code="succeeded" /> + <status package="package-lists-x11.x86_64" code="unknown" /> + <status package="promo-dvd-parts" code="succeeded" /> + </result> +</resultlist> diff --git a/tests/fixtures/build-results-red.xml b/tests/fixtures/build-results-red.xml new file mode 100644 index 00000000..4bf989dc --- /dev/null +++ b/tests/fixtures/build-results-red.xml @@ -0,0 +1,40 @@ +<resultlist state="c7856c90c70c53fae88aacec964b80c0"> + <result project="green" repository="standard" arch="x86_64" code="building" state="building"> + <status package="glibc" code="unknown" /> + <status package="kiwi-image-livecd-gnome.i586" code="unknown" /> + <status package="kiwi-image-livecd-gnome.x86_64" code="succeeded" /> + <status package="kiwi-image-livecd-kde.i586" code="unknown" /> + <status package="kiwi-image-livecd-kde.x86_64" code="succeeded" /> + <status package="kiwi-image-livecd-x11" code="succeeded" /> + <status package="openSUSE-images" code="succeeded" /> + <status package="openSUSE-release" code="unknown" /> + <status package="package-lists-gnome.i586" code="unknown" /> + <status package="package-lists-gnome.x86_64" code="succeeded" /> + <status package="package-lists-images.i586" code="unknown" /> + <status package="package-lists-images.x86_64" code="succeeded" /> + <status package="package-lists-kde.i586" code="unknown" /> + <status package="package-lists-kde.x86_64" code="succeeded" /> + <status package="package-lists-x11.i586" code="unknown" /> + <status package="package-lists-x11.x86_64" code="succeeded" /> + <status package="promo-dvd-parts" code="succeeded" /> + </result> + <result project="green" repository="standard" arch="i586" code="unpublished" state="unpublished"> + <status package="glibc" code="broken" /> + <status package="kiwi-image-livecd-gnome.i586" code="succeeded" /> + <status package="kiwi-image-livecd-gnome.x86_64" code="unknown" /> + <status package="kiwi-image-livecd-kde.i586" code="succeeded" /> + <status package="kiwi-image-livecd-kde.x86_64" code="unknown" /> + <status package="kiwi-image-livecd-x11" code="succeeded" /> + <status package="openSUSE-images" code="failed" /> + <status package="openSUSE-release" code="unknown" /> + <status package="package-lists-gnome.i586" code="succeeded" /> + <status package="package-lists-gnome.x86_64" code="unknown" /> + <status package="package-lists-images.i586" code="succeeded" /> + <status package="package-lists-images.x86_64" code="unknown" /> + <status package="package-lists-kde.i586" code="succeeded" /> + <status package="package-lists-kde.x86_64" code="unknown" /> + <status package="package-lists-x11.i586" code="succeeded" /> + <status package="package-lists-x11.x86_64" code="unknown" /> + <status package="promo-dvd-parts" code="succeeded" /> + </result> +</resultlist> diff --git a/tests/fixtures/check_project_status_red.txt b/tests/fixtures/check_project_status_red.txt new file mode 100644 index 00000000..d7427c45 --- /dev/null +++ b/tests/fixtures/check_project_status_red.txt @@ -0,0 +1,8 @@ +Following repositories are still building: + standard/x86_64: building + +Following packages are broken: + glibc (standard/i586): broken + openSUSE-images (standard/i586): failed + +Found errors in staging project red! From ddef7b9fca5c97a8e85620692bda4a023c706d3b Mon Sep 17 00:00:00 2001 From: Michal Hrusecky <MHrusecky@suse.cz> Date: Fri, 14 Feb 2014 19:18:08 +0100 Subject: [PATCH 4/4] Put checking command in place --- osc-staging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc-staging.py b/osc-staging.py index e14bebc1..8e6da0bc 100644 --- a/osc-staging.py +++ b/osc-staging.py @@ -434,7 +434,7 @@ def do_staging(self, subcmd, opts, *args): self._staging_push(project, opts) elif cmd in ['check']: project = args[1] - return self._staging_check(project, opts.everything, opts) + return api.check_project_status(project) elif cmd in ['remove', 'r']: project = args[1] self._staging_remove(project, opts)