scripts/Invoke-RepoDataGeneration.ps1 (168 lines of code) (raw):
param(
[array]$repositories = @()
)
$repositoryData = @()
$warnings = @()
foreach($repository in $repositories) {
$repoId = $repository.repoId
$repoUrl = $repository.repoUrl
$repoSplit = $repoUrl.Split("/")
$orgName = $repoSplit[3]
$repoName = $repoSplit[4]
$repoSplit = $repoName.Split("-")
$providerName = $repoSplit[1]
$orgAndRepoName = "$orgName/$repoName"
# Meta Data
$metaDataVariables = @(
@{
key = "providerNamespace"
name = "AVM_RESOURCE_PROVIDER_NAMESPACE"
required = $true
requiredFor = @("resource")
},
@{
key = "resourceType"
name = "AVM_RESOURCE_TYPE"
required = $true
requiredFor = @("resource")
},
@{
key = "moduleDisplayName"
name = "AVM_MODULE_DISPLAY_NAME"
required = $true
requiredFor = @("resource", "pattern", "utility")
},
@{
key = "alternativeNames"
name = "AVM_MODULE_ALTERNATIVE_NAMES"
required = $false
},
@{
key = "comments"
name = "AVM_COMMENTS"
required = $false
},
@{
key = "primaryOwnerHandle"
name = "AVM_OWNER_PRIMARY_GITHUB_HANDLE"
required = $true
requiredFor = @("resource", "pattern", "utility")
},
@{
key = "primaryOwnerDisplayName"
name = "AVM_OWNER_PRIMARY_DISPLAY_NAME"
required = $true
requiredFor = @("resource", "pattern", "utility")
},
@{
key = "secondaryOwnerHandle"
name = "AVM_OWNER_SECONDARY_GITHUB_HANDLE"
required = $false
},
@{
key = "secondaryOwnerDisplayName"
name = "AVM_OWNER_SECONDARY_DISPLAY_NAME"
required = $false
}
)
$metaData = $(gh api "/repos/$orgAndRepoName/actions/variables?per_page=30" 2> $null) | ConvertFrom-Json
$metaDataObject = @{}
if($metaData.status -and $metaData.status -ne 200) {
$warning = @{
repoId = $repository.repoId
message = "Meta data not found for: $($orgAndRepoName)"
}
Write-Warning $warning.message
$warnings += $warning
} else {
Write-Host "Meta data found for: $($orgAndRepoName)"
foreach($item in $metaDataVariables) {
$metaDataItem = $metaData.variables | Where-Object { $_.name -eq $item.name }
if($metaDataItem -and $metaDataItem.value) {
$metaDataObject.Add($item.key, $metaDataItem.value)
continue
}
$metaDataObject.Add($item.key, "")
if($item.required -and $item.requiredFor -contains $repository.repoSubType) {
$warning = @{
repoId = $repository.repoId
message = "Required meta data $($item.name) not found for: $($orgAndRepoName)"
}
Write-Warning $warning.message
$warnings += $warning
}
}
}
# Lookup Terraform Registry Status
$url = "https://registry.terraform.io/v1/modules/$orgName/$repoId/$providerName"
$response = Invoke-RestMethod $url -StatusCodeVariable statusCode -SkipHttpErrorCheck
$terraformRegistryPublished = $false
$terraformRegistryLatestVersion = ""
$terraformRegistryModuleOwner = ""
$terraformRegistryFirstPublishedDate = ""
if($response.errors -and $response.errors -contains "Not Found") {
Write-Host "Module not found in Terraform Registry: $url"
} else {
$terraformRegistryPublished = $true
$terraformRegistryLatestVersion = $response.version
$terraformRegistryModuleOwner = $response.owner
Write-Host "Module found in Terraform Registry. Latest version: $terraformRegistryLatestVersion. Owner: $terraformRegistryModuleOwner"
$firstVersion = $response.versions[0]
$firstVersionUrl = "https://registry.terraform.io/v1/modules/$orgName/$repoId/$providerName/$firstVersion"
$firstVersionResponse = Invoke-RestMethod $firstVersionUrl -StatusCodeVariable statusCode -SkipHttpErrorCheck
$terraformRegistryFirstPublishedDate = $firstVersionResponse.published_at
}
$firstPublishedIn = $terraformRegistryFirstPublishedDate -eq "" ? "" : $terraformRegistryFirstPublishedDate.ToString("yyyy-MM")
$moduleType = $repository.repoSubType
$repositoryData += [ordered]@{
moduleType = $moduleType
registryFirstPublishedDate = $terraformRegistryFirstPublishedDate
registryCurrentVersion = $terraformRegistryLatestVersion
registryModuleOwner = $terraformRegistryModuleOwner
ProviderNamespace = $metaDataObject.providerNamespace
ResourceType = $metaDataObject.resourceType
ModuleDisplayName = $metaDataObject.moduleDisplayName
AlternativeNames = $metaDataObject.alternativeNames
ModuleName = $repoId
ParentModule = "n/a"
ModuleStatus = $terraformRegistryPublished ? "Available :green_circle:" : "Proposed :new:"
RepoURL = $repoUrl
PublicRegistryReference = "https://registry.terraform.io/modules/$orgName/$repoId/$providerName/latest"
TelemetryIdPrefix = ""
PrimaryModuleOwnerGHHandle = $metaDataObject.primaryOwnerHandle
PrimaryModuleOwnerDisplayName = $metaDataObject.primaryOwnerDisplayName
SecondaryModuleOwnerGHHandle = $metaDataObject.secondaryOwnerHandle
SecondaryModuleOwnerDisplayName = $metaDataObject.secondaryOwnerDisplayName
ModuleOwnersGHTeam = $repository.repoOwnerTeam
ModuleContributorsGHTeam = $repository.repoContributorTeam
Description = "AVM $moduleType Module for $($metaDataObject.moduleDisplayName)"
Comments = $metaDataObject.comments
FirstPublishedIn = $firstPublishedIn
}
}
$repositoryData | ConvertTo-Json -Depth 10 | Out-File -FilePath "repositoryData.json" -Force -Encoding utf8
$repositoryTypes = @(
"resource",
"pattern",
"utility"
)
$cultureInfo = [System.Globalization.CultureInfo]::CurrentCulture
$textInfo = $cultureInfo.TextInfo
foreach($repositoryType in $repositoryTypes) {
$filteredRepositoryData = $repositoryData | Where-Object { $_.moduleType -eq $repositoryType }
foreach($repository in $filteredRepositoryData) {
$repository.Remove("moduleType")
$repository.Remove("registryFirstPublishedDate")
$repository.Remove("registryCurrentVersion")
$repository.Remove("registryModuleOwner")
}
$repositoryTypeTitleCase = $textInfo.ToTitleCase($repositoryType)
$filteredRepositoryData | Sort-Object { $_.ProviderNamespace, $_.ResourceType } | ConvertTo-Csv -NoTypeInformation | Out-File -FilePath "Terraform$($repositoryTypeTitleCase)Modules.csv" -Force -Encoding utf8
}
if($warnings.Count -eq 0) {
Write-Host "No issues found"
} else {
Write-Host "Issues found ($($warnings.Count))"
$warningsJson = ConvertTo-Json $warnings -Depth 100
$warningsJson | Out-File "warning.log.json"
}