DSCResources/MSFT_xAzureVM/MSFT_xAzureVM.psm1

#region GET FUNCTION

function Get-TargetResource {
[CmdletBinding()]
[OutputType([Hashtable])]
param (
[Parameter(Mandatory)][string]$Name,
[Parameter(Mandatory)][string]$ImageName,
[Parameter(Mandatory)][string]$ServiceName,
[Parameter(Mandatory)][string]$StorageAccountName
)
    $CurrentSubscription = Get-AzureSubscription -Current
    Write-Verbose "The Azure subscription ID is $($CurrentSubscription.SubscriptionID)"
   
    # Native Get cmdlet
    $Get = Get-AzureVM -Name $Name -ServiceName $ServiceName

    # Build Hashtable from native cmdlet values
    @{
        'Ensure' = If ($Get.Name -eq $Name) {'Present'} Else {'Absent'}
        'Name' = $Get.Name
        'ServiceName' = $Get.ServiceName
     }

    }

# Get-TargetResource -Name 'TestVM1' -ServiceName 'testvmservice1' -storageaccountname 'testvmstorage1' -ImageName 'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201404.01-en.us-127GB.vhd' -Verbose
# Expectation is a hashtable with properties of the VM, if it exists.

#endregion



#region SET FUNCTION

function Set-TargetResource {
[CmdletBinding()]
param(
[ValidateSet('Present','Absent')]
[string]$Ensure = 'Present',
[Parameter(Mandatory)][string]$Name,
[Parameter(Mandatory)][string]$ImageName,
[Parameter(Mandatory)][string]$ServiceName,
[Parameter(Mandatory)][string]$StorageAccountName,
[string]$InstanceSize = 'Medium',
[bool]$Linux,
[bool]$Windows,
[pscredential]$Credential,
[string]$ExtensionContainerName,
[string]$ExtensionFileList,
[string]$ExtensionScriptName
)
    # Removing parameters from output
    $PSBoundParameters.Remove('Ensure') | out-null
    $PSBoundParameters.Remove('Debug') | out-null
    $PSBoundParameters.Remove('ErrorAction') | out-null

    switch ($Ensure) {
        'Present' {
            Write-Verbose "Creating VM `"$Name`" in Microsoft Azure."
            Write-Verbose 'Please be patient as the operation completes.'

            # Create VM COnfig
            $VM = New-AzureVMConfig -Name $Name -InstanceSize $InstanceSize -ImageName $ImageName -MediaLocation "http://$StorageAccountName.blob.core.windows.net/vhds/$Name.vhd"
            
            # Set OS Switch
            if ($Windows -eq $true) {Add-AzureProvisioningConfig -VM $VM -AdminUserName $Credential.UserName -Password $Credential.GetNetworkCredential().Password -Windows}
            else {Add-AzureProvisioningConfig -VM $VM -LinuxUser $Credential.UserName -Password $Credential.GetNetworkCredential().Password -Linux}

            if ($ExtensionContainerName -ne '') {
                # VM Agent
                $ExtensionFileList = $ExtensionFileList.Split(',')
                Set-AzureVMCustomScriptExtension -ContainerName $ExtensionContainerName -FileName $ExtensionFileList -VM $VM -Run $ExtensionScriptName
                }
            
            # Native cmdlet for new VM
            
            $CurrentSubscription = Get-AzureSubscription -Current
            $CurrentSubscription.CurrentStorageAccountName = $StorageAccountName
            Write-Verbose "The Azure subscription ID is $($CurrentSubscription.SubscriptionID)"
            Write-Verbose "The Azure storage account is $($CurrentSubscription.CurrentStorageAccountName)"

            New-AzureVM -VMs $VM -ServiceName $ServiceName
            }
        'Absent' {
            # Native Remove cmdlet
            Write-Verbose "Removing VM `"$Name`" from Azure."
            Write-Verbose 'Please be patient as the operation completes.'
            
            $CurrentSubscription = Get-AzureSubscription -Current
            Write-Verbose "The Azure subscription ID is $($CurrentSubscription.SubscriptionID)"
            Remove-AzureVM -Name $Name -ServiceName $ServiceName -DeleteVHD
            }
        }
    }
  
# Set-TargetResource -Ensure 'Present' -Name 'TestVM1' -ServiceName 'testvmsservice1' -storageaccountname 'testvmstorage1' -ImageName 'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201404.01-en.us-127GB.vhd' -windows $true -Verbose
# Expectation is the VM will be created, set, or removed. Validate using Get-AzureVM.

#endregion



#region TEST FUNCTION

function Test-TargetResource {
[CmdletBinding()]
[OutputType([Boolean])]
param(
[ValidateSet('Present','Absent')]
[string]$Ensure = 'Present',
[Parameter(Mandatory)][string]$Name,
[Parameter(Mandatory)][string]$ImageName,
[Parameter(Mandatory)][string]$ServiceName,
[Parameter(Mandatory)][string]$StorageAccountName,
[string]$InstanceSize,
[bool]$Linux,
[bool]$Windows,
[pscredential]$Credential,
[string]$ExtensionContainerName,
[string]$ExtensionFileList,
[string]$ExtensionScriptName
)
    # Output from Get-TargetResource
    $Get = Get-TargetResource -Name $Name -ServiceName $ServiceName -ImageName $ImageName -StorageAccountName $StorageAccountName -ErrorAction SilentlyContinue 

    switch ($Ensure) {
        'Present'{$bool = $true}
        'Absent'{$bool = $false}
        }

    if ($Name -ne $Get.Name -AND $ServiceName -ne $Get.ServiceName) {
        switch ($Ensure) {
            'Present'{$bool = $false}
            'Absent'{$bool = $true}
            }
        write-verbose 'The VM could not be found in Azure.'
        }

    $bool
    }

# Test-TargetResource -Ensure 'Absent' -Name 'TestVM1' -ServiceName 'testvmservice1' -storageaccountname 'testvmstorage1' -ImageName 'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201404.01-en.us-127GB.vhd' -windows $true -Verbose
# Expectation is True or False based on whether the VM has been deployed, depending on Present/Absent.

#endregion

Export-ModuleMember -function *-TargetResource