Start-IpsVsphereExportJob.ps1
<# .Synopsis Implement an image export job. .Description Implement an image export job. This function supports exporting image from Vsphere platform to disk on SMB file share server. #> Function Start-IpsVsphereExportJob { [CmdletBinding(DefaultParameterSetName = 'cmd')] Param( [Parameter(Mandatory = $true, ParameterSetName = 'file')] [obsolete("Use command-line arguments as input of configuration data.")] [string]$ConfigJsonFile, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$CustomerId, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$SmbHost, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$SmbPort = $null, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$SmbShare, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$SmbPath, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$SmbDiskName, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$SmbDiskFormat = "VhdDiskFormat", [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$SmbCwId, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$Deployment, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$ResourceLocationId, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$VsphereCwSecretId, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$VsphereHost, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$VspherePort, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$VsphereSslCaCertificate, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$VCenterSslFingerprint, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [bool]$VsphereSslNoCheckHostname, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$VsphereDataCenter, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$VsphereDataStore, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$VsphereResourcePool = "Resources", [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$VsphereNetwork, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$SourceDiskName, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$AssetsId, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [psobject]$Tags = [PSCustomObject]@{}, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [int]$Timeout = 7200, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$Prefix = "ce", [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string[]]$Flags, [Parameter(Mandatory = $false)] [string]$SecureClientId = '', [Parameter(Mandatory = $false)] [string]$SecureSecret = '', [Parameter(Mandatory = $false)] [string]$LogFileName = 'ExportVsphereToSmb.log', [Parameter(Mandatory = $false)] [switch]$Force ) Begin { Add-PSSnapin Citrix.* } Process { # Initialize Logger # Set parameter 'Verbose' by internal parameter 'VerbosePreference', since the option -Verbose is occupied by powershell cmdlet if($VerbosePreference -eq 'Continue') { $Verbose = $True } else { $Verbose = $False } LogInit $LogFileName $Force $Verbose # Initialize config data if ($PSCmdlet.ParameterSetName -eq 'file') { LogIt "Loading config from $ConfigJsonFile" $configData = Get-Content -Raw -Path $ConfigJsonFile | ConvertFrom-Json LogIt "Config: $configData" $False $CustomerId = $configData.CustomerId $SmbHost = $configData.ExportSmb.Host $SmbPort = $configData.ExportSmb.Port $SmbShare = $configData.ExportSmb.Share $SmbPath = $configData.ExportSmb.Path $SmbDiskName = $configData.ExportSmb.DiskName $SmbDiskFormat = $configData.ExportSmb.DiskFormat if([String]::IsNullOrWhiteSpace($SmbDiskFormat)) { $SmbDiskFormat = "VhdDiskFormat" } $SmbCwId = $configData.ExportSmb.CwId $Deployment = $configData.Deployment if($configData.psobject.Properties.name -contains "ExportResourceLocationId") { $ResourceLocationId = $configData.ExportResourceLocationId } else { $ResourceLocationId = $configData.ResourceLocationId } $VsphereCwSecretId = $configData.VsphereCwSecretId $VsphereHost = $configData.VsphereHost if([String]::IsNullOrWhiteSpace($configData.VspherePort)) { $VspherePort = 443 } else { $VspherePort = [int]$configData.VspherePort } $VsphereSslCaCertificate = $configData.VsphereSslCaCertificate $VCenterSslFingerprint = $configData.VCenterSslFingerprint $VsphereSslNoCheckHostname = $configData.VsphereSslNoCheckHostname $VsphereDataCenter = $configData.VsphereDataCenter $VsphereDataStore = $configData.VsphereDataStore if([String]::IsNullOrWhiteSpace($configData.VsphereResourcePool)) { $VsphereResourcePool = "Resources" } else { $VsphereResourcePool = $configData.VsphereResourcePool } $VsphereNetwork = $configData.VsphereNetwork $SourceDiskName = $configData.SourceDiskName $AssetsId = $configData.AssetsId if($configData.psobject.Properties.name -contains "Tags") { $Tags = $configData.Tags } if([String]::IsNullOrWhiteSpace($configData.Timeout)) { $Timeout = 7200 } else { $Timeout = [int]$configData.Timeout } if([String]::IsNullOrWhiteSpace($configData.Prefix)) { $Prefix = "ce" } else { $Prefix = $configData.Prefix } $Flags = $configData.Flags } try { # Authenticate to Citrix Cloud $parameters = AuthToCitrixCloud $CustomerId $SecureClientId $SecureSecret if ([string]::IsNullOrWhiteSpace($SecureClientId) -Or [string]::IsNullOrWhiteSpace($SecureSecret)) { $SecureClientId = $parameters.ApiKey $SecureSecret = $parameters.SecretKey } } catch { return } # Export try { LogIt "Starting export workflow" # # Run the export workflow # Write-Host "***** Call Method: ExportImageJob overwrite: $($Force.IsPresent) *****" $platformExportData = @{ platformCredentialId = $VsphereCwSecretId vCenterHost = $VsphereHost vCenterPort = $VspherePort datacenter = $VsphereDataCenter datastore = $VsphereDataStore resourcePoolName = $VsphereResourcePool network = $VsphereNetwork sourceDiskName = $SourceDiskName } if ($VsphereSslCaCertificate) { # replace raw string \n -> PowerShell-readable `n $VsphereSslCaCertificate = $VsphereSslCaCertificate.replace("\n", "`n") $platformExportData['vCenterSslCaCertificate'] = $VsphereSslCaCertificate } if ($VCenterSslFingerprint) { $platformExportData['vCenterSslFingerprint'] = $VCenterSslFingerprint } if ($VsphereSslNoCheckHostname) { $platformExportData['vCenterSslNoCheckHostname'] = $VsphereSslNoCheckHostname } if ($SmbPath) { $smbDiskPath = "$SmbShare\$SmbPath" } else { $smbDiskPath = $SmbShare } #Add default tags $Tags = Convert-ObjectToHashtable $Tags $Tags['ctx-user'] = ($env:UserName).ToLower() $exportData = @{ platform = "vSphere" prefix = $Prefix ResourceLocationId = $ResourceLocationId timeoutInSeconds = $Timeout outputStorageLocation = @{ type = "SMB" credentialId = $SmbCwId host = $SmbHost sharePath = $smbDiskPath } outputImageFilename = $SmbDiskName outputImageFormat = $SmbDiskFormat overwriteTargetFile = $Force.IsPresent tags = $Tags } if ($thinProvision) { $exportData["provisionType"] = "Thin" } else { $exportData["provisionType"] = "Thick" } if ($SmbPort) { $exportData['outputStorageLocation']['port'] = $SmbPort } if ($AssetsId) { $exportData['assetsId'] = $AssetsId } if ($Flags) { $exportData['flags'] = $Flags } # Convert the object to JSON to use in the POST body (Note: Default depth is 2 when serializing) $json = ($exportData + $platformExportData) | ConvertTo-Json -Depth 10 LogIt "$($exportData["provisionType"]) Export POST body $json" $False # Send the POST try { $response = Invoke-CCRestMethod 'Post' $Deployment "images/`$export" $CustomerId $SecureClientId $SecureSecret $True $json $JobId = $response.id LogIt "Image Export started with id $JobId" } catch { throw "Failed to start export: $_" } } catch { LogIt "Workflow failed: $_" exit 1 } finally { #Check if it comes to the end of pipeline if ($PSCmdlet.MyInvocation.PipelinePosition -lt $PSCmdlet.MyInvocation.PipelineLength) { $output = [PSCustomObject]@{ CustomerId = $CustomerId Deployment = $Deployment JobId = $JobId LogFileName = $LogFileName SmbHost = $SmbHost SmbPort = $SmbPort SmbShare = $SmbShare SmbPath = $SmbPath SmbDiskName = $SmbDiskName SmbDiskFormat = $SmbDiskFormat SmbCwId = $SmbCwId } Write-Output $output } else{ Clear-XDCredentials } } } } |