forked from BLC/AyposWeb
196 lines
5.2 KiB
TypeScript
196 lines
5.2 KiB
TypeScript
import axios from 'axios';
|
|
|
|
const BASE_URL = 'http://141.196.83.136:8003';
|
|
|
|
export interface StressConfig {
|
|
vms: string[];
|
|
level: 'low' | 'medium' | 'high';
|
|
force: boolean;
|
|
}
|
|
|
|
export interface StressStatus {
|
|
status: string[];
|
|
}
|
|
|
|
class StressService {
|
|
private static instance: StressService;
|
|
|
|
private constructor() {}
|
|
|
|
public static getInstance(): StressService {
|
|
if (!StressService.instance) {
|
|
StressService.instance = new StressService();
|
|
}
|
|
return StressService.instance;
|
|
}
|
|
|
|
public async startStressTest(config: StressConfig): Promise<void> {
|
|
try {
|
|
// Log the request configuration
|
|
console.log('Starting stress test with config:', {
|
|
url: `${BASE_URL}/stress/start`,
|
|
data: {
|
|
vms: config.vms,
|
|
level: config.level,
|
|
force: true
|
|
}
|
|
});
|
|
|
|
const response = await axios.post(
|
|
`${BASE_URL}/stress/start`,
|
|
{
|
|
vms: config.vms,
|
|
level: config.level,
|
|
force: true
|
|
},
|
|
{
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
timeout: 10000,
|
|
}
|
|
);
|
|
|
|
if (response.status !== 200) {
|
|
throw new Error(`Failed to start stress test: Status ${response.status}`);
|
|
}
|
|
|
|
console.log('Stress test started successfully:', response.data);
|
|
return;
|
|
} catch (error) {
|
|
// Enhanced error logging
|
|
if (axios.isAxiosError(error)) {
|
|
console.error('Axios error details:', {
|
|
status: error.response?.status,
|
|
statusText: error.response?.statusText,
|
|
data: error.response?.data,
|
|
config: {
|
|
url: error.config?.url,
|
|
method: error.config?.method,
|
|
data: error.config?.data,
|
|
headers: error.config?.headers
|
|
}
|
|
});
|
|
} else {
|
|
console.error('Non-axios error:', error);
|
|
}
|
|
throw this.handleError(error);
|
|
}
|
|
}
|
|
|
|
public async stopStressTest(vms: string[]): Promise<void> {
|
|
try {
|
|
console.log('Stopping stress test for VMs:', vms);
|
|
|
|
const response = await axios.post(
|
|
`${BASE_URL}/stress/stop`,
|
|
vms,
|
|
{
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
timeout: 10000,
|
|
}
|
|
);
|
|
|
|
if (response.status !== 200) {
|
|
throw new Error(`Failed to stop stress test: Status ${response.status}`);
|
|
}
|
|
|
|
console.log('Stress test stopped successfully:', response.data);
|
|
return;
|
|
} catch (error) {
|
|
if (axios.isAxiosError(error)) {
|
|
console.error('Axios error details:', {
|
|
status: error.response?.status,
|
|
statusText: error.response?.statusText,
|
|
data: error.response?.data,
|
|
config: {
|
|
url: error.config?.url,
|
|
method: error.config?.method,
|
|
data: error.config?.data,
|
|
headers: error.config?.headers
|
|
}
|
|
});
|
|
} else {
|
|
console.error('Non-axios error:', error);
|
|
}
|
|
throw this.handleError(error);
|
|
}
|
|
}
|
|
|
|
public async getStressStatus(vms: string[]): Promise<string[]> {
|
|
try {
|
|
console.log('Fetching stress status for VMs:', vms);
|
|
|
|
const response = await axios.post(
|
|
`${BASE_URL}/stress/status`,
|
|
vms,
|
|
{
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
timeout: 5000,
|
|
}
|
|
);
|
|
|
|
// Log the raw response for debugging
|
|
console.log('Raw stress status response:', {
|
|
status: response.status,
|
|
statusText: response.statusText,
|
|
data: response.data,
|
|
headers: response.headers
|
|
});
|
|
|
|
if (response.status !== 200) {
|
|
throw new Error(`Failed to get stress test status: ${response.status}`);
|
|
}
|
|
|
|
// Handle the new response format where data is an object with VM IPs as keys
|
|
if (response.data && typeof response.data === 'object') {
|
|
// Extract VMs that are running
|
|
const runningVMs = Object.entries(response.data)
|
|
.filter(([_, status]: [string, any]) => status.is_running)
|
|
.map(([ip]) => ip);
|
|
|
|
console.log('Running VMs:', runningVMs);
|
|
return runningVMs;
|
|
}
|
|
|
|
return [];
|
|
} catch (error) {
|
|
if (axios.isAxiosError(error)) {
|
|
console.error('Axios error details:', {
|
|
status: error.response?.status,
|
|
statusText: error.response?.statusText,
|
|
data: error.response?.data,
|
|
config: {
|
|
url: error.config?.url,
|
|
method: error.config?.method,
|
|
data: error.config?.data,
|
|
headers: error.config?.headers
|
|
}
|
|
});
|
|
} else {
|
|
console.error('Non-axios error:', error);
|
|
}
|
|
throw this.handleError(error);
|
|
}
|
|
}
|
|
|
|
private handleError(error: any): Error {
|
|
if (axios.isAxiosError(error)) {
|
|
const response = error.response;
|
|
if (response) {
|
|
return new Error(
|
|
`Server error: ${response.status} - ${JSON.stringify(response.data)}`
|
|
);
|
|
} else if (error.request) {
|
|
return new Error('No response received from server');
|
|
}
|
|
}
|
|
return new Error(`Request error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
export const stressService = StressService.getInstance();
|