update
This commit is contained in:
+153
@@ -0,0 +1,153 @@
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $false)]
|
||||
[object]
|
||||
$WebhookData
|
||||
)
|
||||
|
||||
If ($WebhookData) {
|
||||
If ($WebhookData.RequestHeader.ITD -eq 'PJaSEgC5HML5ZuZk6wKfZQrpj2XfuQ5svBxbnq2g9M7cQJtFN3iGU4kD4p') {
|
||||
Write-Verbose "Header has required data"
|
||||
}
|
||||
Else {
|
||||
Write-Error "Header missing required data"
|
||||
exit;
|
||||
}
|
||||
|
||||
$InputParams = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
|
||||
$vCenterCredential = Get-AutomationPSCredential -Name 'VMware Auto'
|
||||
$SharePointCredential = Get-AutomationPSCredential -Name 'SharePoint IaaS ReadWrite'
|
||||
|
||||
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -ParticipateInCeip $false -Confirm:$false
|
||||
Connect-VIServer -Server itdvmvc1.nd.gov, itdvmvc2.nd.gov -Credential $vCenterCredential
|
||||
|
||||
$VMName = $InputParams.HostName
|
||||
$Id = $InputParams.Id
|
||||
$Duration = $InputParams.Duration
|
||||
|
||||
$VM = Get-VM -Name $VMName | where-object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
If (@($VM).count -eq 2) { $VM = Get-VM -Name $VMName -Server ($global:DefaultVIServers | Sort-Object Name | select -first 1).Name }
|
||||
|
||||
switch ($Duration) {
|
||||
{$Duration -ge 1 -and $Duration -le 7}
|
||||
{
|
||||
Write-Verbose "Duration = Snapshot"
|
||||
$VMSnapshots = $VM | Get-Snapshot | where-object Description -like "AutoSnap_$Id*"
|
||||
|
||||
If (@($VMSnapshots).count -eq 1) {
|
||||
Write-Verbose "Exactly one snapshot match found"
|
||||
$Taken = $true
|
||||
$VMSnapshot = $VMSnapshots
|
||||
$Task = ((Get-View ((Get-View ScheduledTaskManager).ScheduledTask)).info | where-object Description -like "AutoSnap_$Id*")
|
||||
}
|
||||
else {
|
||||
if (@($VMSnapshots | where-object Description -like "AutoSnap_$Id*").count -gt 1) {
|
||||
Write-Error "More than one snapshot match found, abort"
|
||||
Exit
|
||||
}
|
||||
else { Write-Verbose "Snapshot Id #$Id match not found on $VMName" }
|
||||
}
|
||||
}
|
||||
{$Duration -ge 8}
|
||||
{
|
||||
Write-Verbose "Duration = Clone"
|
||||
$VMClones = Get-VM | Where-Object Name -eq ($VMName + "_AutoClone_" + $Id)
|
||||
|
||||
If (@($VMClones).count -eq 1) {
|
||||
Write-Verbose "Exactly one clone match found"
|
||||
$Taken = $true
|
||||
$VMClone = $VMClones
|
||||
$Task = ((Get-View ((Get-View ScheduledTaskManager).ScheduledTask)).info | where-object Description -like "AutoClone_$Id*")
|
||||
}
|
||||
else {
|
||||
if (@($VMClones).count -gt 1) {
|
||||
Write-Error "More than one VM clone match found, abort"
|
||||
Exit
|
||||
}
|
||||
else { Write-Verbose "Clone Id #$Id match not found for $VMName" }
|
||||
}
|
||||
}
|
||||
Default {
|
||||
Write-Error "Duration less than zero."
|
||||
}
|
||||
}
|
||||
|
||||
If ($Taken -eq $true) {
|
||||
write-verbose "Updating SharePoint fields named Status and SnapshotTaken"
|
||||
$UrlContextInfo = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/contextinfo"
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlContextInfo;
|
||||
Method = "Post";
|
||||
UseBasicParsing = $true;
|
||||
Credential = $SharePointCredential;
|
||||
}
|
||||
$RequestDigest = Invoke-RestMethod @InvokeWebRequestParams
|
||||
$RequestDigest = $RequestDigest.GetContextWebInformation.FormDigestValue
|
||||
|
||||
$UrlList = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')"
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlList;
|
||||
UseBasicParsing = $true;
|
||||
Credential = $SharePointCredential;
|
||||
}
|
||||
$List = Invoke-RestMethod @InvokeWebRequestParams
|
||||
$ListItemEntityTypeFullName = $list.entry.content.properties.ListItemEntityTypeFullName
|
||||
|
||||
$UrlListItem = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')/items" + '?$top=10000'
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlListItem;
|
||||
Method = "Get";
|
||||
UseBasicParsing = $true;
|
||||
Headers = @{ "Accept" = "application/json;odata=verbose" };
|
||||
Credential = $SharePointCredential
|
||||
}
|
||||
$ListItems = ((Invoke-WebRequest @InvokeWebRequestParams) -creplace '"Id":', '"Idx":' | ConvertFrom-Json).d.results
|
||||
|
||||
$header = @{
|
||||
"accept" = "application/json;odata=verbose"
|
||||
"X-RequestDigest" = $RequestDigest
|
||||
"IF-MATCH" = '*'
|
||||
"X-HTTP-Method" = "MERGE"
|
||||
}
|
||||
|
||||
$RecordToModify = $ListItems | Where-Object Id -eq $InputParams.Id
|
||||
If (@($RecordToModify).count -gt 1) { Write-Error "More than one record, stopping"; break }
|
||||
$IDtoModify = $RecordToModify.ID
|
||||
|
||||
$UrlItem = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')/items($IDtoModify)"
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlItem;
|
||||
Method = "Get";
|
||||
Headers = @{ "Accept" = "application/json;odata=verbose" }
|
||||
UseBasicParsing = $true;
|
||||
Credential = $SharePointCredential
|
||||
}
|
||||
|
||||
[PSCustomObject]$SetRecord = @{
|
||||
"__metadata" = @{type = $ListItemEntityTypeFullName };
|
||||
Status = 'Taken';
|
||||
SnapshotTaken = $Task.PrevRunTime;
|
||||
AutoExpire = ($Task.Description -split '[\r\n]+')[1].split('_')[1];
|
||||
AutoDelete = ($Task.Description -split '[\r\n]+')[2].split('_')[1];
|
||||
}
|
||||
|
||||
$body = $SetRecord | ConvertTo-Json
|
||||
$InvokeWebRequestParams = @{
|
||||
|
||||
Uri = $UrlItem;
|
||||
Method = "Post";
|
||||
Body = $body;
|
||||
ContentType = "application/json;odata=verbose";
|
||||
Headers = $header;
|
||||
UseBasicParsing = $true;
|
||||
Credential = $SharePointCredential;
|
||||
}
|
||||
Invoke-RestMethod @InvokeWebRequestParams
|
||||
|
||||
Disconnect-VIServer * -Confirm:$false -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
Write-Error "Runbook must be started from webhook"
|
||||
}
|
||||
Reference in New Issue
Block a user