preloader
2 September 2010 / #Msdpm

Automatic disk allocation on DPM 2007

An important new feature of DPM 2010 is the autogrowth of the space allocated for protection groups.

This will extend the disk space used by a group of protection when it becomes full.

On DPM 2007, this functionality is not available, and the manipulation was manually, which can be quickly difficult in the case of a large infrastructure, or with Powershell.

This script can be scheduled several times a day if your protection groups are evolving rapidly in terms of storage.

Be careful because the disk space reallocation on DPM is heavy load process (using Windows dynamic disks)!

Here is the PS script we use :

#
# Script d'allocation automatique d'espace
# pour les datasources DPM
#
# Changelog :
# 12/05/2010 : Correction du problème d'affichage d'espace libre
#

Function Send-SMTPmail($to, $from, $subject, $smtpserver, $body)
{
    $mailer = new-object Net.Mail.SMTPclient($smtpserver)
    $msg = new-object Net.Mail.MailMessage($from,$to,$subject,$body)
#    $msg.IsBodyHTML = $true
    $mailer.send($msg)
}

# Déclaration des variables
$seuilReplica = 3GB
$seuilRecoveryPoint = 3GB
$palierReplica = 15GB
$palierRecoveryPoint = 15GB
$nomServeurDPM = &"hostname"
$serveurSMTP = "xxxx"
$emailFrom = administrator@xxx
$emailTo = administrator@xxx
$corpsMail = ""
$sujetMail = "[DPM] Rapport d'allocation automatique"

# cmdlet permettant de se connecter au serveur DPM
$serveurDPM = Connect-DPMServer $nomServeurDPM -ErrorAction SilentlyContinue

# Vérification de la connexion au serveur DPM
if(!$serveurDPM)
{
    $corpsMail += "Connexion au serveur $nomServeurDPM impossible"
    Send-SMTPmail -to $emailTo -from $emailFrom -subject "$sujetMail" -smtpserver $serveurSMTP -body "$corpsMail"
    exit 1
}

# Récupération de la liste des Protection Group
$listeProtectionGroup = @(Get-ProtectionGroup $nomServeurDPM)

# Parcours de la liste des Protection Group
foreach($protectionGroup in $listeProtectionGroup)
{
    # Récupère le Protection Group en version modifiable
    $modifiableProtectionGroup = Get-ModifiableProtectionGroup $protectionGroup

    # Récupère la liste des sources de données du Protection Group en version modifiable
    $listeDatasource = @(Get-Datasource $modifiableProtectionGroup)

    # Parcours des datasource un par un
    foreach ($datasource in $listeDatasource)
    {
        #
        # Vérification de l'espace disponible au niveau du replica
        #
        if (($datasource.ReplicaSize - $datasource.ReplicaUsedSpace) -lt $seuilReplica)
        {
            # Augmentation de l'allocation disque du replica
            $corpsMail += Get-Date -uformat "%Y/%m/%d"
            $corpsMail = $corpsMail + " - Augmentation du Replica " + $datasource.Name + " sur le Protection Group " + $datasource.ProductionServerName + "`n"
            $nouvelleReplicaSize = $datasource.ReplicaSize + $palierReplica
            Set-DatasourceDiskAllocation -Manual -Datasource $datasource -ProtectionGroup $modifiableProtectionGroup -ReplicaArea $nouvelleReplicaSize
        }
        #else
        #{
        #    # Rien à faire
        #    $espaceLibreReplica = $datasource.ReplicaSize - $datasource.ReplicaUsedSpace
        #    $espaceLibreReplica /= 1MB
        #    Write-Host "Le replica de $($datasource.Name) sur $($datasource.ProductionServerName) n'a pas besoin d'etre agrandie et possède $espaceLibreReplica MB de libre"
        #}

        #
        # Vérification de l'espace disponible au niveau du recovery point
        #
        if (($datasource.ShadowCopyAreaSize - $datasource.ShadowCopyUsedSpace) -lt $seuilRecoveryPoint)
        {
            # Augmentation de l'allocation disque du recovery point
            $corpsMail += Get-Date -uformat "%Y/%m/%d"
            $corpsMail = $corpsMail + " - Augmentation du Recovery Point " + $datasource.Name + " sur le Protection Group " + $datasource.ProductionServerName + "`n"
            $nouvelleRecoveryPointSize = $datasource.ShadowCopyAreaSize + $palierRecoveryPoint
            Set-DatasourceDiskAllocation -Manual -Datasource $datasource -ProtectionGroup $modifiableProtectionGroup -ShadowCopyArea $nouvelleRecoveryPointSize
        }
        #else
        #{
        #    # Rien à faire
        #    $espaceLibreRecoveryPoint = $datasource.ShadowCopyAreaSize - $datasource.ShadowCopyUsedSpace
        #    $espaceLibreRecoveryPoint /= 1MB
        #    Write-Host "Le Recovery Point de $($datasource.Name) sur $($datasource.ProductionServerName) n'a pas besoin d'etre agrandi et possède $espaceLibreRecoveryPoint MB de libre`n"
        #}
    }

    # Application des modification effectuées ci-dessus
    Set-ProtectionGroup $modifiableProtectionGroup
}

# Récupération de l'espace disque disponible
$espaceDisqueDispo = Get-DPMDisk -DPMServerName $nomServeurDPM

# Envoi du mail de rapport
if($corpsMail -ne "")
{
    $corpsMail += "`n`nEspace Disque disponible : " + $espaceDisqueDispo.UnallocatedSpace/1GB + " Go"
    Send-SMTPmail -to $emailTo -from $emailFrom -subject "$sujetMail" -smtpserver $serveurSMTP -body "$corpsMail"
}

# Déconnexion du serveur DPM
Disconnect-DPMServer $nomServeurDPM

> Frederic MARTIN