ClearingAcr.psm1

function Get-PSTSAzureSubscriptions
{
    param([Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $TenantId)

    $AccountSubscriptions= az account list | ConvertFrom-Json

    $Subscriptions = $AccountSubscriptions| Where-Object {$_.tenantId -eq $TenantId }

    return $Subscriptions
}


function Get-PSTSAcrBySubscription
{
    param([Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $SubscriptionName)
    
    process 
    {
         az account set --subscription $SubscriptionName
         
         $AcrList = az acr list | ConvertFrom-Json

         return $AcrList    
    }
    
}


function Get-PSTSReposBySubscription
{
    param([Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $ACRName)

    process 
    {
     
    try
      {

           $RepoList = az acr repository list --name $ACRName | ConvertFrom-Json

           return $RepoList
      }
    
      catch
      {
           write-host "The operation is disallowed on this registry"
      }
        
    }
}


function Get-PSTSRepoTags
{
    param( 
         [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $ACRName,
         [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $RepositoryName
         )

    process 
    {
        $RepositoryTags = az acr repository show-tags --name $ACRName --repository $RepositoryName --output tsv --orderby time_desc
        
        return $RepositoryTags
    }
}


function Delete-PSTSImageAcr
{
    param( 
         [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $ACRName,
         [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $ImageName
         )
    process 
    {
        #az acr repository delete --name $ACRName --image $ImageName --yes
    }
    
}


function ClearingAcr
{
  param(
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $TenantId,
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][int] $nbImagestoKeep,
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string] $EnableDelete
  )

   $imagesDeleted = 0

   $Subscriptions = Get-PSTSAzureSubscriptions -TenantId $TenantId
    
   foreach ($line in $Subscriptions) { 
           
        write-host "- Subscription -"  $line.name

        $AcrList = Get-PSTSAcrBySubscription -SubscriptionName $line.name

          foreach ($Acr in $AcrList)
          {
           write-host "-- Acr --"  $Acr.name
           
           $RepoList = Get-PSTSReposBySubscription -ACRName $Acr.name
              
                  foreach ($Repo in $RepoList)
                   {
                      write-host "--- Repo ---"  $Repo

                      $RepositoryTags = Get-PSTSRepoTags -ACRName $Acr.name -RepositoryName $Repo

                      if ($RepositoryTags.length -gt $ImagestoKeep) {

                            write-host "Deleting images..."
                    
                            for ($item=$nbImagestoKeep; $item -lt $RepositoryTags.length; $item++)
                            {

                                $ImageName = $RepositoryName + ":" + $RepositoryTags[$item]

                                $imagesDeleted++

                                if ($EnableDelete -eq "Yes") {

                                    Delete-PSTSImageAcr -ACRName $Acr.name  -ImageName $ImageName
                                    write-host "---- images deleted:"$ImageName
                                }                
                                
                            }
                      }
                      else {
                            write-host "No images to delete."
                        }
                   }
          }
     
   }

   write-host "Total images deleted:"$imagesDeleted
}