[1/4] testbot: Directly use TestAgent for the file transfers and to run scripts instead of going through the VMs module.

Francois Gouget fgouget at codeweavers.com
Mon Jan 21 21:08:20 CST 2013


---

Now that the underlying VM management API no longer provides this 
functionality there is no reason for these functions to still be 
provided by the VM module.

Also this lets us reduce the number of connections we have to establish 
just to transfer the job data, run it and then retrieve the logs.


 testbot/bin/RevertVM.pl        |   11 ++++--
 testbot/bin/WineRunBuild.pl    |   34 ++++++++++++------
 testbot/bin/WineRunReconfig.pl |   25 ++++++++++---
 testbot/bin/WineRunTask.pl     |   76 ++++++++++++++++++++++------------------
 testbot/lib/WineTestBot/VMs.pm |   63 ++++-----------------------------
 5 files changed, 100 insertions(+), 109 deletions(-)

diff --git a/testbot/bin/RevertVM.pl b/testbot/bin/RevertVM.pl
index 2d8bf71..7d3359e 100755
--- a/testbot/bin/RevertVM.pl
+++ b/testbot/bin/RevertVM.pl
@@ -110,14 +110,19 @@ if (defined($ErrMessage))
   FatalError "Can't change status for VM $VMKey: $ErrMessage", $VM;
 }
 
+my $Success;
+my $TA = $VM->GetAgent();
+$TA->SetConnectTimeout($WaitForToolsInVM);
 foreach my $WaitCount (1..3)
 {
   LogMsg "Waiting for ", $VM->Name, " (up to ${WaitForToolsInVM}s)\n";
-  $ErrMessage = $VM->WaitForToolsInGuest($WaitForToolsInVM);
-  last if (!defined $ErrMessage);
+  $Success = $TA->Ping();
+  last if ($Success);
 }
-if (defined $ErrMessage)
+$TA->Disconnect();
+if (!$Success)
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Tools in $VMKey not responding: $ErrMessage", $VM;
 }
 
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index 4cc7c89..d335214 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -182,6 +182,7 @@ mkdir "$DataDir/jobs/$JobId/$StepNo";
 mkdir "$DataDir/jobs/$JobId/$StepNo/$TaskNo";
 
 my $VM = $Task->VM;
+my $TA = $VM->GetAgent();
 
 LogMsg "Task $JobId/$StepNo/$TaskNo started\n";
 
@@ -236,10 +237,9 @@ if (defined($ErrMessage))
              $FullErrFileName, $Job, $Step, $Task;
 }
 my $FileName = $Step->FileName;
-$ErrMessage = $VM->CopyFileFromHostToGuest("$StepDir/$FileName",
-                                           "staging/$FileName");
-if (defined($ErrMessage))
+if (!$TA->SendFile("$StepDir/$FileName", "staging/$FileName", 0))
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Can't copy patch to VM: $ErrMessage\n",
              $FullErrFileName, $Job, $Step, $Task;
 }
@@ -249,19 +249,31 @@ my $Script = "#!/bin/sh\n" .
              " $BaseName 32";
 $Script .= ",64"if ($Run64);
 $Script .= " >>Build.log 2>&1\n";
-$ErrMessage = $VM->RunScriptInGuestTimeout($Script, $Task->Timeout);
+if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
+{
+  $ErrMessage = $TA->GetLastError();
+  FatalError "Can't send the script to VM: $ErrMessage\n",
+             $FullErrFileName, $Job, $Step, $Task;
+}
+my $Pid = $TA->Run(["./task"], 0);
+my $OldTimeout = $TA->SetTimeout($Task->Timeout);
+if (!$Pid or !defined $TA->Wait($Pid))
+{
+  $ErrMessage = $TA->GetLastError();
+}
+$TA->SetTimeout($OldTimeout);
+
 if (defined($ErrMessage))
 {
-  $VM->CopyFileFromGuestToHost("Build.log", $FullRawlogFileName);
+  $TA->GetFile("Build.log", $FullRawlogFileName);
   ProcessRawlog($FullRawlogFileName, $FullLogFileName, $FullErrFileName);
   FatalError "Failure running script in VM: $ErrMessage\n",
              $FullErrFileName, $Job, $Step, $Task;
 }
 
