Blog Post

Azure Stack Blog
7 MIN READ

VMFleet 2.0 - Quick Start Guide

yijason's avatar
yijason
Former Employee
Oct 07, 2021

Written by Jason Yi, PM on the Azure Edge & Platform team at Microsoft. 

 

Introduction

As we introduce the new generation VMFleet, we also want to provide a quick how to guide to help you quickly get started! Today we will cover 2 paths you can take: using the traditional and customized VMFleet test vs using the new pre-defined workload profile. Let’s dive in.

 

From Setup to Start-FleetSweep

This is the traditional path of setting up VMFleet and running it using your desired DiskSpd parameters/flags.

 

Prerequisites

Before we begin setting up VMFleet, there are a few prerequisites that you should have ready.

  • Ensure that you have 1 CSV per node
    • Within Storage Spaces Direct, CPU usage is based on the host. Therefore, it is recommended that you split the storage load by creating as many CSVs as there are host nodes. We can go ahead and create a CSV per node in the cluster.
    • You may run the following:

 

Get-ClusterNode |% {
    New-Volume -StoragePoolFriendlyName S2D* -FriendlyName $_ -FileSystem CSVFS_ReFS -Size <DESIRED SIZE>
}

 

  • Ensure that you create a “collect” volume.
    • You may run the following:

 

New-Volume -StoragePoolFriendlyName S2D* -FriendlyName collect -FileSystem CSVFS_ReFS -Size 200GB

 

  • If you have ran VMFleet in the past, please ensure that prior VMFleet directories are completely removed from existing volumes.
  • Retrieve or install a Server Core VHDX file. If you do not have one handy, we can create a new one by following the below instructions.
    • Download WS2019 Server Core ISO from the public website.
    • Open Hyper-V Manager.
    • Click “New”, then “Virtual Machine”.
    • Navigate through the prompts and pick a location to store your VM.
    • Once your VM is created, boot up the VM and follow the instructions. This is where you will decide your VM password, or what we will later call, “adminpass”.
      • This is important as we will use this later, so make sure you write this down.
    • Log out of the VM, and navigate to where you stored your VM. You should find a “Virtual Hard Disks” folder. Inside, you should find your new Server Core VHDX file.
    • Rename it to “Gold.vhdx”.
    • Copy or move the file to the cluster environment that you want to run VMFleet in.
    • Done!

Deployment

  1. First, we need to install the new PowerShell Module from the PowerShell Gallery and then load it into our terminal. Run the following:

 

Install-Module -Name “VMFleet”
Import-Module VMFleet

 

  • Sanity Check:
    • Run "Get-Module VMFleet" to confirm the module exists.
    • Run "Get-Command -Module VMFleet" to obtain a list of functions included in the module.
  1. We will now set up the directory structure within the “Collect” CSV created earlier. Run "Install-Fleet"
  • This creates the necessary VMFleet directories which include:
    1.  Collect/control
      • Contains the scripts that the Virtual Machines continuously monitor.
      • Control.ps1: the control script the VMs use to implement the control loop (what used to be called “master.ps1”).
      • Run.ps1: The VMs continuously look for the most recent version of run.ps1 and runs the newly updated script (parameters).
    2.  Collect/flag
      • Location where the control script drops the “go”, “pause”, and “done” flag files. Users should not need to look at these files.
    3. Collect/result
      • Location of the output files from the VMFleet test run.
    4.  Collect/tools
      • DiskSpd will be preinstalled in this folder.
  • Note: Please move the VHDX file into this collect folder. CSV Cache is also turned off by default.
  1. We will now create our “fleet” of VMs by running:

 

New-Fleet -basevhd <PATH TO VHDX> -vms [ENTER_NUM_VMS] -adminpass [ENTER_ADMINPASS] -connectuser [ENTER_NODE_USER] -connectpass [ENTER_NODE_PASS]

 

  • "adminpass" is the administrator password for the Server Core Image. This is the password you set on your Virtual Machine earlier.
  • "connectuser" is a domain account with access to the cluster.
  • "connectpass " is the password for the above domain account.
  • "vms" is the number of VM's to create per node.
    • If this parameter is not provided, the default is a 1:1 subscription ratio where the Number of VMs = Number of physical cores.
  1. [Optional] You can consider modifying the VM hardware configuration. Run

 

