diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpHearbeatPublisher.java (renamed from main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpHeartbeatPublisher.java) | 25 | ||||
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpMessage.java | 54 | ||||
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpUpdatePublisher.java | 66 | ||||
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java | 12 | ||||
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpUpdateListener.java | 62 | ||||
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java | 31 | ||||
-rw-r--r-- | main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java | 18 |
7 files changed, 247 insertions, 21 deletions
diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpHeartbeatPublisher.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpHearbeatPublisher.java index fe730208..0dc8bf54 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpHeartbeatPublisher.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpHearbeatPublisher.java @@ -23,31 +23,34 @@ package org.onap.policy.pdpx.main.comm; import java.util.Timer; import java.util.TimerTask; import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient; +import org.onap.policy.models.pdp.concepts.PdpStateChange; import org.onap.policy.models.pdp.enums.PdpState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class XacmlPdpHeartbeatPublisher extends TimerTask { +public class XacmlPdpHearbeatPublisher extends TimerTask { - private static final Logger LOGGER = LoggerFactory.getLogger(XacmlPdpHeartbeatPublisher.class); + private static final Logger LOGGER = LoggerFactory.getLogger(XacmlPdpHearbeatPublisher.class); - private TopicSinkClient topicSinkClient; private Timer timer; private XacmlPdpMessage heartbeatMessage; - private PdpState pdpState; - + private Object message; + private static TopicSinkClient topicSinkClient; private static volatile boolean alive = false; + public static PdpState pdpState; + /** - * Constructor for instantiating XacmlPdpHeartbeatPublisher. + * Constructor for instantiating XacmlPdpPublisher. * - * @param state of the PDP + * @param message of the PDP * @param topicSinkClient used to send heartbeat message */ - public XacmlPdpHeartbeatPublisher(TopicSinkClient topicSinkClient, PdpState state) { + public XacmlPdpHearbeatPublisher(TopicSinkClient topicSinkClient, PdpStateChange message) { + this.message = message; + this.pdpState = message.getState(); this.topicSinkClient = topicSinkClient; this.heartbeatMessage = new XacmlPdpMessage(); - this.pdpState = state; timer = new Timer(false); timer.scheduleAtFixedRate(this, 0, 60000); // time interval temp hard coded now but will be parameterized setAlive(true); @@ -55,7 +58,7 @@ public class XacmlPdpHeartbeatPublisher extends TimerTask { @Override public void run() { - topicSinkClient.send(heartbeatMessage.formatStatusMessage(pdpState)); + topicSinkClient.send(heartbeatMessage.formatHeartbeatMessage((PdpStateChange) message)); LOGGER.info("Sending Xacml PDP heartbeat to the PAP"); } @@ -69,6 +72,7 @@ public class XacmlPdpHeartbeatPublisher extends TimerTask { } public void updateInternalState(PdpState state) { + ((PdpStateChange) this.message).setState(state); this.pdpState = state; } @@ -79,5 +83,4 @@ public class XacmlPdpHeartbeatPublisher extends TimerTask { public void setAlive(boolean alive) { this.alive = alive; } - } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpMessage.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpMessage.java index 233bd7f7..809e43d0 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpMessage.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpMessage.java @@ -24,7 +24,9 @@ package org.onap.policy.pdpx.main.comm; import java.net.UnknownHostException; import org.onap.policy.common.utils.network.NetworkUtil; +import org.onap.policy.models.pdp.concepts.PdpStateChange; import org.onap.policy.models.pdp.concepts.PdpStatus; +import org.onap.policy.models.pdp.concepts.PdpUpdate; import org.onap.policy.models.pdp.enums.PdpHealthStatus; import org.onap.policy.models.pdp.enums.PdpState; import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager; @@ -42,7 +44,6 @@ public class XacmlPdpMessage { * * @param state of the PDP * @return status message of the PDP - * @throws UnknownHostException if cannot get hostname */ public PdpStatus formatStatusMessage(PdpState state) { PdpStatus status = new PdpStatus(); @@ -63,4 +64,55 @@ public class XacmlPdpMessage { return status; } + + /** + * Method used to format the heartbeat status message. + * + * @param message PdpStateChange message received from the PAP + * @return status message of the PDP + */ + public PdpStatus formatHeartbeatMessage(PdpStateChange message) { + PdpStatus status = new PdpStatus(); + status.setName(NetworkUtil.getHostname()); + + if (XacmlPdpActivator.getCurrent().isAlive()) { + status.setHealthy(PdpHealthStatus.HEALTHY); + } else { + status.setHealthy(PdpHealthStatus.NOT_HEALTHY); + } + + status.setPdpType("xacml"); + status.setState(message.getState()); + status.setPdpGroup(message.getPdpGroup()); + status.setPdpSubgroup(message.getPdpSubgroup()); + status.setSupportedPolicyTypes(XacmlPdpApplicationManager.getToscaPolicyTypeIdents()); + + return status; + } + + /** + * Method used to format the PdpUpdate message. + * + * @param message PdpUpdate message that was received from the PAP + * @return status message of the PDP + */ + public PdpStatus formatPdpUpdateMessage(PdpUpdate message, PdpState state) { + PdpStatus status = new PdpStatus(); + status.setName(NetworkUtil.getHostname()); + + if (XacmlPdpActivator.getCurrent().isAlive()) { + status.setHealthy(PdpHealthStatus.HEALTHY); + } else { + status.setHealthy(PdpHealthStatus.NOT_HEALTHY); + } + + status.setPdpType("xacml"); + status.setState(state); + status.setPdpGroup(message.getPdpGroup()); + status.setPdpSubgroup(message.getPdpSubgroup()); + status.setSupportedPolicyTypes(XacmlPdpApplicationManager.getToscaPolicyTypeIdents()); + status.setPolicies(XacmlPdpApplicationManager.getToscaPolicies()); + + return status; + } } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpUpdatePublisher.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpUpdatePublisher.java new file mode 100644 index 00000000..716421c7 --- /dev/null +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpUpdatePublisher.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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. + * 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.pdpx.main.comm; + +import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient; +import org.onap.policy.models.pdp.concepts.PdpStatus; +import org.onap.policy.models.pdp.concepts.PdpUpdate; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class XacmlPdpUpdatePublisher { + + private static final Logger LOGGER = LoggerFactory.getLogger(XacmlPdpUpdatePublisher.class); + + private XacmlPdpUpdatePublisher() { + throw new IllegalStateException("Please do not create private instance of XacmlPdpUpdatePublisher"); + } + + /** + * Handle the PDP Update message. + * + * @param message Incoming message + * @param client TopicSinkClient + */ + public static void handlePdpUpdate(PdpUpdate message, TopicSinkClient client) { + + if (!message.getPolicies().isEmpty() || message.getPolicies() != null) { + // Load the policies on PDP applications + for (ToscaPolicy toscaPolicy : message.getPolicies()) { + XacmlPdpApplicationManager.loadDeployedPolicy(toscaPolicy); + } + } + + XacmlPdpMessage updatePdpMessage = new XacmlPdpMessage(); + PdpStatus statusMessage = updatePdpMessage.formatPdpUpdateMessage(message, XacmlPdpHearbeatPublisher.pdpState); + sendPdpUpdate(statusMessage, client); + } + + private static void sendPdpUpdate(PdpStatus status, TopicSinkClient client) { + // Send PdpStatus Change to PAP + if (!client.send(status)) { + LOGGER.error("failed to send to topic sink {}", client.getTopic()); + } + } + +} diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java index f5b2fbfa..3e24c3fe 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java @@ -28,7 +28,7 @@ import org.onap.policy.common.utils.coder.StandardCoderObject; import org.onap.policy.models.pdp.concepts.PdpStateChange; import org.onap.policy.models.pdp.concepts.PdpStatus; import org.onap.policy.models.pdp.enums.PdpState; -import org.onap.policy.pdpx.main.comm.XacmlPdpHeartbeatPublisher; +import org.onap.policy.pdpx.main.comm.XacmlPdpHearbeatPublisher; import org.onap.policy.pdpx.main.comm.XacmlPdpMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +39,7 @@ public class XacmlPdpStateChangeListener extends ScoListener<PdpStateChange> { private TopicSinkClient client; - private XacmlPdpHeartbeatPublisher heartbeat; + private XacmlPdpHearbeatPublisher heartbeat; /** * Constructs the object. @@ -48,7 +48,9 @@ public class XacmlPdpStateChangeListener extends ScoListener<PdpStateChange> { */ public XacmlPdpStateChangeListener(TopicSinkClient client) { super(PdpStateChange.class); - heartbeat = new XacmlPdpHeartbeatPublisher(client, PdpState.PASSIVE); + PdpStateChange message = new PdpStateChange(); + message.setState(PdpState.PASSIVE); + heartbeat = new XacmlPdpHearbeatPublisher(client, message); this.client = client; } @@ -66,10 +68,10 @@ public class XacmlPdpStateChangeListener extends ScoListener<PdpStateChange> { } // Update the heartbeat internal state if publisher is running else create new publisher - if (XacmlPdpHeartbeatPublisher.isAlive()) { + if (XacmlPdpHearbeatPublisher.isAlive()) { heartbeat.updateInternalState(message.getState()); } else { - heartbeat = new XacmlPdpHeartbeatPublisher(client, message.getState()); + heartbeat = new XacmlPdpHearbeatPublisher(client, message); } } catch (final Exception e) { diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpUpdateListener.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpUpdateListener.java new file mode 100644 index 00000000..69f96a05 --- /dev/null +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpUpdateListener.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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. + * 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.pdpx.main.comm.listeners; + +import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; +import org.onap.policy.common.endpoints.event.comm.client.TopicSinkClient; +import org.onap.policy.common.endpoints.listeners.ScoListener; +import org.onap.policy.common.utils.coder.StandardCoderObject; +import org.onap.policy.models.pdp.concepts.PdpUpdate; +import org.onap.policy.pdpx.main.comm.XacmlPdpUpdatePublisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class XacmlPdpUpdateListener extends ScoListener<PdpUpdate> { + + private static final Logger LOGGER = LoggerFactory.getLogger(XacmlPdpStateChangeListener.class); + + private TopicSinkClient client; + + /** + * Constructs the object. + * + * @param client used to send back response after receiving state change message + */ + public XacmlPdpUpdateListener(TopicSinkClient client) { + super(PdpUpdate.class); + this.client = client; + } + + @Override + public void onTopicEvent(CommInfrastructure infra, String topic, StandardCoderObject sco, PdpUpdate message) { + + try { + + LOGGER.info("PDP update message has been received from the PAP - {}", message.toString()); + XacmlPdpUpdatePublisher.handlePdpUpdate(message, client); + + } catch (final Exception e) { + LOGGER.error("failed to handle the PDP Update message.", e); + } + + } + +} diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java index a5e1d030..09805593 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java @@ -30,6 +30,8 @@ import java.util.List; import java.util.Map; import java.util.ServiceLoader; import org.onap.policy.models.decisions.concepts.DecisionRequest; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; import org.onap.policy.pdp.xacml.application.common.XacmlApplicationException; import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider; @@ -43,6 +45,7 @@ public class XacmlPdpApplicationManager { private static ServiceLoader<XacmlApplicationServiceProvider> applicationLoader; private static Map<String, XacmlApplicationServiceProvider> providerActionMap = new HashMap<>(); private static List<ToscaPolicyTypeIdentifier> toscaPolicyTypeIdents = new ArrayList<>(); + private static List<ToscaPolicyIdentifier> toscaPolicies = new ArrayList<>(); private XacmlPdpApplicationManager() { super(); @@ -117,6 +120,34 @@ public class XacmlPdpApplicationManager { } /** + * Finds the appropriate application and loads the policy. + * + * @param policy Incoming policy + */ + public static void loadDeployedPolicy(ToscaPolicy policy) { + + for (XacmlApplicationServiceProvider application : applicationLoader) { + try { + // + // There should be only one application per policytype. We can + // put more logic surrounding enforcement of that later. For now, + // just use the first one found. + // + if (application.canSupportPolicyType(policy.getTypeIdentifier())) { + application.loadPolicy(policy); + return; + } + } catch (XacmlApplicationException e) { + LOGGER.error("Failed to load the Tosca Policy", e); + } + } + } + + public static List<ToscaPolicyIdentifier> getToscaPolicies() { + return toscaPolicies; + } + + /** * Returns the current count of policy types supported. This could be misleading a bit * as some applications can support wildcard of policy types. Eg. onap.Monitoring.* as * well as individual types/versions. Nevertheless useful for debugging and testing. diff --git a/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java b/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java index 9695c7b9..330fbd67 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java @@ -38,6 +38,7 @@ import org.onap.policy.pdpx.main.PolicyXacmlPdpRuntimeException; import org.onap.policy.pdpx.main.comm.XacmlPdpMessage; import org.onap.policy.pdpx.main.comm.XacmlPdpPapRegistration; import org.onap.policy.pdpx.main.comm.listeners.XacmlPdpStateChangeListener; +import org.onap.policy.pdpx.main.comm.listeners.XacmlPdpUpdateListener; import org.onap.policy.pdpx.main.parameters.XacmlPdpParameterGroup; import org.onap.policy.pdpx.main.rest.XacmlPdpRestServer; import org.slf4j.Logger; @@ -65,17 +66,21 @@ public class XacmlPdpActivator extends ServiceManagerContainer { /** * Listens for messages on the topic, decodes them into a {@link PdpStatus} message, and then - * dispatches them to {@link #pdpUpdateListener}. + * dispatches them to appropriate listener. */ private final MessageTypeDispatcher msgDispatcher; /** - * Listens for {@link PdpUpdate} messages and then routes them to the listener associated with the - * ID of the originating request. + * Listens for {@link PdpStateChange} messages from the PAP. */ private final XacmlPdpStateChangeListener pdpStateChangeListener; /** + * Listens for {@link PdpUpdate} messages from the PAP. + */ + private final XacmlPdpUpdateListener pdpUpdateListener; + + /** * The current activator. */ private static XacmlPdpActivator current = null; @@ -101,6 +106,7 @@ public class XacmlPdpActivator extends ServiceManagerContainer { this.xacmlPdpParameterGroup = xacmlPdpParameterGroup; this.msgDispatcher = new MessageTypeDispatcher(MSG_TYPE_NAMES); this.pdpStateChangeListener = new XacmlPdpStateChangeListener(sinkClient); + this.pdpUpdateListener = new XacmlPdpUpdateListener(sinkClient); this.register = new XacmlPdpPapRegistration(sinkClient); this.message = new XacmlPdpMessage(); } catch (RuntimeException | TopicSinkClientException e) { @@ -113,10 +119,14 @@ public class XacmlPdpActivator extends ServiceManagerContainer { addAction("XACML PDP parameters", () -> ParameterService.register(xacmlPdpParameterGroup), () -> ParameterService.deregister(xacmlPdpParameterGroup.getName())); - addAction("Request ID Dispatcher", + addAction("PdpStateChange Dispatcher", () -> msgDispatcher.register(PdpMessageType.PDP_STATE_CHANGE.name(), this.pdpStateChangeListener), () -> msgDispatcher.unregister(PdpMessageType.PDP_STATE_CHANGE.name())); + addAction("PdpUpdate Dispatcher", + () -> msgDispatcher.register(PdpMessageType.PDP_UPDATE.name(), this.pdpUpdateListener), + () -> msgDispatcher.unregister(PdpMessageType.PDP_UPDATE.name())); + addAction("Message Dispatcher", () -> registerMsgDispatcher(), () -> unregisterMsgDispatcher()); |