-$ErrMessage = $VM->CopyFileFromGuestToHost("Build.log", $FullRawlogFileName);
-LogMsg "263 ErrMessage=[", $ErrMessage || "<undef>", "]\n";
-if (defined($ErrMessage))
+if (!$TA->GetFile("Build.log", $FullRawlogFileName))
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Can't copy log from VM: $ErrMessage\n", $FullErrFileName,
              $Job, $Step, $Task;
 }
@@ -288,10 +300,9 @@ foreach my $OtherStep (@{$Job->Steps->GetItems()})
       {
         $TestExecutable = "build-mingw$Bits/programs/$BaseName/tests/${BaseName}.exe_test.exe";
       }
-      $ErrMessage = $VM->CopyFileFromGuestToHost($TestExecutable,
-                                                 "$OtherStepDir/$OtherFileName");
-      if (defined($ErrMessage))
+      if (!$TA->GetFile($TestExecutable, "$OtherStepDir/$OtherFileName"))
       {
+        $ErrMessage = $TA->GetLastError();
         FatalError "Can't copy generated executable from VM: $ErrMessage\n",
                    $FullErrFileName, $Job, $Step, $Task;
       }
@@ -299,6 +310,7 @@ foreach my $OtherStep (@{$Job->Steps->GetItems()})
     }
   }
 }
+$TA->Disconnect();
 
 $Task->Status($NewStatus);
 $Task->ChildPid(undef);
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index fa38a5f..0618a48 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -182,6 +182,7 @@ mkdir "$DataDir/jobs/$JobId/$StepNo";
 mkdir "$DataDir/jobs/$JobId/$StepNo/$TaskNo";
 
 my $VM = $Task->VM;
+my $TA = $VM->GetAgent();
 
 LogMsg "Task $JobId/$StepNo/$TaskNo started\n";
 
@@ -201,24 +202,38 @@ if (defined($ErrMessage))
 my $Script = "#!/bin/sh\n" .
              "rm -f Reconfig.log\n" .
              "../bin/build/Reconfig.pl >>Reconfig.log 2>&1\n";
-$ErrMessage = $VM->RunScriptInGuestTimeout($Script, $Task->Timeout);
+if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
+{
+  $ErrMessage = $TA->GetLastError();
+  FatalError "Can't send the script to VM: $ErrMessage\n",
+             $FullErrFileName, $Job, $Step, $Task;
+}
+my $Pid = $TA->Run(["./task"], 0);
+my $OldTimeout = $TA->SetTimeout($Task->Timeout);
+if (!$Pid or !defined $TA->Wait($Pid))
+{
+  $ErrMessage = $TA->GetLastError();
+}
+$TA->SetTimeout($OldTimeout);
+
 if (defined($ErrMessage))
 {
-  $VM->CopyFileFromGuestToHost("Reconfig.log", $FullRawlogFileName);
+  $TA->GetFile("Reconfig.log", $FullRawlogFileName);
   ProcessRawlog($FullRawlogFileName, $FullLogFileName, $FullErrFileName);
   FatalError "Failure running script in VM: $ErrMessage\n",
              $FullErrFileName, $Job, $Step, $Task;
 }
 
-$ErrMessage = $VM->CopyFileFromGuestToHost("Reconfig.log", $FullRawlogFileName);
-if (defined($ErrMessage))
+if (!$TA->GetFile("Reconfig.log", $FullRawlogFileName))
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Can't copy log from VM: $ErrMessage\n", $FullErrFileName,
              $Job, $Step, $Task;
 }
+$TA->Disconnect();
+
 my $Success = ProcessRawlog($FullRawlogFileName, $FullLogFileName,
                               $FullErrFileName);
-
 if ($Success)
 {
   $ErrMessage = $VM->RemoveSnapshot($VM->IdleSnapshot);
diff --git a/testbot/bin/WineRunTask.pl b/testbot/bin/WineRunTask.pl
index 072a033..9751d3b 100755
--- a/testbot/bin/WineRunTask.pl
+++ b/testbot/bin/WineRunTask.pl
@@ -142,29 +142,6 @@ sub CountFailures
   return $Failures;
 }
 
