quickstarts/microsoft.costmanagement/finops-hub/modules/scripts/Copy-FileToAzureBlob.ps1 (163 lines of code) (raw):

# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. Write-Output "Updating settings.json file..." Write-Output " Storage account: $env:storageAccountName" Write-Output " Container: $env:containerName" $validateScopes = { $_.Length -gt 45 } # Initialize variables $fileName = 'settings.json' $filePath = Join-Path -Path . -ChildPath $fileName $newScopes = $env:scopes.Split('|') | Where-Object $validateScopes | ForEach-Object { @{ scope = $_ } } # Get storage context $storageContext = @{ Context = New-AzStorageContext -StorageAccountName $env:storageAccountName -UseConnectedAccount Container = $env:containerName } # Download existing settings, if they exist $blob = Get-AzStorageBlobContent @storageContext -Blob $fileName -Destination $filePath -Force if ($blob) { $text = Get-Content $filePath -Raw Write-Output "---------" Write-Output $text Write-Output "---------" $json = $text | ConvertFrom-Json Write-Output "Existing settings.json file found. Updating..." # Rename exportScopes to scopes + convert to object array if ($json.exportScopes) { Write-Output " Updating exportScopes..." if ($json.exportScopes[0] -is [string]) { Write-Output " Converting string array to object array..." $json.exportScopes = @($json.exportScopes | Where-Object $validateScopes | ForEach-Object { @{ scope = $_ } }) if (-not ($json.exportScopes -is [array])) { Write-Output " Converting single object to object array..." $json.exportScopes = @($json.exportScopes) } } Write-Output " Renaming to 'scopes'..." $json | Add-Member -MemberType NoteProperty -Name scopes -Value $json.exportScopes $json.PSObject.Properties.Remove('exportScopes') } # Force string array to object array with unique values if ($json.scopes) { Write-Output " Converting string array to object array..." $scopeArray = @() $json.scopes | Where-Object $validateScopes | ForEach-Object { $scopeArray += $_ } | Select-Object -Unique $json.scopes = @() + $scopeArray } } # Set default if not found if (!$json) { Write-Output "No existing settings.json file found. Creating new file..." $json = [ordered]@{ '$schema' = 'https://aka.ms/finops/hubs/settings-schema' type = 'HubInstance' version = '' learnMore = 'https://aka.ms/finops/hubs' scopes = @() retention = @{ 'msexports' = @{ days = 0 } 'ingestion' = @{ months = 13 } 'raw' = @{ days = 0 } 'final' = @{ months = 13 } } } $text = $json | ConvertTo-Json Write-Output "---------" Write-Output $text Write-Output "---------" } # Set default retention if (!($json.retention)) { # In case the retention object is not present in the settings.json file (versions before 0.4), add it with default values $retention = @" { "msexports": { "days": 0 }, "ingestion": { "months": 13 }, "raw": { "days": 0 }, "final": { "months": 13 } } "@ $json | Add-Member -Name retention -Value (ConvertFrom-Json $retention) -MemberType NoteProperty } # Set or update msexports retention if (!($json.retention.msexports)) { $json.retention | Add-Member -Name msexports -Value (ConvertFrom-Json "{""days"":$($env:msexportRetentionInDays)}") -MemberType NoteProperty } else { $json.retention.msexports.days = [Int32]::Parse($env:msexportRetentionInDays) } # Set or update ingestion retention if (!($json.retention.ingestion)) { $json.retention | Add-Member -Name ingestion -Value (ConvertFrom-Json "{""months"":$($env:ingestionRetentionInMonths)}") -MemberType NoteProperty } else { $json.retention.ingestion.months = [Int32]::Parse($env:ingestionRetentionInMonths) } # Set or update raw retention if (!($json.retention.raw)) { $json.retention | Add-Member -Name raw -Value (ConvertFrom-Json "{""days"":$($env:rawRetentionInDays)}") -MemberType NoteProperty } else { $json.retention.raw.days = [Int32]::Parse($env:rawRetentionInDays) } # Set or update final retention if (!($json.retention.final)) { $json.retention | Add-Member -Name final -Value (ConvertFrom-Json "{""months"":$($env:finalRetentionInMonths)}") -MemberType NoteProperty } else { $json.retention.final.months = [Int32]::Parse($env:finalRetentionInMonths) } # Updating settings Write-Output "Updating version to $env:ftkVersion..." $json.version = $env:ftkVersion $json.scopes = (@() + $json.scopes + $newScopes) | Select-Object -Unique if ($null -eq $json.scopes) { $json.scopes = @() } $text = $json | ConvertTo-Json Write-Output "---------" Write-Output $text Write-Output "---------" $text | Out-File $filePath # Upload new/updated settings Write-Output "Uploading settings.json file..." Set-AzStorageBlobContent @storageContext -File $filePath -Force | Out-Null # Save focusSchemaFile file to storage $schemaFiles = $env:schemaFiles | ConvertFrom-Json -Depth 10 Write-Output "Uploading ${$schemaFiles.PSObject.Properties.Count} schema files..." $schemaFiles.PSObject.Properties | ForEach-Object { $fileName = "$($_.Name).json" $tempPath = "./$fileName" Write-Output " Uploading $($_.Name).json..." $_.Value | Out-File $tempPath Set-AzStorageBlobContent @storageContext -File $tempPath -Blob "schemas/$fileName" -Force | Out-Null }