Add Target Poll Event in Service Events (#2981)

* Add Target Poll Event in Service Events

Signed-off-by: strailov <Stanislav.Trailov@bosch.io>

* Target poll event to service event

Signed-off-by: strailov <Stanislav.Trailov@bosch.io>

---------

Signed-off-by: strailov <Stanislav.Trailov@bosch.io>
This commit is contained in:
Stanislav Trailov
2026-03-27 10:18:37 +02:00
committed by GitHub
parent 5aafdaca6f
commit ba3a08e560
6 changed files with 58 additions and 3 deletions

View File

@@ -0,0 +1,31 @@
/**
* Copyright (c) 2026 Contributors to the Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.hawkbit.repository.event.remote.service;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.eclipse.hawkbit.repository.event.remote.TargetPollEvent;
import java.io.Serial;
/**
* Service event for {@link TargetPollEvent}. Event that needs single replica processing
*/
public class TargetPollServiceEvent extends AbstractServiceRemoteEvent<TargetPollEvent> {
@Serial
private static final long serialVersionUID = 1L;
@JsonCreator
public TargetPollServiceEvent(@JsonProperty("payload") TargetPollEvent remoteEvent) {
super(remoteEvent);
}
}

View File

@@ -70,6 +70,7 @@ import org.eclipse.hawkbit.repository.event.remote.service.TargetAssignDistribut
import org.eclipse.hawkbit.repository.event.remote.service.TargetAttributesRequestedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetCreatedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetDeletedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetPollServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetUpdatedServiceEvent;
/**
@@ -181,6 +182,7 @@ public class EventType {
TYPES.put(1005, CancelTargetAssignmentServiceEvent.class);
TYPES.put(1008, ActionCreatedServiceEvent.class);
TYPES.put(1009, ActionUpdatedServiceEvent.class);
TYPES.put(1010, TargetPollServiceEvent.class);
}
/**

View File

@@ -20,6 +20,7 @@ import org.eclipse.hawkbit.repository.event.remote.CancelTargetAssignmentEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetAssignDistributionSetEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetAttributesRequestedEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetDeletedEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetPollEvent;
import org.eclipse.hawkbit.repository.event.remote.entity.ActionCreatedEvent;
import org.eclipse.hawkbit.repository.event.remote.entity.ActionUpdatedEvent;
import org.eclipse.hawkbit.repository.event.remote.entity.TargetCreatedEvent;
@@ -31,6 +32,7 @@ import org.eclipse.hawkbit.repository.event.remote.service.TargetAssignDistribut
import org.eclipse.hawkbit.repository.event.remote.service.TargetAttributesRequestedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetCreatedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetDeletedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetPollServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetUpdatedServiceEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -74,7 +76,8 @@ public final class EventPublisherHolder {
CancelTargetAssignmentEvent.class,
TargetAttributesRequestedEvent.class,
ActionCreatedEvent.class,
ActionUpdatedEvent.class
ActionUpdatedEvent.class,
TargetPollEvent.class
);
@Autowired
@@ -181,6 +184,8 @@ public final class EventPublisherHolder {
return new ActionCreatedServiceEvent(actionCreatedEvent);
} else if (event instanceof ActionUpdatedEvent actionUpdatedEvent) {
return new ActionUpdatedServiceEvent(actionUpdatedEvent);
} else if (event instanceof TargetPollEvent targetPollEvent) {
return new TargetPollServiceEvent(targetPollEvent);
}
return null;
}

View File

@@ -45,6 +45,7 @@ import org.eclipse.hawkbit.repository.event.ApplicationEventFilter;
import org.eclipse.hawkbit.repository.event.remote.EventEntityManager;
import org.eclipse.hawkbit.repository.event.remote.EventEntityManagerHolder;
import org.eclipse.hawkbit.repository.event.remote.TargetPollEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetPollServiceEvent;
import org.eclipse.hawkbit.repository.jpa.acm.AccessController;
import org.eclipse.hawkbit.repository.jpa.aspects.ExceptionMappingAspectHandler;
import org.eclipse.hawkbit.repository.jpa.autocleanup.AutoActionCleanup;
@@ -277,7 +278,9 @@ public class JpaRepositoryConfiguration {
@Bean
@ConditionalOnMissingBean
ApplicationEventFilter applicationEventFilter(final RepositoryProperties repositoryProperties) {
return e -> e instanceof TargetPollEvent && !repositoryProperties.isPublishTargetPollEvent();
return e ->
(e instanceof TargetPollEvent || e instanceof TargetPollServiceEvent)
&& !repositoryProperties.isPublishTargetPollEvent();
}
/**

View File

@@ -28,6 +28,7 @@ import org.eclipse.hawkbit.repository.event.remote.service.TargetAssignDistribut
import org.eclipse.hawkbit.repository.event.remote.service.TargetAttributesRequestedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetCreatedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetDeletedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetPollServiceEvent;
import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.Target;
@@ -78,7 +79,8 @@ class ServiceEventsTest {
CancelTargetAssignmentEvent.class,
TargetAttributesRequestedEvent.class,
ActionCreatedEvent.class,
ActionUpdatedEvent.class
ActionUpdatedEvent.class,
TargetPollEvent.class
);
assertEquals(EventPublisherHolder.SERVICE_EVENTS, expected);
}
@@ -130,6 +132,14 @@ class ServiceEventsTest {
verify(streamBridge).send(eq("group"), any(CancelTargetAssignmentServiceEvent.class));
}
@Test
void testTargetPollEventIsSent() {
TargetPollEvent event = new TargetPollEvent();
publisher.publishEvent(event);
verify(streamBridge).send("fanout", event);
verify(streamBridge).send(eq("group"), any(TargetPollServiceEvent.class));
}
private Action mockAction() {
final Action actionMock = mock(Action.class);
final Target targetMock = mock(Target.class);

View File

@@ -38,6 +38,7 @@ import org.eclipse.hawkbit.repository.event.remote.RemoteTenantAwareEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetAssignDistributionSetEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetAttributesRequestedEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetDeletedEvent;
import org.eclipse.hawkbit.repository.event.remote.TargetPollEvent;
import org.eclipse.hawkbit.repository.event.remote.entity.ActionCreatedEvent;
import org.eclipse.hawkbit.repository.event.remote.entity.ActionUpdatedEvent;
import org.eclipse.hawkbit.repository.event.remote.entity.TargetCreatedEvent;
@@ -49,6 +50,7 @@ import org.eclipse.hawkbit.repository.event.remote.service.TargetAssignDistribut
import org.eclipse.hawkbit.repository.event.remote.service.TargetAttributesRequestedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetCreatedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetDeletedServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetPollServiceEvent;
import org.eclipse.hawkbit.repository.event.remote.service.TargetUpdatedServiceEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationListener;
@@ -180,6 +182,8 @@ public class EventVerifier extends AbstractTestExecutionListener {
modifiedEvents.add(new DynamicExpect(ActionCreatedServiceEvent.class, event.count()));
} else if (type.isAssignableFrom(ActionUpdatedEvent.class)) {
modifiedEvents.add(new DynamicExpect(ActionUpdatedServiceEvent.class, event.count()));
} else if (type.isAssignableFrom(TargetPollEvent.class)) {
modifiedEvents.add(new DynamicExpect(TargetPollServiceEvent.class, event.count()));
}
}