-sub RetrieveLogFile
-{
-  my ($Job, $Step, $Task, $GuestLogFileName, $HostLogFileName) = @_;
-
-  my $VM = $Task->VM;
-  my $ErrMessage = $VM->CopyFileFromGuestToHost($GuestLogFileName,
-                                                $HostLogFileName);
-  chmod 0664, $HostLogFileName;
-  if (defined($ErrMessage) || $Step->Type ne "suite")
-  {
-    return $ErrMessage;
-  }
-
-  my $LatestNameBase = "$DataDir/latest/" . $VM->Name . "_" .
-                       ($Step->FileType eq "exe64" ? "64" : "32");
-  unlink("${LatestNameBase}.log");
-  unlink("${LatestNameBase}.err");
-  link("$DataDir/jobs/" . $Job->Id . "/" . $Step->No . "/" . $Task->No . "/log",
-       "${LatestNameBase}.log");
-
-  return undef;
-}
-
 $ENV{PATH} = "/usr/bin:/bin";
 delete $ENV{ENV};
 
@@ -223,6 +200,7 @@ mkdir "$DataDir/jobs/$JobId/$StepNo/$TaskNo";
 umask($oldumask);
 
 my $VM = $Task->VM;
+my $TA = $VM->GetAgent();
 
 LogMsg "Task $JobId/$StepNo/$TaskNo (" . $VM->Name . ") started\n";
 
@@ -248,26 +226,24 @@ if ($FileType ne "exe32" && $FileType ne "exe64")
              $FullErrFileName, $Job, $Step, $Task;
 }
 my $FileName = $Step->FileName;
-$ErrMessage = $VM->CopyFileFromHostToGuest("$StepDir/$FileName", $FileName);
-if (defined($ErrMessage))
+if (!$TA->SendFile("$StepDir/$FileName", $FileName, 0))
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Can't copy exe to VM: $ErrMessage\n",
              $FullErrFileName, $Job, $Step, $Task;
 }
 my $TestLauncher = "TestLauncher" . 
                    ($FileType eq "exe64" ? "64" : "32") .
                    ".exe";
-$ErrMessage = $VM->CopyFileFromHostToGuest("$BinDir/windows/$TestLauncher",
-                                           $TestLauncher);
-if (defined($ErrMessage))
+if (!$TA->SendFile("$BinDir/windows/$TestLauncher", $TestLauncher, 0))
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Can't copy TestLauncher to VM: $ErrMessage\n",
              $FullErrFileName, $Job, $Step, $Task;
 }
-$ErrMessage = $VM->CopyFileFromHostToGuest("$BinDir/windows/GenFixEnv.exe",
-                                           "GenFixEnv.exe");
-if (defined($ErrMessage))
+if (!$TA->SendFile("$BinDir/windows/GenFixEnv.exe", "GenFixEnv.exe", 0))
 {
+  $ErrMessage = $TA->GetLastError();
   FatalError "Can't copy GenFixEnv to VM: $ErrMessage\n",
              $FullErrFileName, $Job, $Step, $Task;
 }
@@ -316,10 +292,41 @@ elsif ($Step->Type eq "suite")
   $Script .= "-q -o $RptFileName -t $Tag -m $AdminEMail -i \"$Info\"\r\n" .
              "$FileName -q -s $RptFileName\r\n";
 }
+if (!$TA->SendFileFromString($Script, "script.bat", $TestAgent::SENDFILE_EXE))
+{
+  $ErrMessage = $TA->GetLastError();
+  FatalError "Can't send the script to VM: $ErrMessage\n",
+             $FullErrFileName, $Job, $Step, $Task;
+}
+
+my $Pid = $TA->Run(["./script.bat"], 0);
+my $OldTimeout = $TA->SetTimeout($Task->Timeout);
+if (!$Pid or !defined $TA->Wait($Pid))
+{
+  $ErrMessage = $TA->GetLastError();
+}
+$TA->SetTimeout($OldTimeout);
+
+my $LogErrMessage;
+if (!$TA->GetFile($RptFileName, $FullLogFileName))
+{
+  $LogErrMessage = $TA->GetLastError();
+}
+elsif ($Step->Type eq "suite")
+{
+  chmod 0664, $FullLogFileName;
+}
+else
+{
+  chmod 0664, $FullLogFileName;
+  my $LatestNameBase = "$DataDir/latest/" . $VM->Name . "_" .
+                       ($Step->FileType eq "exe64" ? "64" : "32");
+  unlink("${LatestNameBase}.log");
+  unlink("${LatestNameBase}.err");
+  link("$DataDir/jobs/" . $Job->Id . "/" . $Step->No . "/" . $Task->No . "/log",
+       "${LatestNameBase}.log");
+}
 
