Start-IpsGcpExportJob.ps1
<# .Synopsis Implement an image export job. .Description Implement an image export job. This function supports exporting image from Gcp platform to disk on SMB file share server. Note: Start-IpsGcpPublishJob is the alias name of this cmdlet. It uses the same set of parameters as input. You need to specify the right values for the publish workflow. #> Function Start-IpsGcpExportJob { [CmdletBinding(DefaultParameterSetName = 'cmd')] [Alias("Start-IpsGcpPublishJob")] 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')] [Obsolete("Specifying an alternate SMB port is not supported and this parameter will be ignored.")] [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 = "VhdxDiskFormat", [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]$GcpZone = "us-east4-a", [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$VpcNetworkName, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string]$VpcNetworkSubnetName, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [bool]$UsePublicIP = $false, [Parameter(Mandatory = $false)] [string]$PrepareDiskName, [Parameter(Mandatory = $true, ParameterSetName = 'cmd')] [string]$CloudCwSecretId, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string[]]$NetworkTags, [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]$CeVmSku = "n1-standard-1", [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [bool]$CeDebug, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [string[]]$Flags, [Parameter(Mandatory = $false, ParameterSetName = 'cmd')] [bool]$DryRun = $false, [Parameter(Mandatory = $false)] [string]$SecureClientId = '', [Parameter(Mandatory = $false)] [string]$SecureSecret = '', [Parameter(Mandatory = $false)] [string]$LogFileDir = "", [Parameter(Mandatory = $false)] [string]$LogFileName = 'ExportGcpToSmb.log', [Parameter(Mandatory = $false)] [switch]$OverwriteLog, [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 $LogFileDir $LogFileName $OverwriteLog $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.PublishSmb.Host $SmbShare = $configData.PublishSmb.Share $SmbPath = $configData.PublishSmb.Path $SmbDiskName = $configData.PublishSmb.DiskName $SmbDiskFormat = $configData.PublishSmb.DiskFormat if([String]::IsNullOrWhiteSpace($SmbDiskFormat)) { $SmbDiskFormat = "VhdxDiskFormat" } $SmbCwId = $configData.PublishSmb.CwId if([String]::IsNullOrWhiteSpace($PrepareDiskName)) { $PrepareDiskName = $configData.PublishSmb.DiskName } $Deployment = $configData.Deployment if($configData.psobject.Properties.name -contains "ExportResourceLocationId") { $ResourceLocationId = $configData.ExportResourceLocationId } else { $ResourceLocationId = $configData.ResourceLocationId } if([String]::IsNullOrWhiteSpace($configData.GcpZone)) { $GcpZone = "us-east4-a" } else { $GcpZone = $configData.GcpZone } $VpcNetworkName = $configData.VpcNetworkName $VpcNetworkSubnetName = $configData.VpcNetworkSubnetName $UsePublicIP = $configData.UsePublicIP $NetworkTags = $configData.NetworkTags $CloudCwSecretId = $configData.CloudCwSecretId $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 } $CeDebug = $configData.CeDebug $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 { LogFatal "Failed to authenticate to Citrix Cloud" } # Export try { LogIt "Starting export workflow" # # Run the export workflow # Write-Host "***** Call Method: ExportImageJob overwrite: $($Force.IsPresent) *****" $platformExportData = @{ platformCredentialId = $CloudCwSecretId targetDiskName = $PrepareDiskName zone = $GcpZone VpcNetworkName = $VpcNetworkName UsePublicIP = $UsePublicIP } if ($VpcNetworkSubnetName) { $platformExportData["VpcNetworkSubnetName"] = $VpcNetworkSubnetName } if ($NetworkTags) { $platformExportData["NetworkTags"] = $NetworkTags } if ($SmbPath) { $smbDiskPath = "$SmbShare\$SmbPath" } else { $smbDiskPath = $SmbShare } #Add default tags $Tags = Convert-ObjectToHashtable $Tags $Tags['ctx-user'] = ($env:UserName).ToLower() $exportData = @{ platform = "Gcp" prefix = $Prefix ceVmSku = $CeVmSku ceDebug = $CeDebug ResourceLocationId = $ResourceLocationId timeoutInSeconds = $Timeout outputStorageLocation = @{ type = "SMB" credentialId = $SmbCwId host = $SmbHost sharePath = $smbDiskPath } provisionType = "Thin" outputImageFilename = $SmbDiskName outputImageFormat = $SmbDiskFormat overwriteTargetFile = $Force.IsPresent tags = $Tags } 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 $query = @{ "async" = $true "dryRun" = $DryRun } # Send the POST try { $response = Invoke-CCRestMethod 'Post' $Deployment "images/`$export" $CustomerId $SecureClientId $SecureSecret $query $json $JobId = $response.id LogIt "Image Export started with id $JobId" } catch { $JobId = "Job failed to start" throw "Failed to start export: $_" } } catch { LogFatal "Workflow failed: $_" } 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 LogFileDir = $LogFileDir LogFileName = $LogFileName SmbHost = $SmbHost SmbShare = $SmbShare SmbPath = $SmbPath SmbDiskName = $SmbDiskName SmbDiskFormat = $SmbDiskFormat SmbCwId = $SmbCwId } Write-Output $output } else{ Clear-XDCredentials } } } } |