vmware / PowerCLI-Example-Scripts

http://blogs.vmware.com/powercli
Other
757 stars 603 forks source link

New-HVPool: Errors when source JSON file has null values for maxNumberOfMonitors and maxResolutionOfAnyOneMonitor #483

Open chriskoch99 opened 3 years ago

chriskoch99 commented 3 years ago

Scenario: Exporting pool settings from a desktop pool in one pod, for use in creating a replica pool in another pod.

Source pool is Automated, Instant Clone, Blast protocol only. No PCoIP.

Exported JSON file has the following:

 "PcoipDisplaySettings":  {
                                                                                         "Renderer3D":  "MANAGE_BY_VSPHERE_CLIENT",
                                                                                         "EnableGRIDvGPUs":  false,
                                                                                         "VGPUGridProfile":  null,
                                                                                         "VRamSizeMB":  null,
                                                                                         "VRamSizeKB":  null,
                                                                                         "MaxNumberOfMonitors":  null,
                                                                                         "MaxResolutionOfAnyOneMonitor":  null
                                                                                     }

Using New-HVPool with the JSON file as input for the -spec option, I get the following:

The variable cannot be validated because the value 0 is not a valid value for the maxNumberOfMonitors variable.
At C:\Users\chriskoch99\Documents\WindowsPowerShell\Modules\VMware.Hv.Helper\VMware.HV.Helper.psm1:4536 char:17
+ ...             $maxNumberOfMonitors = $jsonObject.DesktopSettings.displa ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ValidationMetadataException
    + FullyQualifiedErrorId : ValidateSetFailure

The variable cannot be validated because the value  is not a valid value for the maxResolutionOfAnyOneMonitor variable.
At C:\Users\chriskoch99\Documents\WindowsPowerShell\Modules\VMware.Hv.Helper\VMware.HV.Helper.psm1:4537 char:17
+ ...             $maxResolutionOfAnyOneMonitor = $jsonObject.DesktopSettin ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ValidationMetadataException
    + FullyQualifiedErrorId : ValidateSetFailure

This is because null values are not included in the ValidateSet for the $maxNumberOfMonitors and $maxResolutionOfAnyOneMonitor variables as defined at the beginning of the script, and the if ($null -ne $jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings) section doesn't code around the possibility of null values for Blast-only pools.

To resolve this, I have modified the following:

                $maxNumberOfMonitors = $jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings.maxNumberOfMonitors
                $maxResolutionOfAnyOneMonitor = $jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings.maxResolutionOfAnyOneMonitor

to the following:

                If ($jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings.maxNumberOfMonitors) {
                 $maxNumberOfMonitors = $jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings.maxNumberOfMonitors
                }
                If ($jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings.maxResolutionOfAnyOneMonitor) {
                 $maxResolutionOfAnyOneMonitor = $jsonObject.DesktopSettings.displayProtocolSettings.pcoipDisplaySettings.maxResolutionOfAnyOneMonitor
                }

This seems to work. For Blast only pools, the values of these settings when you export them will generally be null, and the function should allow for this.

Thoughts?

get-calvus commented 2 years ago

Hey Chris, I have the same error, but with the MaxResolutionOfAnyOneMonitor setting as well. My question is, where exactly did you put in your fix? In the json or in the ps1?

chriskoch99 commented 2 years ago

This was a direct edit to the New-HVPool function in VMware.HV.Helper.psm1. See my last two code blocks above for the specific change. Should be able to search for the original lines in VMware.HV.Helper.psm1 to find the spot.

get-calvus commented 2 years ago

Thanks! I'll give that a try.