/*-
* ============LICENSE_START=======================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. 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.pdpx.main;
import java.util.Collections;
+import org.apache.commons.lang3.StringUtils;
import org.onap.policy.common.utils.network.NetworkUtil;
import org.onap.policy.models.pdp.concepts.PdpMessage;
import org.onap.policy.models.pdp.concepts.PdpResponseDetails;
* Current state of this XACML PDP.
*/
public class XacmlState {
- // The logger for this class
private static final Logger LOGGER = LoggerFactory.getLogger(XacmlState.class);
+ /**
+ * Unique name for the xacml-pdp JVM, used in PdpStatus messages.
+ */
+ public static final String PDP_NAME = NetworkUtil.genUniqueName("xacml");
+
/**
* The application manager.
*/
*/
private final PdpStatus status;
-
/**
* Constructs the object, initializing the state.
*/
- public XacmlState(XacmlPdpApplicationManager appManager) {
+ public XacmlState(XacmlPdpApplicationManager appManager, String pdpGroupName, String pdpType) {
this.appManager = appManager;
this.status = new PdpStatus();
- this.status.setName(NetworkUtil.getHostname());
- this.status.setPdpType("xacml");
+ this.status.setName(PDP_NAME);
+ this.status.setPdpType(pdpType);
this.status.setState(PdpState.PASSIVE);
- this.status.setSupportedPolicyTypes(appManager.getToscaPolicyTypeIdents());
this.status.setPolicies(Collections.emptyList());
+ this.status.setPdpGroup(pdpGroupName);
}
/**
* @return {@code true} if this PDP should handle the message, {@code false} otherwise
*/
public boolean shouldHandle(PdpMessage message) {
- return message.appliesTo(status.getName(), status.getPdpGroup(), status.getPdpSubgroup());
+ return message.appliesTo(status.getName(), status.getPdpGroup(), status.getPdpType());
}
/**
*
* @return a new heart beat message
*/
- public PdpStatus genHeartbeat() {
+ public synchronized PdpStatus genHeartbeat() {
// first, update status fields
status.setHealthy(XacmlPdpActivator.getCurrent().isAlive() ? PdpHealthStatus.HEALTHY
: PdpHealthStatus.NOT_HEALTHY);
* @param message message from which to update the internal state
* @return a response to the message
*/
- public PdpStatus updateInternalState(PdpStateChange message) {
+ public synchronized PdpStatus updateInternalState(PdpStateChange message) {
+ LOGGER.info("set state of {} to {}", this, message.getState());
status.setState(message.getState());
/*
* within a group/subgroup.
*/
- PdpStatus status2 = makeResponse(message);
-
- // start/stop rest controller based on state change
- handleXacmlRestController();
+ PdpStatus status2 = makeResponse(message, "");
// these fields aren't needed in the response, so clear them out to avoid sending
status2.setPolicies(null);
* @param message message from which to update the internal state
* @return a response to the message
*/
- public PdpStatus updateInternalState(PdpUpdate message) {
- status.setPdpGroup(message.getPdpGroup());
+ public synchronized PdpStatus updateInternalState(PdpUpdate message, String errMessage) {
status.setPdpSubgroup(message.getPdpSubgroup());
status.setPolicies(appManager.getToscaPolicyIdentifiers());
- return makeResponse(message);
+ return makeResponse(message, errMessage);
}
/**
*
* @return the current PdpStatus with Terminated state
*/
- public PdpStatus terminatePdpMessage() {
+ public synchronized PdpStatus terminatePdpMessage() {
+ LOGGER.info("set state of {} to {}", this, PdpState.TERMINATED);
status.setState(PdpState.TERMINATED);
return new PdpStatus(status);
}
* Makes a response to the given message, based on the current state.
*
* @param message message for which the response should be made
+ * @param errMessage the error message to be sent to PAP
* @return a new response
*/
- private PdpStatus makeResponse(PdpMessage message) {
- PdpResponseDetails resp = new PdpResponseDetails();
- resp.setResponseStatus(PdpResponseStatus.SUCCESS);
+ private PdpStatus makeResponse(PdpMessage message, String errMessage) {
+ var resp = new PdpResponseDetails();
+
+ if (StringUtils.isBlank(errMessage)) {
+ resp.setResponseStatus(PdpResponseStatus.SUCCESS);
+ } else {
+ resp.setResponseStatus(PdpResponseStatus.FAIL);
+ resp.setResponseMessage(errMessage);
+ }
resp.setResponseTo(message.getRequestId());
- PdpStatus status2 = new PdpStatus(status);
+ var status2 = new PdpStatus(status);
status2.setResponse(resp);
return status2;
}
-
- /**
- * Manages the Xacml-Pdp rest controller based on the Xacml-Pdp State.
- * Current supported states:
- * ACTIVE - rest service is running and handling requests
- * PASSIVE - rest service is not running
- */
- private void handleXacmlRestController() {
- if (status.getState() == PdpState.ACTIVE) {
- LOGGER.info("State change: {} - Starting rest controller", status.getState());
- XacmlPdpActivator.getCurrent().startXacmlRestController();
- } else if (status.getState() == PdpState.PASSIVE) {
- LOGGER.info("State change: {} - Stopping rest controller", status.getState());
- XacmlPdpActivator.getCurrent().stopXacmlRestController();
- } else {
- // unsupported state
- LOGGER.warn("Unsupported state: {}", status.getState());
- }
- }
}