Initial OpenECOMP policy/engine commit
Change-Id: I7dbff37733b661643dd4d1caefa3d7dccc361b6e
Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
diff --git a/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSGateway.java b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSGateway.java
new file mode 100644
index 0000000..70c537c
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSGateway.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.policy.brmsInterface;
+
+import org.openecomp.policy.api.NotificationScheme;
+import org.openecomp.policy.api.PolicyEngine;
+
+//import org.apache.log4j.Logger;
+
+//import org.apache.commons.logging.Log;
+//import org.apache.commons.logging.LogFactory;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+
+/**
+ * BRMSGateway: This application acts as the Gateway interface between the PDP XACML and PDP Drools.
+ * The listens for BRMS based policies and pushes them to the specified Policy Repository, from where the PDP Drools reads the Rule Jar.
+ *
+ * @version 0.1
+ */
+public class BRMSGateway {
+// private static final Logger logger = Logger.getLogger(BRMSGateway.class.getName());
+ private static final Logger logger = FlexLogger.getLogger(BRMSGateway.class);
+ private static final String configFile = "config.properties";
+
+ private static PolicyEngine policyEngine = null;
+
+ public static void main(String[] args) throws Exception{
+ // Initialize Handler.
+ logger.info("Initializing BRMS Handler");
+ BRMSHandler bRMSHandler = null;
+ try{
+ bRMSHandler = new BRMSHandler(configFile);
+ }catch(NullPointerException e){
+ logger.error("Check your property file: " + e.getMessage());
+ System.exit(1);
+ }
+
+ // Set Handler with Auto Notification and initialize policyEngine
+ try{
+ logger.info("Initializing policyEngine with Auto Notifications");
+ policyEngine= new PolicyEngine(configFile,NotificationScheme.AUTO_ALL_NOTIFICATIONS, bRMSHandler);
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_UNKNOWN+"Error while Initializing Policy Engine " + e.getMessage());
+ }
+
+ //Keep Running....
+ Runnable runnable = new Runnable(){
+ public void run(){
+ while (true){
+ try {
+ Thread.sleep(30000);
+ } catch (InterruptedException e) {
+ logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR+"Thread Exception " + e.getMessage());
+ }
+ }
+ }
+ };
+ Thread thread = new Thread(runnable);
+ thread.start();
+ }
+
+ public static PolicyEngine getPolicyEngine(){
+ return policyEngine;
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSHandler.java b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSHandler.java
new file mode 100644
index 0000000..2cc1787
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSHandler.java
@@ -0,0 +1,134 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.policy.brmsInterface;
+
+import java.util.Collection;
+
+import org.openecomp.policy.api.ConfigRequestParameters;
+import org.openecomp.policy.api.LoadedPolicy;
+import org.openecomp.policy.api.NotificationType;
+import org.openecomp.policy.api.PDPNotification;
+import org.openecomp.policy.api.PolicyConfig;
+import org.openecomp.policy.api.PolicyConfigStatus;
+import org.openecomp.policy.api.PolicyEngine;
+import org.openecomp.policy.api.RemovedPolicy;
+import org.openecomp.policy.utils.BackUpHandler;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+//import org.apache.log4j.Logger;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+/**
+ * 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 = Logger.getLogger(BRMSHandler.class.getName());
+ private static final Logger logger = FlexLogger.getLogger(BRMSHandler.class.getName());
+ // This Values are fixed for BRMS based rules. Don't change until they are changed during creation in PAP-ADMIN.
+ //private static final String ecompName = "DROOLS";
+ //private static final String configName = "BRMS_RAW_RULE";
+
+ private BRMSPush bRMSPush = null;
+
+ public BRMSHandler(String propertiesFile) throws Exception{
+ bRMSPush = new BRMSPush(propertiesFile, this);
+ }
+
+ @Override
+ public void notificationReceived(PDPNotification notification) {
+ logger.info("Notification Recieved");
+ logger.info(notification.getNotificationType().toString());
+ bRMSPush.initiate();
+ if(BRMSPush.getBackUpMonitor().getFlag()){
+ logger.info("Master Application performing on Notification ");
+ runOnNotification(notification);
+ }else{
+ logger.info("Slave application Skipping Notification.. ");
+ }
+ }
+
+ private void removedPolicies(Collection<RemovedPolicy> removedPolicies){
+ Boolean removed = false;
+ logger.info("Removed Policies");
+ for(RemovedPolicy removedPolicy: removedPolicies){
+ logger.info(removedPolicy.getPolicyName());
+ logger.info(removedPolicy.getVersionNo());
+ if(removedPolicy.getPolicyName().contains("_BRMS_")){
+ try{
+ String name = removedPolicy.getPolicyName().substring(removedPolicy.getPolicyName().indexOf("_BRMS_")+6, removedPolicy.getPolicyName().length());
+ name= name.substring(name.indexOf("_")+1,name.length());
+ logger.info("Policy Removed with this policy Name : " + name);
+ bRMSPush.removeRule(name);
+ removed = true;
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Rertriving policy failed " + e.getMessage());
+ }
+ }
+ }
+ if(removed){
+ bRMSPush.pushRules();
+ }
+ }
+
+ public void runOnNotification(PDPNotification notification){
+ 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");
+ for(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{
+ PolicyEngine policyEngine = BRMSGateway.getPolicyEngine();
+ if(policyEngine!=null){
+ ConfigRequestParameters configRequestParameters = new ConfigRequestParameters();
+ configRequestParameters.setPolicyName(updatedPolicy.getPolicyName());
+ Collection<PolicyConfig> policyConfigs = policyEngine.getConfig(configRequestParameters);
+ for(PolicyConfig policyConfig: policyConfigs){
+ if(policyConfig.getPolicyConfigStatus().equals(PolicyConfigStatus.CONFIG_RETRIEVED)){
+ String name = policyConfig.getPolicyName().substring(policyConfig.getPolicyName().indexOf("_BRMS_")+6, policyConfig.getPolicyName().length());
+ name= name.substring(name.indexOf("_")+1,name.length());
+ logger.info("Policy Retrieved with this Name notified: " + name);
+ bRMSPush.addRule(name,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(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Rertriving policy failed " + e.getMessage());
+ }
+ }
+ }
+ bRMSPush.pushRules();
+ }
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSPush.java b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSPush.java
new file mode 100644
index 0000000..3ea8d62
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/BRMSPush.java
@@ -0,0 +1,627 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.policy.brmsInterface;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DeploymentRepository;
+import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.Exclusion;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.shared.invoker.DefaultInvocationRequest;
+import org.apache.maven.shared.invoker.DefaultInvoker;
+import org.apache.maven.shared.invoker.InvocationRequest;
+import org.apache.maven.shared.invoker.InvocationResult;
+import org.apache.maven.shared.invoker.Invoker;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.WriterFactory;
+import org.openecomp.policy.utils.BackUpHandler;
+import org.openecomp.policy.utils.BackUpMonitor;
+import org.openecomp.policy.utils.PolicyUtils;
+import org.sonatype.nexus.client.NexusClient;
+import org.sonatype.nexus.client.NexusClientException;
+import org.sonatype.nexus.client.NexusConnectionException;
+import org.sonatype.nexus.client.rest.NexusRestClient;
+import org.sonatype.nexus.rest.model.NexusArtifact;
+
+//import org.apache.log4j.Logger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.openecomp.policy.common.im.AdministrativeStateException;
+import org.openecomp.policy.common.im.IntegrityMonitor;
+import com.att.nsa.cambria.client.CambriaBatchingPublisher;
+import com.att.nsa.cambria.client.CambriaClientBuilders;
+import com.att.nsa.cambria.client.CambriaClientBuilders.PublisherBuilder;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+
+/**
+ * BRMSPush: Application responsible to push policies to the BRMS PDP Policy Repository (PR).
+ * Mavenize and push policy to PR
+ *
+ * @version 0.4
+ */
+@SuppressWarnings("deprecation")
+public class BRMSPush {
+
+
+ private static final Logger logger = FlexLogger.getLogger(BRMSPush.class.getName());
+ private static final String projectsLocation = "RuleProjects";
+ private static final String goals[] = {"clean", "deploy"};
+
+ private static Map<String, String> modifiedGroups = new HashMap<String, String>();
+ private static IntegrityMonitor im;
+ private static BackUpMonitor bm;
+ private static String resourceName = null;
+ private List<String> groupIDs = null;
+ private List<String> artifactIDs= null; //"test"
+ private Map<String,Integer> names= null; // "Rules"
+ private String defaultName = null;
+ private String repID = null; // "ecomp_policy-3rd-party"
+ private String repName = null; // "d2policy-snapshots"
+ private String repURL= null;
+ private String repUserName = null;
+ private ArrayList<ControllerPOJO> controllers;
+ private HashMap<String,String> versions = new HashMap<String, String>();
+ private String repPassword = null;
+ private String policyKeyID = null;
+ private List<File> matchingList = null;
+ private boolean createFlag = false;
+ private String uebList = null;
+ private String pubTopic = null;
+ private PublisherBuilder pubBuilder = null;
+ private Long uebDelay = Long.parseLong("5000");
+ private static String brmsdependencyversion = null;
+
+ public BRMSPush(String propertiesFile, BackUpHandler handler) throws Exception{
+ Properties config = new Properties();
+ Path file = Paths.get(propertiesFile);
+ if(Files.notExists(file)){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE+"Config File doesn't Exist in the specified Path " + file.toString());
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE+"Config File doesn't Exist in the specified Path " + file.toString());
+ }else{
+ if(file.toString().endsWith(".properties")){
+ InputStream in;
+ in = new FileInputStream(file.toFile());
+ config.load(in);
+ // Grab the Properties.
+ defaultName = config.getProperty("defaultName").replaceAll(" ", "");
+ if(defaultName==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "defaultName property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "defaultName property is missing from the property file");
+ }
+ repID = config.getProperty("repositoryID").replaceAll(" ", "");
+ if(repID==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryID property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryID property is missing from the property file ");
+ }
+ repName = config.getProperty("repositoryName").replaceAll(" ", "");
+ if(repName==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryName property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryName property is missing from the property file ");
+ }
+ repURL = config.getProperty("repositoryURL").replaceAll(" ", "");
+ if(repURL==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryURL property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryURL property is missing from the property file ");
+ }
+ repUserName = config.getProperty("repositoryUsername").trim();
+ repPassword = config.getProperty("repositoryPassword").trim();
+ if(repUserName==null || repPassword==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repostoryUserName and respositoryPassword properties are required.");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "repostoryUserName and respositoryPassword properties are required.");
+ }
+ policyKeyID = config.getProperty("policyKeyID").replaceAll(" ", "");
+ if(policyKeyID==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "policyKeyID property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "policyKeyID property is missing from the property file ");
+ }
+ brmsdependencyversion = config.getProperty("brms.dependency.version").replaceAll(" ", "");
+ if(brmsdependencyversion==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "brmsdependencyversion property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "brmsdependencyversion property is missing from the property file ");
+ }
+ readGroups(config);
+ logger.info("Trying to set up IntegrityMonitor");
+ try {
+ logger.info("Trying to set up IntegrityMonitor");
+ resourceName = config.getProperty("RESOURCE_NAME").replaceAll(" ", "");;
+ if(resourceName==null){
+ logger.warn("RESOURCE_NAME is missing setting default value. ");
+ resourceName = "brmsgw_pdp01";
+ }
+ im = IntegrityMonitor.getInstance(resourceName, config);
+ } catch (Exception e) {
+ logger.error("Error starting Integerity Monitor: " + e);
+ }
+ logger.info("Trying to set up BackUpMonitor");
+ try {
+ bm = BackUpMonitor.getInstance(BackUpMonitor.ResourceNode.BRMS.toString(), resourceName, config, handler);
+ } catch (Exception e) {
+ logger.error("Error starting BackUpMonitor: " + e);
+ }
+ // Setting up the Publisher for UEB
+ uebList = config.getProperty("UEB_URL").trim();
+ pubTopic = config.getProperty("UEB_TOPIC").trim();
+ String apiKey = config.getProperty("UEB_API_KEY");
+ String apiSecret = config.getProperty("UEB_API_SECRET");
+ if(uebList==null || pubTopic==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "UEB properties are missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "UEB properties are missing from the property file ");
+ }
+ pubBuilder = new CambriaClientBuilders.PublisherBuilder();
+ pubBuilder.usingHosts(uebList)
+ .onTopic(pubTopic);
+ if(apiKey!=null && !apiKey.isEmpty() &&
+ apiSecret!=null && !apiSecret.isEmpty()) {
+ apiKey= apiKey.trim();
+ apiSecret = apiSecret.trim();
+ pubBuilder.authenticatedBy(apiKey, apiSecret);
+ }
+ String uDelay = config.getProperty("UEB_DELAY");
+ if(uDelay!=null && !uDelay.isEmpty()){
+ uDelay = uDelay.trim();
+ try{
+ uebDelay = Long.parseLong(uDelay);
+ }catch (NumberFormatException e){
+ logger.error("UEB_DELAY not a long format number" + e);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Will Initialize the variables required for BRMSPush.
+ */
+ public void initiate() {
+ modifiedGroups = new HashMap<String, String>();
+ controllers = new ArrayList<ControllerPOJO>();
+ try {
+ bm.updateNotification();
+ } catch (Exception e) {
+ logger.error("Error while updating Notification: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Will Add rules to projects. Creates necessary folders if required.
+ */
+ public void addRule(String name, String rule, Map<String, String> responseAttributes) {
+ // 1 check the response Attributes and determine if this belongs to any projects.
+ // 2 if not create folder // new File("Projects\\test").mkdirs();
+ // 3 create pom.
+ // 4 copy the rule.
+ // 5 store the groups that have been updated.
+ String kSessionName=null;
+ String selectedName = null;
+
+ if(!responseAttributes.isEmpty()){
+ // Pick selected Value
+ for(String key: responseAttributes.keySet()){
+ if(key.equals(policyKeyID)){
+ selectedName = responseAttributes.get(key);
+ }
+ //kmodule configurations
+ else if (key.equals("kSessionName")){
+ kSessionName=responseAttributes.get(key);
+ }
+ }
+
+ }
+ // If no Match then pick Default.
+ if(selectedName==null){
+ selectedName = defaultName;
+ }
+ if(names.containsKey(selectedName)){
+ //If the key is not got as parameters set by the user, setting the default value for kSessionName as closedLoop
+ if(kSessionName==null){
+ if(selectedName==defaultName){
+ kSessionName="closedloop";
+ }else{
+ kSessionName= selectedName;
+ }
+ }
+ // create directories if missing.
+ createProject(projectsLocation+File.separator+getArtifactID(selectedName)+File.separator+"src"+File.separator+"main"+File.separator+"resources",kSessionName);
+ copyDataToFile(projectsLocation+File.separator+getArtifactID(selectedName)+File.separator+"src"+File.separator+"main"+File.separator+"resources"+File.separator+"rules"+File.separator+name+".drl", rule);
+ addModifiedGroup(selectedName, "update"); // Will check for Create Later after generating the Pom.
+ }
+ }
+
+ /**
+ * Will Push policies to the PolicyRepo.
+ *
+ * @param notificationType <String> type of notification Type.
+ */
+ public void pushRules(){
+ // Check how many groups have been updated.
+ // Invoke their Maven process.
+ try {
+ im.startTransaction();
+ } catch (AdministrativeStateException e) {
+ logger.error("Error while starting Transaction " + e);
+ } catch (Exception e) {
+ logger.error("Error while starting Transaction " + e);
+ }
+ if(!modifiedGroups.isEmpty()){
+ Boolean flag = false;
+ for(String group: modifiedGroups.keySet()){
+ try{
+ InvocationRequest request = new DefaultInvocationRequest();
+ createPom(group);
+ request.setPomFile(new File(projectsLocation+File.separator+getArtifactID(group)+File.separator+"pom.xml"));
+ request.setGoals(Arrays.asList(goals));
+ Invoker invoker = new DefaultInvoker();
+ InvocationResult result = invoker.execute(request);
+ if(result.getExecutionException()!=null){
+ logger.error(result.getExecutionException());
+ }else if(result.getExitCode()!=0){
+ logger.error("Maven Invocation failure..!");
+ }
+ if(result.getExitCode()==0){
+ logger.info("Build Completed..!");
+ if (createFlag) {
+ addNotification(group, "create");
+ }else{
+ addNotification(group, modifiedGroups.get(group));
+ }
+ flag = true;
+ }
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Maven Invocation issue for "+getArtifactID(group) + e.getMessage());
+ }
+ }
+ if(flag){
+ sendNotification(controllers);
+ }
+ }
+ im.endTransaction();
+ }
+
+ /**
+ * Removes a Rule from Rule Projects.
+ */
+ public void removeRule(String name){
+ File file = new File(projectsLocation);
+ matchingList = new ArrayList<File>();
+ searchFile(file,name);
+ for(File matchingFile: matchingList){
+ if(matchingFile.delete()){
+ logger.info("Deleted File.. " + matchingFile.getAbsolutePath());
+ String groupName = getName(matchingFile.toString());
+ String ruleFolder= projectsLocation+File.separator+getArtifactID(groupName)+File.separator+"src"+File.separator+"main"+File.separator+"resources"+File.separator+"rules";
+ if(new File(ruleFolder).listFiles().length==0){
+ removedRuleModifiedGroup(groupName);
+ }else{
+ addModifiedGroup(groupName, "update"); // This is an update in terms of PDPD.
+ }
+ }
+ }
+ }
+
+ private void addModifiedGroup(String controllerName, String operation) {
+ modifiedGroups.put(controllerName, operation);
+ }
+
+ private void addNotification(String controllerName, String operation) {
+ ControllerPOJO controllerPOJO = new ControllerPOJO();
+ controllerPOJO.setName(controllerName);
+ controllerPOJO.setOperation(operation);
+ HashMap<String, String> drools = new HashMap<String, String>();
+ drools.put("groupId", getGroupID(controllerName));
+ drools.put("artifactId", getArtifactID(controllerName));
+ drools.put("version", versions.get(controllerName));
+ controllerPOJO.setDrools(drools);
+ controllers.add(controllerPOJO);
+ try {
+ logger.debug("Notification added: "
+ + PolicyUtils.objectToJsonString(controllerPOJO));
+ } catch (JsonProcessingException e) {
+ logger.error(XACMLErrorConstants.ERROR_SCHEMA_INVALID
+ + "Json Processing Error " + e);
+ }
+ }
+
+ private void removedRuleModifiedGroup(String controllerName){
+ // This will be sending Notification to PDPD directly to Lock
+ ControllerPOJO controllerPOJO = new ControllerPOJO();
+ controllerPOJO.setName(controllerName);
+ controllerPOJO.setOperation("lock");
+ List<ControllerPOJO> controllers = new ArrayList<ControllerPOJO>();
+ controllers.add(controllerPOJO);
+ sendNotification(controllers);
+ }
+
+ private void sendNotification(List<ControllerPOJO> controllers){
+ NotificationPOJO notification = new NotificationPOJO();
+ String requestId = UUID.randomUUID().toString();
+ logger.info("Generating notification RequestID : " + requestId);
+ notification.setRequestID(requestId);
+ notification.setEntity("controller");
+ notification.setControllers(controllers);
+ try {
+ String notificationJson = PolicyUtils.objectToJsonString(notification);
+ logger.info("Sending Notification :\n" + notificationJson);
+ sendMessage(notificationJson);
+ } catch (IOException | GeneralSecurityException | InterruptedException e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while sending notification to PDP-D " + e.getMessage());
+ }
+ }
+
+ private void sendMessage(String message) throws IOException, GeneralSecurityException, InterruptedException {
+ // Sending Message through UEB interface.
+ CambriaBatchingPublisher pub = pubBuilder.build();
+ pub.send( "MyPartitionKey", message);
+ logger.debug("Message Published on UEB :" + uebList + "for Topic: " + pubTopic);
+ Thread.sleep(uebDelay);
+ pub.close();
+ }
+
+ private void searchFile(File file, String name) {
+ if(file.isDirectory()){
+ logger.info("Searching Directory..." + file.getAbsolutePath());
+ if(file.canRead()){
+ for(File temp: file.listFiles()){
+ if(temp.isDirectory()){
+ // Recursive search.
+ searchFile(temp, name);
+ }else{
+ if(temp.getName().equals(name+".drl")){
+ matchingList.add(temp);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void createPom(String name){
+ Model model = new Model();
+ model.setModelVersion("4.0.0");
+ model.setGroupId(getGroupID(name));
+ model.setArtifactId(getArtifactID(name));
+ model.setVersion(incrementVersion(name));
+ model.setName(name);
+ DistributionManagement distributionManagement = new DistributionManagement();
+ DeploymentRepository repository = new DeploymentRepository();
+ repository.setId(repID);
+ repository.setName(repName);
+ repository.setUrl(repURL);
+ distributionManagement.setRepository(repository);
+ model.setDistributionManagement(distributionManagement);
+ // Depenendency Mangement goes here.
+ List<Dependency> dependencyList= new ArrayList<Dependency>();
+
+ String version= StringEscapeUtils.escapeJava(brmsdependencyversion);
+
+ Dependency demoDependency = new Dependency();
+ demoDependency.setGroupId("org.openecomp.policy.drools-applications");
+ demoDependency.setArtifactId("demo");
+ demoDependency.setVersion(version);
+ dependencyList.add(demoDependency);
+
+ Dependency controlloopDependency = new Dependency();
+ controlloopDependency.setGroupId("org.openecomp.policy.drools-applications");
+ controlloopDependency.setArtifactId("controlloop");
+ controlloopDependency.setVersion(version);
+ dependencyList.add(controlloopDependency);
+
+ Dependency restDependency = new Dependency();
+ restDependency.setGroupId("org.openecomp.policy.drools-applications");
+ restDependency.setArtifactId("rest");
+ restDependency.setVersion(version);
+ dependencyList.add(restDependency);
+
+ Dependency appcDependency = new Dependency();
+ appcDependency.setGroupId("org.openecomp.policy.drools-applications");
+ appcDependency.setArtifactId("appc");
+ appcDependency.setVersion(version);
+ dependencyList.add(appcDependency);
+
+ Dependency aaiDependency = new Dependency();
+ aaiDependency.setGroupId("org.openecomp.policy.drools-applications");
+ aaiDependency.setArtifactId("aai");
+ aaiDependency.setVersion(version);
+ dependencyList.add(aaiDependency);
+
+ Dependency msoDependency = new Dependency();
+ msoDependency.setGroupId("org.openecomp.policy.drools-applications");
+ msoDependency.setArtifactId("mso");
+ msoDependency.setVersion(version);
+ dependencyList.add(msoDependency);
+
+ Dependency trafficgeneratorDependency = new Dependency();
+ trafficgeneratorDependency.setGroupId("org.openecomp.policy.drools-applications");
+ trafficgeneratorDependency.setArtifactId("trafficgenerator");
+ trafficgeneratorDependency.setVersion(version);
+ dependencyList.add(trafficgeneratorDependency);
+
+
+ model.setDependencies(dependencyList);
+
+ Writer writer = null;
+ try{
+ writer = WriterFactory.newXmlWriter(new File(projectsLocation+File.separator+getArtifactID(name)+File.separator+"pom.xml"));
+ MavenXpp3Writer pomWriter = new MavenXpp3Writer();
+ pomWriter.write(writer, model);
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Error while creating POM for " + getArtifactID(name) + e.getMessage());
+ }finally{
+ IOUtil.close(writer);
+ }
+ }
+
+ private void createProject(String path,String ksessionName){
+ new File(path+File.separator+"rules").mkdirs();
+ new File(path+File.separator+"META-INF").mkdirs();
+ if(!Files.exists(Paths.get(path+File.separator+"META-INF"+File.separator+"kmodule.xml"))){
+ // Hard coding XML for PDP Drools to accept our Rules.
+ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "\n"+
+ "<kmodule xmlns=\"http://jboss.org/kie/6.0.0/kmodule\">" +"\n"+
+ "<kbase name=\"rules\" packages=\"rules\">" + "\n" +
+ "<ksession name=\""+ ksessionName +"\"/>"+ "\n" +
+ "</kbase></kmodule>";
+ copyDataToFile(path+File.separator+"META-INF"+File.separator+"kmodule.xml", xml);
+ }
+ }
+
+ private void copyDataToFile(String file, String rule) {
+ try{
+ FileUtils.writeStringToFile(new File(file), rule);
+ } catch (Exception e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Error while creating Rule for " + file + e.getMessage());
+ }
+ }
+
+ private void readGroups(Properties config) throws Exception{
+ String[] groupNames = null;
+ if(config.getProperty("groupNames").contains(",")){
+ groupNames = config.getProperty("groupNames").replaceAll(" ", "").split(",");
+ }else{
+ groupNames = new String[]{config.getProperty("groupNames").replaceAll(" ", "")};
+ }
+ if(groupNames==null || groupNames.length==0){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "groupNames property is missing or empty from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + "groupNames property is missing or empty from the property file ");
+ }
+ names = new HashMap<String, Integer>();
+ groupIDs = new ArrayList<String>();
+ artifactIDs = new ArrayList<String>();
+ for(int counter=0; counter < groupNames.length ;counter++){
+ String name = groupNames[counter];
+ String groupID = config.getProperty(name+".groupID");
+ if(groupID==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".groupID property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".groupID property is missing from the property file ");
+ }
+ String artifactID = config.getProperty(name+".artifactID");
+ if(artifactID==null){
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".artifactID property is missing from the property file ");
+ throw new Exception(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".artifactID property is missing from the property file ");
+ }
+ // Add to list if we got all
+ names.put(name, counter);
+ groupIDs.add(groupID);
+ artifactIDs.add(artifactID);
+ }
+ }
+
+ private String getGroupID(String name){
+ return groupIDs.get(names.get(name));
+ }
+
+ private String getArtifactID(String name){
+ return artifactIDs.get(names.get(name));
+ }
+
+ private String getName(String filePath){
+ filePath = filePath.replaceFirst(projectsLocation, "").substring(1);
+ String artifactName = filePath.substring(0, filePath.indexOf(File.separator));
+ for(String name : names.keySet()){
+ if(artifactName.equals(getArtifactID(name))){
+ return name;
+ }
+ }
+ // If not found return default
+ return defaultName;
+ }
+
+ private String incrementVersion(String name) {
+ final NexusClient client = new NexusRestClient();
+ String newVersion = "0.1.0";
+ createFlag = false;
+ try {
+ client.connect(repURL.substring(0, repURL.indexOf(repURL.split(":[0-9]+\\/nexus")[1])), repUserName, repPassword);
+ final NexusArtifact template = new NexusArtifact();
+ template.setGroupId(getGroupID(name));
+ template.setArtifactId(getArtifactID(name));
+ final List<NexusArtifact> artifacts = client.searchByGAV(template);
+ int bigMajor = 0;
+ int bigMinor = 0;
+ for(NexusArtifact artifact : artifacts){
+ String version = artifact.getVersion();
+ int majorVal = Integer.parseInt(version.substring(0, version.indexOf(".")));
+ int minorVal = Integer.parseInt(version.substring(version.indexOf(".")+1,version.lastIndexOf(".")));
+ if(majorVal > bigMajor){
+ bigMajor = majorVal;
+ bigMinor = minorVal;
+ }else if((bigMajor==majorVal) && (minorVal > bigMinor)){
+ bigMinor = minorVal;
+ }
+ }
+ if(bigMinor>=9){
+ bigMajor = bigMajor+1;
+ bigMinor = 0;
+ }else{
+ bigMinor = bigMinor+1;
+ }
+ if(artifacts.isEmpty()){
+ // This is new artifact.
+ newVersion = "0.1.0";
+ }else{
+ newVersion = bigMajor + "." + bigMinor + artifacts.get(0).getVersion().substring(artifacts.get(0).getVersion().lastIndexOf("."));
+ }
+ } catch (NexusClientException | NexusConnectionException | NullPointerException e) {
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "version number increment failed will be using default version " +e.getMessage());
+ } finally {
+ try {
+ client.disconnect();
+ } catch (NexusClientException | NexusConnectionException e) {
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "failed to disconnect Connection from Nexus." +e.getMessage());
+ }
+ }
+ if(newVersion.equals("0.1.0")){
+ createFlag = true;
+ }
+ versions.put(name, newVersion);
+ logger.info("Controller: " + name + "is on version: "+ newVersion);
+ return newVersion;
+ }
+
+ // Return BackUpMonitor
+ public static BackUpMonitor getBackUpMonitor(){
+ return bm;
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/ControllerPOJO.java b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/ControllerPOJO.java
new file mode 100644
index 0000000..546925b
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/ControllerPOJO.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.policy.brmsInterface;
+
+import java.util.Map;
+
+/**
+ * POJO for controller information.
+ *
+ */
+public class ControllerPOJO {
+ private String name;
+ private Map<String,String> drools;
+ private String operation;
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public Map<String,String> getDrools() {
+ return drools;
+ }
+ public void setDrools(Map<String,String> drools) {
+ this.drools = drools;
+ }
+ public String getOperation() {
+ return operation;
+ }
+ public void setOperation(String operation) {
+ this.operation = operation;
+ }
+}
+
diff --git a/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/NotificationPOJO.java b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/NotificationPOJO.java
new file mode 100644
index 0000000..116a7b4
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/openecomp/policy/brmsInterface/NotificationPOJO.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.policy.brmsInterface;
+
+import java.util.List;
+
+/**
+ * This POJO will be transformed to JSON for Notification Purposes.
+ *
+ */
+public class NotificationPOJO {
+ private String requestID;
+ private String entity;
+ private List<ControllerPOJO> controllers;
+ public String getRequestID() {
+ return requestID;
+ }
+ public void setRequestID(String requestID) {
+ this.requestID = requestID;
+ }
+ public String getEntity() {
+ return entity;
+ }
+ public void setEntity(String entity) {
+ this.entity = entity;
+ }
+ public List<ControllerPOJO> getControllers() {
+ return controllers;
+ }
+ public void setControllers(List<ControllerPOJO> controllers) {
+ this.controllers = controllers;
+ }
+
+}
diff --git a/BRMSGateway/src/main/resources/log4j.properties b/BRMSGateway/src/main/resources/log4j.properties
new file mode 100644
index 0000000..71f3596
--- /dev/null
+++ b/BRMSGateway/src/main/resources/log4j.properties
@@ -0,0 +1,48 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP Policy Engine
+# ================================================================================
+# Copyright (C) 2017 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=========================================================
+###
+
+#
+# Use this properties for debugging and development.
+#
+#
+# Set root logger level to DEBUG and its only appender to A1.
+log4j.rootLogger=INFO, FILE
+
+# A1 is set to be a DailyRollingFileAppender.
+log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
+
+# Set the name of the file
+log4j.appender.FILE.File=BRMSLog.log
+
+# Set the immediate flush to true (default)
+log4j.appender.FILE.ImmediateFlush=true
+
+# Set the threshold to debug mode
+log4j.appender.FILE.Threshold=debug
+
+# Set the append to false, should not overwrite
+log4j.appender.FILE.Append=true
+
+# Set the DatePattern
+log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
+
+# A1 uses PatternLayout.
+log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
+log4j.appender.FILE.layout.ConversionPattern=%d{yyyy_MM_dd_HH_mm_ss_SSS} [%t] %-5p %l- %m%n
diff --git a/BRMSGateway/src/main/resources/logback.xml b/BRMSGateway/src/main/resources/logback.xml
new file mode 100644
index 0000000..af6dd33
--- /dev/null
+++ b/BRMSGateway/src/main/resources/logback.xml
@@ -0,0 +1,252 @@
+<!--
+ ============LICENSE_START=======================================================
+ ECOMP Policy Engine
+ ================================================================================
+ Copyright (C) 2017 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=========================================================
+ -->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+ <!--<jmxConfigurator /> -->
+ <!-- directory path for all other type logs -->
+ <property name="logDir" value="logs" />
+
+ <!-- directory path for debugging type logs -->
+ <property name="debugDir" value="logs" />
+
+ <!-- specify the component name
+ <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC" -->
+ <property name="componentName" value="Policy"></property>
+ <property name="subComponentName" value="BRMSGateway"></property>
+
+ <!-- log file names -->
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+
+
+ <!-- modified time stamp format -->
+
+ <!-- A U D I T
+ <property name="defaultAuditPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+ <property name="defaultAuditPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{ElapsedTime}|%X{server}|%X{clientIpAddress}|%c||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+ -->
+ <property name="defaultAuditPattern" value="%X{TransactionBeginTimestamp}|%X{TransactionEndTimestamp}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{TransactionElapsedTime}|%X{server}|%X{clientIpAddress}|%c||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+
+
+
+ <!-- M E T R I C
+ <property name="defaultMetricPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+ -->
+ <property name="defaultMetricPattern" value="%X{MetricBeginTimestamp}|%X{MetricEndTimestamp}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%p|%X{severity}|%X{serverIpAddress}|%X{MetricElapsedTime}|%X{server}|%X{clientIpAddress}|%c||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+
+
+
+ <!-- E R R O R
+ <property name="defaultErrorPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
+ -->
+ <property name="defaultErrorPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{requestId}|%t|%X{serviceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
+
+
+
+ <!-- D E B U G
+ <property name="debugLoggerPatternOld" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
+ <property name="debugLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> -->
+ -->
+ <property name="debugLoggerPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%msg%n" />
+
+
+
+ <!-- D E F A U L T
+ <property name="defaultPatternOld" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}|%msg%n" />
+ <property name="defaultPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+ -->
+ <property name="defaultPattern" value="%d{"yyyy-MM-dd'T'HH:mm:ss.SSSXXX", UTC}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{server}|%X{clientIpAddress}|%c||%msg%n" />
+
+
+
+ <!-- P A T H
+ <property name="logDirectory" value="${catalina.base}/${logDir}/${componentName}/${subComponentName}" />
+ <property name="debugLogDirectory" value="${catalina.base}/${debugDir}/${componentName}/${subComponentName}" />
+ -->
+ <property name="logDirectory" value="${logDir}/${componentName}/${subComponentName}" />
+ <property name="debugLogDirectory" value="${debugDir}/${componentName}/${subComponentName}" />
+
+
+
+
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+
+ <!-- The EELFAppender is used to record events to the general application
+ log -->
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine
+ related logging events. The audit logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultAuditPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+
+
+
+<appender name="EELFMetrics"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>${defaultMetricPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender>
+
+
+
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>ERROR</level>
+ </filter>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultErrorPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+
+
+ <appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>INFO</level>
+ </filter>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+
+ <logger name="com.att.eelf.audit" level="info" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="info" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+ </logger>
+
+ <logger name="com.att.eelf.error" level="error" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="com.att.eelf.debug" level="info" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger>
+
+
+
+ <root level="INFO">
+ <appender-ref ref="asyncEELFDebug" />
+ <appender-ref ref="asyncEELFError" />
+ </root>
+
+</configuration>
\ No newline at end of file