Private/Merge-KubeConfigs.ps1

# Function to merge kubeconfig files
function Merge-KubeConfigs {
    [CmdletBinding()]
    param (
        [string[]]$MergeConfigs,
        [string]$DestinationConfig,
        [switch]$DryRun
    )

    # Initialize empty hash tables to hold the merged clusters, contexts, and users
    $mergedClusters = @{}
    $mergedContexts = @{}
    $mergedUsers = @{}

    foreach ($configPath in $MergeConfigs) {
        Write-Verbose "Merging config from $configPath"
        $configContent = Get-Content -Raw -Path $configPath
        $config = $configContent | ConvertFrom-Yaml

        # Merge clusters
        foreach ($cluster in $config.clusters) {
            if (-not $mergedClusters.ContainsKey($cluster.name)) {
                $mergedClusters[$cluster.name] = $cluster
            }
        }

        # Merge contexts
        foreach ($context in $config.contexts) {
            if (-not $mergedContexts.ContainsKey($context.name)) {
                $mergedContexts[$context.name] = $context
            }
        }

        # Merge users
        foreach ($user in $config.users) {
            if (-not $mergedUsers.ContainsKey($user.name)) {
                $mergedUsers[$user.name] = $user
            }
        }
    }

    # Create the merged kubeconfig with the correct structure
    $mergedKubeConfig = @"
apiVersion: v1
kind: Config
preferences: {} `n
"@


    # Convert clusters, contexts, and users to YAML
    $clustersYaml = @"
clusters: `n
"@

    foreach ($cluster in $mergedClusters.Values) {
        $clustersYaml += " - cluster:`n"
        $clustersYaml += " certificate-authority-data: $($cluster.cluster.'certificate-authority-data')`n"
        $clustersYaml += " server: $($cluster.cluster.server)`n"
        $clustersYaml += " name: $($cluster.name)`n"
    }

    $contextsYaml = @"
contexts: `n
"@

    foreach ($context in $mergedContexts.Values) {
        $contextsYaml += " - context:`n"
        $contextsYaml += " cluster: $($context.context.cluster)`n"
        $contextsYaml += " user: $($context.context.user)`n"
        $contextsYaml += " name: $($context.name)`n"
    }

    $usersYaml = @"
users: `n
"@

    foreach ($user in $mergedUsers.Values) {
        $usersYaml += " - name: $($user.name)`n"
        $usersYaml += " user:`n"
        $usersYaml += " client-certificate-data: $($user.user.'client-certificate-data')`n"
        $usersYaml += " client-key-data: $($user.user.'client-key-data')`n"
    }

    # Combine everything into one YAML structure
    $fullKubeConfigYaml = $mergedKubeConfig + $clustersYaml + $contextsYaml + $usersYaml

    # If it's not a dry run, save the merged config to the destination file
    if (-not $DryRun) {
        $fullKubeConfigYaml | Set-Content -Path $DestinationConfig
        Write-Host "Merged kubeconfig saved to $DestinationConfig" -ForegroundColor Green
    }
    else {
        # Dry run: Do not save, but indicate what would have happened
        Write-Host "Dry run enabled: No changes have been made. The merged kubeconfig would have been saved to $DestinationConfig" -ForegroundColor Yellow
    }

    # Display summary of merged entities
    Write-Host ""
    Write-Host "╔════════════════════════════════════════════════╗" -ForegroundColor Magenta
    Write-Host "║ KubeTidy Merge Summary ║" -ForegroundColor Magenta
    Write-Host "╠════════════════════════════════════════════════╣" -ForegroundColor Magenta
    Write-Host "║ Files Merged: $($MergeConfigs.Count) ║" -ForegroundColor Yellow
    Write-Host "║ Clusters Merged: $($mergedClusters.Count) ║" -ForegroundColor Cyan
    Write-Host "║ Contexts Merged: $($mergedContexts.Count) ║" -ForegroundColor Cyan
    Write-Host "║ Users Merged: $($mergedUsers.Count) ║" -ForegroundColor Cyan
    Write-Host "╚════════════════════════════════════════════════╝" -ForegroundColor Magenta
    Write-Host ""
}