From de7db439f3c1f141b9e40b2a4216a313e6301b90 Mon Sep 17 00:00:00 2001 From: Sky Brewer Date: Tue, 28 Oct 2025 16:06:38 +0100 Subject: [PATCH 1/5] Make processor enabled runtime --- .../processors/ChannelProcessor.java | 4 +- .../processors/ChannelProcessorInfo.java | 5 ++ .../processors/ChannelProcessorManager.java | 23 ++++++- .../processors/ChannelProcessorService.java | 16 +++-- .../processors/aa/AAChannelProcessor.java | 66 +++++++++++-------- .../application_test_multi.properties | 1 - 6 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorInfo.java diff --git a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessor.java b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessor.java index 7cf65142..7f9e82db 100644 --- a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessor.java +++ b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessor.java @@ -8,7 +8,9 @@ public interface ChannelProcessor { boolean enabled(); - String processorInfo(); + void setEnabled(boolean enabled); + + ChannelProcessorInfo processorInfo(); long process(List channels) throws JsonProcessingException; } diff --git a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorInfo.java b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorInfo.java new file mode 100644 index 00000000..a4e77d16 --- /dev/null +++ b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorInfo.java @@ -0,0 +1,5 @@ +package org.phoebus.channelfinder.processors; + +import java.util.Map; + +public record ChannelProcessorInfo(String name, boolean enabled, Map properties) {} diff --git a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorManager.java b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorManager.java index 35c7d800..209c9ddc 100644 --- a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorManager.java +++ b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorManager.java @@ -25,6 +25,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -75,10 +76,13 @@ public long processorCount() { responseCode = "200", description = "List of processor-info", content = - @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))) + @Content( + array = + @ArraySchema( + schema = @Schema(implementation = ChannelProcessorInfo.class)))) }) - @GetMapping("/info") - public List processorInfo() { + @GetMapping("/processors") + public List processorInfo() { return channelProcessorService.getProcessorsInfo(); } @@ -151,4 +155,17 @@ public long processChannels( public void processChannels(List channels) { channelProcessorService.sendToProcessors(channels); } + + @Operation(summary = "Set if the processor is enabled or not") + @PutMapping( + value = "/processor/{processorName}/enabled", + produces = {"application/json"}, + consumes = {"application/json"}) + public void setProcessorEnabled( + @PathVariable("processorName") String processorName, + @Parameter(description = "Value of enabled to set, default value: true") + @RequestParam(required = false, name = "enabled", defaultValue = "true") + Boolean enabled) { + channelProcessorService.setProcessorEnabled(processorName, enabled); + } } diff --git a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java index 3eb49071..75a25f93 100644 --- a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java +++ b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java @@ -2,6 +2,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.Spliterator; import java.util.logging.Level; import java.util.logging.Logger; @@ -28,10 +30,16 @@ long getProcessorCount() { return channelProcessors.size(); } - List getProcessorsInfo() { - return channelProcessors.stream() - .map(ChannelProcessor::processorInfo) - .collect(Collectors.toList()); + List getProcessorsInfo() { + return channelProcessors.stream().map(ChannelProcessor::processorInfo).toList(); + } + + void setProcessorEnabled(String name, boolean enabled) { + Optional processor = + channelProcessors.stream() + .filter(p -> Objects.equals(p.processorInfo().name(), name)) + .findFirst(); + processor.ifPresent(channelProcessor -> channelProcessor.setEnabled(enabled)); } /** diff --git a/src/main/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessor.java b/src/main/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessor.java index d7ad8e85..c4de947e 100644 --- a/src/main/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessor.java +++ b/src/main/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessor.java @@ -15,6 +15,7 @@ import org.phoebus.channelfinder.entity.Channel; import org.phoebus.channelfinder.entity.Property; import org.phoebus.channelfinder.processors.ChannelProcessor; +import org.phoebus.channelfinder.processors.ChannelProcessorInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @@ -64,8 +65,15 @@ public boolean enabled() { } @Override - public String processorInfo() { - Map processorProperties = + public void setEnabled(boolean enabled) { + this.aaEnabled = enabled; + } + + @Override + public ChannelProcessorInfo processorInfo() { + return new ChannelProcessorInfo( + "AAChannelProcessor", + aaEnabled, Map.of( "archiveProperty", archivePropertyName, @@ -74,8 +82,7 @@ public String processorInfo() { "Archivers", aaURLs.keySet().toString(), "AutoPauseOn", - autoPauseOptions.toString()); - return "AAChannelProcessor: ProcessProperties " + processorProperties; + autoPauseOptions.toString())); } /** @@ -199,7 +206,7 @@ private void addChannelChange( aaArchivePVS.get(archiverAlias).add(newArchiverPV); } } - + private ArchiveAction pickArchiveAction(String archiveStatus, String pvStatus) { if (archiveStatus.equals("Being archived") && (pvStatus.equals(PV_STATUS_INACTIVE))) { return ArchiveAction.PAUSE; @@ -209,14 +216,13 @@ private ArchiveAction pickArchiveAction(String archiveStatus, String pvStatus) { && !archiveStatus.equals("Paused") && pvStatus.equals(PV_STATUS_ACTIVE)) { // If archive status anything else return ArchiveAction.ARCHIVE; - } return ArchiveAction.NONE; } private Map> getArchiveActions( - Map archivePVS, ArchiverInfo archiverInfo) { + Map archivePVS, ArchiverInfo archiverInfo) { if (archiverInfo == null) { return Map.of(); } @@ -224,37 +230,43 @@ private Map> getArchiveActions( logger.log(Level.INFO, () -> String.format("Get archiver status in archiver %s", archiverInfo)); Map> result = new EnumMap<>(ArchiveAction.class); - Arrays.stream(ArchiveAction.values()).forEach(archiveAction -> result.put(archiveAction, new ArrayList<>())); + Arrays.stream(ArchiveAction.values()) + .forEach(archiveAction -> result.put(archiveAction, new ArrayList<>())); // Don't request to archive an empty list. if (archivePVS.isEmpty()) { return result; } - List> statuses = archiverClient.getStatuses(archivePVS, archiverInfo.url(), archiverInfo.alias()); + List> statuses = + archiverClient.getStatuses(archivePVS, archiverInfo.url(), archiverInfo.alias()); logger.log(Level.FINER, "Statuses {0}", statuses); - statuses.forEach(archivePVStatusJsonMap -> { - String archiveStatus = archivePVStatusJsonMap.get("status"); - String pvName = archivePVStatusJsonMap.get("pvName"); + statuses.forEach( + archivePVStatusJsonMap -> { + String archiveStatus = archivePVStatusJsonMap.get("status"); + String pvName = archivePVStatusJsonMap.get("pvName"); - if (archiveStatus == null || pvName == null) { - logger.log(Level.WARNING, "Missing status or pvName in archivePVStatusJsonMap: {0}", archivePVStatusJsonMap); - return; - } + if (archiveStatus == null || pvName == null) { + logger.log( + Level.WARNING, + "Missing status or pvName in archivePVStatusJsonMap: {0}", + archivePVStatusJsonMap); + return; + } - ArchivePVOptions archivePVOptions = archivePVS.get(pvName); - if (archivePVOptions == null) { - logger.log(Level.WARNING, "archivePVS does not contain pvName: {0}", pvName); - return; - } + ArchivePVOptions archivePVOptions = archivePVS.get(pvName); + if (archivePVOptions == null) { + logger.log(Level.WARNING, "archivePVS does not contain pvName: {0}", pvName); + return; + } - String pvStatus = archivePVOptions.getPvStatus(); - ArchiveAction action = pickArchiveAction(archiveStatus, pvStatus); + String pvStatus = archivePVOptions.getPvStatus(); + ArchiveAction action = pickArchiveAction(archiveStatus, pvStatus); - List archivePVOptionsList = result.get(action); - archivePVOptionsList.add(archivePVOptions); - }); + List archivePVOptionsList = result.get(action); + archivePVOptionsList.add(archivePVOptions); + }); return result; } - + private ArchivePVOptions createArchivePV( List policyList, Channel channel, String archiveProperty, String pvStaus) { ArchivePVOptions newArchiverPV = new ArchivePVOptions(); diff --git a/src/test/resources/application_test_multi.properties b/src/test/resources/application_test_multi.properties index 5f1b28d4..b16b4234 100644 --- a/src/test/resources/application_test_multi.properties +++ b/src/test/resources/application_test_multi.properties @@ -88,7 +88,6 @@ logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=INFO ################ Archiver Appliance Configuration Processor ################# aa.urls={'post': 'http://localhost:17664', 'query': 'http://localhost:17665'} aa.default_alias=post, query -aa.enabled=true aa.pva=false aa.archive_property_name=archive aa.archiver_property_name=archiver From 599381a81ce7c00d30b3be16dda3cebc5eb18312 Mon Sep 17 00:00:00 2001 From: Sky Brewer Date: Wed, 29 Oct 2025 09:04:52 +0100 Subject: [PATCH 2/5] Move aa processor tests into own package --- .../processors/{ => aa}/AAChannelProcessorIT.java | 4 ++-- .../{ => aa}/AAChannelProcessorMultiArchiverIT.java | 10 ++++------ .../processors/{ => aa}/AAChannelProcessorMultiIT.java | 10 ++++------ .../{ => aa}/AAChannelProcessorNoDefaultIT.java | 9 ++++----- .../{ => aa}/AAChannelProcessorNoPauseIT.java | 9 ++++----- .../{ => aa}/AAChannelProcessorStatusPauseIT.java | 9 ++++----- .../{ => aa}/AAChannelProcessorTagPauseIT.java | 9 ++++----- .../processors/{ => aa}/AAChannelProcessorTest.java | 3 +-- 8 files changed, 27 insertions(+), 36 deletions(-) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorIT.java (98%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorMultiArchiverIT.java (96%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorMultiIT.java (95%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorNoDefaultIT.java (86%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorNoPauseIT.java (84%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorStatusPauseIT.java (85%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorTagPauseIT.java (85%) rename src/test/java/org/phoebus/channelfinder/processors/{ => aa}/AAChannelProcessorTest.java (98%) diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorIT.java similarity index 98% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorIT.java index 7d3af327..8fa12e59 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorIT.java @@ -1,4 +1,4 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -21,7 +21,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; import org.phoebus.channelfinder.entity.Property; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; +import org.phoebus.channelfinder.processors.ChannelProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorMultiArchiverIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorMultiArchiverIT.java similarity index 96% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorMultiArchiverIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorMultiArchiverIT.java index 1cc76071..baeb914a 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorMultiArchiverIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorMultiArchiverIT.java @@ -1,10 +1,10 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.activeProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.archiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.inactiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.activeProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.archiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.inactiveProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -25,8 +25,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; -import org.phoebus.channelfinder.processors.aa.ArchiveAction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorMultiIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorMultiIT.java similarity index 95% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorMultiIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorMultiIT.java index 9e81bb35..dbd2d241 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorMultiIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorMultiIT.java @@ -1,10 +1,10 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.activeProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.archiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.inactiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.activeProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.archiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.inactiveProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -25,8 +25,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; -import org.phoebus.channelfinder.processors.aa.ArchiveAction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorNoDefaultIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorNoDefaultIT.java similarity index 86% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorNoDefaultIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorNoDefaultIT.java index 2a5eb0c8..69125930 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorNoDefaultIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorNoDefaultIT.java @@ -1,8 +1,8 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.activeProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.archiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.paramableAAChannelProcessorTest; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.activeProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.archiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.paramableAAChannelProcessorTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -17,7 +17,6 @@ import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; import org.phoebus.channelfinder.entity.Property; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorNoPauseIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorNoPauseIT.java similarity index 84% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorNoPauseIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorNoPauseIT.java index 410f504f..adc10c8d 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorNoPauseIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorNoPauseIT.java @@ -1,8 +1,8 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.archiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.inactiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.paramableAAChannelProcessorTest; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.archiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.inactiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.paramableAAChannelProcessorTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,7 +16,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorStatusPauseIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorStatusPauseIT.java similarity index 85% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorStatusPauseIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorStatusPauseIT.java index 3a7c0302..88885852 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorStatusPauseIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorStatusPauseIT.java @@ -1,8 +1,8 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.archiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.inactiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.paramableAAChannelProcessorTest; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.archiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.inactiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.paramableAAChannelProcessorTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,7 +16,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorTagPauseIT.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorTagPauseIT.java similarity index 85% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorTagPauseIT.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorTagPauseIT.java index 8e89d4a3..36d8988e 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorTagPauseIT.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorTagPauseIT.java @@ -1,8 +1,8 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.archiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.inactiveProperty; -import static org.phoebus.channelfinder.processors.AAChannelProcessorIT.paramableAAChannelProcessorTest; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.archiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.inactiveProperty; +import static org.phoebus.channelfinder.processors.aa.AAChannelProcessorIT.paramableAAChannelProcessorTest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,7 +16,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.phoebus.channelfinder.entity.Channel; -import org.phoebus.channelfinder.processors.aa.AAChannelProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.TestPropertySource; diff --git a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorTest.java b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorTest.java similarity index 98% rename from src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorTest.java rename to src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorTest.java index bcc19102..4bbc5113 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/AAChannelProcessorTest.java +++ b/src/test/java/org/phoebus/channelfinder/processors/aa/AAChannelProcessorTest.java @@ -1,4 +1,4 @@ -package org.phoebus.channelfinder.processors; +package org.phoebus.channelfinder.processors.aa; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -11,7 +11,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.phoebus.channelfinder.processors.aa.ArchivePVOptions; class AAChannelProcessorTest { From 7d9d3dc98371f55284cbf3de1801d79233bf8e94 Mon Sep 17 00:00:00 2001 From: Sky Brewer Date: Mon, 3 Nov 2025 11:23:27 +0100 Subject: [PATCH 3/5] Add test for the enable disable processor --- .../processors/ChannelProcessorService.java | 17 ++- .../ChannelProcessorServiceTest.java | 112 ++++++++++++++++++ .../resources/application_test.properties | 3 + 3 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java diff --git a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java index 75a25f93..a87c954a 100644 --- a/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java +++ b/src/main/java/org/phoebus/channelfinder/processors/ChannelProcessorService.java @@ -19,12 +19,20 @@ public class ChannelProcessorService { private static final Logger logger = Logger.getLogger(ChannelProcessorService.class.getName()); - @Autowired private List channelProcessors; + private final List channelProcessors; - @Autowired private TaskExecutor taskExecutor; + private final TaskExecutor taskExecutor; - @Value("${processors.chunking.size:10000}") - private int chunkSize; + private final int chunkSize; + + public ChannelProcessorService( + @Autowired List channelProcessors, + @Autowired TaskExecutor taskExecutor, + @Value("${processors.chunking.size:10000}") int chunkSize) { + this.channelProcessors = channelProcessors; + this.taskExecutor = taskExecutor; + this.chunkSize = chunkSize; + } long getProcessorCount() { return channelProcessors.size(); @@ -68,7 +76,6 @@ public void sendToProcessors(List channels) { while (true) { List chunk = new ArrayList<>(chunkSize); for (int i = 0; i < chunkSize && split.tryAdvance(chunk::add); i++) {} - ; if (chunk.isEmpty()) break; channelProcessor.process(chunk); } diff --git a/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java b/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java new file mode 100644 index 00000000..6b59f01a --- /dev/null +++ b/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java @@ -0,0 +1,112 @@ +package org.phoebus.channelfinder.processors; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.phoebus.channelfinder.entity.Channel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest() +@TestPropertySource(value = "classpath:application_test.properties") +class ChannelProcessorServiceTest { + + private ChannelProcessorService channelProcessorService; + + @Autowired private DummyProcessor dummyProcessor; + + @Configuration + static class TestConfig { + @Bean + public DummyProcessor dummyProcessor() { + return new DummyProcessor(); + } + } + + static class DummyProcessor implements ChannelProcessor { + private final AtomicBoolean enabled = new AtomicBoolean(false); + private final AtomicBoolean processed = new AtomicBoolean(false); + + @Override + public boolean enabled() { + return enabled.get(); + } + + @Override + public void setEnabled(boolean enabled) { + this.enabled.set(enabled); + } + + @Override + public ChannelProcessorInfo processorInfo() { + return new ChannelProcessorInfo("DummyProcessor", enabled.get(), Map.of()); + } + + @Override + public long process(List channels) throws JsonProcessingException { + processed.set(true); + return channels.size(); + } + + public boolean hasBeenProcessed() { + return processed.get(); + } + + public void reset() { + processed.set(false); + } + } + + @BeforeEach + void setUp() { + channelProcessorService = + new ChannelProcessorService(List.of(dummyProcessor), Runnable::run, 10); + } + + @Test + void testEnableAndDisableDummyProcessor() { + // Initially, the dummy processor should be disabled + Assertions.assertFalse( + dummyProcessor.enabled(), "Dummy processor should be disabled initially"); + + // Enable the dummy processor + channelProcessorService.setProcessorEnabled("DummyProcessor", true); + Assertions.assertTrue(dummyProcessor.enabled(), "Dummy processor should be enabled"); + + // Disable the dummy processor + channelProcessorService.setProcessorEnabled("DummyProcessor", false); + Assertions.assertFalse(dummyProcessor.enabled(), "Dummy processor should be disabled"); + } + + @Test + void testDummyProcessorProcessing() { + // Disable the dummy processor + dummyProcessor.reset(); + channelProcessorService.setProcessorEnabled("DummyProcessor", false); + Assertions.assertFalse(dummyProcessor.enabled(), "Dummy processor should be disabled"); + + // Process a channel - dummy processor should not be called + channelProcessorService.sendToProcessors( + Collections.singletonList(new Channel("test-channel"))); + Assertions.assertFalse( + dummyProcessor.hasBeenProcessed(), "Dummy processor should not have been called"); + + // Enable the dummy processor + channelProcessorService.setProcessorEnabled("DummyProcessor", true); + Assertions.assertTrue(dummyProcessor.enabled(), "Dummy processor should be enabled"); + + // Process a channel - dummy processor should be called + channelProcessorService.sendToProcessors( + Collections.singletonList(new Channel("test-channel"))); + Assertions.assertTrue( + dummyProcessor.hasBeenProcessed(), "Dummy processor should have been called"); + } +} diff --git a/src/test/resources/application_test.properties b/src/test/resources/application_test.properties index 16d8487d..9808fe11 100644 --- a/src/test/resources/application_test.properties +++ b/src/test/resources/application_test.properties @@ -85,6 +85,9 @@ channelfinder.version=@project.version@ # DEBUG level will log all requests and responses to and from the REST end points logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=INFO +################ Processor ################################################## +processors.chunking.size=10000 + ################ Archiver Appliance Configuration Processor ################# aa.urls={'default': 'http://localhost:17665'} aa.default_alias=default From 701b713c72d69b6d27904857a2e56422bd1c6d91 Mon Sep 17 00:00:00 2001 From: Sky Brewer Date: Thu, 6 Nov 2025 15:56:12 +0100 Subject: [PATCH 4/5] ChannelProcessorManager test --- .../processors/ChannelProcessorManagerIT.java | 86 +++++++++++++++++++ .../resources/application_test.properties | 6 +- 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorManagerIT.java diff --git a/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorManagerIT.java b/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorManagerIT.java new file mode 100644 index 00000000..71319021 --- /dev/null +++ b/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorManagerIT.java @@ -0,0 +1,86 @@ +package org.phoebus.channelfinder.processors; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.phoebus.channelfinder.CFResourceDescriptors; +import org.phoebus.channelfinder.ChannelScroll; +import org.phoebus.channelfinder.entity.Scroll; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.util.Base64Utils; + +@ExtendWith(SpringExtension.class) +@WebMvcTest(ChannelProcessorManager.class) +@TestPropertySource( + value = "classpath:application_test.properties", + properties = {"elasticsearch.create.indices = false"}) +class ChannelProcessorManagerIT { + + protected static final String AUTHORIZATION = + "Basic " + Base64Utils.encodeToString("admin:adminPass".getBytes()); + + @Autowired protected MockMvc mockMvc; + @MockBean ChannelScroll channelScroll; + + @Test + void testProcessorCount() throws Exception { + MockHttpServletRequestBuilder request = + get("/" + CFResourceDescriptors.CHANNEL_PROCESSOR_RESOURCE_URI + "/count"); + mockMvc.perform(request).andExpect(status().isOk()).andExpect(content().string("2")); + } + + @Test + void testProcessorsInfo() throws Exception { + MockHttpServletRequestBuilder request = + get("/" + CFResourceDescriptors.CHANNEL_PROCESSOR_RESOURCE_URI + "/processors"); + mockMvc + .perform(request) + .andExpect(status().isOk()) + .andExpect( + jsonPath("$[*].name", containsInAnyOrder("AAChannelProcessor", "DummyProcessor"))); + } + + @Test + void testProcessorEnabled() throws Exception { + MockHttpServletRequestBuilder request = + put("/" + + CFResourceDescriptors.CHANNEL_PROCESSOR_RESOURCE_URI + + "/processor/AAChannelProcessor/enabled") + .header(HttpHeaders.AUTHORIZATION, AUTHORIZATION) + .contentType("application/json") + .content("{\"enabled\": false}"); + mockMvc.perform(request).andExpect(status().isOk()); + } + + @Test + void testProcessAllChannels() throws Exception { + Mockito.when(channelScroll.query(Mockito.any())).thenReturn(new Scroll("", List.of())); + + MockHttpServletRequestBuilder request = + put("/" + CFResourceDescriptors.CHANNEL_PROCESSOR_RESOURCE_URI + "/process/all") + .header(HttpHeaders.AUTHORIZATION, AUTHORIZATION); + mockMvc.perform(request).andExpect(status().isOk()); + } + + @Test + void testProcessQuery() throws Exception { + Mockito.when(channelScroll.query(Mockito.any())).thenReturn(new Scroll("", List.of())); + MockHttpServletRequestBuilder request = + put("/" + CFResourceDescriptors.CHANNEL_PROCESSOR_RESOURCE_URI + "/process/query") + .header(HttpHeaders.AUTHORIZATION, AUTHORIZATION); + mockMvc.perform(request).andExpect(status().isOk()); + } +} diff --git a/src/test/resources/application_test.properties b/src/test/resources/application_test.properties index 9808fe11..e6dfacad 100644 --- a/src/test/resources/application_test.properties +++ b/src/test/resources/application_test.properties @@ -54,7 +54,7 @@ demo_auth.enabled = true ############## Group-->Role Mapping ############## # Customize group names here -admin-groups=cf-admins,sys-admins +admin-groups=cf-admins,sys-admins, ADMIN channel-groups=cf-channels property-groups=cf-properties tag-groups=cf-tags @@ -109,6 +109,6 @@ aa.auto_pause=pvStatus,archive ############################## Metrics ############################### #actuator management.endpoints.web.exposure.include=prometheus, metrics, health, info -metrics.tags=group4_10 -metrics.properties=group4: 10; group5: 10 +metrics.tags= +metrics.properties= metrics.updateInterval=1 \ No newline at end of file From 010fbce0f9d6f046120daafcdfbc99be911e0b46 Mon Sep 17 00:00:00 2001 From: Sky Brewer Date: Thu, 6 Nov 2025 16:47:41 +0100 Subject: [PATCH 5/5] Remove verbose comments --- .../processors/ChannelProcessorServiceTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java b/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java index 6b59f01a..88454b78 100644 --- a/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java +++ b/src/test/java/org/phoebus/channelfinder/processors/ChannelProcessorServiceTest.java @@ -73,37 +73,30 @@ void setUp() { @Test void testEnableAndDisableDummyProcessor() { - // Initially, the dummy processor should be disabled Assertions.assertFalse( dummyProcessor.enabled(), "Dummy processor should be disabled initially"); - // Enable the dummy processor channelProcessorService.setProcessorEnabled("DummyProcessor", true); Assertions.assertTrue(dummyProcessor.enabled(), "Dummy processor should be enabled"); - // Disable the dummy processor channelProcessorService.setProcessorEnabled("DummyProcessor", false); Assertions.assertFalse(dummyProcessor.enabled(), "Dummy processor should be disabled"); } @Test void testDummyProcessorProcessing() { - // Disable the dummy processor dummyProcessor.reset(); channelProcessorService.setProcessorEnabled("DummyProcessor", false); Assertions.assertFalse(dummyProcessor.enabled(), "Dummy processor should be disabled"); - // Process a channel - dummy processor should not be called channelProcessorService.sendToProcessors( Collections.singletonList(new Channel("test-channel"))); Assertions.assertFalse( dummyProcessor.hasBeenProcessed(), "Dummy processor should not have been called"); - // Enable the dummy processor channelProcessorService.setProcessorEnabled("DummyProcessor", true); Assertions.assertTrue(dummyProcessor.enabled(), "Dummy processor should be enabled"); - // Process a channel - dummy processor should be called channelProcessorService.sendToProcessors( Collections.singletonList(new Channel("test-channel"))); Assertions.assertTrue(