Add new methods in the participant intermediary 15/142015/1
authorFrancescoFioraEst <francesco.fiora@est.tech>
Mon, 8 Sep 2025 07:58:09 +0000 (08:58 +0100)
committerFrancesco Fiora <francesco.fiora@est.tech>
Tue, 9 Sep 2025 07:43:42 +0000 (07:43 +0000)
Add new method getInstanceElementDto,
and new method getCompositionElementDto.

Issue-ID: POLICY-5453
Change-Id: I6e02ee1f198b11c6cb5347db2cd35c46503a3456
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java
participant/participant-intermediary/src/test/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImplTest.java

index e74b460..a2857bd 100644 (file)
@@ -85,6 +85,15 @@ public interface ParticipantIntermediaryApi {
      */
     AutomationCompositionElement getAutomationCompositionElement(UUID instanceId, UUID elementId);
 
+    /**
+     * Get an InstanceElementDto by AutomationComposition instanceId and elementId.
+     *
+     * @param instanceId the ID of the AutomationComposition Instance to update the state on
+     * @param elementId the ID of the AutomationComposition Instance Element to update the state on
+     * @return get the InstanceElementDto
+     */
+    InstanceElementDto getInstanceElementDto(UUID instanceId, UUID elementId);
+
     /**
      * Get a copy of all AutomationCompositionElementDefinition from all primed compositions.
      *
@@ -109,6 +118,15 @@ public interface ParticipantIntermediaryApi {
      */
     AutomationCompositionElementDefinition getAcElementDefinition(UUID compositionId, ToscaConceptIdentifier elementId);
 
+    /**
+     * Get a CompositionElementDto by compositionId and element definition id.
+     *
+     * @param compositionId the composition id
+     * @param elementId the element definition id
+     * @return the AutomationCompositionElementDefinition
+     */
+    CompositionElementDto getCompositionElementDto(UUID compositionId, ToscaConceptIdentifier elementId);
+
     /**
      * Send AutomationComposition Instance Element update Info to AC-runtime.
      *
index 87a16b0..2c6023b 100644 (file)
@@ -24,6 +24,9 @@ package org.onap.policy.clamp.acm.participant.intermediary.api.impl;
 import java.util.Map;
 import java.util.UUID;
 import lombok.RequiredArgsConstructor;
+import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionElementDto;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ElementState;
+import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.AutomationCompositionOutHandler;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.CacheProvider;
@@ -34,6 +37,7 @@ import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDef
 import org.onap.policy.clamp.models.acm.concepts.DeployState;
 import org.onap.policy.clamp.models.acm.concepts.LockState;
 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
 import org.onap.policy.models.base.PfUtils;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.springframework.stereotype.Component;
@@ -91,6 +95,14 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp
         return element != null ? new AutomationCompositionElement(element) : null;
     }
 
+    @Override
+    public InstanceElementDto getInstanceElementDto(UUID instanceId, UUID elementId) {
+        var element = getAutomationCompositionElement(instanceId, elementId);
+        return element == null
+            ? new InstanceElementDto(instanceId, elementId, Map.of(), Map.of(), ElementState.NOT_PRESENT)
+            : new InstanceElementDto(instanceId, elementId, element.getProperties(), element.getOutProperties());
+    }
+
     @Override
     public void sendAcDefinitionInfo(UUID compositionId, ToscaConceptIdentifier elementId,
             Map<String, Object> outProperties) {
@@ -129,4 +141,13 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp
         var acElementDefinition = acDefinition.getElements().get(elementId);
         return acElementDefinition != null ? new AutomationCompositionElementDefinition(acElementDefinition) : null;
     }
+
+    @Override
+    public CompositionElementDto getCompositionElementDto(UUID compositionId, ToscaConceptIdentifier elementId) {
+        var element = getAcElementDefinition(compositionId, elementId);
+        return element == null
+                ? new CompositionElementDto(compositionId, elementId, Map.of(), Map.of(), ElementState.NOT_PRESENT)
+                : new CompositionElementDto(compositionId, elementId,
+                element.getAutomationCompositionElementToscaNodeTemplate().getProperties(), element.getOutProperties());
+    }
 }
index c0bda78..d1919d8 100644 (file)
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
 import java.util.Map;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.acm.participant.intermediary.api.ElementState;
 import org.onap.policy.clamp.acm.participant.intermediary.api.InstanceElementDto;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.AutomationCompositionOutHandler;
 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.AcDefinition;
@@ -53,41 +54,42 @@ class ParticipantIntermediaryApiImplTest {
     private static final UUID ELEMENT_ID = UUID.randomUUID();
     private static final UUID COMPOSITION_ID = UUID.randomUUID();
     private static final ToscaConceptIdentifier DEFINITION_ELEMENT_ID = new ToscaConceptIdentifier("code", "0.0.1");
+    private static final ToscaConceptIdentifier WRONG_DEF_ELEMENT_ID = new ToscaConceptIdentifier("wrong", "0.0.1");
 
     @Test
     void testUpdateAutomationCompositionElementState() {
-        var automationComposiitonHandler = mock(AutomationCompositionOutHandler.class);
-        var apiImpl = new ParticipantIntermediaryApiImpl(automationComposiitonHandler, mock(CacheProvider.class));
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, mock(CacheProvider.class));
         apiImpl.updateAutomationCompositionElementState(AUTOMATION_COMPOSITION_ID, ELEMENT_ID, DeployState.UNDEPLOYED,
                 LockState.NONE, StateChangeResult.NO_ERROR, null);
-        verify(automationComposiitonHandler).updateAutomationCompositionElementState(AUTOMATION_COMPOSITION_ID,
+        verify(automationCompositionHandler).updateAutomationCompositionElementState(AUTOMATION_COMPOSITION_ID,
                 ELEMENT_ID, DeployState.UNDEPLOYED, LockState.NONE, StateChangeResult.NO_ERROR, null);
     }
 
     @Test
     void testUpdateCompositionState() {
-        var automationComposiitonHandler = mock(AutomationCompositionOutHandler.class);
-        var apiImpl = new ParticipantIntermediaryApiImpl(automationComposiitonHandler, mock(CacheProvider.class));
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, mock(CacheProvider.class));
         apiImpl.updateCompositionState(COMPOSITION_ID, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "");
-        verify(automationComposiitonHandler).updateCompositionState(COMPOSITION_ID, AcTypeState.PRIMED,
+        verify(automationCompositionHandler).updateCompositionState(COMPOSITION_ID, AcTypeState.PRIMED,
                 StateChangeResult.NO_ERROR, "");
     }
 
     @Test
     void testSendAcElementInfo() {
-        var automationComposiitonHandler = mock(AutomationCompositionOutHandler.class);
-        var apiImpl = new ParticipantIntermediaryApiImpl(automationComposiitonHandler, mock(CacheProvider.class));
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, mock(CacheProvider.class));
         apiImpl.sendAcElementInfo(AUTOMATION_COMPOSITION_ID, ELEMENT_ID, USE_STATE, OPERATIONAL_STATE, MAP);
-        verify(automationComposiitonHandler).sendAcElementInfo(AUTOMATION_COMPOSITION_ID, ELEMENT_ID, USE_STATE,
+        verify(automationCompositionHandler).sendAcElementInfo(AUTOMATION_COMPOSITION_ID, ELEMENT_ID, USE_STATE,
                 OPERATIONAL_STATE, MAP);
     }
 
     @Test
     void testSendAcDefinitionInfo() {
-        var automationComposiitonHandler = mock(AutomationCompositionOutHandler.class);
-        var apiImpl = new ParticipantIntermediaryApiImpl(automationComposiitonHandler, mock(CacheProvider.class));
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, mock(CacheProvider.class));
         apiImpl.sendAcDefinitionInfo(COMPOSITION_ID, DEFINITION_ELEMENT_ID, MAP);
-        verify(automationComposiitonHandler).sendAcDefinitionInfo(COMPOSITION_ID, DEFINITION_ELEMENT_ID, MAP);
+        verify(automationCompositionHandler).sendAcDefinitionInfo(COMPOSITION_ID, DEFINITION_ELEMENT_ID, MAP);
     }
 
     @Test
@@ -101,8 +103,8 @@ class ParticipantIntermediaryApiImplTest {
         acElement.setId(ELEMENT_ID);
         automationComposition.setElements(Map.of(ELEMENT_ID, acElement));
 
-        var automationComposiitonHandler = mock(AutomationCompositionOutHandler.class);
-        var apiImpl = new ParticipantIntermediaryApiImpl(automationComposiitonHandler, cacheProvider);
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, cacheProvider);
         var mapResult = apiImpl.getAutomationCompositions();
         assertEquals(map, mapResult);
 
@@ -133,8 +135,8 @@ class ParticipantIntermediaryApiImplTest {
         var map = Map.of(COMPOSITION_ID, acDefinition);
         var cacheProvider = mock(CacheProvider.class);
         when(cacheProvider.getAcElementsDefinitions()).thenReturn(map);
-        var automationComposiitonHandler = mock(AutomationCompositionOutHandler.class);
-        var apiImpl = new ParticipantIntermediaryApiImpl(automationComposiitonHandler, cacheProvider);
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, cacheProvider);
         var mapResult = apiImpl.getAcElementsDefinitions();
         assertThat(map).hasSameSizeAs(mapResult);
         assertThat(mapResult.get(COMPOSITION_ID)).isNotEmpty();
@@ -146,10 +148,10 @@ class ParticipantIntermediaryApiImplTest {
         result = apiImpl.getAcElementsDefinitions(COMPOSITION_ID);
         assertEquals(acDefinition.getElements(), result);
 
-        var element = apiImpl.getAcElementDefinition(UUID.randomUUID(), new ToscaConceptIdentifier("wrong", "0.0.1"));
+        var element = apiImpl.getAcElementDefinition(UUID.randomUUID(), WRONG_DEF_ELEMENT_ID);
         assertThat(element).isNull();
 
-        element = apiImpl.getAcElementDefinition(COMPOSITION_ID, new ToscaConceptIdentifier("wrong", "0.0.1"));
+        element = apiImpl.getAcElementDefinition(COMPOSITION_ID, WRONG_DEF_ELEMENT_ID);
         assertThat(element).isNull();
 
         element = apiImpl.getAcElementDefinition(COMPOSITION_ID, DEFINITION_ELEMENT_ID);
@@ -164,4 +166,83 @@ class ParticipantIntermediaryApiImplTest {
         assertEquals(COMPOSITION_ID, instanceElementDto.instanceId());
         assertEquals(ELEMENT_ID, instanceElementDto.elementId());
     }
+
+    @Test
+    void testGetInstanceElementDto() {
+        var automationComposition = new AutomationComposition();
+        automationComposition.setInstanceId(AUTOMATION_COMPOSITION_ID);
+        var map = Map.of(AUTOMATION_COMPOSITION_ID, automationComposition);
+        var cacheProvider = mock(CacheProvider.class);
+        when(cacheProvider.getAutomationCompositions()).thenReturn(map);
+        var acElement = new AutomationCompositionElement();
+        acElement.setId(ELEMENT_ID);
+        acElement.setProperties(MAP);
+        acElement.setOutProperties(MAP);
+        automationComposition.setElements(Map.of(ELEMENT_ID, acElement));
+
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, cacheProvider);
+        var mapResult = apiImpl.getAutomationCompositions();
+        assertEquals(map, mapResult);
+
+        var rndInstance = UUID.randomUUID();
+        var rndElementId = UUID.randomUUID();
+        var element = apiImpl.getInstanceElementDto(rndInstance, rndElementId);
+        assertThat(element).isNotNull();
+        assertEquals(rndInstance, element.instanceId());
+        assertEquals(rndElementId, element.elementId());
+        assertEquals(ElementState.NOT_PRESENT, element.state());
+
+        element = apiImpl.getInstanceElementDto(AUTOMATION_COMPOSITION_ID, rndElementId);
+        assertThat(element).isNotNull();
+        assertEquals(AUTOMATION_COMPOSITION_ID, element.instanceId());
+        assertEquals(rndElementId, element.elementId());
+        assertEquals(ElementState.NOT_PRESENT, element.state());
+
+        element = apiImpl.getInstanceElementDto(AUTOMATION_COMPOSITION_ID, ELEMENT_ID);
+        assertThat(element).isNotNull();
+        assertEquals(AUTOMATION_COMPOSITION_ID, element.instanceId());
+        assertEquals(ELEMENT_ID, element.elementId());
+        assertEquals(acElement.getProperties(), element.inProperties());
+        assertEquals(acElement.getOutProperties(), element.outProperties());
+        assertEquals(ElementState.PRESENT, element.state());
+    }
+
+    @Test
+    void testGetCompositionElementDto() {
+        var acElementDefinition = new AutomationCompositionElementDefinition();
+        acElementDefinition.setAcElementDefinitionId(DEFINITION_ELEMENT_ID);
+        acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(new ToscaNodeTemplate());
+        acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().setProperties(MAP);
+        acElementDefinition.setOutProperties(MAP);
+        var acDefinition = new AcDefinition();
+        acDefinition.setCompositionId(COMPOSITION_ID);
+        acDefinition.getElements().put(DEFINITION_ELEMENT_ID, acElementDefinition);
+        var cacheProvider = mock(CacheProvider.class);
+        when(cacheProvider.getAcElementsDefinitions()).thenReturn(Map.of(COMPOSITION_ID, acDefinition));
+        var automationCompositionHandler = mock(AutomationCompositionOutHandler.class);
+        var apiImpl = new ParticipantIntermediaryApiImpl(automationCompositionHandler, cacheProvider);
+
+        var rndCompositionId = UUID.randomUUID();
+        var element = apiImpl.getCompositionElementDto(rndCompositionId, WRONG_DEF_ELEMENT_ID);
+        assertThat(element).isNotNull();
+        assertEquals(rndCompositionId, element.compositionId());
+        assertEquals(WRONG_DEF_ELEMENT_ID, element.elementDefinitionId());
+        assertEquals(ElementState.NOT_PRESENT, element.state());
+
+        element = apiImpl.getCompositionElementDto(COMPOSITION_ID, WRONG_DEF_ELEMENT_ID);
+        assertThat(element).isNotNull();
+        assertEquals(COMPOSITION_ID, element.compositionId());
+        assertEquals(WRONG_DEF_ELEMENT_ID, element.elementDefinitionId());
+        assertEquals(ElementState.NOT_PRESENT, element.state());
+
+        element = apiImpl.getCompositionElementDto(COMPOSITION_ID, DEFINITION_ELEMENT_ID);
+        assertThat(element).isNotNull();
+        assertEquals(COMPOSITION_ID, element.compositionId());
+        assertEquals(DEFINITION_ELEMENT_ID, element.elementDefinitionId());
+        assertEquals(acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().getProperties(),
+                element.inProperties());
+        assertEquals(acElementDefinition.getOutProperties(), element.outProperties());
+        assertEquals(ElementState.PRESENT, element.state());
+    }
 }