1+ param (
2+ # Path to the environment JSON file used to identify the vCenter and Rubrik servers
3+ [Parameter (Mandatory = $true )]
4+ [ValidateScript ({Test-Path $_ })]
5+ [String ]$EnvironmentFile ,
6+ # Path to the configuration JSON file used to describe the applications being tested
7+ [Parameter (Mandatory = $true )]
8+ [ValidateScript ({Test-Path $_ })]
9+ [String ]$ConfigFile ,
10+ # Path to the folder that contains XML credential files for this build
11+ [Parameter (Mandatory = $true )]
12+ [ValidateScript ({Test-Path $_ })]
13+ [String ]$IdentityPath
14+ )
15+
16+ # Synopsis: Pull configuration details from the root config.json file
17+ task GetConfig {
18+ $script :Environment = Get-Content - Path $EnvironmentFile | ConvertFrom-Json
19+ $script :Config = Get-Content - Path $ConfigFile | ConvertFrom-Json
20+ # If a trailing backslash is omitted, this will make sure it's added to correct for future path + filename activities
21+ if ($IdentityPath.Substring ($IdentityPath.Length - 1 ) -ne ' \' ) {
22+ $script :IdentityPath += ' \'
23+ }
24+ }
25+
26+ # Synopsis: Establish connectivity to a Rubrik Cluster
27+ task ConnectRubrik {
28+ $Credential = Import-Clixml - Path ($IdentityPath + $Environment.rubrikCred )
29+ $null = Connect-Rubrik - Server $Environment.rubrikServer - Credential $Credential
30+ Write-Verbose - Message " Rubrik Status: Connected to $ ( $rubrikConnection.server ) " - Verbose
31+ }
32+
33+ # Synopsis: Establish connectivity to a VMware vCenter Server
34+ task ConnectVMware {
35+ $Credential = Import-Clixml - Path ($IdentityPath + $Environment.vmwareCred )
36+ $null = Connect-VIServer - Server $Environment.vmwareServer - Credential $Credential
37+ Write-Verbose - Message " VMware Status: Connected to $ ( $global :DefaultVIServer.Name ) " - Verbose
38+ }
39+
40+ # Synopsis: Create a Live Mount of the intended virtual machine(s)
41+ task CreateLiveMount {
42+ $i = 0
43+ # Uses a null array of Mount IDs that will be used to track the request process
44+ [Array ]$Script :MountArray = $null
45+ foreach ($VM in $Config.virtualMachines ) {
46+ # The resulting Live Mount has the network interface disabled
47+ $MountRequest = Get-RubrikVM $VM.name | Get-RubrikSnapshot - Date (Get-Date ) | New-RubrikMount - MountName $VM.mountName - PowerOn - DisableNetwork $true - Confirm:$false
48+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Request Created: $ ( $MountRequest.id ) " - Verbose
49+ $Script :MountArray += $MountRequest
50+ $i ++
51+ }
52+ }
53+
54+ # Synopsis: Validate the health of the Live Mount request and power state
55+ task ValidateLiveMount {
56+ $i = 0
57+ foreach ($Mount in $MountArray ) {
58+ while ($true ) {
59+ $ValidateRequest = (Get-RubrikRequest - id $Mount.id - Type vmware/ vm).status
60+ $ValidatePowerOn = (Get-VM - Name $Config.virtualMachines [$i ].mountName - ErrorAction:SilentlyContinue).PowerState
61+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Status: Request is $ValidateRequest , PowerState is $ValidatePowerOn " - Verbose
62+ if ($ValidateRequest -ne ' SUCCEEDED' -or $ValidatePowerOn -ne ' PoweredOn' ) {
63+ Start-Sleep 5
64+ }
65+ else {
66+ break
67+ }
68+ }
69+ $i ++
70+ }
71+ }
72+
73+ # Synopsis: Validate the health of the Live Mount VMware Tools
74+ task ValidateLiveMountTools {
75+ $i = 0
76+ foreach ($Mount in $MountArray ) {
77+ while ($true ) {
78+ $ValidateTools = (Get-VM - Name $Config.virtualMachines [$i ].mountName).ExtensionData.Guest.ToolsRunningStatus
79+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) VMware Tools Status: $ValidateTools " - Verbose
80+ if ($ValidateTools -ne ' guestToolsRunning' ) {
81+ Start-Sleep 5
82+ }
83+ else {
84+ break
85+ }
86+ }
87+ $i ++
88+ }
89+ }
90+
91+ # Synopsis: Move a Live Mount to a test network
92+ task MoveLiveMountNetwork {
93+ $i = 0
94+ foreach ($Mount in $MountArray ) {
95+ $ValidateNetwork = Get-NetworkAdapter - VM $Config.virtualMachines [$i ].mountName | Set-NetworkAdapter `
96+ - NetworkName $Config.virtualMachines [$i ].testNetwork `
97+ - Connected:$true `
98+ - Confirm:$false
99+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Network Status: $ ( $ValidateNetwork.NetworkName ) is $ ( $ValidateNetwork.ConnectionState ) " - Verbose
100+ $i ++
101+ }
102+ }
103+
104+ # Synopsis: Move a Live Mount to a test address
105+ task MoveLiveMountNetworkAddress {
106+ $i = 0
107+ foreach ($Mount in $MountArray ) {
108+ # Keeping the guest credential value local since it may only apply to the individual virtual machine in some cases
109+ $GuestCredential = Import-Clixml - Path ($IdentityPath + $ ($Config.virtualMachines [$i ].guestCred))
110+ $splat = @ {
111+ ScriptText = ' Get-NetAdapter | where {$_.Status -eq "Up"} | New-NetIPAddress -IPAddress ' + $Config.virtualMachines [$i ].testIp + ' -PrefixLength 24 -DefaultGateway ' + $Config.virtualMachines [$i ].testGateway
112+ ScriptType = ' PowerShell'
113+ VM = $Config.virtualMachines [$i ].mountName
114+ GuestCredential = $GuestCredential
115+ }
116+ $null = Invoke-VMScript @splat - ErrorAction Stop
117+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Network Address Status: Assigned to $ ( $Config.virtualMachines [$i ].testIp) " - Verbose
118+ $i ++
119+ }
120+ }
121+
122+ # Synopsis: Validate the Live Mount against one or more tests to verify the backup copy is operational
123+ task LiveMountTest {
124+ $i = 0
125+ foreach ($Mount in $MountArray ) {
126+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Test Status: Loading the following tests - $ ( $Config.virtualMachines [$i ].tasks) " - Verbose
127+ # Keeping the guest credential value local since it may only apply to the individual virtual machine in some cases
128+ # Not all tests will need a guest credential, but it's there in case required
129+ $GuestCredential = Import-Clixml - Path ($IdentityPath + $ ($Config.virtualMachines [$i ].guestCred))
130+ Invoke-Build - File .\tests.ps1 - Task $Config.virtualMachines [$i ].tasks - Config $Config.virtualMachines [$i ] - GuestCredential $GuestCredential
131+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Test Status: Testing complete" - Verbose
132+ $i ++
133+ }
134+ }
135+
136+ # Synopsis: Remove any remaining Live Mount artifacts
137+ task Cleanup {
138+ $i = 0
139+ foreach ($Mount in $MountArray ) {
140+ # The request may take a few seconds to complete, but it's not worth holding up the build waiting for the task
141+ $UnmountRequest = Get-RubrikMount - id (Get-RubrikRequest - id $Mount.id - Type vmware/ vm).links.href[0 ].split(' /' )[-1 ] | Remove-RubrikMount - Force - Confirm:$false
142+ Write-Verbose - Message " $ ( $Config.virtualMachines [$i ].mountName) Removal Status: $ ( $UnmountRequest.id ) is $ ( $UnmountRequest.status ) " - Verbose
143+ $i ++
144+ }
145+ }
146+
147+ task 1_Init `
148+ GetConfig
149+
150+ task 2_Connect `
151+ ConnectRubrik,
152+ ConnectVMware
153+
154+ task 3_LiveMount `
155+ CreateLiveMount,
156+ ValidateLiveMount,
157+ ValidateLiveMountTools
158+
159+ task 4_LiveMountNetwork `
160+ MoveLiveMountNetwork,
161+ MoveLiveMountNetworkAddress
162+
163+ task 5_Testing `
164+ LiveMountTest
165+
166+ task . `
167+ 1_Init,
168+ 2_Connect,
169+ 3_LiveMount,
170+ 4_LiveMountNetwork,
171+ 5_Testing,
172+ Cleanup
0 commit comments