#884 Rework module state
Merged 4 years ago by praiskup. Opened 4 years ago by frostyx.
copr/ frostyx/copr fix-module-status  into  master

file modified
+4 -2
@@ -55,8 +55,10 @@ 

      }

  

  

- class ModuleStatusEnum(with_metaclass(EnumType, object)):

-     vals = {"pending": 0, "succeeded": 1, "failed": 2}

+ class ModuleStatusEnum(StatusEnum):

+     vals = {k: v for k, v in StatusEnum.vals.items()

+             if k in ["canceled", "running", "starting", "pending",

+                       "failed", "succeeded", "waiting", "unknown"]}

  

  

  class BuildSourceEnum(with_metaclass(EnumType, object)):

@@ -1561,9 +1561,15 @@ 

          """

          Return numeric representation of status of this build

          """

-         if any(b for b in self.builds if b.status == StatusEnum("failed")):

-             return ModuleStatusEnum("failed")

-         return self.action.result if self.action else ModuleStatusEnum("pending")

+         if self.action:

+             return { BackendResultEnum("success"): ModuleStatusEnum("succeeded"),

+                      BackendResultEnum("failure"): ModuleStatusEnum("failed"),

+                      BackendResultEnum("waiting"): ModuleStatusEnum("waiting"),

+                    }[self.action.result]

+         build_statuses = [b.status for b in self.builds]

+         for state in ["canceled", "running", "starting", "pending", "failed", "succeeded"]:

+             if ModuleStatusEnum(state) in build_statuses:

+                 return ModuleStatusEnum(state)

  

      @property

      def state(self):

@@ -3,7 +3,7 @@ 

  {% from "coprs/detail/_describe_source.html" import describe_source %}

  {% from "coprs/detail/_describe_failure.html" import describe_failure %}

  {% from "coprs/detail/_builds_table.html" import builds_table with context %}

- {% from "_helpers.html" import chroot_to_os_logo, build_state_text, build_state, copr_name %}

+ {% from "_helpers.html" import chroot_to_os_logo, build_state_text, build_state, copr_name, module_state %}

  {% block title %}Module {{ module.id }} in {{ copr_name(copr) }}{% endblock %}

  

  {% set selected_tab = "modules" %}
@@ -36,6 +36,9 @@ 

        </div>

        <div class="panel-body">

          <dl class="dl-horizontal">

+           <dt>Status:</dt>

+           <dd>{{ module_state(module) }} - {{ module.state | build_state_description }} </dd>

+ 

            <dt>Name:</dt>

            <dd>{{ module.name }}</dd>

  

@@ -4,12 +4,49 @@ 

  from tests.coprs_test_case import CoprsTestCase

  from coprs.logic.modules_logic import ModuleBuildFacade, ModulemdGenerator

  from coprs.logic.coprs_logic import CoprChrootsLogic

+ from copr_common.enums import ActionTypeEnum, BackendResultEnum, ModuleStatusEnum, StatusEnum

+ from coprs import models, db

  

  import gi

  gi.require_version('Modulemd', '1.0')

  from gi.repository import Modulemd

  

  

+ class TestModulesLogic(CoprsTestCase):

+     def test_state(self, f_users, f_coprs, f_mock_chroots, f_builds, f_modules, f_db):

+         self.b1.build_chroots[0].status = StatusEnum("pending")

+         self.b3.build_chroots[0].status = StatusEnum("succeeded")

+         self.b3.build_chroots[1].status = StatusEnum("succeeded")

+         self.b3.source_status = StatusEnum("succeeded")

+ 

+         # even though b3 is succeeded, b1 is still pending

+         self.m1.builds = [self.b1, self.b3]

+         assert self.m1.status == ModuleStatusEnum("pending")

+ 

+         # now what if b1 succeeds

+         self.b1.build_chroots[0].status = StatusEnum("succeeded")

+         assert self.m1.status == ModuleStatusEnum("succeeded")

+ 

+         # let's say that b3 failed

+         self.b3.build_chroots[0].status = StatusEnum("failed")

+         assert self.m1.status == ModuleStatusEnum("failed")

+ 

+ 

+         # once the action exists, it dictates the status

+         self.b3.build_chroots[0].status = StatusEnum("succeeded")

+         action = models.Action(

+             action_type=ActionTypeEnum("build_module"),

+             object_type="module",

+             object_id=self.m1.id,

+         )

+         db.session.add(action)

+         assert self.m1.status == ModuleStatusEnum("waiting")

+ 

+         # the backend proceeds the action

+         action.result = BackendResultEnum("success")

+         assert self.m1.status == ModuleStatusEnum("succeeded")

+ 

+ 

  class TestModuleBuildFacade(CoprsTestCase):

      def test_get_build_batches(self):

          pkg1 = Modulemd.ComponentRpm(name="pkg1", rationale="rationale")