import java.util.UUID;
import org.junit.jupiter.api.Test;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantDefinition;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantUpdates;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.clamp.controlloop.participant.dcae.httpclient.ClampHttpClient;
import org.onap.policy.clamp.controlloop.participant.dcae.httpclient.ConsulDcaeHttpClient;
import org.onap.policy.clamp.controlloop.participant.dcae.main.parameters.ParticipantDcaeParameters;
if (loop != null) {
clampClient.undeploy(LOOP);
intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState,
- ControlLoopState.UNINITIALISED);
+ ControlLoopState.UNINITIALISED, ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
}
break;
case PASSIVE:
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
break;
case RUNNING:
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
break;
default:
LOGGER.debug("Unknown orderedstate {}", newState);
String status = ClampHttpClient.getStatusCode(loop);
if (MICROSERVICE_INSTALLED_SUCCESSFULLY.equals(status)) {
intermediaryApi.updateControlLoopElementState(element.getId(), element.getOrderedState(),
- ControlLoopState.PASSIVE);
+ ControlLoopState.PASSIVE, ParticipantMessageType.CONTROL_LOOP_UPDATE);
deployedFlag = true;
break;
}
if (!deployedFlag) {
LOGGER.warn("DCAE is not deployed properly, ClElement state will be UNINITIALISED2PASSIVE");
intermediaryApi.updateControlLoopElementState(element.getId(), element.getOrderedState(),
- ControlLoopState.UNINITIALISED2PASSIVE);
+ ControlLoopState.UNINITIALISED2PASSIVE, ParticipantMessageType.CONTROL_LOOP_UPDATE);
}
}
} catch (PfModelException e) {
private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
private static final Coder CODER = new StandardCoder();
private static final String TOSCA_TEMPLATE_YAML = "examples/controlloop/PMSubscriptionHandling.yaml";
- private static final String CONTROL_LOOP_ELEMENT = "ControlLoopElement";
+ private static final String CONTROL_LOOP_ELEMENT = "org.onap.policy.clamp.controlloop.ControlLoopElement";
/**
* Method to create a controlLoop from a yaml file.
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
import org.onap.policy.clamp.controlloop.participant.kubernetes.exception.ServiceException;
try {
chartService.uninstallChart(chart);
intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState,
- ControlLoopState.UNINITIALISED);
+ ControlLoopState.UNINITIALISED, ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
chartMap.remove(controlLoopElementId);
podStatusMap.remove(chart.getReleaseName());
} catch (ServiceException se) {
}
break;
case PASSIVE:
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
break;
case RUNNING:
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
break;
default:
LOGGER.warn("cannot transition from state {} to state {}", currentState, newState);
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
import org.onap.policy.clamp.controlloop.participant.policy.client.PolicyApiHttpClient;
}
break;
case PASSIVE:
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.PASSIVE,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
break;
case RUNNING:
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.RUNNING,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
break;
default:
LOGGER.debug("Unknown orderedstate {}", newState);
apiHttpClient.deletePolicyType(policyType.getKey(), policyType.getValue());
}
policyTypeMap.clear();
- intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.UNINITIALISED);
+ intermediaryApi.updateControlLoopElementState(controlLoopElementId, newState, ControlLoopState.UNINITIALISED,
+ ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
}
/**
public void controlLoopElementUpdate(ControlLoopElement element, ToscaNodeTemplate clElementDefinition)
throws PfModelException {
intermediaryApi.updateControlLoopElementState(element.getId(), element.getOrderedState(),
- ControlLoopState.PASSIVE);
+ ControlLoopState.PASSIVE, ParticipantMessageType.CONTROL_LOOP_UPDATE);
ToscaServiceTemplate controlLoopDefinition = intermediaryApi.getToscaServiceTemplate();
if (controlLoopDefinition.getToscaTopologyTemplate() != null) {
if (controlLoopDefinition.getPolicyTypes() != null) {
@Test
void testParticipantStatusHeartbeat() throws Exception {
- final ParticipantStatus heartbeat = new ParticipantStatus();
- heartbeat.setParticipantId(getParticipantId());
- ControlLoopInfo clInfo = getControlLoopInfo(getControlLoopId());
- clInfo.setControlLoopId(getControlLoopId());
- heartbeat.setControlLoopInfoList(List.of(clInfo));
-
- ControlLoopElementDefinition clDefinition = getClElementDefinition();
- List<ControlLoopElementDefinition> controlLoopElementDefinitionList =
- List.of(clDefinition);
- ParticipantDefinition participantDefinition = new ParticipantDefinition();
- participantDefinition.setParticipantId(getParticipantId());
- participantDefinition.setControlLoopElementDefinitionList(controlLoopElementDefinitionList);
- List<ParticipantDefinition> participantDefinitionUpdates = List.of(participantDefinition);
- heartbeat.setParticipantDefinitionUpdates(participantDefinitionUpdates);
-
+ final ParticipantStatus heartbeat = participantHandler.makeHeartbeat(true);
synchronized (lockit) {
ParticipantMessagePublisher publisher =
new ParticipantMessagePublisher(Collections.singletonList(Mockito.mock(TopicSink.class)));
private static final Coder CODER = new StandardCoder();
static CommonTestData commonTestData = new CommonTestData();
private static final Logger LOGGER = LoggerFactory.getLogger(TestListenerUtils.class);
- private static final String CONTROL_LOOP_ELEMENT = "ControlLoopElement";
+ private static final String CONTROL_LOOP_ELEMENT = "org.onap.policy.clamp.controlloop.ControlLoopElement";
private TestListenerUtils() {}
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.clamp.controlloop.models.messages.rest.TypedSimpleResponse;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
import org.springframework.stereotype.Service;
public TypedSimpleResponse<ControlLoopElement> updateControlLoopElement(ControlLoopElement element) {
TypedSimpleResponse<ControlLoopElement> response = new TypedSimpleResponse<>();
response.setResponse(intermediaryApi.updateControlLoopElementState(element.getId(), element.getOrderedState(),
- element.getState()));
+ element.getState(), ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE));
return response;
}
private static final Coder CODER = new StandardCoder();
static CommonTestData commonTestData = new CommonTestData();
private static final Logger LOGGER = LoggerFactory.getLogger(TestListenerUtils.class);
- private static final String CONTROL_LOOP_ELEMENT = "ControlLoopElement";
+ private static final String CONTROL_LOOP_ELEMENT = "org.onap.policy.clamp.controlloop.ControlLoopElement";
private TestListenerUtils() {}
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
* @return ControlLoopElement updated control loop element
*/
ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState currentState,
- ControlLoopState newState);
+ ControlLoopState newState, ParticipantMessageType messageType);
/**
* Update the control loop element statistics.
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
@Override
public ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState currentState,
- ControlLoopState newState) {
- return participantHandler.getControlLoopHandler().updateControlLoopElementState(id, currentState, newState);
+ ControlLoopState newState, ParticipantMessageType messageType) {
+ return participantHandler.getControlLoopHandler().updateControlLoopElementState(id, currentState, newState,
+ messageType);
}
@Override
* Dispatch a heartbeat for this participant.
*/
public void sendHeartbeat() {
- publisher.sendHeartbeat(participantHandler.makeHeartbeat());
+ publisher.sendHeartbeat(participantHandler.makeHeartbeat(false));
}
/**
private ToscaConceptIdentifier participantId = null;
private MessageSender messageSender = null;
+ @Getter
private final Map<ToscaConceptIdentifier, ControlLoop> controlLoopMap = new LinkedHashMap<>();
@Getter
* @return controlLoopElement the updated controlloop element
*/
public ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState orderedState,
- ControlLoopState newState) {
+ ControlLoopState newState, ParticipantMessageType messageType) {
if (id == null) {
LOGGER.warn("Cannot update Control loop element state, id is null");
}
var controlLoop = controlLoopMap.get(stateChangeMsg.getControlLoopId());
+ var controlLoopAck = new ControlLoopAck(ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
if (controlLoop == null) {
+ controlLoopAck.setMessage("Control loop " + stateChangeMsg.getControlLoopId()
+ + " does not use this participant " + participantId);
+ controlLoopAck.setResult(false);
+ controlLoopAck.setResponseTo(stateChangeMsg.getMessageId());
+ controlLoopAck.setControlLoopId(stateChangeMsg.getControlLoopId());
+ messageSender.sendAckResponse(controlLoopAck);
LOGGER.debug("Control loop {} does not use this participant", stateChangeMsg.getControlLoopId());
return;
}
- var controlLoopStateChangeAck = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK);
- controlLoopStateChangeAck.setResponseTo(stateChangeMsg.getMessageId());
- controlLoopStateChangeAck.setControlLoopId(stateChangeMsg.getControlLoopId());
- handleState(controlLoop, controlLoopStateChangeAck, stateChangeMsg.getOrderedState());
- messageSender.sendAckResponse(controlLoopStateChangeAck);
+ handleState(controlLoop, stateChangeMsg.getOrderedState());
}
/**
* Method to handle state changes.
*
* @param controlLoop participant response
- * @param response participant response
* @param orderedState controlloop ordered state
*/
- private void handleState(final ControlLoop controlLoop, final ControlLoopAck response,
- ControlLoopOrderedState orderedState) {
+ private void handleState(final ControlLoop controlLoop, ControlLoopOrderedState orderedState) {
switch (orderedState) {
case UNINITIALISED:
- handleUninitialisedState(controlLoop, orderedState, response);
+ handleUninitialisedState(controlLoop, orderedState);
break;
case PASSIVE:
- handlePassiveState(controlLoop, orderedState, response);
+ handlePassiveState(controlLoop, orderedState);
break;
case RUNNING:
- handleRunningState(controlLoop, orderedState, response);
+ handleRunningState(controlLoop, orderedState);
break;
default:
LOGGER.debug("StateChange message has no state, state is null {}", controlLoop.getDefinition());
// TODO: Updates to existing ControlLoops are not supported yet (Addition/Removal of ControlLoop
// elements to existing ControlLoop has to be supported).
if (controlLoop != null) {
- controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId());
- controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId());
controlLoopUpdateAck.setMessage("Control loop " + updateMsg.getControlLoopId()
+ " already defined on participant " + participantId);
controlLoopUpdateAck.setResult(false);
+ controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId());
+ controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId());
messageSender.sendAckResponse(controlLoopUpdateAck);
return;
}
controlLoop.setDefinition(updateMsg.getControlLoopId());
controlLoop.setElements(clElementMap);
controlLoopMap.put(updateMsg.getControlLoopId(), controlLoop);
-
- controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId());
- controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId());
- controlLoopUpdateAck.setMessage("Control loop " + updateMsg.getControlLoopId()
- + " defined on participant " + participantId);
- controlLoopUpdateAck.setResult(true);
- messageSender.sendAckResponse(controlLoopUpdateAck);
}
private ToscaNodeTemplate getClElementNodeTemplate(List<ControlLoopElementDefinition> clElementDefinitions,
*
* @param controlLoop participant response
* @param orderedState orderedState
- * @param response participant response
*/
- private void handleUninitialisedState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
- final ControlLoopAck response) {
- handleStateChange(controlLoop, orderedState, ControlLoopState.UNINITIALISED, response);
+ private void handleUninitialisedState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState) {
+ handleStateChange(controlLoop, orderedState, ControlLoopState.UNINITIALISED);
controlLoopMap.remove(controlLoop.getKey().asIdentifier());
for (ControlLoopElementListener clElementListener : listeners) {
*
* @param controlLoop participant response
* @param orderedState orderedState
- * @param response participant response
*/
- private void handlePassiveState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
- final ControlLoopAck response) {
- handleStateChange(controlLoop, orderedState, ControlLoopState.PASSIVE, response);
+ private void handlePassiveState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState) {
+ handleStateChange(controlLoop, orderedState, ControlLoopState.PASSIVE);
}
/**
*
* @param controlLoop participant response
* @param orderedState orderedState
- * @param response participant response
*/
- private void handleRunningState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
- final ControlLoopAck response) {
- handleStateChange(controlLoop, orderedState, ControlLoopState.RUNNING, response);
+ private void handleRunningState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState) {
+ handleStateChange(controlLoop, orderedState, ControlLoopState.RUNNING);
}
/**
* @param controlLoop participant status in memory
* @param orderedState orderedState the new ordered state the participant should have
* @param newState new state of the control loop elements
- * @param response the response to the state change request
*/
private void handleStateChange(ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
- ControlLoopState newState, ControlLoopAck response) {
+ ControlLoopState newState) {
if (orderedState.equals(controlLoop.getOrderedState())) {
- response.setMessage("Control loop is already in state " + orderedState);
- response.setResult(false);
+ var controlLoopAck = new ControlLoopAck(ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE);
+ controlLoopAck.setMessage("Control loop is already in state" + orderedState);
+ controlLoopAck.setResult(false);
+ controlLoopAck.setControlLoopId(controlLoop.getDefinition());
+ messageSender.sendAckResponse(controlLoopAck);
return;
}
});
}
- response.setMessage("ControlLoop state changed from " + controlLoop.getOrderedState() + " to " + orderedState);
- response.setResult(true);
controlLoop.setOrderedState(orderedState);
}
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopInfo;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopStatistics;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantDefinition;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
* @param participantStatusReqMsg participant participantStatusReq message
*/
public void handleParticipantStatusReq(final ParticipantStatusReq participantStatusReqMsg) {
- sender.sendParticipantStatus(makeHeartbeat());
+ sender.sendParticipantStatus(makeHeartbeat(true));
}
/**
}
toscaServiceTemplate = participantUpdateMsg.getToscaServiceTemplate();
- for (ParticipantDefinition participantDefinition : participantUpdateMsg.getParticipantDefinitionUpdates()) {
- if (participantDefinition.getParticipantId().equals(participantType)) {
- clElementDefsOnThisParticipant = participantDefinition.getControlLoopElementDefinitionList();
+ if (toscaServiceTemplate != null) {
+ // This message is to commission the controlloop
+ for (ParticipantDefinition participantDefinition : participantUpdateMsg.getParticipantDefinitionUpdates()) {
+ if (participantDefinition.getParticipantId().equals(participantType)) {
+ clElementDefsOnThisParticipant = participantDefinition.getControlLoopElementDefinitionList();
+ break;
+ }
}
+ } else {
+ // This message is to decommision the controlloop
+ clElementDefsOnThisParticipant.clear();
}
sendParticipantUpdateAck(participantUpdateMsg.getMessageId());
}
/**
* Method to send heartbeat to controlloop runtime.
*/
- public ParticipantStatus makeHeartbeat() {
+ public ParticipantStatus makeHeartbeat(boolean responseToParticipantStatusReq) {
this.participantStatistics.setState(state);
this.participantStatistics.setHealthStatus(healthStatus);
this.participantStatistics.setTimeStamp(Instant.now());
heartbeat.setParticipantType(participantType);
heartbeat.setHealthStatus(healthStatus);
heartbeat.setState(state);
+ heartbeat.setControlLoopInfoList(getControlLoopInfoList());
+
+ if (responseToParticipantStatusReq) {
+ List<ParticipantDefinition> participantDefinitionUpdates = new ArrayList<>();
+ ParticipantDefinition participantDefinition = new ParticipantDefinition();
+ participantDefinition.setParticipantId(participantId);
+ participantDefinition.setControlLoopElementDefinitionList(clElementDefsOnThisParticipant);
+ participantDefinitionUpdates.add(participantDefinition);
+ heartbeat.setParticipantDefinitionUpdates(participantDefinitionUpdates);
+ }
+
return heartbeat;
}
+
+ private List<ControlLoopInfo> getControlLoopInfoList() {
+ List<ControlLoopInfo> controlLoopInfoList = new ArrayList<>();
+ for (Map.Entry<ToscaConceptIdentifier, ControlLoop> entry :
+ controlLoopHandler.getControlLoopMap().entrySet()) {
+ ControlLoopInfo clInfo = new ControlLoopInfo();
+ clInfo.setControlLoopId(entry.getKey());
+ ControlLoopStatistics clStatitistics = new ControlLoopStatistics();
+ clStatitistics.setControlLoopId(entry.getKey());
+ ClElementStatisticsList clElementStatisticsList = new ClElementStatisticsList();
+ clElementStatisticsList.setClElementStatistics(
+ entry.getValue().getControlLoopElementStatisticsList(entry.getValue()));
+ clStatitistics.setClElementStatisticsList(clElementStatisticsList);
+ clInfo.setControlLoopStatistics(clStatitistics);
+ clInfo.setState(entry.getValue().getState());
+ }
+ return controlLoopInfoList;
+ }
}
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
participantUpdateMessage.getParticipantType(), false);
}
+ /**
+ * Handle a ControlLoop update acknowledge message from a participant.
+ *
+ * @param controlLoopAckMessage the ControlLoopAck message received from a participant
+ */
+ @MessageIntercept
+ public void handleControlLoopUpdateAckMessage(ControlLoopAck controlLoopAckMessage) {
+ LOGGER.debug("ControlLoop Update Ack message received {}", controlLoopAckMessage);
+ }
+
+ /**
+ * Handle a ControlLoop statechange acknowledge message from a participant.
+ *
+ * @param controlLoopAckMessage the ControlLoopAck message received from a participant
+ */
+ @MessageIntercept
+ public void handleControlLoopStateChangeAckMessage(ControlLoopAck controlLoopAckMessage) {
+ LOGGER.debug("ControlLoop StateChange Ack message received {}", controlLoopAckMessage);
+ }
+
/**
* Supervise a control loop, performing whatever actions need to be performed on the control loop.
*
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.runtime.supervision.comm;
+
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
+import org.onap.policy.clamp.controlloop.runtime.config.messaging.Listener;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * Listener for ControlLoopStateChangeAck messages sent by participants.
+ */
+@Component
+public class ControlLoopStateChangeAckListener extends ScoListener<ControlLoopAck> implements Listener {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopStateChangeAckListener.class);
+
+ private final SupervisionHandler supervisionHandler;
+
+ /**
+ * Constructs the object.
+ */
+ public ControlLoopStateChangeAckListener(SupervisionHandler supervisionHandler) {
+ super(ControlLoopAck.class);
+ this.supervisionHandler = supervisionHandler;
+ }
+
+ @Override
+ public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+ final ControlLoopAck controlLoopStateChangeAckMessage) {
+ LOGGER.debug("ControlLoopStateChangeAck received from participant - {}", controlLoopStateChangeAckMessage);
+ supervisionHandler.handleControlLoopStateChangeAckMessage(controlLoopStateChangeAckMessage);
+ }
+
+ @Override
+ public ScoListener<ControlLoopAck> getScoListener() {
+ return this;
+ }
+
+ @Override
+ public String getType() {
+ return ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK.name();
+ }
+}
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.runtime.supervision.comm;
+
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
+import org.onap.policy.clamp.controlloop.runtime.config.messaging.Listener;
+import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.endpoints.listeners.ScoListener;
+import org.onap.policy.common.utils.coder.StandardCoderObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * Listener for ControlLoopUpdateAck messages sent by participants.
+ */
+@Component
+public class ControlLoopUpdateAckListener extends ScoListener<ControlLoopAck> implements Listener {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControlLoopUpdateAckListener.class);
+
+ private final SupervisionHandler supervisionHandler;
+
+ /**
+ * Constructs the object.
+ */
+ public ControlLoopUpdateAckListener(SupervisionHandler supervisionHandler) {
+ super(ControlLoopAck.class);
+ this.supervisionHandler = supervisionHandler;
+ }
+
+ @Override
+ public void onTopicEvent(final CommInfrastructure infra, final String topic, final StandardCoderObject sco,
+ final ControlLoopAck controlLoopUpdateAckMessage) {
+ LOGGER.debug("ControlLoopUpdateAck message received from participant - {}", controlLoopUpdateAckMessage);
+ supervisionHandler.handleControlLoopUpdateAckMessage(controlLoopUpdateAckMessage);
+ }
+
+ @Override
+ public ScoListener<ControlLoopAck> getScoListener() {
+ return this;
+ }
+
+ @Override
+ public String getType() {
+ return ParticipantMessageType.CONTROLLOOP_UPDATE_ACK.name();
+ }
+}
import java.time.Instant;
import java.util.ArrayList;
-import java.util.LinkedHashMap;
import java.util.List;
-import java.util.Map;
import java.util.UUID;
import lombok.AllArgsConstructor;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantDefinition;
import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantUpdates;
import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopUpdate;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
public class ParticipantUpdatePublisher extends AbstractParticipantPublisher<ParticipantUpdate> {
private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantUpdatePublisher.class);
- private static final String CONTROL_LOOP_ELEMENT = "ControlLoopElement";
- private final PolicyModelsProvider modelsProvider;
+ private static final String CONTROL_LOOP_ELEMENT = "org.onap.policy.clamp.controlloop.ControlLoopElement";
private static final Coder CODER = new StandardCoder();
+ private final PolicyModelsProvider modelsProvider;
/**
* Send ParticipantUpdate to Participant.
* @param participantType the participant Type
*/
public void send(ToscaConceptIdentifier participantId, ToscaConceptIdentifier participantType,
- boolean commissionFlag) {
+ boolean commissionFlag) {
var message = new ParticipantUpdate();
message.setParticipantId(participantId);
message.setParticipantType(participantType);
private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
private static final String TOSCA_TEMPLATE_YAML =
"src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
- private static final String CONTROL_LOOP_ELEMENT = "ControlLoopElement";
+ private static final String CONTROL_LOOP_ELEMENT = "org.onap.policy.clamp.controlloop.ControlLoopElement";
private static final Coder CODER = new StandardCoder();
/**