-$ErrMessage = $VM->RunScriptInGuestTimeout($Script, $Task->Timeout + 15);
-my $LogErrMessage = RetrieveLogFile $Job, $Step, $Task,
-                                    $RptFileName, $FullLogFileName;
 TakeScreenshot $VM, $FullScreenshotFileName;
 if (defined($ErrMessage))
 {
@@ -331,6 +338,7 @@ if (defined($LogErrMessage))
   FatalError "Can't copy log from VM: $LogErrMessage\n", $FullErrFileName,
              $Job, $Step, $Task;
 }
+$TA->Disconnect();
 
 $Task->Status("completed");
 $Task->ChildPid(undef);
diff --git a/testbot/lib/WineTestBot/VMs.pm b/testbot/lib/WineTestBot/VMs.pm
index 5848df7..ed3282c 100644
--- a/testbot/lib/WineTestBot/VMs.pm
+++ b/testbot/lib/WineTestBot/VMs.pm
@@ -357,7 +357,7 @@ sub PowerOff
   return $self->UpdateStatus($Domain);
 }
 
-sub _GetTunnel($)
+sub GetAgent($)
 {
   my ($self) = @_;
 
@@ -365,65 +365,16 @@ sub _GetTunnel($)
   # or autodetect the settings based on the VM's VirtURI setting.
   my $URI = $Tunnel || $self->VirtURI;
 
+  my $TunnelInfo;
   if ($URI =~ s/^(?:[a-z]+\+)?(?:ssh|libssh2):/ssh:/)
   {
     my $ParsedURI = URI->new($URI);
-
-    my %TunnelInfo;
-    %TunnelInfo = %$TunnelDefaults if ($TunnelDefaults);
-    $TunnelInfo{sshhost}  = $ParsedURI->host;
-    $TunnelInfo{sshport}  = $ParsedURI->port;
-    $TunnelInfo{username} = $ParsedURI->userinfo;
-    return \%TunnelInfo;
-  }
-
-  return undef;
-}
-
-sub WaitForToolsInGuest($$)
-{
-  my ($self, $Timeout) = @_;
-
-  my $TA = TestAgent->new($self->Hostname, $AgentPort, $self->_GetTunnel());
-  $TA->SetConnectTimeout($Timeout);
-  my $Success = $TA->Ping();
-  $TA->Disconnect();
-  return $Success ? undef : $TA->GetLastError();
-}
-
-sub CopyFileFromHostToGuest($$$)
-{
-  my ($self, $HostPathName, $GuestPathName) = @_;
-  my $TA = TestAgent->new($self->Hostname, $AgentPort, $self->_GetTunnel());
-  my $Success = $TA->SendFile($HostPathName, $GuestPathName);
-  $TA->Disconnect();
-  return $Success ? undef : $TA->GetLastError();
-}
-
-sub CopyFileFromGuestToHost($$$)
-{
-  my ($self, $GuestPathName, $HostPathName) = @_;
-  my $TA = TestAgent->new($self->Hostname, $AgentPort, $self->_GetTunnel());
-  my $Success = $TA->GetFile($GuestPathName, $HostPathName);
-  $TA->Disconnect();
-  return $Success ? undef : $TA->GetLastError();
-}
-
-sub RunScriptInGuestTimeout($$$)
-{
-  my ($self, $ScriptText, $Timeout) = @_;
-  my $TA = TestAgent->new($self->Hostname, $AgentPort, $self->_GetTunnel());
-  $TA->SetTimeout($Timeout);
-
-  my $Success;
-  if ($TA->SendFileFromString($ScriptText, "./script.bat", $TestAgent::SENDFILE_EXE))
-  {
-    my $Pid = $TA->Run(["./script.bat"], 0);
-    $Success = 1 if ($Pid and defined $TA->Wait($Pid));
-    $TA->Rm("./script.bat");
+    %$TunnelInfo = %$TunnelDefaults if ($TunnelDefaults);
+    $TunnelInfo->{sshhost}  = $ParsedURI->host;
+    $TunnelInfo->{sshport}  = $ParsedURI->port;
+    $TunnelInfo->{username} = $ParsedURI->userinfo;
   }
-  $TA->Disconnect();
-  return $Success ? undef : $TA->GetLastError();
+  return TestAgent->new($self->Hostname, $AgentPort, $TunnelInfo);
 }
 
 my %StreamData;
-- 
1.7.10.4




More information about the wine-patches mailing list