/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * Copyright (C) 2025-2026 OpenInfra Foundation Europe. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
return Optional.empty();
}
var job = new JpaMessageJob(identificationId.toString());
- try {
- var result = messageJobRepository.save(job);
- return Optional.of(result.getJobId());
- } catch (RuntimeException ex) {
- // already exist a job with this identificationId
- LOGGER.warn(ex.getMessage());
- }
- return Optional.empty();
+ var result = messageJobRepository.save(job);
+ return Optional.of(result.getJobId());
}
/**
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * Copyright (C) 2025-2026 OpenInfra Foundation Europe. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
-import org.hibernate.exception.ConstraintViolationException;
import org.junit.jupiter.api.Test;
import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
assertThat(opt).isEmpty();
}
- @Test
- void testCreateJobFail() {
- var messageJobRepository = mock(MessageJobRepository.class);
- var identificationId = UUID.randomUUID();
- when(messageJobRepository.save(any())).thenThrow(new ConstraintViolationException("", null, ""));
- var messageProvider = new MessageProvider(mock(MessageRepository.class), messageJobRepository);
- var opt = messageProvider.createJob(identificationId);
- assertThat(opt).isEmpty();
- }
-
@Test
void testRemoveJob() {
var messageJobRepository = mock(MessageJobRepository.class);
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2021-2025 Nordix Foundation.
+ * Copyright (C) 2021-2026 OpenInfra Foundation Europe. All rights reserved.
* ================================================================================
* Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.onap.policy.clamp.acm.runtime.supervision.scanner.MonitoringScanner;
import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Component;
/**
}
private void scanAcDefinition(UUID compositionId) {
- var optJobId = messageProvider.createJob(compositionId);
+ var optJobId = createJob(compositionId);
if (optJobId.isEmpty()) {
return;
}
private void scanAutomationComposition(UUID instanceId,
Map<UUID, AutomationCompositionDefinition> acDefinitionMap) {
- var optJobId = messageProvider.createJob(instanceId);
+ var optJobId = createJob(instanceId);
if (optJobId.isEmpty()) {
return;
}
monitoringScanner.scanAutomationComposition(instanceId, acDefinitionMap);
messageProvider.removeJob(optJobId.get());
}
+
+ /**
+ * Create new Job related to the identificationId.
+ *
+ * @param identificationId the instanceId or compositionId
+ *
+ * @return the jobId if the job has been created or empty if identificationId is already used
+ */
+ public Optional<String> createJob(UUID identificationId) {
+ try {
+ return messageProvider.createJob(identificationId);
+ } catch (DataIntegrityViolationException ex) {
+ LOGGER.debug("Job with this identificationId {} already exists", identificationId);
+ }
+ return Optional.empty();
+ }
}
/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
+ * Copyright (C) 2025-2026 OpenInfra Foundation Europe. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
package org.onap.policy.clamp.acm.runtime.liquibase;
-import org.junit.jupiter.api.Assertions;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.acm.runtime.supervision.SupervisionScanner;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.DynamicPropertyRegistry;
@Testcontainers
class HibernateValidationTest extends AbstractLiquibaseTestBase {
+ @Autowired
+ private SupervisionScanner scanner;
+
+ private static final AtomicInteger parallelCount = new AtomicInteger();
+
@DynamicPropertySource
static void overrideProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.driver-class-name", postgres::getDriverClassName);
}
- // Dummy test: Hibernate validation runs during context startup and throws exception on validation failure
@Test
- void contextStartsAndHibernateValidationPasses() {
- Assertions.assertTrue(true);
+ void createJobTest() {
+ var list = List.of(1, 2, 3, 4, 5);
+ var id = UUID.randomUUID();
+ list.stream().parallel().forEach(
+ x -> {
+ var optJob = scanner.createJob(id);
+ if (optJob.isPresent()) {
+ parallelCount.getAndIncrement();
+ }
+ }
+ );
+ assertEquals(1, parallelCount.get());
}
}
import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider;
import org.onap.policy.clamp.models.acm.utils.TimestampHelper;
+import org.springframework.dao.DataIntegrityViolationException;
class SupervisionScannerTest {
verify(phaseScanner, times(0)).scanWithPhase(any(), any(), any());
}
+ @Test
+ void testScannerJobFail() {
+ var automationComposition = new AutomationComposition();
+ automationComposition.setInstanceId(INSTANCE_ID);
+ automationComposition.setCompositionId(COMPOSITION_ID);
+ automationComposition.setDeployState(DeployState.DEPLOYING);
+ Set<UUID> set = new HashSet<>();
+ set.add(automationComposition.getInstanceId());
+ var automationCompositionProvider = mock(AutomationCompositionProvider.class);
+ when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(set);
+ when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId()))
+ .thenReturn(Optional.of(automationComposition));
+
+ var stageScanner = mock(StageScanner.class);
+ var simpleScanner = mock(SimpleScanner.class);
+ when(simpleScanner.scanMessage(any(), any())).thenReturn(new UpdateSync());
+ var phaseScanner = mock(PhaseScanner.class);
+
+ var messageProvider = mock(MessageProvider.class);
+ when(messageProvider.createJob(automationComposition.getInstanceId()))
+ .thenThrow(new DataIntegrityViolationException("", null));
+ var message = new DocMessage();
+ when(messageProvider.getAllMessages(INSTANCE_ID)).thenReturn(List.of(message));
+ when(messageProvider.findInstanceMessages()).thenReturn(Set.of(INSTANCE_ID));
+
+ var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMED);
+ var monitoringScanner = new MonitoringScanner(automationCompositionProvider, acDefinitionProvider,
+ mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner, messageProvider);
+ var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider,
+ messageProvider, monitoringScanner);
+
+ supervisionScanner.run();
+ verify(stageScanner, times(0)).scanStage(any(), any(), any(), any());
+ verify(simpleScanner, times(0)).simpleScan(any(), any());
+ verify(phaseScanner, times(0)).scanWithPhase(any(), any(), any());
+ verify(messageProvider, times(0)).removeMessage(message.getMessageId());
+ verify(messageProvider, times(0)).removeJob(JOB_ID);
+ }
+
@Test
void testScanner() {
var automationComposition = new AutomationComposition();