Francois Gouget : testbot: Allow specifying extra mission capabilities.

Alexandre Julliard julliard at winehq.org
Thu Mar 5 16:33:59 CST 2020


Module: tools
Branch: master
Commit: 17e6b89d14e6bb90bf611e323f444cfe6268bb63
URL:    https://source.winehq.org/git/tools.git/?a=commit;h=17e6b89d14e6bb90bf611e323f444cfe6268bb63

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Wed Mar  4 16:30:11 2020 +0100

testbot: Allow specifying extra mission capabilities.

This allows specifying extra builds or locales that a VM can handle,
without having these used for every mailing list patch or WineTest run.
The extra capabilities can then be used when manually scheduling a job
on the TestBot.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47853
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 testbot/ddl/update42.sql            |  5 +++++
 testbot/ddl/winetestbot.sql         |  1 +
 testbot/doc/winetestbot-schema.dia  | 23 +++++++++++++++++++++++
 testbot/lib/WineTestBot/Missions.pm | 26 ++++++++++++++++++++++++--
 testbot/lib/WineTestBot/VMs.pm      | 10 +++++++++-
 testbot/web/Submit.pl               |  2 +-
 testbot/web/admin/VMDetails.pl      |  3 ++-
 7 files changed, 65 insertions(+), 5 deletions(-)

diff --git a/testbot/ddl/update42.sql b/testbot/ddl/update42.sql
new file mode 100644
index 0000000..f38833e
--- /dev/null
+++ b/testbot/ddl/update42.sql
@@ -0,0 +1,5 @@
+USE winetestbot;
+
+ALTER TABLE VMs
+  ADD MissionCaps VARCHAR(512) NOT NULL
+      AFTER Missions;
diff --git a/testbot/ddl/winetestbot.sql b/testbot/ddl/winetestbot.sql
index e6114e0..e1cb571 100644
--- a/testbot/ddl/winetestbot.sql
+++ b/testbot/ddl/winetestbot.sql
@@ -49,6 +49,7 @@ CREATE TABLE VMs
   Type          ENUM('win32', 'win64', 'build', 'wine') NOT NULL,
   Role          ENUM('extra', 'base', 'winetest', 'retired', 'deleted') NOT NULL,
   Missions      VARCHAR(256)     NOT NULL,
+  MissionCaps   VARCHAR(512)     NOT NULL,
   Status        ENUM('dirty', 'reverting', 'sleeping', 'idle', 'running', 'off', 'offline', 'maintenance') NOT NULL,
   Errors        INT(2)           NULL,
   ChildPid      INT(5)           NULL,
diff --git a/testbot/doc/winetestbot-schema.dia b/testbot/doc/winetestbot-schema.dia
index 372d3bf..81ab656 100644
--- a/testbot/doc/winetestbot-schema.dia
+++ b/testbot/doc/winetestbot-schema.dia
@@ -2406,6 +2406,29 @@
             <dia:string>##</dia:string>
           </dia:attribute>
         </dia:composite>
+        <dia:composite type="table_attribute">
+          <dia:attribute name="name">
+            <dia:string>#MissionCaps#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>#VARCHAR(512)#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="primary_key">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="nullable">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="unique">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="default_value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+        </dia:composite>
         <dia:composite type="table_attribute">
           <dia:attribute name="name">
             <dia:string>#Status#</dia:string>
diff --git a/testbot/lib/WineTestBot/Missions.pm b/testbot/lib/WineTestBot/Missions.pm
index 4f83875..810eb4d 100644
--- a/testbot/lib/WineTestBot/Missions.pm
+++ b/testbot/lib/WineTestBot/Missions.pm
@@ -142,9 +142,10 @@ sub GetTaskMissionDescription($$)
   return $Description;
 }
 
-sub GetMissionCaps($)
+sub GetMissionCaps($$)
 {
-  my ($MissionStatement) = @_;
+  my ($MissionStatement, $MissionCaps) = @_;
+
   my $Capabilities = { build => {}, lang => {} };
 
   # Extract capabilities from the mission statement
@@ -165,6 +166,27 @@ sub GetMissionCaps($)
       }
     }
   }
+
+  # Parse the additional capabilities
+  foreach my $Capability (split /,/, $MissionCaps || "")
+  {
+    if ($Capability =~ s/^lang=//)
+    {
+      foreach my $Lang (split /[|]/, $Capability)
+      {
+        $Capabilities->{lang}->{$Lang} = 1;
+      }
+    }
+    elsif ($Capability =~ /^(?:win32|wow32|wow64)$/)
+    {
+      $Capabilities->{build}->{$Capability} = 1;
+    }
+    else
+    {
+      $ErrMessage ||= "Invalid option capability '$Capability'";
+    }
+  }
+
   if (%{$Capabilities->{lang}})
   {
     # en_US is the default for Wine VMs and must always be supported
diff --git a/testbot/lib/WineTestBot/VMs.pm b/testbot/lib/WineTestBot/VMs.pm
index 6c3c8b7..6dd1ff2 100644
--- a/testbot/lib/WineTestBot/VMs.pm
+++ b/testbot/lib/WineTestBot/VMs.pm
@@ -311,6 +311,7 @@ sub ResetModified($)
   $self->SUPER::ResetModified();
   $self->{OldType} = $self->Type;
   $self->{OldMissions} = $self->Missions;
+  $self->{OldMissionCaps} = $self->MissionCaps;
 }
 
 my $_SupportedMissions = {
@@ -347,7 +348,8 @@ sub Validate($)
     return ("Role", "Only win32, win64 and wine VMs can have a role of '" . $self->Role . "'");
   }
   if ($self->ValuesDiffer($self->{OldType}, $self->Type) or
-      $self->ValuesDiffer($self->{OldMissions}, $self->Missions))
+      $self->ValuesDiffer($self->{OldMissions}, $self->Missions) or
+      $self->ValuesDiffer($self->{OldMissionCaps}, $self->MissionCaps))
   {
     my ($ErrMessage, $Missions) = ParseMissionStatement($self->Missions);
     return ("Missions", $ErrMessage) if (defined $ErrMessage);
@@ -366,8 +368,13 @@ sub Validate($)
         }
       }
     }
