This change introduces the Weather Sensor device type which retrieves data from public APIs, and enhances the core Host/Device interfaces to provide consistent access to inventory and items across all specialized device types. It also improves search logic and fixes several bugs identified during implementation. - Weather Sensor Extension: Added schema and recipe for a device retrieving weather data via Zabbix HTTP agent items. - Interface Enhancements: Added inventory and items fields to Host and Device interfaces to ensure all device specialized types have consistent access to monitoring and inventory data. - Search Logic Improvements: Enhanced ParsedArgs to support searchByAny and technical name (host) searches when a name pattern is provided. - Bug Fixes: - Fixed getLocations argument order in the Zabbix API datasource. - Implemented deduplication for groupids and templateids in HostImporter to prevent Zabbix duplicate value errors. - Added missing url field to CreateTemplateItem for HTTP Agent item support. - Testing: - Extended the regression test suite with 4 new automated checks covering the fixed bugs. - Updated Jest tests to accommodate the improved search parameters. - Documentation: Updated cookbook and test specifications to reflect new features and regression testing obligations.
103 lines
4.1 KiB
TypeScript
103 lines
4.1 KiB
TypeScript
import {DeleteResponse} from "../schema/generated/graphql.js";
|
|
import {
|
|
TemplateHelper,
|
|
ZabbixDeleteTemplateGroupsRequest,
|
|
ZabbixDeleteTemplatesRequest,
|
|
ZabbixQueryTemplateGroupRequest
|
|
} from "../datasources/zabbix-templates.js";
|
|
import {isZabbixErrorResult, ParsedArgs} from "../datasources/zabbix-request.js";
|
|
import {zabbixAPI} from "../datasources/zabbix-api.js";
|
|
|
|
export class TemplateDeleter {
|
|
|
|
public static async deleteTemplates(templateids: number[] | null | undefined, name_pattern?: string | null, zabbixAuthToken?: string, cookie?: string): Promise<DeleteResponse[]> {
|
|
const result: DeleteResponse[] = [];
|
|
let idsToDelete = templateids ? [...templateids] : [];
|
|
|
|
if (name_pattern) {
|
|
const foundIds = await TemplateHelper.findTemplateIdsByName([name_pattern], zabbixAPI, zabbixAuthToken, cookie);
|
|
if (foundIds) {
|
|
// Merge and deduplicate
|
|
idsToDelete = Array.from(new Set([...idsToDelete, ...foundIds]));
|
|
}
|
|
}
|
|
|
|
if (idsToDelete.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
// Zabbix template.delete accepts an array of template IDs
|
|
const deleteResult = await new ZabbixDeleteTemplatesRequest(zabbixAuthToken, cookie)
|
|
.executeRequestReturnError(zabbixAPI, new ParsedArgs(idsToDelete));
|
|
|
|
if (isZabbixErrorResult(deleteResult)) {
|
|
let errorMessage = deleteResult.error.message;
|
|
if (deleteResult.error.data) {
|
|
errorMessage += " " + (typeof deleteResult.error.data === 'string' ? deleteResult.error.data : JSON.stringify(deleteResult.error.data));
|
|
}
|
|
// If the whole batch fails, we report the error for each ID
|
|
for (const id of idsToDelete) {
|
|
result.push({
|
|
id: id,
|
|
message: errorMessage,
|
|
error: deleteResult.error
|
|
});
|
|
}
|
|
} else if (deleteResult?.templateids) {
|
|
for (const id of idsToDelete) {
|
|
result.push({
|
|
id: id,
|
|
message: `Template ${id} deleted successfully`
|
|
});
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async deleteTemplateGroups(groupids: number[] | null | undefined, name_pattern?: string | null, zabbixAuthToken?: string, cookie?: string): Promise<DeleteResponse[]> {
|
|
const result: DeleteResponse[] = [];
|
|
let idsToDelete = groupids ? [...groupids] : [];
|
|
|
|
if (name_pattern) {
|
|
const queryResult = await new ZabbixQueryTemplateGroupRequest(zabbixAuthToken, cookie)
|
|
.executeRequestReturnError(zabbixAPI, new ParsedArgs({ name_pattern: name_pattern }));
|
|
|
|
if (!isZabbixErrorResult(queryResult) && Array.isArray(queryResult)) {
|
|
const foundIds = queryResult.map(g => Number(g.groupid));
|
|
// Merge and deduplicate
|
|
idsToDelete = Array.from(new Set([...idsToDelete, ...foundIds]));
|
|
}
|
|
}
|
|
|
|
if (idsToDelete.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
const deleteResult = await new ZabbixDeleteTemplateGroupsRequest(zabbixAuthToken, cookie)
|
|
.executeRequestReturnError(zabbixAPI, new ParsedArgs(idsToDelete));
|
|
|
|
if (isZabbixErrorResult(deleteResult)) {
|
|
let errorMessage = deleteResult.error.message;
|
|
if (deleteResult.error.data) {
|
|
errorMessage += " " + (typeof deleteResult.error.data === 'string' ? deleteResult.error.data : JSON.stringify(deleteResult.error.data));
|
|
}
|
|
for (const id of idsToDelete) {
|
|
result.push({
|
|
id: id,
|
|
message: errorMessage,
|
|
error: deleteResult.error
|
|
});
|
|
}
|
|
} else if (deleteResult?.groupids) {
|
|
for (const id of idsToDelete) {
|
|
result.push({
|
|
id: id,
|
|
message: `Template group ${id} deleted successfully`
|
|
});
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|