CloudFactoryIAAS.psm1

function Get-AuthenticationParameters {
    param (
        [Parameter(Mandatory=$true)]
        [string]$refreshToken,
        
        [Parameter(Mandatory = $false)]
        [ValidateSet("Production", "RC")]
        [string]$Portal="Production",

        [Parameter(Mandatory = $true)]
        [ValidateSet("Utility", "Infrastructure")]
        [string]$API
    )

    $ErrorActionPreference="Stop"
    
    try {

        switch ($Portal) {
            "Production" {
                $BaseURI = "https://portal.api.cloudfactory.dk"
                switch ($API) {
                    "Utility" {$URI = "https://portal.api.cloudfactory.dk"}
                    "Infrastructure" {$URI = "https://portal.api.cloudfactory.dk/infrastructure"}
                }
            }
            
            "RC" {
                $BaseURI = "https://portal.api.rc.cloudfactory.dk"
                switch ($API) {
                    "Utility" {$URI = "https://portal.api.rc.cloudfactory.dk"}
                    "Infrastructure" {$URI = "https://portal.api.rc.cloudfactory.dk/infrastructure"}
                }
            }
        }

        $request = Invoke-RestMethod -Uri ($BaseURI + "/Authenticate/ExchangeRefreshToken/$RefreshToken")
        $access_token = $request.access_token

        return @{
            baseuri = $URI
            header = @{Authorization = "Bearer $access_token"}
        }

    }
    catch {
        throw $_
    }
    
}
function Get-RefreshToken {
    Param(
        [Parameter(Mandatory = $true)]
        [ValidateSet("true", "false")]
        [string]$Customer
    )

    try {
        $ErrorActionPreference="Stop"

        $URI = "https://portal.api.cloudfactory.dk/Authenticate/Login?customer=$Customer"
        $request = Invoke-RestMethod -Method Get -Uri $URI -ContentType "application/json"
        $url = ($request -split " ")[0]

        [system.Diagnostics.Process]::Start($url)

    }
    catch {
        throw $_
    }

}
function Create-VMCheckpoint {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID,

        [Parameter(Mandatory=$true)]
        [string]
        $CheckpointName
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Post -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/Checkpoints?name=$CheckpointName") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Delete-VMCheckpoint {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID,

        [Parameter(Mandatory=$true)]
        [string]
        $CheckpointID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Delete -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/Checkpoints?checkpointId=$CheckpointID") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Get-VMCheckpoints {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,
        
        [Parameter(Mandatory=$true)]
        [string]
        $VMID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/Checkpoints") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Restore-VMCheckpoint {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID,

        [Parameter(Mandatory=$true)]
        [string]
        $CheckpointID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Post -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/Checkpoints/Restore?checkpointId=$CheckpointID") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Create-VMDisk {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID,

        [Parameter(Mandatory=$true)]
        [int]
        $DiskSizeGB
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/Disk?diskSizeGiB=$DiskSizeGB") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Mount-VMISO {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID,

        [Parameter(Mandatory=$true)]
        [int]
        $LibaryID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Post -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/Disk/Mount?libaryId=$LibaryID") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Update-VMDisk {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID,

        [Parameter(Mandatory=$true)]
        [string]
        $DiskID,

        [Parameter(Mandatory=$true)]
        [int]
        $NewSizeGB
    )

    $ErrorActionPreference="Stop"

    try {
        #Getting VM object
        $VM = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID") -Headers $Header
        
        #Finding the correct disk
        $DiskToChange = $VM.disks | Where-Object {$_.id -eq $DiskID}

        if ($DiskToChange){
            #Calculating the new size
            [Int64]$NewSize = ($NewSizeGB * 1024 * 1024 * 1024)
            $DiskToChange.size = $NewSize

            #Define body
            $body = $VM | select cpu, memory, disks, networksAdapters, spec

            #Making the request
            $request = Invoke-RestMethod -Method Put -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID") -ContentType "application/json" -Headers $Header -Body ($body|ConvertTo-Json)
        }
        else {
            throw "Can't find any disk with following disk id: $DiskID"
        }
    }
    catch {
        throw $_
    }
}
function Get-Networks {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/Network") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Get-Projects {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Get-ISOLibary {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/Templates/Libary") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Get-Templates {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/Templates") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Create-VM {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$false)]
        [string]
        $Name,

        [Parameter(Mandatory=$false)]
        [string]
        $TemplateID,

        [Parameter(Mandatory=$false)]
        [int]
        $vCPU,

        [Parameter(Mandatory=$false)]
        [int]
        $MemoryGB,

        [Parameter(Mandatory=$false)]
        [int]
        $VLANID,

        [Parameter(Mandatory=$false)]
        [string]
        $adminPassword,

        [Parameter(Mandatory=$false)]
        [object]
        $customObject
    )

    $ErrorActionPreference="Stop"

    try {
        
        if ($customObject){
            $body = $customObject | ConvertTo-Json -Depth 10
            $request = Invoke-RestMethod -Method Post -Uri ($Baseuri + "Projects/$ProjectID/VirtualMachines") -ContentType "application/json" -Headers $Header -Body $body
        }
        else {
            $body = @{
                name = $Name
                templateId = $TemplateID
                cpu = $vCPU
                memoryGiB = $MemoryGB
                networkAdapters = @(
                    @{
                        vlan = $VLANID
                    }
                )
                customizations = @{
                    adminPassword = $adminPassword
                }
            } | ConvertTo-Json -Depth 10
    
            $request = Invoke-RestMethod -Method Post -Uri ($Baseuri + "Projects/$ProjectID/VirtualMachines") -ContentType "application/json" -Headers $Header -Body $body
        }
        
    }
    catch {
        throw $_
    }
}
function Get-VM {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$false)]
        [string]
        $VMID
    )

    $ErrorActionPreference="Stop"

    try {
        
        if ($VMID){
            $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID") -Headers $Header
            return $request
        }
        else {
            $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines") -Headers $Header
            return $request
        }
        
    }
    catch {
        throw $_
    }
}
function Get-VMDisks {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Get -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID") -Headers $Header
        $disks = $request | Select-Object -ExpandProperty disks
        return $disks
    }
    catch {
        throw $_
    }
}
function PowerOff-VM {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Put -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/PowerState?wantedPowerState=PowerOff") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Start-VM {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Put -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/PowerState?wantedPowerState=Start") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Stop-VM {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]
        $Header,
        
        [Parameter(Mandatory=$true)]
        [string]
        $ProjectID,

        [Parameter(Mandatory=$true)]
        [string]
        $VMID
    )

    $ErrorActionPreference="Stop"

    try {
        $request = Invoke-RestMethod -Method Put -Uri ($Baseuri + "/Projects/$ProjectID/VirtualMachines/$VMID/PowerState?wantedPowerState=Stop") -Headers $Header
        return $request
    }
    catch {
        throw $_
    }
}
function Get-Endpoint {
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Baseuri,
        
        [Parameter(Mandatory=$true)]
        [hashtable]$Header,
        
        [Parameter(Mandatory=$true)]
        [string]$Endpoint,

        [Parameter(Mandatory=$false)]
        [int]$RequestLength=100,

        [Parameter(Mandatory=$true)]
        [ValidateSet("Get", "Post", "Put", "Delete")]
        [string]$Method
    )

    $ErrorActionPreference="Stop"
    try {
        
        $uri = ($Baseuri + $Endpoint)
        $request = Invoke-RestMethod -Method $Method -Uri $uri -Headers $Header

        return $request

    }
    catch {
        throw $_
    }
    
}