Private/Get-RubrikAPIData.ps1

<#
    Helper function to retrieve API data from Rubrik
#>

function Get-RubrikAPIData($endpoint)
{
  $api = @{
    Session                   = @{
      'v1.1' = @{
        URI         = '/api/v1/session'
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = '{"userId": "11111111-2222-3333-4444-555555555555","token": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}'
        FailureCode = '422'
        FailureMock = '{"errorType":"user_error","message":"Incorrect Username/Password","cause":null}'
      }
      'v1.0' = @{
        URI         = '/api/v1/login'
        Body        = @('username', 'password')
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = '{"userId": "11111111-2222-3333-4444-555555555555","token": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}'
        FailureCode = '422'
        FailureMock = '{"errorType":"user_error","message":"Incorrect Username/Password","cause":null}'
      }
      'v0' = @{
        URI         = '/login'
        Body        = @('userId', 'password')
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = '{"status":"Success","description":"Successfully logged in","userId":"11111111-2222-3333-4444-555555555555","token":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}'
        FailureCode = '200'
        FailureMock = '{"status": "Failure","description": "Incorrect Username/Password"}'
      }
    }
    VMwareVMGet               = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm'
        Body        = ''
        Params      = @{
          Filter = 'is_relic'
          Search = 'name'
          SLA    = 'effective_sla_domain_id'
        }        
        Method      = 'Get'
        Result      = 'data'
        Filter      = @{
          '$VM' = 'name'
          '$SLA' = 'effectiveSlaDomainName'
        }
        SuccessCode = '200'
        SuccessMock = @"
{
    "hasMore": true,
    "data": [{
        "id": "11111111-2222-3333-4444-555555555555-vm-666666",
        "name": "TEST1",
        "configuredSlaDomainId": "d8a8430c-40de-4cb7-b834-bd0e7de40ed1",
        "configuredSlaDomainName": "Gold",
        "effectiveSlaDomainId": "d8a8430c-40de-4cb7-b834-bd0e7de40ed1",
        "effectiveSlaDomainName": "Gold",
        "isArchived": false,
        "inheritedSlaName": "Gold",
        "slaId": "d8a8430c-40de-4cb7-b834-bd0e7de40ed1",
        "isRelic": true
    }, {
        "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee-vm-ffffff",
        "name": "TEST2",
        "configuredSlaDomainId": "INHERIT",
        "configuredSlaDomainName": "Inherit",
        "effectiveSlaDomainId": "UNPROTECTED",
        "effectiveSlaDomainName": "Unprotected",
        "isArchived": true,
        "inheritedSlaName": "Unprotected",
        "slaId": "INHERIT",
        "isRelic": false
    }]
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/vm'
        Body        = ''
        Params      = @{
          Filter = 'archiveStatusFilterOpt'
          Search = ''
        }
        Method      = 'Get'
        Result      = ''
        Filter      = @{
          '$VM' = 'name'
          '$SLA' = 'effectiveSlaDomainName'
        }        
        SuccessCode = '200'
        SuccessMock = @"
[{
        "id": "11111111-2222-3333-4444-555555555555-vm-666666",
        "name": "TEST1",
        "configuredSlaDomainId": "d8a8430c-40de-4cb7-b834-bd0e7de40ed1",
        "configuredSlaDomainName": "Gold",
        "effectiveSlaDomainId": "d8a8430c-40de-4cb7-b834-bd0e7de40ed1",
        "effectiveSlaDomainName": "Gold",
        "isArchived": false,
        "inheritedSlaName": "Gold",
        "slaId": "d8a8430c-40de-4cb7-b834-bd0e7de40ed1",
        "isRelic": false
    }, {
        "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee-vm-ffffff",
        "name": "TEST2",
        "configuredSlaDomainId": "INHERIT",
        "configuredSlaDomainName": "Inherit",
        "effectiveSlaDomainId": "UNPROTECTED",
        "effectiveSlaDomainName": "Unprotected",
        "isArchived": true,
        "inheritedSlaName": "Unprotected",
        "slaId": "INHERIT",
        "isRelic": true
    }]
"@

        FailureCode = '500'
        FailureMock = '{"status": "Failure"}'
      }
    }
    VMwareVMSnapshotGet       = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/{id}/snapshot'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
{
  "hasMore": false,
  "data": [
    {
      "date": "2016-12-05T17:10:17Z",
      "virtualMachineName": "TEST1",
      "id": "11111111-2222-3333-4444-555555555555",
      "consistencyLevel": "CRASH_CONSISTENT"
    },
    {
      "date": "2016-12-05T13:06:35Z",
      "virtualMachineName": "TEST1",
      "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "consistencyLevel": "CRASH_CONSISTENT"
    }
  ],
  "total": 2
}
"@
        
        FailureCode = '404'
        FailureMock = '{"message":"Could not find VirtualMachine with id=11111111-2222-3333-4444-555555555555-vm-6666"}'
      }
      v0 = @{
        URI         = '/snapshot?vm={id}'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
[
    {
      "date": "2016-12-05T17:10:17Z",
      "virtualMachineName": "TEST1",
      "id": "11111111-2222-3333-4444-555555555555",
      "consistencyLevel": "CRASH_CONSISTENT"
    },
    {
      "date": "2016-12-05T13:06:35Z",
      "virtualMachineName": "TEST1",
      "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "consistencyLevel": "CRASH_CONSISTENT"
    }
]
"@

        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMMountPost         = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/mount'
        Body        = @{
          snapshotId           = 'snapshotId'
          hostId               = 'hostId'
          vmName               = 'vmName'
          disableNetwork       = 'disableNetwork'
          removeNetworkDevices = 'removeNetworkDevices'
          powerOn              = 'powerOn'
        }
        Method      = 'Post'
        SuccessCode = '202'
        SuccessMock = @"
{
  "requestId": "MOUNT_SNAPSHOT_11111111-2222-3333-4444-555555555555_66666666-7777-8888-9999-000000000000:::0",
  "status": "QUEUED",
  "links": [
    {
      "href": "https://RVM1111111111/api/v1/vmware/vm/request/MOUNT_SNAPSHOT_11111111-2222-3333-4444-555555555555_66666666-7777-8888-9999-000000000000:::0",
      "rel": "self",
      "method": "GET"
    }
  ]
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/job/type/mount'
        Body        = @{
          snapshotId           = 'snapshotId'
          hostId               = 'hostId'
          vmName               = 'vmName'
          disableNetwork       = 'disableNetwork'
          removeNetworkDevices = 'removeNetworkDevices'
          powerOn              = 'powerOn'
        }
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = @"
{
  "requestId": "MOUNT_SNAPSHOT_11111111-2222-3333-4444-555555555555_66666666-7777-8888-9999-000000000000:::0",
  "status": "QUEUED",
  "links": [
    {
      "href": "https://RVM1111111111/api/v1/vmware/vm/request/MOUNT_SNAPSHOT_11111111-2222-3333-4444-555555555555_66666666-7777-8888-9999-000000000000:::0",
      "rel": "self",
      "method": "GET"
    }
  ]
}
"@

        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMMountGet          = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/snapshot/mount'
        Params      = @{
          VMID   = 'vm_id'
        }
        Method      = 'Get'
        Result      = 'data'
        SuccessCode = '200'
        SuccessMock = @"
{
  "hasMore": false,
  "data": [
    {
      "id": "11111111-2222-3333-4444-555555555555",
      "snapshotDate": "2016-12-01T23:26:49+0000",
      "sourceVirtualMachineId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee-vm-fff",
      "sourceVirtualMachineName": "TEST1",
      "isReady": 1
    },
    {
      "id": "aaaaaaaa-2222-3333-4444-555555555555",
      "snapshotDate": "2016-12-01T23:26:49+0000",
      "sourceVirtualMachineId": "11111111-bbbb-cccc-dddd-eeeeeeeeeeee-vm-fff",
      "sourceVirtualMachineName": "TEST2",
      "isReady": 1
    }
  ],
  "total": 2
}
"@

        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMMountDelete       = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/snapshot/mount/{id}'
        Params      = @{
          Force   = 'force'
        }
        Method      = 'Delete'
        SuccessCode = '202'
        SuccessMock = @"
{
  "requestId": "UNMOUNT_SNAPSHOT_11111111-2222-3333-4444-555555555555_66666666-7777-8888-9999-000000000000:::0",
  "status": "QUEUED",
  "links": [
    {
      "href": "https://RVM1111111111/api/v1/vmware/vm/request/UNMOUNT_SNAPSHOT_11111111-2222-3333-4444-555555555555_66666666-7777-8888-9999-000000000000:::0",
      "rel": "self",
      "method": "GET"
    }
  ]
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/job/type/unmount'
        Params      = @{
          MountID = 'mountId'
          Force   = 'force'
        }        
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    ClusterVersionGet         = @{
      v1 = @{
        URI         = '/api/v1/cluster/{id}/version'
        Params      = @{
          id = 'id'
        }
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = '"9.9.9~DA9-99"'
        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/system/version'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = '"1.1.1~DA1-11"'
        FailureCode = ''
        FailureMock = ''
      }
    }
    SLADomainGet              = @{
      v1 = @{
        URI         = '/api/v1/sla_domain'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
{
  "hasMore": false,
  "data": [
    {
      "id": "11111111-2222-3333-4444-555555555555",
      "name": "TEST1",
      "numDbs": 11,
      "numFilesets": 11,
      "numLinuxHosts": 11,
      "numVms": 11
    },
    {
      "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "name": "TEST2",
      "numDbs": 22,
      "numFilesets": 22,
      "numLinuxHosts": 22,
      "numVms": 22
    }
  ],
  "total": 2
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/slaDomain'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
[
  {
    "id": "11111111-2222-3333-4444-555555555555",
    "name": "TEST1",
    "numVms": 11,
    "numSnapshots": 11
  },
  {
    "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "name": "TEST2",
    "numVms": 22,
    "numSnapshots": 22
  }
]
"@

        FailureCode = ''
        FailureMock = ''
      }
    }
    SLADomainDelete           = @{
      v1 = @{
        URI         = '/api/v1/sla_domain/{id}'
        Method      = 'Delete'
        SuccessCode = '204'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/slaDomain/{id}'
        Method      = 'Delete'
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    JobGet                    = @{
      v1 = @{
        URI         = '/api/internal/job/{id}'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
{
    "id": "CREATE_SNAPSHOT_123456-vm-123:::11",
    "status": "SUCCEEDED",
    "result": "abcdef",
    "startTime": "2016-12-27T06:17:54+0000",
    "endTime": "2016-12-27T06:25:42+0000",
    "jobType": "CREATE_SNAPSHOT",
    "nodeId": "cluster:::RVM151S001111",
    "isDisabled": false
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/job/instance/{id}'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
{
    "id": "CREATE_SNAPSHOT_123456-vm-123:::11",
    "status": "SUCCEEDED",
    "result": "abcdef",
    "startTime": "2016-12-27T06:17:54+0000",
    "endTime": "2016-12-27T06:25:42+0000",
    "jobType": "CREATE_SNAPSHOT",
    "nodeId": "cluster:::RVM151S001111",
    "isDisabled": false
}
"@

        FailureCode = ''
        FailureMock = ''
      }
    }
    ReportBackupJobsDetailGet = @{
      v1 = @{
        URI         = '/api/v1/report/backup_jobs/detail?report_type={id}'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = @"
{
   "hasMore":false,
   "data":[
      {
         "objectType":"Mssql",
         "slaDomainId":"123456",
         "durationInMillis":120000,
         "slaDomainName":"Gold",
         "location":"TEST1\\MSSQLSERVER",
         "endTime":"2016-12-26T17:41:51Z",
         "failureDescription":"Rubrik backup service at \u0027TEST1\u0027 returned error: Failed to take database snapshot, Error = VSS_E_BAD_STATE(0x80042301)",
         "scheduledTime":"2016-12-26T17:34:01Z",
         "objectId":"abcdef",
         "status":"Failed",
         "objectName":"DB1",
         "jobType":"Backup",
         "jobId":"MSSQL_DB_BACKUP_123456:::11",
         "startTime":"2016-12-26T17:39:51Z"
      }
   ]
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/report/backupJobs/detail'
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMBackupPost        = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/{id}/backup'
        Method      = 'Post'
        SuccessCode = '202'
        SuccessMock = @"
{
    "requestId": "CREATE_VMWARE_SNAPSHOT_123456:::0",
    "status": "QUEUED",
    "links": [
                  {
                      "href": "https://RVM15BS011111/api/v1/vmware/vm/request/CREATE_VMWARE_SNAPSHOT_123456:::0",
                      "rel": "self",
                      "method": "GET"
                  }
              ]
}
"@

        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/job/type/backup'
        Method      = 'Post'
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMMountPowerPost    = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/mount/{id}/power'
        Method      = 'Post'
        Params      = @{
          vmId        = $null
          powerStatus = 'powerStatus'
        }
        SuccessCode = '204'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/vm/power'
        Method      = 'Post'
        Params      = @{
          vmId        = 'vmId'
          powerStatus = 'powerState'
        }        
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMPatch             = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/{id}'
        Body        = @{
          SLA                        = 'configuredSlaDomainId'
          snapshotConsistencyMandate = 'snapshotConsistencyMandate'
          maxNestedVsphereSnapshots  = 'maxNestedVsphereSnapshots'
          isVmPaused                 = 'isVmPaused'
          preBackupScript            = @{
            scriptPath      = 'scriptPath'
            timeoutMs       = 'timeoutMs'
            failureHandling = 'failureHandling'
          }
          postSnapScript             = @{
            scriptPath      = 'scriptPath'
            timeoutMs       = 'timeoutMs'
            failureHandling = 'failureHandling'
          }
          postBackupScript           = @{
            scriptPath      = 'scriptPath'
            timeoutMs       = 'timeoutMs'
            failureHandling = 'failureHandling'
          }
        }
        Method      = 'Patch'
        Result      = 'data'
        Filter      = @{
          '$VM'    = 'name'
          '$SLA'   = 'effectiveSlaDomainName'
          '$Host'  = 'hostName'
          '$Cluster' = 'clusterName'
        }        
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
      v0 = @{
        URI         = '/vm/{id}'
        Method      = 'Patch'
        Params      = @{
          snapshotConsistencyMandate = 'snapshotConsistencyMandate'
          maxNestedVsphereSnapshots  = 'maxNestedVsphereSnapshots'
        }      
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    SLADomainPost             = @{
      v1 = @{
        URI         = '/api/v1/sla_domain'
        Method      = 'Post'
        Params      = @{
          name        = 'name'
          frequencies = @{
            timeUnit  = 'timeUnit'
            frequency = 'frequency'
            retention = 'retention'
          }
        }
        SuccessCode = '201'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    VMwareVMRequestGet        = @{
      v1 = @{
        URI         = '/api/v1/vmware/vm/request/{id}'
        Method      = 'Get'
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    MSSQLDBGet                = @{
      v1 = @{
        URI         = '/api/v1/mssql/db'
        Body        = ''
        Params      = @{
          Filter = 'archive_status'
          Search = 'search_value'
        }         
        Method      = 'Get'
        Result      = 'data'
        Filter      = @{
          '$Database' = 'name'
          '$SLA'    = 'effectiveSlaDomainName'
          '$Host'   = 'rootProperties.rootName'
          '$Instance' = 'instanceName'
        }
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      }
    }
    MSSQLDBPatch              = @{
      v1 = @{
        URI         = '/api/v1/mssql/db/{id}'
        Body        = @{
          SLA               = 'configuredSlaDomainId'
          LogBackupSeconds  = 'logBackupFrequencyInSeconds'
          LogRetentionHours = 'logRetentionHours'
          CopyOnly          = 'copyOnly'
          MaxDataStreams    = 'maxDataStreams'
        }    
        Params      = ''    
        Method      = 'Patch'
        Result      = 'data'
        Filter      = @{
          '$Database' = 'name'
          '$SLA'    = 'effectiveSlaDomainName'
          '$Host'   = 'rootProperties.rootName'
          '$Instance' = 'instanceName'
        }
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      } 
    }
    FilesetGet                = @{
      v1 = @{
        URI         = '/api/v1/fileset'
        Body        = ''   
        Params      = @{
          Filter     = 'is_relic'
          Search     = 'name'
          SearchHost = 'host_name'
          SLA        = 'effective_sla_domain_id'
        }     
        Method      = 'Get'
        Result      = 'data'
        Filter      = ''
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      } 
    }
    FilesetPatch              = @{
      v1 = @{
        URI         = '/api/v1/fileset/{id}'
        Body        = @{
          SLA = 'configuredSlaDomainId'
        }
        Params      = ''
        Method      = 'Patch'
        Result      = 'data'
        Filter      = ''
        SuccessCode = '200'
        SuccessMock = ''
        FailureCode = ''
        FailureMock = ''
      } 
    }
  } # End of API
  
  return $api.$endpoint
} # End of function