Set-Fleet -ProcessorCount 1 -MemoryStartupBytes 2gb -MemoryMaximumBytes 2gb -MemoryMinimumBytes 2gb

 

Note:

  • If you specify “MemoryMaximumBytes”, you must specify “MemoryMinimumBytes”, which implies that your VMs will have dynamic memory.
  • If you omit “MemoryMaximumBytes” or “MemoryMinimumBytes”, it implies that your VMs will have static memory.
    • If MemoryStartupBytes = MemoryMinimumBytes = MemoryMaximumBytes, that also denotes static memory.
  • “MemoryStartupBytes” is a mandatory parameter.
  • It is recommended that the number of vCPUs should not exceed the number of logical processors. If you would like more information, refer to this: Understanding and using Hyper-V hypervisor scheduler types | Microsoft Docs

Start Running VMFleet!

  1. Open 2 PowerShell terminals. In the first one, run Watch-Cluster and in the second one, run Start-Fleet. This second function will turn on all the VMs in a “paused” state.
  2. At this point you can run Start-FleetSweep [ENTER_PARAMETERS] or take this time to explore and run any of the other functions!
    • Here is a sample sweep command to help you get started: "Start-FleetSweep -b 4 -t 8 -o 8 -w 0 -d 300 -p r"
  3. Done!

Aftermath

Once you are done running VMFleet you can run Stop-Fleet to shut down all the virtual machines or run Remove-Fleet to completely delete all the virtual machines on your environment.

 

From Setup to Measure-FleetCoreWorkload

This is a new workflow for setting up VMFleet and the predefined profile workloads (General, Peak, VDI, SQL).

 

Prerequisites

Before we begin setting up VMFleet, there are a few prerequisites that you should have ready.

  • Ensure that you have 1 CSV per node
    • Within Storage Spaces Direct, CPU usage is based on the host. Therefore, it is recommended that you split the storage load by creating as many CSVs as there are host nodes. We can go ahead and create a CSV per node in the cluster.
    • In order to be precise about the CSV size, please use our new VMFleet command: "Get-FleetVolumeEstimate"
      • This will output a prescribed CSV size based on different resiliency types. We recommend you select a 2-way mirrored value or 3-way mirrored value depending on your node count.
  • You may run the following: (use the CSV size from Get-FleetVolumeEstimate)

 

Get-ClusterNode |% {
    New-Volume -StoragePoolFriendlyName S2D* -FriendlyName $_ -FileSystem CSVFS_ReFS -Size <DESIRED SIZE>
}

 

  • Ensure that you create a “collect” volume.
    • You may run the following:

 

New-Volume -StoragePoolFriendlyName S2D* -FriendlyName collect -FileSystem CSVFS_ReFS -Size 200GB

 

  • If you have ran VMFleet in the past, please ensure that prior VMFleet directories are completely removed from existing volumes.
  • Retrieve or install a Server Core VHDX file. If you do not have one handy, we can create a new one by following the below instructions.
    • Download WS2019 Server Core ISO from the public website.
    • Open Hyper-V Manager.
    • Click “New”, then “Virtual Machine”.
    • Navigate through the prompts and pick a location to store your VM.
    • Once your VM is created, boot up the VM and follow the instructions. This is where you will decide your VM password, or what we will later call, “adminpass”.
      • This is important as we will use this later, so make sure you write this down.
    • Log out of the VM, and navigate to where you stored your VM. You should find a “Virtual Hard Disks” folder. Inside, you should find your new Server Core VHDX file.
    • Rename it to “Gold.vhdx”.
    • Copy or move the file to the cluster environment that you want to run VMFleet in.
    • Done!

Deployment

  1. Let’s begin deploying VMFleet. First, we need to install the new PowerShell Module from the PowerShell Gallery and then load it into the terminal. Run the following:

 

Install-Module -Name “VMFleet”
Import-Module VMFleet

 

 

  • Sanity Check:
    • Run "Get-Module VMFleet" to confirm the module exists.
    • Run "Get-Command -Module VMFleet" to obtain a list of commands included in the module.

     2. We will now set up the directory structure within the “Collect” CSV that we created earlier. Run "Install-Fleet"

  • This creates the necessary VMFleet directories which include:

     3. We will now create our “fleet” of VMs by running:

 