+
+    ($ErrMessage, my $_Caps) = GetMissionCaps("", $self->MissionCaps);
+    return ("MissionCaps", $ErrMessage) if (defined $ErrMessage);
+
     $self->{OldType} = $self->Type;
     $self->{OldMissions} = $self->Missions;
+    $self->{OldMissionCaps} = $self->MissionCaps;
   }
 
   return $self->SUPER::Validate();
@@ -734,6 +741,7 @@ my @PropertyDescriptors = (
   CreateEnumPropertyDescriptor("Type", "Type of VM", !1, 1, ['win32', 'win64', 'build', 'wine']),
   CreateEnumPropertyDescriptor("Role", "VM Role", !1, 1, ['extra', 'base', 'winetest', 'retired', 'deleted']),
   CreateBasicPropertyDescriptor("Missions", "Missions", !1, 1, "A", 256),
+  CreateBasicPropertyDescriptor("MissionCaps", "Mission Capabilities", !1, !1, "A", 512),
   CreateEnumPropertyDescriptor("Status", "Current status", !1, 1, ['dirty', 'reverting', 'sleeping', 'idle', 'running', 'off', 'offline', 'maintenance']),
   CreateBasicPropertyDescriptor("Errors", "Errors", !1, !1, "N", 2),
   CreateBasicPropertyDescriptor("ChildPid", "Child process id", !1, !1, "N", 5),
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index f76ca6e..5e9a61e 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -484,7 +484,7 @@ sub _initialize($$$)
   foreach my $VMKey (@$SortedKeys)
   {
     my $VM = $VMs->GetItem($VMKey);
-    my ($ErrMessage, $Caps) = GetMissionCaps($VM->Missions);
+    my ($ErrMessage, $Caps) = GetMissionCaps($VM->Missions, $VM->MissionCaps);
     LogMsg "$ErrMessage\n" if (defined $ErrMessage);
 
     my @Builds = $VM->Type eq "wine" ? keys %{$Caps->{build}} : ("vm");
diff --git a/testbot/web/admin/VMDetails.pl b/testbot/web/admin/VMDetails.pl
index 095de3a..27ffd2f 100644
--- a/testbot/web/admin/VMDetails.pl
+++ b/testbot/web/admin/VMDetails.pl
@@ -74,7 +74,7 @@ sub GenerateFooter($)
   print "<thead><tr><th class='Record'>Legend</th></tr></thead>\n";
   print "<tbody><tr><td class='Record'>\n";
 
-  print "<p>The Missions syntax is <i>mission1:mission2:...|mission3|...</i> where <i>mission1</i> and <i>mission2</i> will be run in the same task, and <i>mission3</i> in a separate task.<br>\n";
+  print "<p>The <b>Missions</b> syntax is <i>mission1:mission2:...|mission3|...</i> where <i>mission1</i> and <i>mission2</i> will be run in the same task, and <i>mission3</i> in a separate task.<br>\n";
   print "Each mission is composed of a build and options separated by commas: <i>build,option1=value,option2,...</i>. The value can be omitted for boolean options and defaults to true.<br>\n";
   print "The supported builds are <i>build</i> for build VMs; <i>exe32</i> and <i>exe64</i> for Windows VMs;<i> win32</i>, <i>wow32</i> and <i>wow64</i> for Wine VMs.</p>\n";
   print "<p>On Wine VMs:<br>\n";
@@ -82,6 +82,7 @@ sub GenerateFooter($)
   print "The <i>lang</i> option can be set to run the tests in the specified \$LANG locale. The default is en_US (<i>.UTF-8</i> can be omitted).<br>\n";
   print "The <i>dir</i> option can be set to specify the directory in which to run the tests. A path starting with a single letter followed by a slash specifies the drive, for instance 'c/' for 'c:' (the default).<br>\n";
   print "If set, the <i>nosubmit</i> option specifies that the WineTest results should not be published online.</p>\n";
+  print "<p>The <b>MissionCaps</b> syntax is <i>option1,option2=value1|value2,...</i> where <i>option1</i> is either a build or an option name, and <i>option2</i> is the name of an option that can be set to either <i>value1</i> or <i>value2</i>.<br>\n";
   print "</td></tr></tbody>\n";
   print "</table></div>\n";
   $self->SUPER::GenerateFooter();




More information about the wine-cvs mailing list