Skip to content

Commit

Permalink
Merge pull request #133 from sentrysoftware/feature/issue-48-add-the-…
Browse files Browse the repository at this point in the history
…ability-to-include-executeforeachentryof-entry-values

Issue #48:  Add the ability to include executeForEachEntryOf entry values
  • Loading branch information
NassimBtk committed Mar 21, 2024
2 parents 1005d20 + 8ad0874 commit 49c69e8
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 23 deletions.
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

0 comments on commit 49c69e8

Please sign in to comment.