cDscDocker.psm1


enum Ensure
{
    Present
    Absent
}



[DscResource()]
class cDscDocker 
{
    [DscProperty(Key)] 
    [string]$docker
    
    [DscProperty(Mandatory)] 
    [Ensure]$Ensure
    
    
    #Equivalent of Set-TargetResource
    #Executes the current operation necessary to get the system to the desired state
    [void] Set()
    {
        if ($this.Ensure -eq [Ensure]::Present)
        {
            
            if (-not $this.CheckDockerProvider()) #If the docker provider isnt present
            {
                $this.InstallDockerProvider()
                
            }
            $this.InstallDocker() #Install docker..
            
            
            
        }

        elseif ($this.Ensure -eq [Ensure]::Absent)
        {
            Uninstall-Package -ProviderName DockerMsftProvider -Name docker -Force #Uninstall docker; will move to a function if re-used elsewhere
        }
        
    }
    

    #Equivalent of Test-TargetResource
    #Returns true if system is in the state specified; false if a modification needs to take place
    [bool] Test()
    {
        
        $dockerPresent = $this.CheckDocker()
        $returnValue = $false
        
        if ($this.Ensure -eq [Ensure]::Present)
        {
            
            if ($dockerPresent)
            {
                Write-Verbose "Item exists. Expected present"
                $returnValue = $true
            }
            if (-not $dockerPresent)
            {
                Write-Verbose "Item is Absent. Expect Present"
                $returnValue = $false
            }
        }
        Else
        {
            if ($dockerPresent)
            {
                Write-Verbose "Item exists. Expect Absent"
                $returnValue = $false
            }
            if (-not $dockerPresent)
            {
                Write-Verbose "Item absent. Expect Absent"
                $returnValue = $true
            }
            
            
        }
        
        return $returnValue
            
    }
    
    #Equivalent of the Get-TargetResource
    #Get's the current state of the system in cDscDocker object form
    [cDscDocker] Get()
    {
        if ($this.CheckDocker())
        {
            $this.Ensure = [Ensure]::Present
        }
        else
        {
            $this.Ensure = [Ensure]::Absent
        }

        return $this
        
        
    }


    #Function for installation of docker
    [void]InstallDocker()
    {
        Install-Package -Name docker -ProviderName DockerMsftProvider -Force
        $global:DSCMachineStatus = 1
    }

    #Function for installation of docker package provider
    [void]InstallDockerProvider()
    {
        Install-Module -Name DockerMsftProvider -Repository psgallery -Force
    }


    #Function to check if docker is already present
    [bool]CheckDocker()
    {
        $installed = $false

        if($this.CheckDockerProvider())
        {

            $packages = Get-Package -ProviderName DockerMsftProvider
            foreach ($p in $packages)
            {
                if ($p.Name -eq 'docker')
                {
                    $installed = $true
                }
            }
        }


        return $installed
    }
    

    #Function to verify the appropriate docker package provider is available on the host
    [bool]CheckDockerProvider()
    {
        $available = $false
        $providers = Get-PackageProvider -ListAvailable
        
        foreach($provider in $providers)
        {
            if ($provider.Name -eq "DockerMsftProvider")
            {
                $available = $true
            }
        }
        
        return $available
    }
}