* ============LICENSE_START=======================================================
* ONAP Policy Engine
* ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Modified Copyright (C) 2018 Samsung Electronics Co., Ltd.
+ * Modifications Copyright (C) 2019 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.
import com.att.nsa.cambria.client.CambriaClientBuilders;
import com.att.nsa.cambria.client.CambriaClientBuilders.PublisherBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
-
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Pattern;
-
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.ws.rs.ProcessingException;
-
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.maven.model.Dependency;
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.eclipse.persistence.config.PersistenceUnitProperties;
import org.onap.policy.api.PEDependency;
import org.onap.policy.utils.BackUpHandler;
import org.onap.policy.utils.BackUpMonitor;
import org.onap.policy.utils.BusPublisher;
+import org.onap.policy.utils.PeCryptoUtils;
import org.onap.policy.utils.PolicyUtils;
import org.onap.policy.xacml.api.XACMLErrorConstants;
/**
* BRMSPush: Application responsible to push policies to the BRMS PDP Policy Repository (PR).
* Mavenize and push policy to PR
- *
+ *
* @version 1.0
*/
private static final String DROOLS_APPS_TEMPLATE_GROUP =
"org.onap.policy.drools-applications.controlloop.templates";
private static final String DROOLS_APPS_MODEL_GROUP =
- "org.onap.policy.drools-applications.controlloop.common.model-impl";
+ "org.onap.policy.models.policy-models-interactions.model-impl";
private static final String META_INF = "META-INF";
private static final String KMODULE_XML_FILE = "kmodule.xml";
private static final String POM_XML_FILE = "pom.xml";
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 final String DEFAULT_VERSION = "1.2.3";
+ private static final String DEFAULT_VERSION = "1.5.1-SNAPSHOT";
private static final String DEPENDENCY_FILE = "dependency.json";
- private static final String BRMSPERSISTENCE = "brmsEclipselink.persistencexml";
+ private static final String PROP_AES_KEY = "org.onap.policy.encryption.aes.key";
+ public static final String BRMSPERSISTENCE = "brmsEclipselink.persistencexml";
private static Map<String, String> modifiedGroups = new HashMap<>();
private static IntegrityMonitor im;
/**
* Responsible to push policies to the BRMS PDP Policy Repository (PR).
- *
+ *
* @param propertiesFile the properties file
* @param handler the {@link BackUpHandler}
* @throws PolicyException PolicyException related to the operation
throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE
+ "Data/File Read Error while reading from the property file.");
}
+ // init the aes key from prop or env
+ PeCryptoUtils.initAesKey(config.getProperty(PROP_AES_KEY));
+
LOGGER.info("Trying to set up IntegrityMonitor");
String resourceName = null;
try {
repUrlList.add(repUrl);
}
repUserName = config.getProperty("repositoryUsername");
- repPassword = config.getProperty("repositoryPassword");
+ repPassword = PeCryptoUtils.decrypt(config.getProperty("repositoryPassword"));
if (repUserName == null || repPassword == null) {
LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+ "repostoryUserName and respositoryPassword properties are required.");
uebList = uebList.trim();
pubTopic = pubTopic.trim();
pubBuilder = new CambriaClientBuilders.PublisherBuilder();
- pubBuilder.usingHosts(uebList).onTopic(pubTopic);
+ pubBuilder.usingHosts(uebList).onTopic(pubTopic).usingHttps(true);
String apiKey = config.getProperty("UEB_API_KEY");
String apiSecret = config.getProperty("UEB_API_SECRET");
if (apiKey != null && !apiKey.isEmpty() && apiSecret != null && !apiSecret.isEmpty()) {
final ArrayList<PEDependency> userDependencies = new ArrayList<>();
for (final Map.Entry<String, String> entry : responseAttributes.entrySet()) {
final String key = entry.getKey();
- String value = entry.getValue();
+ final String value = entry.getValue();
if (key.equals(policyKeyId)) {
selectedName = value;
}
}
// Check User Specific values.
if ("$controller:".equals(key)) {
- try {
- final PEDependency dependency = PolicyUtils.jsonStringToObject(value, PEDependency.class);
- userControllerName = key.replaceFirst("$controller:", "");
- LOGGER.info("addRule: userControllerName - " + userControllerName + ", dependency: - "
- + dependency);
- addToGroup(userControllerName, dependency);
- } catch (final Exception e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while resolving Controller: " + e);
- }
-
+ userControllerName = getUserControllerName(key, value);
} else if ("$dependency$".equals(key) && value.startsWith("[") && value.endsWith("]")) {
- value = value.substring(1, value.length() - 1).trim();
- final List<String> dependencyStrings = Arrays.asList(value.split(Pattern.quote("},{")));
- for (final String dependencyString : dependencyStrings) {
- try {
- userDependencies.add(PolicyUtils.jsonStringToObject(dependencyString, PEDependency.class));
- } catch (final Exception e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while resolving Dependencies: "
- + e);
- }
- }
+ updateUserDependencies(userDependencies, value);
}
}
if (userControllerName != null) {
}
}
+ private String getUserControllerName(final String key, final String value) {
+ String userControllerName = null;
+ // Check User Specific values.
+ try {
+ final PEDependency dependency = PolicyUtils.jsonStringToObject(value, PEDependency.class);
+ userControllerName = key.replaceFirst("$controller:", "");
+ LOGGER.info("addRule: userControllerName - " + userControllerName + ", dependency: - " + dependency);
+ addToGroup(userControllerName, dependency);
+ } catch (final Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while resolving Controller: " + e);
+ }
+ return userControllerName;
+ }
+
+ private void updateUserDependencies(final ArrayList<PEDependency> userDependencies, String value) {
+ // update the user dependencies supplied as parameter to this method
+ value = value.substring(1, value.length() - 1).trim();
+ final List<String> dependencyStrings = Arrays.asList(value.split(Pattern.quote("},{")));
+ for (final String dependencyString : dependencyStrings) {
+ try {
+ userDependencies.add(PolicyUtils.jsonStringToObject(dependencyString, PEDependency.class));
+ } catch (final Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while resolving Dependencies: " + e);
+ }
+ }
+ }
+
private void syncGroupInfo() {
// Sync DB to JMemory.
final EntityTransaction et = em.getTransaction();
LOGGER.info("Updated Local Memory values with values from database.");
} catch (final Exception exception) {
LOGGER.error("Unable to sync group info", exception);
- et.rollback();
- throw exception;
+ if (et.isActive()) {
+ et.rollback();
+ }
+
}
}
} catch (final Exception exception) {
LOGGER.error("Unable add policy to database", exception);
et.rollback();
- throw exception;
}
}
try (JarFile jar = new JarFile(jarFileName)) {
final Enumeration<?> enumEntries = jar.entries();
while (enumEntries.hasMoreElements()) {
- final JarEntry jarEntry = (JarEntry) enumEntries.nextElement();
- File file = null;
- final String fileName = jarEntry.getName().substring(jarEntry.getName().lastIndexOf("/") + 1);
- if (jarEntry.getName().endsWith(".drl")) {
- final String path = PROJECTSLOCATION + File.separator + artifactId + File.separator + "src"
- + File.separator + "main" + File.separator + RESOURCES + File.separator + RULES;
- new File(path).mkdirs();
- if (syncFlag && policyMap.containsKey(fileName.replace(".drl", ""))) {
- file = new File(path + File.separator + fileName);
- } else {
- file = new File(path + File.separator + fileName);
- }
- } else if (jarEntry.getName().endsWith(POM_XML_FILE)) {
- final String path = PROJECTSLOCATION + File.separator + artifactId;
- new File(path).mkdirs();
- file = new File(path + File.separator + fileName);
- } else if (jarEntry.getName().endsWith(KMODULE_XML_FILE)) {
- final String path = PROJECTSLOCATION + File.separator + artifactId + File.separator + "src"
- + File.separator + "main" + File.separator + RESOURCES + File.separator + META_INF;
- new File(path).mkdirs();
- file = new File(path + File.separator + fileName);
- }
- if (file != null) {
- try (InputStream is = jar.getInputStream(jarEntry);
- FileOutputStream fos = new FileOutputStream(file)) {
- while (is.available() > 0) {
- fos.write(is.read());
- }
- LOGGER.info(fileName + " Created..");
- } catch (final IOException e) {
- LOGGER.info("exception Occured" + e);
- }
- }
+ parseJarContents(artifactId, jar, enumEntries);
}
} catch (final IOException e) {
LOGGER.info("exception Occured" + e);
}
}
+ private void parseJarContents(final String artifactId, final JarFile jar, final Enumeration<?> enumEntries) {
+ final JarEntry jarEntry = (JarEntry) enumEntries.nextElement();
+ File file = null;
+ final String fileName = jarEntry.getName().substring(jarEntry.getName().lastIndexOf("/") + 1);
+ if (jarEntry.getName().endsWith(".drl")) {
+ final String path = PROJECTSLOCATION + File.separator + artifactId + File.separator + "src" + File.separator
+ + "main" + File.separator + RESOURCES + File.separator + RULES;
+ new File(path).mkdirs();
+ if (syncFlag && policyMap.containsKey(fileName.replace(".drl", ""))) {
+ file = new File(path + File.separator + fileName);
+ } else {
+ file = new File(path + File.separator + fileName);
+ }
+ } else if (jarEntry.getName().endsWith(POM_XML_FILE)) {
+ final String path = PROJECTSLOCATION + File.separator + artifactId;
+ new File(path).mkdirs();
+ file = new File(path + File.separator + fileName);
+ } else if (jarEntry.getName().endsWith(KMODULE_XML_FILE)) {
+ final String path = PROJECTSLOCATION + File.separator + artifactId + File.separator + "src" + File.separator
+ + "main" + File.separator + RESOURCES + File.separator + META_INF;
+ new File(path).mkdirs();
+ file = new File(path + File.separator + fileName);
+ }
+ if (file != null) {
+ try (InputStream is = jar.getInputStream(jarEntry); FileOutputStream fos = new FileOutputStream(file)) {
+ while (is.available() > 0) {
+ fos.write(is.read());
+ }
+ LOGGER.info(fileName + " Created..");
+ } catch (final IOException e) {
+ LOGGER.info("exception Occured" + e);
+ }
+ }
+ }
+
private NexusArtifact getLatestArtifactFromNexus(final String selectedName) {
final List<NexusArtifact> artifacts = getArtifactFromNexus(selectedName, null);
int bigNum = 0;
/**
* Will Push policies to the PolicyRepo.
- *
+ *
* @throws PolicyException PolicyException related to the operation
*/
public void pushRules() throws PolicyException {
LOGGER.error("Error while starting Transaction " + e);
}
if (!modifiedGroups.isEmpty()) {
- Boolean flag = false;
- for (final Map.Entry<String, String> entry : modifiedGroups.entrySet()) {
- InvocationResult result = null;
- final String group = entry.getKey();
- try {
- LOGGER.info("PushRules: ModifiedGroups, Key: " + group + ", Value: " + entry.getValue());
- final InvocationRequest request = new DefaultInvocationRequest();
- setVersion(group);
- createPom(group);
- request.setPomFile(new File(
- PROJECTSLOCATION + File.separator + getArtifactId(group) + File.separator + POM_XML_FILE));
- request.setGoals(Arrays.asList(GOALS));
- final Invoker invoker = new DefaultInvoker();
- result = invoker.execute(request);
- if (result.getExecutionException() != null) {
- LOGGER.error(result.getExecutionException());
- } else if (result.getExitCode() != 0) {
- LOGGER.error("Maven Invocation failure..!");
- }
- } catch (final Exception e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Maven Invocation issue for "
- + getArtifactId(group) + e.getMessage(), e);
- }
- if (result != null && result.getExitCode() == 0) {
- LOGGER.info("Build Completed..!");
- if (createFlag) {
- addNotification(group, "create");
- } else {
- addNotification(group, entry.getValue());
- }
- flag = true;
- } else {
- throw new PolicyException(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Maven Invocation failure!");
- }
- }
- if (flag) {
+ if (buildAndGenerateJarFile()) {
sendNotification(controllers);
}
}
getNameAndSetRemove(controllerName, name);
}
+ private Boolean buildAndGenerateJarFile() throws PolicyException {
+ Boolean flag = false;
+ for (final Map.Entry<String, String> entry : modifiedGroups.entrySet()) {
+ InvocationResult result = null;
+ final String group = entry.getKey();
+ try {
+ LOGGER.info("PushRules: ModifiedGroups, Key: " + group + ", Value: " + entry.getValue());
+ final InvocationRequest request = new DefaultInvocationRequest();
+ setVersion(group);
+ createPom(group);
+ request.setPomFile(new File(
+ PROJECTSLOCATION + File.separator + getArtifactId(group) + File.separator + POM_XML_FILE));
+ request.setGoals(Arrays.asList(GOALS));
+ final Invoker invoker = new DefaultInvoker();
+ result = invoker.execute(request);
+ if (result.getExecutionException() != null) {
+ LOGGER.error(result.getExecutionException());
+ } else if (result.getExitCode() != 0) {
+ LOGGER.error("Maven Invocation failure..!");
+ }
+ } catch (final Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Maven Invocation issue for "
+ + getArtifactId(group) + e.getMessage(), e);
+ }
+ if (result != null && result.getExitCode() == 0) {
+ LOGGER.info("Build Completed..!");
+ if (createFlag) {
+ addNotification(group, "create");
+ } else {
+ addNotification(group, entry.getValue());
+ }
+ flag = true;
+ } else {
+ throw new PolicyException(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Maven Invocation failure!");
+ }
+ }
+ return flag;
+ }
+
private String getGroupName(final String name) {
if (policyMap.containsKey(name)) {
return policyMap.get(name);
/**
* Default Dependency Section. Can be changed as required.
- *
+ *
* @param controllerName the controller name
* @return changed dependency list
*/
msoDependency.setArtifactId("controlloop.common.model-impl.so");
msoDependency.setVersion(version);
dependencyList.add(msoDependency);
-
- final Dependency trafficgeneratorDependency = new Dependency();
- trafficgeneratorDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
- trafficgeneratorDependency.setArtifactId("controlloop.common.model-impl.trafficgenerator");
- trafficgeneratorDependency.setVersion(version);
- dependencyList.add(trafficgeneratorDependency);
return dependencyList;
}
} catch (final Exception exception) {
LOGGER.error("Unable add/update policy group to database for controller name: " + name, exception);
et.rollback();
- throw exception;
}
}
} catch (final Exception exception) {
LOGGER.error("Unable remove policy from group to database for policy name: " + policyName, exception);
et.rollback();
- throw exception;
}
}
/**
* Get URL List Size.
- *
+ *
* @return URL list size
*/
public int urlListSize() {