New-Fleet -basevhd <PATH TO VHDX> -adminpass [ENTER_ADMINPASS] -connectuser [ENTER_NODE_USER] -connectpass [ENTER_NODE_PASS]

 

  • "adminpass" is the administrator password for the Server Core Image. This is the password you set on your Virtual Machine earlier.
  • "connectuser" is a domain account with access to the cluster.
  • "connectpass " is the password for the above domain account.
  • "vms" is the number of VM's to create per node.
    • Please do not provide this parameter, we will use our default subscription ratio of 1:1. Number of VMs = Number of physical cores.

     4. Measure-FleetCoreWorkload also collects diagnostic data (Get-SDDCDiagnosticInfo). Therefore, before running the command, we must also install the NuGet Package if you have not previously done so. In doing so, we also need to temporairly set the PSGallery as a trusted repository source (Note: This will temporarily relax the security boundary). 

 

$repo = Get-PSRepository -Name PSGallery
if ($null -eq $repo) { Write-Host "The PSGallery is not configured on this system, please address this before continuing" }
else {
    if ($repo.InstallationPolicy -ne 'Trusted') {
        Write-Host "Setting the PSGallery repository to Trusted, original InstallationPolicy: $($repo.InstallationPolicy)"
        Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
    } 

    ### Installing the pre-requisite modules

    Install-PackageProvider NuGet -Force
    Install-Module -Name PrivateCloud.DiagnosticInfo -Force
    Install-Module -Name MSFT.Network.Diag -Force

    if ($repo.InstallationPolicy -ne 'Trusted') {
        Write-Host "Resetting the PSGallery repository to $($repo.InstallationPolicy)"
        Set-PSRepository -Name PSGallery -InstallationPolicy $repo.InstallationPolicy
    } 
}  

 

Run Measure-FleetCoreWorkload!

     5. We can now run Measure-FleetCoreWorkload. Running the command below will automatically run all 4 workloads (General, Peak, VDI, SQL) and place the individual outputs in the result directory. IMPORTANT: If you plan on running another test, please clear the result directory.

 

Measure-FleetCoreWorkload

 

     6. Congratulations! You’re done! All you need to do is wait for the test to complete.

  • Note: If you ever run into an error and need to rerun Measure-FleetCoreWorkload, don’t be afraid to do so! It is smart enough to pick up from where it last stopped and continue the test without starting from scratch.
Updated Jun 27, 2022
Version 2.0

