How to find whether lab environment is in healthy state or not?


MTM provides ability to see all the environments across your lab and one of the thing it shows is whether the environment is healthy or not. By healthy, I mean whether machines in the environment are ready to run tests or are ready to deploy an application or not. Yesterday one of our customer mentioned that she wants to find this out programmatically. So in this blog, I am sharing how to do that programmatically.

  • Login to a machine with tfs object model installed. (The tfs object model gets installed with VS, MTM, Tfs, test controller etc)
  • Open notepad, copy paste the following script and change the highlighted variables as per your setup/deployment.
  • Open a power-shell command prompt and run the modified power-shell script.
  • It should show whether your environment is healthy or not. 

Enjoy !!

(Update: 18/6/2014 Jason Van Eaton, an internal customer pointed out a bug in the post where he correctly mentioned that I am checking for NotReady state twice and am not checking for Offline state. Fixed it now.)

# Define parameters
$tfsCollectionUrl = New-Object System.URI("
http://myserver/tfs/defaultcollection");
$projectName = "myProject";
$environmentName = "myEnvironment";

# Load Client Assembly
[Reflection.Assembly]::Load(“Microsoft.TeamFoundation.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”);
[Reflection.Assembly]::Load(“Microsoft.TeamFoundation.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”);
[Reflection.Assembly]::Load(“Microsoft.TeamFoundation.Lab.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”);
[Reflection.Assembly]::Load(“Microsoft.TeamFoundation.Lab.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”);  

# Connect to tfs
$tfsCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($tfsCollectionUrl);
$labService = $tfsCollection.GetService([Microsoft.TeamFoundation.Lab.Client.LabService]);

# Query for environments
$labEnvironmentQuerySpec = New-Object Microsoft.TeamFoundation.Lab.Client.LabEnvironmentQuerySpec;
$labEnvironmentQuerySpec.Project = $projectName;
$labEnvironmentQuerySpec.Disposition = [Microsoft.TeamFoundation.Lab.Client.LabEnvironmentDisposition]::Active;

$labEnvironments = $labService.QueryLabEnvironments($labEnvironmentQuerySpec);
foreach ($environment in $labEnvironments)
{
   $envName = $environment.Name;
   if ($envName -eq $environmentName)
   {
      foreach ($labSystem in $environment.LabSystems)
      {
         if ($labSystem.State -eq [Microsoft.TeamFoundation.Lab.Client.TestMachineState]::NotReady -Or $labSystem.State -eq [Microsoft.TeamFoundation.Lab.Client.TestMachineState]::Offline)
         {
            Write-Host $envName -> $labSystem.DisplayName -> $labSystem.State -> UnHealthy;
         }
         else
         {
            Write-Host $envName -> $labSystem.DisplayName -> $labSystem.State -> Healthy;
         }

      }
   }
}

Comments (7)

  1. Anonymous says:

    Thanks so much Aseem for taking out time and helping. You were really quick. Would have taken long for me as I am new with MTM.

    Could you please point to me articles where I can start reading on MTM and get good hands on.?

  2. You might also want to go through this link for understanding Lab Management flows in MTM.

    msdn.microsoft.com/…/dd997438(v=vs.110).aspx

    Regards

    Aseem Bansal

  3. Anonymous says:

    Thanks Aseem, Yes, the code you provided worked for me.

    I was writing a powershell script to use tcm.exe to run tests on multiple suites, configuration and multiple locales. I was trying to find a way to check on env issue and your script helped.

    I will go through the links you have suggested. Thanks again.

    I am not able to rate this article. Would like to give 5 star. Do I need to be member to rate this?

  4. Good to know this that it helped, Geetika. To rate it, yes you should login.

    Regards

    Aseem Bansal

  5. Geetika Bangard says:

    Hi Aseem,

    I have a different question. I am running around 4000 test cases at same time.

    Although an env has more than 1 test agents(2 or 3), I see that tests are running sequentially.

    Under controller in MTM, for every agent, I see Load distribution as 100. Does that mean only if tests queued more than 100, it will be taken by next agent?

    I am trying to look for way that the tests are run in parallel and not taking 10 hours 🙁

    Thanks for helping,

    Geetika

  6. Geetika the load distribution indicates the #tests assigned per agent at a given point of time. So if you have 4000 test cases and 4 agents each agent will get a set of 100 tests to execute. Once it completes execution of these it will be assigned the next 100. You can tweak this value in the bucket size parameter in your testsettings.