Public/Copy-FMTImages.ps1

function Copy-FMTImages {
    param(
        [parameter()]
        [string] $targetResourceGroup,
        [parameter()]
        [string] $storageAccount,
        [parameter()]
        [string] $StorageContainer = 'silk',
        [parameter()]
        [string] $cnodeVersion,
        [parameter()]
        [string] $dnodeVersion,
        [parameter(Mandatory)]
        [string] $sasToken,
        [parameter()]
        [string] $souceStorageAccount = "silkimages",
        [parameter()]
        [string] $Location
    )
    # Check AZ context

    $session = New-FMTSession
    if (!$session) {
        $message = '-- stopping --'
        return $message
    }

    if (!$cnodeVersion -and !$dnodeVersion) {
        Write-Host -ForegroundColor yellow "No image versions specified, please set -cnodeVersion or -dnodeVersion (or both)"
        exit
    }

    if (!$targetResourceGroup) {
        $rglist = Get-AzResourceGroup
        $targetResourceGroup = Build-MenuFromArray -array $rglist -property resourcegroupname -message "Select the appropriate Resource Group"
    }

    $rg = Get-AzResourceGroup -Name $targetResourceGroup -ErrorAction SilentlyContinue
    if (!$rg) {
        Write-Host -ForegroundColor yellow "Resource group -- $targetResourceGroup -- Not found. Please check and try again."
        exit
    }

    if (!$Location) {
        $Location = $rg.Location
    }

    if (!$storageAccount) {
        $storage_accountname = 'images' + ( -join ((48..57) + (65..90) + (97..122) | Get-Random -Count 10 | ForEach-Object {[char]$_})).ToLower()
    } else {
        $storage_accountname = $storageAccount
    }

    if ($cnodeVersion) {
        $cImageName = "k2c-cnode-" + $cnodeVersion.Replace('.','-')
        $cImageFileName = $cImageName + ".vhd"
        $currentCImage = Get-AzImage -Name $cimageName -ResourceGroupName $targetResourceGroup -ErrorAction SilentlyContinue
        if ($currentCImage) {
            Write-Host -ForegroundColor yellow "Image -- $imageName -- Already exists in resource group -- $targetResourceGroup."
            exit 
        }
    }

    if ($dnodeVersion) {
        $dImageName = "azure-dnode-" + $dnodeVersion.Replace('.','-')
        $dImageFileName = $dImageName + ".vhd"
        $currentDImage = Get-AzImage -Name $dimageName -ResourceGroupName $targetResourceGroup -ErrorAction SilentlyContinue
        if ($currentDImage) {
            Write-Host -ForegroundColor yellow "Image -- $imageName -- Already exists in resource group -- $targetResourceGroup."
            exit 
        }
    }


    # Create target storage account
    if (!$storageAccount) {
        Write-Host -ForegroundColor yellow "Creating Storage account $storage_accountname"
        $sa = New-AzStorageAccount -Name $storage_accountname -ResourceGroupName $rg.ResourceGroupName -Location $Location -SkuName Standard_LRS -AllowBlobPublicAccess $false
    } else {
        $sa = Get-AzStorageAccount -ResourceGroupName $rg.ResourceGroupName -Name $storageAccount
    }

    $sc = $sa | Get-AzStorageContainer -Name $StorageContainer -ErrorAction SilentlyContinue
    if (!$sc) {
        try {
            $sc = $sa | New-AzStorageContainer -Name $StorageContainer 
        } catch {
            Write-Error 'Can not create or read container in this storage account, please check your permissions'
            exit
        }
    }


    # Generate storage contexts and
    Write-Host -ForegroundColor yellow "Copying $cimageFileName and $dimageFileName to $storage_accountname"
    $sakeys = $sa | Get-AzStorageAccountKey

    $srcContext = New-AzStorageContext -StorageAccountName $souceStorageAccount -SasToken $sasToken 
    $dstContext = New-AzStorageContext -StorageAccountName $sa.StorageAccountName -StorageAccountKey $sakeys[0].Value
    if ($cnodeVersion) {
        Start-AzStorageBlobCopy -DestContainer $StorageContainer -SrcBlob $cimageFileName -SrcContainer 'images' -DestContext $dstContext -Context $srcContext -DestBlob $cimageFileName 
    }
    if ($dnodeVersion) {
        Start-AzStorageBlobCopy -DestContainer $StorageContainer -SrcBlob $dimageFileName -SrcContainer 'images' -DestContext $dstContext -Context $srcContext -DestBlob $dimageFileName 
    }

    # Run VM size validation here

    $badArray = @()

    $response = Get-AzComputeResourceSku -Location $Location | Where-Object {$_.Name -eq 'Standard_D64s_v4' -or $_.Name -eq 'Standard_L8s_v2'}
    $badResources = ($response | Where-Object {$_.Restrictions})
    foreach ($r in $badResources) {
        $o = New-Object psobject
        $o | Add-Member -MemberType NoteProperty -Name "Location" -Value $r.LocationInfo.Location
        $o | Add-Member -MemberType NoteProperty -Name "VM Size" -Value $r.name
        $o | Add-Member -MemberType NoteProperty -Name "Restriction" -Value $r.Restrictions.reasoncode
        $o | Add-Member -MemberType NoteProperty -Name "Zones" -Value $r.Restrictions.RestrictionInfo.Zones

        $badArray += $o
    }

    Write-Host -ForegroundColor yellow  "Checking for VM deployment restructions..."
    $badArray

    # Wait for file to be copied
    if ($cnodeVersion) {
        Get-AzStorageBlobCopyState -Blob $cimageFileName -Container $StorageContainer -Context $dstContext -WaitForComplete
    }
    if ($dnodeVersion) {
        Get-AzStorageBlobCopyState -Blob $dimageFileName -Container $StorageContainer -Context $dstContext -WaitForComplete
    }

    if ($cnodeVersion) {
        # Create cnode Image
        $cimageURI = $sc.CloudBlobContainer.Uri.AbsoluteUri + '/' + $cimageFileName
        $cimageConfig = New-AzImageConfig -Location $Location
        $cimageConfig = Set-AzImageOsDisk -Image $cimageConfig -OsType Linux -OsState Generalized -BlobUri $cimageURI
        New-AzImage -ImageName $cimageName -ResourceGroupName $rg.ResourceGroupName -Image $cimageConfig
    }

    if ($dnodeVersion) {
        # Create dnode Image
        $dimageURI = $sc.CloudBlobContainer.Uri.AbsoluteUri + '/' + $dimageFileName
        $dimageConfig = New-AzImageConfig -Location $Location
        $dimageConfig = Set-AzImageOsDisk -Image $dimageConfig -OsType Linux -OsState Generalized -BlobUri $dimageURI
        New-AzImage -ImageName $dimageName -ResourceGroupName $rg.ResourceGroupName -Image $dimageConfig
    }
}