15 Comments

  • MaxLotte's avatar
    MaxLotte
    Copper Contributor

    Hello all,

     

    I have the exact same issue as you Thomas555 

    Did you find a way around it ? I'll keep searching in the meantime.

    Thanks,

    Max.

  • Thomas555's avatar
    Thomas555
    Copper Contributor

    Hello all,

     

    if I want to start the fleet with the command Start-FleetSweep -b 4 -t 8 -o 8 -w 0 -d 300 -p r

    I get this issue in Powershell - what can I do ?

     

    PS C:\Windows\system32> Start-FleetSweep -b 4 -t 8 -o 8 -w 0 -d 300 -p r
    --------------------
    2022-01-05T08:52:37: RUN PARAMETERS
    2022-01-05T08:52:37: o = 8
    2022-01-05T08:52:37: d = 300
    2022-01-05T08:52:37: AddSpec =
    2022-01-05T08:52:37: p = r
    2022-01-05T08:52:37: b = 4
    2022-01-05T08:52:37: t = 8
    2022-01-05T08:52:37: w = 0
    2022-01-05T08:52:37: Cool = 30
    2022-01-05T08:52:37: Warm = 60
    2022-01-05T08:52:37: iops = $null
    2022-01-05T08:52:49: START Go Epoch: 1
    2022-01-05T08:52:49: CLEAR pause at Go
    2022-01-05T08:52:49: SLEEP TO RUN CHECK (19,96 seconds)
    2022-01-05T08:53:09: RUN CHECK Go Epoch: 1
    GetDoneFlags : Cannot bind argument to parameter 'VM' because it is an empty array.
    At C:\Program Files\WindowsPowerShell\Modules\VMFleet\2.0.2.1\VMFleet.psm1:5279
    char:82
    + ... (GetDoneFlags -DonePath $donePath -GoEpoch $goepoch -VM $vms -Assert ...
    + ~~~~
    + CategoryInfo : InvalidData: (:) [GetDoneFlags], ParentContainsErrorRe
    cordException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyArrayNotAllowed,G
    etDoneFlags

     

    Also I get an issue while creating the VMS:

     

    PS C:\Windows\system32> New-Fleet -basevhd C:\ClusterStorage\Volume02TWM\VirtualMachines\Gold.vhdx -vms 30 -adminpass '123456' -connectuser username -connectpass password
    HOST1: Cannot connect to CIM server. WinRM cannot process the request. The following error with errorcode
    0x8009030e occurred while using Kerberos authentication: A specified logon session does not exist. It may already
    have been terminated.
    Possible causes are:
    -The user name or password specified are invalid.
    -Kerberos is used when no authentication method and no user name are specified.
    -Kerberos accepts domain user names, but not local user names.
    -The Service Principal Name (SPN) for the remote computer name and port does not exist.
    -The client and remote computers are in different domains and there is no trust between the two domains.
    After checking for the above issues, try the following:
    -Check the Event Viewer for events related to authentication.
    -Change the authentication method; add the destination computer to the WinRM TrustedHosts configuration setting
    or use HTTPS transport.
    Note that computers in the TrustedHosts list might not be authenticated.
    -For more information about WinRM configuration, run the following command: winrm help config.
    + CategoryInfo : ResourceUnavailable: (MSFT_Volume:String) [Get-Volume], CimJobException
    + FullyQualifiedErrorId : CimJob_BrokenCimSession,Get-Volume
    + PSComputerName : HOST2

     

    I tried alot to solve this but it seems the script cant deploy the VMS on my second host. 

    • I tested commands like "Get-NetAdapter -CimSession Host2" - was successfully 

    or 

    • Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value 'Host1.domain.lab,Host2.domain.lab,Cluster.domain.lab'

    or a simple remot PS:

    • Enter-PSSession -ComputerName Host2 -Credential $cred - it also successfully.
    • This command also work: [Host2]: PS C:\Users\admtl\Documents> Get-Volume
    • I checked if I logged in on both with the same domain account and both Host are correctly memeber of my domain. (nltest /sc_query:domain.lab)
    • Firewall is disabled. 

     

    What can I to here also ?

     

  • jakkals's avatar
    jakkals
    Copper Contributor

    10000 likes man! Worked like a charm! Thank you!

  • Alex_Korolev's avatar
    Alex_Korolev
    Copper Contributor

    jakkals To fix that, delete your gold image from tools after VM creation, becouse you are copy L:\tools\* inside of your VM while fleet startup

  • jakkals's avatar
    jakkals
    Copper Contributor

    Hi Jason,

     

    Thanks for this post. Really detailed. 

     

    I'm having some issues getting my "fleet" to execute a sweep. I have rebuilt my fleet about 10 times, each time with a new "gold" Server Core image.

     

    All my VM's start perfectly when I execute start-vmfleet and then they get looping with with a PowerShell window reading "Launching C:\run\control.ps1 @ [Whatever date/time]" ("Paused" state if I understand the deployment correctly)

     

    Regardless what I try then to get a sweep to execute like:

     

    Start-FleetSweep -b 4 -t 8 -o 8 -w 0 -d 300 -p r

    OR

    $profile = Get-FleetProfileXml -Name "General" -Warmup 30 -Duration 60 -Cooldown 30 -WriteRatio 30 -BlockSize 8

    Start-FleetResultRun -ProfileXml $profile

    OR

    Measure-FleetCoreWorkload

     

    Nothing happens in the VM. They all just keep looping on the control.ps1. They never execute the run.ps1 or sweep.ps1. 

     

    I can confirm that the drive mapping to \\169.254.1.1 works and that I can browse the L: from the VM's.

     

    I can't figure out why they are not executing the remaining steps as from looking at the control.ps1 its supposed to look for "new" files and then execute them; which is not happening.

     

    VMFleet 2.0.0.1

    Windows Server 2019 DC (3 node Dell R740xd HCI)

    Windows Server Standard Core VM's (144 count)

     

    Have also tried different hosts. They all have the same symptoms.

     

    Any help?

    Thanks

    Jacques

     

    Control window output:

    PS C:\Windows\system32> Start-FleetSweep -b 4 -t 8 -o 8 -w 0 -d 300 -p r
    --------------------
    2021-11-05T08:25:52: RUN PARAMETERS
    2021-11-05T08:25:52: o = 8
    2021-11-05T08:25:52: d = 300
    2021-11-05T08:25:52: AddSpec =
    2021-11-05T08:25:52: p = r
    2021-11-05T08:25:52: b = 4
    2021-11-05T08:25:52: t = 8
    2021-11-05T08:25:52: w = 0
    2021-11-05T08:25:52: Cool = 30
    2021-11-05T08:25:52: Warm = 60
    2021-11-05T08:25:52: iops = $null
    2021-11-05T08:25:53: START Go Epoch: 1
    2021-11-05T08:25:53: CLEAR pause at Go
    2021-11-05T08:25:53: SLEEP TO RUN CHECK (19,98 seconds)
    2021-11-05T08:26:13: RUN CHECK Go Epoch: 1
    2021-11-05T08:26:13: RUN CHECK 1 : 0/144 done (0,02s, total 0,02s)
    2021-11-05T08:26:13: RUN CHECK PASS Go Epoch: 1
    2021-11-05T08:26:13: SLEEP TO END (369,95 seconds)
    2021-11-05T08:32:23: COMPLETION CHECK 1 : 0/144 done (0,02s, total 0,02s)
    2021-11-05T08:32:25: COMPLETION CHECK 2 : 0/144 done (0,00s, total 2,02s)
    2021-11-05T08:32:27: COMPLETION CHECK 3 : 0/144 done (0,02s, total 4,06s)
    2021-11-05T08:32:29: COMPLETION CHECK 4 : 0/144 done (0,00s, total 6,08s)
    2021-11-05T08:32:31: COMPLETION CHECK 5 : 0/144 done (0,03s, total 8,13s)
    2021-11-05T08:32:33: COMPLETION CHECK 6 : 0/144 done (0,02s, total 10,16s)
    2021-11-05T08:32:35: COMPLETION CHECK 7 : 0/144 done (0,02s, total 12,17s)
    2021-11-05T08:32:37: COMPLETION CHECK 8 : 0/144 done (0,02s, total 14,20s)
    2021-11-05T08:32:39: COMPLETION CHECK 9 : 0/144 done (0,00s, total 16,22s)
    2021-11-05T08:32:41: COMPLETION CHECK 10 : 0/144 done (0,00s, total 18,24s)
    2021-11-05T08:32:43: COMPLETION CHECK 11 : 0/144 done (0,02s, total 20,27s)
    2021-11-05T08:32:45: COMPLETION CHECK 12 : 0/144 done (0,02s, total 22,30s)
    2021-11-05T08:32:47: COMPLETION CHECK 13 : 0/144 done (0,02s, total 24,31s)
    2021-11-05T08:32:49: COMPLETION CHECK 14 : 0/144 done (0,00s, total 26,33s)
    2021-11-05T08:32:51: COMPLETION CHECK 15 : 0/144 done (0,00s, total 28,34s)
    2021-11-05T08:32:53: COMPLETION CHECK 16 : 0/144 done (0,00s, total 30,36s)
    2021-11-05T08:32:55: COMPLETION CHECK 17 : 0/144 done (0,00s, total 32,38s)
    2021-11-05T08:32:57: COMPLETION CHECK 18 : 0/144 done (0,02s, total 34,41s)
    2021-11-05T08:32:59: COMPLETION CHECK 19 : 0/144 done (0,00s, total 36,42s)
    2021-11-05T08:33:01: COMPLETION CHECK 20 : 0/144 done (0,00s, total 38,45s)
    2021-11-05T08:33:03: COMPLETION CHECK 21 : 0/144 done (0,00s, total 40,49s)
    2021-11-05T08:33:05: COMPLETION CHECK 22 : 0/144 done (0,00s, total 42,50s)
    2021-11-05T08:33:07: COMPLETION CHECK 23 : 0/144 done (0,02s, total 44,53s)
    2021-11-05T08:33:09: COMPLETION CHECK 24 : 0/144 done (0,00s, total 46,55s)
    2021-11-05T08:33:11: COMPLETION CHECK 25 : 0/144 done (0,00s, total 48,58s)
    2021-11-05T08:33:13: COMPLETION CHECK 26 : 0/144 done (0,02s, total 50,61s)
    2021-11-05T08:33:15: COMPLETION CHECK 27 : 0/144 done (0,02s, total 52,64s)
    2021-11-05T08:33:17: COMPLETION CHECK 28 : 0/144 done (0,02s, total 54,66s)
    2021-11-05T08:33:19: COMPLETION CHECK 29 : 0/144 done (0,02s, total 56,69s)
    2021-11-05T08:33:21: COMPLETION CHECK 30 : 0/144 done (0,00s, total 58,71s)
    2021-11-05T08:33:23: COMPLETION CHECK 31 : 0/144 done (0,02s, total 60,75s)
    2021-11-05T08:33:25: COMPLETION CHECK 32 : 0/144 done (0,00s, total 62,77s)
    2021-11-05T08:33:27: COMPLETION CHECK 33 : 0/144 done (0,02s, total 64,82s)
    2021-11-05T08:33:29: COMPLETION CHECK 34 : 0/144 done (0,02s, total 66,85s)
    2021-11-05T08:33:32: COMPLETION CHECK 35 : 0/144 done (0,02s, total 68,88s)
    2021-11-05T08:33:34: COMPLETION CHECK 36 : 0/144 done (0,00s, total 70,89s)
    2021-11-05T08:33:36: COMPLETION CHECK 37 : 0/144 done (0,02s, total 72,93s)
    2021-11-05T08:33:38: COMPLETION CHECK 38 : 0/144 done (0,02s, total 74,96s)
    2021-11-05T08:33:40: COMPLETION CHECK 39 : 0/144 done (0,00s, total 76,97s)
    2021-11-05T08:33:42: COMPLETION CHECK 40 : 0/144 done (0,00s, total 78,99s)
    2021-11-05T08:33:44: COMPLETION CHECK 41 : 0/144 done (0,02s, total 81,02s)
    2021-11-05T08:33:46: COMPLETION CHECK 42 : 0/144 done (0,02s, total 83,05s)
    2021-11-05T08:33:48: COMPLETION CHECK 43 : 0/144 done (0,00s, total 85,07s)
    2021-11-05T08:33:50: COMPLETION CHECK 44 : 0/144 done (0,00s, total 87,10s)
    2021-11-05T08:33:52: COMPLETION CHECK 45 : 0/144 done (0,02s, total 89,15s)
    2021-11-05T08:33:54: COMPLETION CHECK 46 : 0/144 done (0,02s, total 91,16s)
    2021-11-05T08:33:56: COMPLETION CHECK 47 : 0/144 done (0,00s, total 93,16s)
    2021-11-05T08:33:58: COMPLETION CHECK 48 : 0/144 done (0,00s, total 95,19s)
    2021-11-05T08:34:00: COMPLETION CHECK 49 : 0/144 done (0,00s, total 97,21s)
    2021-11-05T08:34:02: COMPLETION CHECK 50 : 0/144 done (0,00s, total 99,24s)
    2021-11-05T08:34:04: COMPLETION CHECK 51 : 0/144 done (0,00s, total 101,25s)
    2021-11-05T08:34:06: COMPLETION CHECK 52 : 0/144 done (0,02s, total 103,30s)
    2021-11-05T08:34:08: COMPLETION CHECK 53 : 0/144 done (0,02s, total 105,33s)
    2021-11-05T08:34:10: COMPLETION CHECK 54 : 0/144 done (0,02s, total 107,35s)
    2021-11-05T08:34:12: COMPLETION CHECK 55 : 0/144 done (0,02s, total 109,38s)
    2021-11-05T08:34:14: COMPLETION CHECK 56 : 0/144 done (0,00s, total 111,40s)
    2021-11-05T08:34:16: COMPLETION CHECK 57 : 0/144 done (0,00s, total 113,41s)
    2021-11-05T08:34:18: COMPLETION CHECK 58 : 0/144 done (0,02s, total 115,46s)
    2021-11-05T08:34:20: COMPLETION CHECK 59 : 0/144 done (0,00s, total 117,47s)
    2021-11-05T08:34:22: COMPLETION CHECK 60 : 0/144 done (0,00s, total 119,49s)
    2021-11-05T08:34:24: COMPLETION CHECK 61 : 0/144 done (0,00s, total 121,51s)
    2021-11-05T08:34:24: ABORT: only received 0/144 completions in 61 attempts
    Load did not fully complete, please check profile and virtual machines for errors
    At C:\Program Files\WindowsPowerShell\Modules\VMFleet\2.0.0.1\VMFleet.psm1:4993 char:13
    + throw "Load did not fully complete, please check profile ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : OperationStopped: (Load did not fu...ines for errors:String) [], RuntimeException
    + FullyQualifiedErrorId : Load did not fully complete, please check profile and virtual machines for errors