daisy_workflows/export_metadata/export-metadata.ps1 (86 lines of code) (raw):

function Get-MetadataValue { param ( [parameter(Mandatory=$true)] [string]$key, [parameter(Mandatory=$false)] [string]$default ) # Returns the provided metadata value for a given key. $url = "http://metadata.google.internal/computeMetadata/v1/instance/attributes/$key" $max_attemps = 30 for ($i=0; $i -le $max_attemps; $i++) { try { $client = New-Object Net.WebClient $client.Headers.Add('Metadata-Flavor', 'Google') $value = ($client.DownloadString($url)).Trim() Write-Host "Retrieved metadata for key $key with value $value." return $value } catch [System.Net.WebException] { if ($default) { Write-Host "Failed to retrieve metadata for $key, returning default $default." return $default } # Sleep after each failure with no default value to give the network adapters time to become functional. Start-Sleep -s 1 } } Write-Host "Failed $max_attemps times to retrieve value from metadata for $key, returning null." return $null } function Export-ImageMetadata { $image_version = Get-Date -Format "yyyyMMdd" $publish_date = Get-Date -Format "o" $image_metadata = @{'id' = $image_id; 'name' = $image_name; 'family' = $image_family; 'version' = $image_version; 'publish_date' = $publish_date; 'packages' = @()} # Get Googet packages. $out = & 'C:\ProgramData\GooGet\googet.exe' -root 'C:\ProgramData\GooGet' 'installed' $out = $out[1..$out.length] [array]::sort($out) foreach ($package_line in $out) { try { $name = $package_line.Trim().Split(' ')[0] # Get Package Info for each package $info = & 'C:\ProgramData\GooGet\googet.exe' -root 'C:\ProgramData\GooGet' 'installed' '-info' $name foreach ($line in $info) { if ($line -match "Version") { $version = $line.Split(":")[1].Trim() } if ($line -match "Source") { $source = $line.Split(":") $source = [String]::Concat($source[1..$source.length]).Trim() } } $package_metadata = @{'name' = $name; 'version' = $version; 'commmit_hash' = $source} $image_metadata['packages'] += $package_metadata } catch { Write-Host "ExportFailed: Failed to retrieve metadata for $package_line, skiping." } } # Save the JSON image_metadata. $image_metadata_json = $image_metadata | ConvertTo-Json -Compress $image_metadata_json | & 'gsutil' cp - "${metadata_dest}" } try { Write-Host 'Beginning export windows image metadata' $metadata_dest = Get-MetadataValue -key 'metadata_dest' $image_id = Get-MetadataValue -key 'image_id' $image_name = Get-MetadataValue -key 'image_name' $image_family = Get-MetadataValue -key 'image_family' Export-ImageMetadata Write-Host 'ExportSuccess: Finished export windows image metadata' } catch { Write-Host 'Exception caught in script:' Write-Host $_.InvocationInfo.PositionMessage Write-Host "Message: $($_.Exception.Message)" Write-Host 'Windows export package metadata failed.' exit 1 }