tools/AduCmdlets/AduImportUpdate.psm1 (89 lines of code) (raw):
#
# Device Update for IoT Hub
# PowerShell module for creating and preparing update for import into Device Update for IoT Hub (ADU).
# Copyright (c) Microsoft Corporation.
#
#Requires -Version 5.0
using module .\AduUpdate.psm1 # to import classes
Import-Module $PSScriptRoot\AduAzStorageBlobHelper.psm1 -ErrorAction Stop
function New-AduImportUpdateInput
{
<#
.SYNOPSIS
Stage update artifacts in provided Azure Storage Blob Container and create the request body for ADU Import Update API.
.EXAMPLE
PS > $container = Get-AduAzBlobContainer -SubscriptionId $subscriptionId -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccount -ContainerName $containerName
PS >
PS > $updateId = New-AduUpdateId -Provider Fabrikam -Name Toaster -Version 2.0
PS > $compatInfo1 = New-AduUpdateCompatibility -Manufacturer Fabrikam -Model Toaster
PS > $compatInfo2 = New-AduUpdateCompatibility -Properties @{ OS = "Linux"; Manufacturer = "Fabrikam" }
PS > $step = New-AduInstallationStep -Handler 'microsoft/swupdate:1' -Files '.\file1.json', '.\file2.zip'
PS >
PS > New-AduImportUpdateInput -UpdateId $updateId -Compatibility $compatInfo1, $compatInfo2 -InstallationSteps $step -BlobContainer $container
#>
[CmdletBinding()]
Param(
# Update identity created using New-AduUpdateId.
[Parameter(Mandatory=$true)]
[ValidateNotNull()]
[UpdateId] $UpdateId,
# Optional friendly update description.
[ValidateLength(0, 512)]
[string] $Description,
# Whether the update can be deployed on its own to a device. Must be false for a referenced update.
[bool] $IsDeployable = $true,
# List of compatibility information of devices this update is compatible with, created using New-AduUpdateCompatibility.
[Parameter(Mandatory=$true)]
[ValidateCount(1, 10)]
[hashtable[]] $Compatibility,
# List of update installation steps, created using New-AduInstallationSteps
[Parameter(Mandatory=$true)]
[ValidateCount(1, 10)]
[System.Collections.Specialized.OrderedDictionary[]] $InstallationSteps,
# Azure Storage Blob container to host the files.
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[Microsoft.WindowsAzure.Commands.Common.Storage.ResourceModel.AzureStorageContainer] $BlobContainer
)
$updateIdStr = "$($UpdateId.Provider).$($UpdateId.Name).$($UpdateId.Version)"
Write-Verbose "Uploading update file(s) to Azure Blob Storage."
$fileMetaList = @()
$InstallationSteps | Where-Object { $_.type -eq 'inline' } | ForEach-Object {
$_.files | ForEach-Object {
$filename = Split-Path -Leaf (Resolve-Path $_)
if ($fileMetaList.filename -notcontains $filename)
{
# Place files within updateId subdirectory in case there are filenames conflict.
$blobName = "$updateIdStr/$filename"
$url = Copy-AduFileToAzBlobContainer -FilePath $_ -BlobName $blobName -BlobContainer $BlobContainer -ErrorAction Stop
$fileMeta = New-Object PSObject | Select-Object filename, url
$fileMeta.filename = $filename
$fileMeta.url = $url
$fileMetaList += $fileMeta
}
}
}
Write-Verbose "Uploading import manifest to Azure Blob Storage."
$importMan = New-AduImportManifest -UpdateId $UpdateId -Description $Description -IsDeployable $IsDeployable `
-Compatibility $Compatibility -InstallationSteps $InstallationSteps `
-ErrorAction Stop
$importManJsonFile = New-TemporaryFile
$importMan | Out-File $importManJsonFile -Encoding utf8
Get-Content $importManJsonFile | Write-Verbose
$importManJsonFile = Get-Item $importManJsonFile # refresh file properties
$importManJsonHash = Get-AduFileHashes -FilePath $importManJsonFile -ErrorAction Stop
$importManUrl = Copy-AduFileToAzBlobContainer -FilePath $importManJsonFile -BlobName "$updateIdStr/importmanifest.json" -BlobContainer $BlobContainer -ErrorAction Stop
Write-Verbose "Preparing Import Update API request body."
$importManMeta = [ordered] @{
url = $importManUrl
sizeInBytes = $importManJsonFile.Length
hashes = $importManJsonHash
}
$importUpdateInput = [ordered] @{
importManifest = $importManMeta
files = $fileMetaList
}
Remove-Item $importManJsonFile
return $importUpdateInput
}
Export-ModuleMember -Function New-AduImportUpdateInput, New-AduUpdateId, New-AduUpdateCompatibility, New-AduInstallationStep, Get-AduAzBlobContainer