summaryrefslogtreecommitdiffstats
path: root/BRMSGateway/src/main/java/org/onap/policy/brms/api/BrmsHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'BRMSGateway/src/main/java/org/onap/policy/brms/api/BrmsHandler.java')
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brms/api/BrmsHandler.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brms/api/BrmsHandler.java b/BRMSGateway/src/main/java/org/onap/policy/brms/api/BrmsHandler.java
new file mode 100644
index 000000000..0f686feec
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brms/api/BrmsHandler.java
@@ -0,0 +1,200 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017-2018 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.brms.api;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.onap.policy.api.ConfigRequestParameters;
+import org.onap.policy.api.LoadedPolicy;
+import org.onap.policy.api.NotificationType;
+import org.onap.policy.api.PDPNotification;
+import org.onap.policy.api.PolicyConfig;
+import org.onap.policy.api.PolicyConfigStatus;
+import org.onap.policy.api.PolicyEngine;
+import org.onap.policy.api.PolicyException;
+import org.onap.policy.api.RemovedPolicy;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.utils.BackUpHandler;
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+
+/**
+ * BRMSHandler: Notification Handler which listens for PDP Notifications. Take action only for BRMS
+ * policies.
+ *
+ * @version 0.3
+ */
+public class BrmsHandler implements BackUpHandler {
+
+ private static final Logger logger = FlexLogger.getLogger(BrmsHandler.class.getName());
+
+ private BrmsPush brmsPush = null;
+
+ public BrmsHandler(final String propertiesFile) throws PolicyException {
+ setBrmsPush(new BrmsPush(propertiesFile, this));
+ }
+
+ public void setBrmsPush(final BrmsPush brmsPush) {
+ this.brmsPush = brmsPush;
+ }
+
+ /*
+ * This Method is executed upon notification by the Policy Engine API Notification.
+ * (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.utils.BackUpHandler#notificationReceived(org.onap.policy.api.PDPNotification)
+ */
+ @Override
+ public void notificationReceived(final PDPNotification notification) {
+ logger.info("Notification Recieved");
+ logger.info(notification.getNotificationType().toString());
+ final Boolean flag = BrmsPush.getBackUpMonitor().getFlag();
+ brmsPush.initiate(flag);
+ if (flag) {
+ logger.info("Master Application performing on Notification ");
+ runOnNotification(notification);
+ } else {
+ logger.info("Slave application Skipping Notification.. ");
+ }
+ }
+
+ /*
+ * Executed when a policy is removed from PDP.
+ */
+ private void removedPolicies(final Collection<RemovedPolicy> removedPolicies) {
+ Boolean removed = false;
+ logger.info("Removed Policies");
+ for (final RemovedPolicy removedPolicy : removedPolicies) {
+ logger.info(removedPolicy.getPolicyName());
+ logger.info(removedPolicy.getVersionNo());
+ if (removedPolicy.getPolicyName().contains("_BRMS_")) {
+ try {
+ logger.info("Policy Removed with this policy Name : " + removedPolicy.getPolicyName());
+ brmsPush.removeRule(removedPolicy.getPolicyName());
+ removed = true;
+ } catch (final Exception e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Rertriving policy failed " + e.getMessage(),
+ e);
+ }
+ }
+ }
+ Boolean failureFlag;
+ int index = 0;
+ do {
+ failureFlag = false;
+ if (removed) {
+ try {
+ brmsPush.pushRules();
+ } catch (final PolicyException e) {
+ // Upon Notification failure
+ failureFlag = true;
+ brmsPush.rotateUrls();
+ logger.error("Failure during Push Operation ", e);
+ }
+ }
+ index++;
+ }
+ while (failureFlag && index < brmsPush.urlListSize());
+ }
+
+ /*
+ * This method is executed if BRMSGW is "MASTER" (non-Javadoc)
+ *
+ * @see
+ * org.onap.policy.utils.BackUpHandler#runOnNotification(org.onap.policy.api.PDPNotification)
+ */
+ @Override
+ public void runOnNotification(final PDPNotification notification) {
+ // reset the BRMSPush data structures
+ brmsPush.resetDs();
+ if (notification.getNotificationType().equals(NotificationType.REMOVE)) {
+ removedPolicies(notification.getRemovedPolicies());
+ } else if (notification.getNotificationType().equals(NotificationType.UPDATE)
+ || notification.getNotificationType().equals(NotificationType.BOTH)) {
+ logger.info("Updated Policies: \n");
+ final ArrayList<PolicyConfig> brmsPolicies = addedPolicies(notification);
+ Boolean successFlag = false;
+ for (int i = 0; !successFlag && i < brmsPush.urlListSize(); i++) {
+ if (i != 0) {
+ for (final PolicyConfig policyConfig : brmsPolicies) {
+ logger.info("Policy Retry with this Name notified: " + policyConfig.getPolicyName());
+ brmsPush.addRule(policyConfig.getPolicyName(), policyConfig.toOther(),
+ policyConfig.getResponseAttributes());
+ }
+ }
+ try {
+ brmsPush.pushRules();
+ successFlag = true;
+ } catch (final PolicyException e) {
+ // Upon Notification failure
+ successFlag = false;
+ brmsPush.rotateUrls();
+ logger.error("Failure during Push Operation ", e);
+ }
+ }
+ }
+ }
+
+ /*
+ * Executed when a policy is added to PDP.
+ */
+ private ArrayList<PolicyConfig> addedPolicies(final PDPNotification notification) {
+ final ArrayList<PolicyConfig> result = new ArrayList<>();
+ for (final LoadedPolicy updatedPolicy : notification.getLoadedPolicies()) {
+ logger.info("policyName : " + updatedPolicy.getPolicyName());
+ logger.info("policyVersion :" + updatedPolicy.getVersionNo());
+ logger.info("Matches: " + updatedPolicy.getMatches());
+ // Checking the Name is correct or not.
+ if (updatedPolicy.getPolicyName().contains("_BRMS_")) {
+ try {
+ final PolicyEngine policyEngine = getPolicyEngine();
+ if (policyEngine != null) {
+ final ConfigRequestParameters configRequestParameters = new ConfigRequestParameters();
+ configRequestParameters.setPolicyName(updatedPolicy.getPolicyName());
+ final Collection<PolicyConfig> policyConfigs = policyEngine.getConfig(configRequestParameters);
+ for (final PolicyConfig policyConfig : policyConfigs) {
+ if (policyConfig.getPolicyConfigStatus().equals(PolicyConfigStatus.CONFIG_RETRIEVED)) {
+ logger.info(
+ "Policy Retrieved with this Name notified: " + policyConfig.getPolicyName());
+ result.add(policyConfig);
+ brmsPush.addRule(policyConfig.getPolicyName(), policyConfig.toOther(),
+ policyConfig.getResponseAttributes());
+ } else {
+ logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR
+ + "Fail to retrieve policy so rule will not be pushed to PolicyRepo !!!!\n\n");
+ }
+ }
+ }
+ } catch (final Exception e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Rertriving policy failed " + e.getMessage(),
+ e);
+ }
+ }
+ }
+ return result;
+ }
+
+ public PolicyEngine getPolicyEngine() {
+ return BrmsGateway.getPolicyEngine();
+ }
+}