Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #48: Add the ability to include executeForEachEntryOf entry values #133

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.sentrysoftware.metricshub.engine.connector.model.common.CustomConcatMethod;
import org.sentrysoftware.metricshub.engine.connector.model.common.EntryConcatMethod;
import org.sentrysoftware.metricshub.engine.connector.model.common.IEntryConcatMethod;
import org.sentrysoftware.metricshub.engine.connector.model.monitor.task.source.CopySource;
import org.sentrysoftware.metricshub.engine.connector.model.monitor.task.source.HttpSource;
import org.sentrysoftware.metricshub.engine.connector.model.monitor.task.source.IpmiSource;
Expand Down Expand Up @@ -548,32 +550,67 @@ private void concatEntryResult(
final List<String> row,
final SourceTable sourceTableToConcat
) {
final EntryConcatMethod entryConcatMethod = source.getEntryConcatMethod() != null
? (EntryConcatMethod) source.getEntryConcatMethod()
: EntryConcatMethod.LIST;
final IEntryConcatMethod iEntryConcatMethod = source.getEntryConcatMethod();
final String rawData = sourceTableToConcat.getRawData();

switch (entryConcatMethod) {
case JSON_ARRAY:
appendJsonToArray(currentResult, rawData);
break;
case JSON_ARRAY_EXTENDED:
appendExtendedJsonToArray(currentResult, row, sourceTableToConcat);
break;
default: // LIST or empty
if (rawData != null && !rawData.isBlank()) {
joinStringValue(currentResult, rawData, "\n");
}

final List<List<String>> table = sourceTableToConcat.getTable();

if (table != null && !table.isEmpty()) {
currentResult
.getTable()
.addAll(table.stream().filter(line -> !line.isEmpty()).collect(Collectors.toCollection(ArrayList::new)));
}
break;
if (iEntryConcatMethod instanceof CustomConcatMethod customConcatMethod) {
appendCustomEntryResult(customConcatMethod, currentResult, row, rawData);
} else {
final EntryConcatMethod entryConcatMethod = iEntryConcatMethod != null
? (EntryConcatMethod) iEntryConcatMethod
: EntryConcatMethod.LIST;

switch (entryConcatMethod) {
case JSON_ARRAY:
appendJsonToArray(currentResult, rawData);
break;
case JSON_ARRAY_EXTENDED:
appendExtendedJsonToArray(currentResult, row, sourceTableToConcat);
break;
default:
if (rawData != null && !rawData.isBlank()) {
joinStringValue(currentResult, rawData, "\n");
}

final List<List<String>> table = sourceTableToConcat.getTable();

if (table != null && !table.isEmpty()) {
currentResult
.getTable()
.addAll(table.stream().filter(line -> !line.isEmpty()).collect(Collectors.toCollection(ArrayList::new)));
}
break;
}
}
}

/**
* Append the custom entry result <em>rawData</em> to the given <em>currentResult</em> {@link SourceTable}.
*
* @param customConcatMethod The {@link CustomConcatMethod} instance.
* @param currentResult The {@link SourceTable} result to update.
* @param row The row to concatenate in case we have the JSON_ARRAY_EXTENDED concatenation method.
* @param rawData The rawData to append.
*/
private void appendCustomEntryResult(
final CustomConcatMethod customConcatMethod,
final SourceTable currentResult,
final List<String> row,
final String rawData
) {
if (rawData == null) {
return;
}
String entryConcatStart = customConcatMethod.getConcatStart() != null
? replaceDynamicEntry(customConcatMethod.getConcatStart(), row)
: EMPTY;
String entryConcatEnd = customConcatMethod.getConcatEnd() != null
? replaceDynamicEntry(customConcatMethod.getConcatEnd(), row)
: EMPTY;

currentResult.setRawData(
currentResult.getRawData().concat(entryConcatStart).concat(rawData).concat(entryConcatEnd)
);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.sentrysoftware.metricshub.engine.configuration.HostConfiguration;
import org.sentrysoftware.metricshub.engine.configuration.HttpConfiguration;
import org.sentrysoftware.metricshub.engine.configuration.SnmpConfiguration;
import org.sentrysoftware.metricshub.engine.connector.model.common.CustomConcatMethod;
import org.sentrysoftware.metricshub.engine.connector.model.common.DeviceKind;
import org.sentrysoftware.metricshub.engine.connector.model.common.EntryConcatMethod;
import org.sentrysoftware.metricshub.engine.connector.model.common.ExecuteForEachEntryOf;
Expand Down Expand Up @@ -177,6 +178,62 @@ void testProcessHTTPSource() {
assertEquals(EXPECTED_RESULT, result.getRawData());
}

@Test
void testProcessHTTPSourceCustomExecuteForEachEntry() {
final HttpConfiguration httpConfiguration = HttpConfiguration
.builder()
.username(USERNAME)
.password(PASSWORD.toCharArray())
.port(161)
.timeout(120L)
.build();
final HostConfiguration hostConfiguration = HostConfiguration
.builder()
.hostname(LOCALHOST)
.hostId(LOCALHOST)
.hostType(DeviceKind.LINUX)
.configurations(Collections.singletonMap(HttpConfiguration.class, httpConfiguration))
.build();
final TelemetryManager telemetryManager = TelemetryManager.builder().hostConfiguration(hostConfiguration).build();

final HttpSource httpSource = HttpSource.builder().url(URL).build();
final CustomConcatMethod customConcatMethod = CustomConcatMethod
.builder()
.concatStart("concatStart:{")
.concatEnd("}concatEnd;")
.build();
httpSource.setExecuteForEachEntryOf(
ExecuteForEachEntryOf.builder().source(ENCLOSURE_COLLECT_SOURCE_1).concatMethod(customConcatMethod).build()
);

final SourceTable sourceTable = SourceTable
.builder()
.table(
Arrays.asList(Arrays.asList(VALUE_VAL1, VALUE_VAL2, VALUE_VAL3), Arrays.asList(VALUE_A1, VALUE_B1, VALUE_C1))
)
.build();

final HostProperties hostProperties = HostProperties.builder().build();

hostProperties.getConnectorNamespace(MY_CONNECTOR_1_NAME).addSourceTable(ENCLOSURE_COLLECT_SOURCE_1, sourceTable);

telemetryManager.setHostProperties(hostProperties);

final SourceTable expected1 = SourceTable.builder().rawData(EXPECTED_VAL_1).build();
final SourceTable expected2 = SourceTable.builder().rawData(EXPECTED_VAL_2).build();
doReturn(expected1, expected2).when(sourceProcessor).process(any(HttpSource.class));

SourceTable result = new SourceUpdaterProcessor(
sourceProcessor,
telemetryManager,
MY_CONNECTOR_1_NAME,
Map.of(MONITOR_ATTRIBUTE_ID, MONITOR_ID_ATTRIBUTE_VALUE)
)
.process(httpSource);
final String expectedResult = "concatStart:{expectedVal1}concatEnd;concatStart:{expectedVal2}concatEnd;";
assertEquals(expectedResult, result.getRawData());
}

@Test
void testProcessSNMPGetSource() {
final SnmpConfiguration snmpConfiguration = SnmpConfiguration.builder().port(161).timeout(120L).build();
Expand Down