PrepareApi.ps1


Class PrepareApi : ApiClient
{
    # properties
    [string]$CloudProvisioningType
    [string]$CloudCwSecretId
    [string]$CloudDiskName
    [string]$AssetsId
    [psobject[]]$XdReconfigure
    [hashtable]$Tags
    [int]$Timeout
    [string]$Prefix
    [bool]$InstallMisa
    [bool]$ForceMisa
    [string]$InstallPvs
    [string[]]$Flags

    # Default constructor
    PrepareApi([hashtable]$values) : base ($values) {
        $this.CopyValues(
            @{
                AssetsId = @{
                    required = $False
                    default = $null
                }
                CloudProvisioningType = @{
                    required = $False
                    default = "Mcs"
                }
                CloudCwSecretId = @{
                    required = $True
                }
                CloudDiskName = @{
                    required = $True
                }
                XdReconfigure = @{
                    required = $True
                }
                Tags = @{
                    required = $False
                    default = @{}
                }
                Timeout = @{
                    required = $False
                    default = 3600
                }
                Prefix = @{
                    required = $False
                    default = "ce"
                }
                InstallMisa = @{
                    required = $False
                    default = $true
                }
                ForceMisa = @{
                    required = $False
                    default = $false
                }
                InstallPvs = @{
                    required = $False
                    default = $null
                }
                Flags = @{
                    required = $False
                    default = $null
                }
            },
            $values
        )
    }

    # POST ProcessImage
    hidden [string]PostProcessImageJob([string]$resourceLocationId, [string]$platform, [hashtable]$platformPrepareData)
    {
        # Get the URL to use
        $url = $this.BuildUrl("images/`$prepare", $True)

        LogIt "Creating $platform $($this.CloudProvisioningType) prepare job URL: $url on connector $resourceLocationId"

        $this.AddDefaultTags($this.Tags)

        # Create a jobData object
        $prepareData = @{
            platform = $platform
            provisioningType = $this.CloudProvisioningType
            platformCredentialId = $this.CloudCwSecretId
            resourceLocationId = $resourceLocationId
            XdReconfigure = $this.XdReconfigure
            tags = $this.Tags
            timeoutInSeconds = $this.Timeout
            prefix = $this.Prefix
        }
        if ($this.AssetsId)
        {
            $prepareData['assetsId'] = $this.AssetsId
        }
        if ($this.CloudProvisioningType -eq "Pvs")
        {
            if ($this.InstallPvs)
            {
                $prepareData['installPvs'] = $this.InstallPvs
            }
            $prepareData['installMisa'] = $false
            $prepareData['forceMisa'] = $false
        }
        elseif ($this.CloudProvisioningType -eq "Mcs")
        {
            $prepareData['installMisa'] = $this.InstallMisa
            $prepareData['forceMisa'] = $this.ForceMisa
        }
        if ($this.Flags)
        {
            $prepareData['flags'] = $this.Flags
        }

         # Convert the object to JSON to use in the POST body (Note: Default depth is 2 when serializing)
        $json = ($prepareData + $platformPrepareData) | ConvertTo-Json -Depth 10
        LogIt "$platform $($this.CloudProvisioningType) prepare POST $url -> $json" $False

        # Send the POST
        try {
            $response = $this.Post($url, $json)
            $jobId = $response.id    
            return $jobId    
        } catch {
            throw "Failed to start $platform prepare: $_"
        }
    }
}

Function New-PrepareClient([hashtable]$values) {
    $platform = $values.CloudPlatform

    if ($platform -eq "azure") {
        return [AzurePrepareApi]::New($values)
    } elseif ($platform -eq "gcp") {
        return [GcpPrepareApi]::New($values)
    } else {
        throw "Unable to create PrepareClient. Invalid CloudPlatform specified '$platform'."
    }
}