test_runs_getRecentTestRuns
Retrieve recent test run details from LoadRunner Cloud for the past month, with optional filtering by project IDs to focus on specific performance test data.
Instructions
Get recent test runs details for the last month from LoadRunner Cloud. Optionally filter by projectIds.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| projectIds | No | Optional project IDs to filter the usage. |
Implementation Reference
- The main handler function `executeFunction` that fetches recent test runs license usage details from LoadRunner Cloud API for the last 30 days, optionally filtered by projectIds.const executeFunction = async ({ projectIds = '' } = {}) => { const baseUrl = process.env.LRC_BASE_URL; const tenantId = process.env.LRC_TENANT_ID; const token = await getAuthToken(); // Calculate startTime and endTime for the last 1 month const endTime = Date.now(); const startTime = endTime - 30 * 24 * 60 * 60 * 1000; // 30 days in ms try { // Construct the URL with query parameters const url = new URL(`${baseUrl}/license/usage`); url.searchParams.append('TENANTID', tenantId); if (projectIds) url.searchParams.append('projectIds', projectIds); url.searchParams.append('startTime', startTime); url.searchParams.append('endTime', endTime); // Set up headers for the request const headers = { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }; // Perform the fetch request const response = await fetch(url.toString(), { method: 'GET', headers }); // Check if the response was successful if (!response.ok) { const text = await response.text(); try { const errorData = JSON.parse(text); throw new Error(JSON.stringify(errorData)); } catch (jsonErr) { // Not JSON, log the raw text console.error('Non-JSON error response:', text); throw new Error(text); } } // Parse and return the response data const text = await response.text(); try { const data = JSON.parse(text); return data; } catch (jsonErr) { // Not JSON, log the raw text console.error('Non-JSON success response:', text); return { error: 'Received non-JSON response from API', raw: text }; } } catch (error) { console.error('Error retrieving license usage:', error); return { error: 'An error occurred while retrieving license usage.' }; } };
- The input schema definition for the tool, specifying optional projectIds parameter.function: { name: 'test_runs_getRecentTestRuns', description: 'Get recent test runs details for the last month from LoadRunner Cloud. Optionally filter by projectIds.', parameters: { type: 'object', properties: { projectIds: { type: 'string', description: 'Optional project IDs to filter the usage.' } }, required: [] } }
- lib/tools.js:7-16 (registration)The `discoverTools` function that dynamically imports all tool files listed in toolPaths and registers them by spreading their `apiTool` objects.export async function discoverTools() { const toolPromises = toolPaths.map(async (file) => { const module = await import(`../tools/${file}`); return { ...module.apiTool, path: file, }; }); return Promise.all(toolPromises); }
- tools/paths.js:1-11 (registration)The list of tool paths including the path to this tool's file, enabling its discovery and registration.export const toolPaths = [ 'loadrunner-cloud/load-runner-cloud-api/projects-get-projects.js', 'loadrunner-cloud/load-runner-cloud-api/test-runs-get-active-test-runs.js', 'loadrunner-cloud/load-runner-cloud-api/test-runs-get-test-run-transactions.js', 'loadrunner-cloud/load-runner-cloud-api/test-runs-get-test-run-summary.js', 'loadrunner-cloud/load-runner-cloud-api/test-runs-get-http-responses.js', 'loadrunner-cloud/load-runner-cloud-api/test-runs-get-test-run-recent.js', 'loadrunner-cloud/load-runner-cloud-api/projects-get-load-tests.js', 'loadrunner-cloud/load-runner-cloud-api/projects-get-load-test-scripts.js', 'loadrunner-cloud/load-runner-cloud-api/projects-get-load-test-runs.js' ];
- The `getAuthToken` helper function imported by the handler to obtain the authentication token for API requests.const getAuthToken = async () => { const baseUrl = process.env.LRC_BASE_URL; const tenantId = process.env.LRC_TENANT_ID; const clientId = process.env.LRC_CLIENT_ID; const clientSecret = process.env.LRC_CLIENT_SECRET; try { const url = new URL(`${baseUrl}/auth-client`); url.searchParams.append('TENANTID', tenantId); const headers = { 'Content-Type': 'application/json', 'accept': 'application/json' }; const body = JSON.stringify({ client_id: clientId, client_secret: clientSecret }); const response = await fetch(url.toString(), { method: 'POST', headers, body }); if (!response.ok) { const text = await response.text(); try { const errorData = JSON.parse(text); throw new Error(JSON.stringify(errorData)); } catch (jsonErr) { // Not JSON, log the raw text console.error('Non-JSON error response:', text); throw new Error(text); } } const data = await response.json(); // Adjust according to actual API response structure return data.access_token || data.token || data; } catch (error) { console.error('Error retrieving auth token:', error); return { error: 'An error occurred while retrieving auth token.' }; } };