#800 koji-wrapper: Ask for task state
Closed 6 years ago by lsedlar. Opened 6 years ago by lsedlar.
lsedlar/pungi ask-koji-status  into  master

file modified
+1 -1
@@ -203,7 +203,7 @@ 

          time.sleep(num * 3)

          output = koji_wrapper.run_blocking_cmd(koji_cmd, log_file=log_file)

          self.pool.log_debug("build-image outputs: %s" % (output))

-         if output["retcode"] != 0:

+         if not koji_wrapper.is_task_successful(output['task_id']):

              self.fail(compose, cmd)

              raise RuntimeError("ImageBuild task failed: %s. See %s for more details."

                                 % (output["task_id"], log_file))

file modified
+1 -1
@@ -181,7 +181,7 @@ 

          time.sleep(num * 3)

  

          output = koji_wrapper.run_blocking_cmd(koji_cmd, log_file=log_file)

-         if output["retcode"] != 0:

+         if not koji_wrapper.is_task_successful(output['task_id']):

              raise RuntimeError("LiveImage task failed: %s. See %s for more details." % (output["task_id"], log_file))

  

          # copy finished image to isos/

@@ -105,7 +105,7 @@ 

          time.sleep(self.num * 3)

          output = koji_wrapper.run_blocking_cmd(cmd, log_file=log_file)

          self.pool.log_debug('live media outputs: %s' % (output))

-         if output['retcode'] != 0:

+         if not koji_wrapper.is_task_successful(output['task_id']):

              self.pool.log_error('Live media task failed.')

              raise RuntimeError('Live media task failed: %s. See %s for more details.'

                                 % (output['task_id'], log_file))

@@ -63,6 +63,13 @@ 

          else:

              raise RuntimeError('Unsupported authentication type in Koji')

  

+     def is_task_successful(self, task_id):

+         """Check if task finished successfully. We only care about the parent

+         task here, failed subtasks are fine.

+         """

+         task = self.koji_proxy.getTaskInfo(task_id)

+         return task['state'] == koji.TASK_STATES['CLOSED']

+ 

      def _get_cmd(self, *args):

          return ["koji", "--profile=%s" % self.profile] + list(args)

  

@@ -750,6 +750,7 @@ 

              "output": None,

              "task_id": 1234,

          }

+         KojiWrapper.return_value.is_task_successful.return_value = True

          koji_wrapper.get_image_paths.return_value = {

              'amd64': [

                  '/koji/task/1235/tdl-amd64.xml',
@@ -878,6 +879,7 @@ 

              "output": None,

              "task_id": 1234,

          }

+         KojiWrapper.return_value.is_task_successful.return_value = False

  

          t = CreateImageBuildThread(pool)

          with mock.patch('time.sleep'):
@@ -968,6 +970,7 @@ 

              "output": None,

              "task_id": 1234,

          }

+         KojiWrapper.return_value.is_task_successful.return_value = False

  

          t = CreateImageBuildThread(pool)

          with self.assertRaises(RuntimeError):

@@ -11,6 +11,8 @@ 

  import os

  import sys

  

+ import koji

+ 

  sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

  

  from pungi.wrappers.kojiwrapper import KojiWrapper, get_buildroot_rpms
@@ -287,6 +289,22 @@ 

                                 '/koji/task/12387277/libvirt-raw-xz-x86_64.xml',

                                 '/koji/task/12387277/Fedora-Cloud-Base-23-20160103.x86_64.raw.xz'])

  

+     def test_is_task_successful_ok(self):

+         self.koji.koji_proxy.getTaskInfo.return_value = {

+             'state': koji.TASK_STATES['CLOSED']

+         }

+         self.assertTrue(self.koji.is_task_successful(123))

+         self.assertEqual(self.koji.koji_proxy.getTaskInfo.call_args_list,

+                          [mock.call(123)])

+ 

+     def test_is_task_successful_fail(self):

+         self.koji.koji_proxy.getTaskInfo.return_value = {

+             'state': koji.TASK_STATES['FAILED']

+         }

+         self.assertFalse(self.koji.is_task_successful(123))

+         self.assertEqual(self.koji.koji_proxy.getTaskInfo.call_args_list,

+                          [mock.call(123)])

+ 

  

  class LiveMediaTestCase(KojiWrapperBaseTestCase):

      def test_get_live_media_cmd_minimal(self):

@@ -496,6 +496,7 @@ 

              'output': 'some output',

              'task_id': 123

          }

+         KojiWrapper.return_value.is_task_successful.return_value = True

          koji_wrapper.get_image_path.return_value = ['/path/to/image.iso']

  

          t = CreateLiveImageThread(pool)
@@ -576,6 +577,7 @@ 

              'output': 'some output',

              'task_id': 123

          }

+         KojiWrapper.return_value.is_task_successful.return_value = True

          koji_wrapper.get_image_path.return_value = ['/path/to/image.iso']

  

          t = CreateLiveImageThread(pool)
@@ -657,6 +659,7 @@ 

              'output': 'some output',

              'task_id': 123

          }

+         KojiWrapper.return_value.is_task_successful.return_value = True

          koji_wrapper.get_image_path.return_value = ['/path/to/image-a.b-sda.raw.xz']

  

          t = CreateLiveImageThread(pool)
@@ -734,6 +737,7 @@ 

              'output': 'some output',

              'task_id': 123

          }

+         KojiWrapper.return_value.is_task_successful.return_value = False

  

          t = CreateLiveImageThread(pool)

          with mock.patch('time.sleep'):

@@ -469,6 +469,8 @@ 

              ]

          }

  

+         KojiWrapper.return_value.is_task_successful.return_value = True

+ 

          t = LiveMediaThread(pool)

          get_file_size.return_value = 1024

          get_mtime.return_value = 13579
@@ -557,6 +559,8 @@ 

          get_file_size.return_value = 1024

          get_mtime.return_value.st_mtime = 13579

  

+         KojiWrapper.return_value.is_task_successful.return_value = False

+ 

          t = LiveMediaThread(pool)

          with mock.patch('time.sleep'):

              t.process((compose, compose.variants['Server'], config), 1)

Instead of relying on exit code of the command, we should instead query Koji and ask for the information directly.

This is applied for live images, live media and image build phases.

Fixes: https://pagure.io/pungi/issue/797

Let's not do this. Koji is fixed to report failure the way pungi expects it.

Pull-Request has been closed by lsedlar

6 years ago