aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--aai-core/src/main/java/org/openecomp/aai/dbgraphgen/DbSearchWithTags.java366
-rw-r--r--aai-core/src/test/java/org/openecomp/aai/parsers/uri/URIToDBKeyTest.java182
-rw-r--r--aai-core/src/test/java/org/openecomp/aai/util/CNNameTest.java2
3 files changed, 184 insertions, 366 deletions
diff --git a/aai-core/src/main/java/org/openecomp/aai/dbgraphgen/DbSearchWithTags.java b/aai-core/src/main/java/org/openecomp/aai/dbgraphgen/DbSearchWithTags.java
deleted file mode 100644
index dba5fba3..00000000
--- a/aai-core/src/main/java/org/openecomp/aai/dbgraphgen/DbSearchWithTags.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * org.openecomp.aai
- * ================================================================================
- * 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.aai.dbgraphgen;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import org.openecomp.aai.db.props.AAIProperties;
-import org.openecomp.aai.exceptions.AAIException;
-import org.openecomp.aai.introspection.Loader;
-import org.openecomp.aai.serialization.db.DBSerializer;
-import org.openecomp.aai.serialization.engines.TransactionalGraphEngine;
-import org.openecomp.aai.util.AAIConfig;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-
-
-/**
- * Database-level Search-Utility class that uses edge-tags to help it navigate the graph.
- */
-public class DbSearchWithTags{
-
- private EELFLogger LOGGER = EELFManager.getInstance().getLogger(DbSearchWithTags.class);
-
- private TransactionalGraphEngine engine;
-
- protected DbSearchWithTags() {
-
- }
- public DbSearchWithTags(Loader loader, TransactionalGraphEngine engine, DBSerializer serializer) {
- this.engine = engine;
- }
-
- /**
- * Run edge tag query.
- *
- * @param transId the trans id
- * @param fromAppId the from app id
- * @param edgeTag the edge tag
- * @param searchRootType - root collection point when doing the search
- * @param displayRootType - if they want more data than would be included using the searchRootType, this
- * lets them specify it.
- * @param searchDirectionStr the search direction str
- * @param initialFilterHash the initial filter hash
- * @param secondaryFilterHash the secondary filter hash
- * @param pruneLevel either "none", "searchLevel" or "displayLevel".
- * @param retNodeType could be either "all" for the full map, or a single nodeType
- * @param trimList list of nodes to "stop" at when collecting data
- * @return List<resultSet>
- * @throws AAIException the AAI exception
- */
- public Tree<Vertex> runEdgeTagQuery( String transId, String fromAppId,
- String edgeTag,
- String searchRootType,
- Map<String,Object> initialFilterHash,
- Map<String,Object> secondaryFilterHash)
- throws AAIException{
-
- final String tag = edgeTag;
- final String reverseTag = edgeTag + "-REV";
- //max levels is not used at this time, but may be used again
- int maxLevels = 50; // default value
- String maxString = AAIConfig.get("aai.edgeTag.proc.max.levels");
- if( maxString != null && !maxString.equals("") ){
- try {
- int maxVal = Integer.parseInt(maxString);
- maxLevels = maxVal;
- }
- catch ( Exception nfe ){
- // Don't worry, we will leave "maxLevels" set to the default value it was initialized with
- }
- }
-
- // First, we need to use the intialFilter plus the edgeTag to identify a set of search-root-nodes
- HashMap <String, Vertex> searchRootHash = identifyTopNodeSet( transId, fromAppId,
- edgeTag, searchRootType, initialFilterHash, maxLevels );
-
-
- Set<String> keySet = searchRootHash.keySet();
- Iterator<String> itr = keySet.iterator();
- String[] arrayOfVertices = new String[keySet.size()];
- int i = 0;
- while (itr.hasNext()) {
- arrayOfVertices[i] = itr.next();
- i++;
- }
- //start from all vertices provided
- //repeat checking the out edge for the tag and the in edge for reverse tag
- //emit all vertices not already seen and start again
- //return a tree structure of the vertices and edges touched by this traversal
- Tree<Element> resultTree = this.engine.asAdmin().getReadOnlyTraversalSource().V(arrayOfVertices)
- .emit().repeat(__.union(__.outE().has(tag, true), __.inE().has(reverseTag, true)).otherV()).tree().next();
-
- //the resulting tree includes the edges because of our query, we'll need to remove them
- Tree<Vertex> sanitizedTree = removeUnwantedItems(resultTree);
-
- //if we have secondary filters then check each tree returned for matches
- if (!secondaryFilterHash.isEmpty()) {
- filterOutResultTrees(sanitizedTree, secondaryFilterHash);
- }
- return sanitizedTree;
-
- }// End of runEdgeTagQuery()
-
- /**
- * Identify top node set.
- *
- * @param transId the trans id
- * @param fromAppId the from app id
- * @param edgeTag the edge tag
- * @param topNodeType the top node type
- * @param initialFilterHash the initial filter hash
- * @param maxLevels the max levels
- * @return List<titanVertex>
- * @throws AAIException the AAI exception
- */
- public HashMap<String, Vertex> identifyTopNodeSet( String transId, String fromAppId,
- String edgeTag, String topNodeType, Map<String,Object> initialFilterHash, int maxLevels )
- throws AAIException {
-
- final String tag = edgeTag;
- final String reverseTag = edgeTag + "-REV";
- HashMap <String, Vertex> topVertHash = new HashMap <>();
-
- // Given the filter, we want to select all the nodes of the type the filter tells us that have the
- // property they gave us.
- // Then looping through those start points, we will look "up" and then "down" to find the set of target/top nodes.
-
- if( initialFilterHash == null || initialFilterHash.isEmpty() ){
- throw new AAIException("AAI_6118", " initialFilterHash is required for identifyInitialNodeSet() call. \n");
- }
-
- // NOTE: we're expecting the filter to have a format like this: "nodeType.parameterName:parameterValue"
- Iterator <?> it = initialFilterHash.entrySet().iterator();
- // -- DEBUG -- for now we only deal with ONE initial filter parameter
- // it would be easy enough to deal with multiple parameters if they all
- // applied to the same nodeType.
- String propNodeTypeDotName = "";
- String initNodeType = "";
- String initPropName = "";
-
- String extraChecks = "";
-
- String propVal = "";
- if( it.hasNext() ){
- Map.Entry<?,?> propEntry = (Map.Entry<?,?>) it.next();
- propNodeTypeDotName = (propEntry.getKey()).toString();
- propVal = (propEntry.getValue()).toString();
- }
-
- GraphTraversalSource source = this.engine.asAdmin().getReadOnlyTraversalSource();
- GraphTraversal<Vertex, Vertex> g;
-
- int periodLoc = propNodeTypeDotName.indexOf(".");
- if( periodLoc <= 0 ){
- throw new AAIException("AAI_6120", "Bad filter param key passed in: [" + propNodeTypeDotName + "]. Expected format = [nodeName.paramName]\n");
- }
- else {
- initNodeType = propNodeTypeDotName.substring(0,periodLoc);
- initPropName = propNodeTypeDotName.substring(periodLoc + 1);
-
- //there used to be logic here that would do something special for generic-vnf.vnf-name and vserver.vserver-name
- //it would attempt a search as they sent it, if nothing came back, try as all upper, try as all lower, then fail
- //here it checks whether something comes back or not, if not change the case and try again
- if( (initNodeType.equals("generic-vnf") && initPropName.equals("vnf-name"))
- || (initNodeType.equals("vserver") && initPropName.equals("vserver-name")) ){
- if (!this.checkKludgeCase(initNodeType, initPropName, propVal)) {
- if (this.checkKludgeCase(initNodeType, initPropName, propVal.toUpperCase())) {
- propVal = propVal.toUpperCase();
- } else {
- if (this.checkKludgeCase(initNodeType, initPropName, propVal)) {
- propVal = propVal.toLowerCase();
- }
- }
- }
- }
- g = source.V().has(AAIProperties.NODE_TYPE, initNodeType).has(initPropName, propVal);
-
- //search all around bounded by our edge tag for start nodes that match our topNodeType
- if (!topNodeType.equals(initNodeType)) {
-
- g.union(__.<Vertex>start().until(__.has(AAIProperties.NODE_TYPE, topNodeType))
- .repeat(__.union(__.inE().has(reverseTag, true), __.outE().has(tag, true)).otherV()),
- __.<Vertex>start().until(__.has(AAIProperties.NODE_TYPE, topNodeType))
- .repeat(__.union(__.inE().has(tag, true), __.outE().has(reverseTag, true)).otherV())).dedup();
- }
-
- List<Vertex> results = g.toList();
-
- results.forEach(v -> {
- topVertHash.put(v.id().toString(), v);
- });
- }
- if( topVertHash.isEmpty() ){
- // No Vertex was found - throw a not-found exception
- throw new AAIException("AAI_6114", "No Node of type " + topNodeType + " found for properties: " + initialFilterHash.toString() + extraChecks);
- }
- else {
- return topVertHash;
- }
-
- }// End identifyInitialNodeSet()
-
- /**
- * This is a carryover from the previous version.
- * We may be able to remove this.
- *
- * @param nodeType
- * @param propName
- * @param propValue
- * @return
- */
- private boolean checkKludgeCase(String nodeType, String propName, String propValue) {
- return this.engine.getQueryBuilder().getVerticesByIndexedProperty(AAIProperties.NODE_TYPE, nodeType).getVerticesByProperty(propName, propValue).hasNext();
- }
-
- /**
- * This method starts from the top of the tree object and checks each nested tree.
- * If that tree does not contain a node (or nodes) that match the filterHash, remove it
- *
- * @param tree
- * @param filterHash
- * @throws AAIException
- */
- private void filterOutResultTrees(Tree<Vertex> tree, Map<String,Object> filterHash) throws AAIException {
- Set<Vertex> topLevelKeys = new LinkedHashSet<>(tree.keySet());
- for (Vertex topLevel : topLevelKeys) {
- if (!this.checkVertexWithFilters(topLevel, filterHash)) {
- if (!filterOutResultTreesHelper(tree.get(topLevel), filterHash)) {
- //if we never found anything to satisfy our filter, remove the entire result tree
- tree.remove(topLevel);
- }
- }
- }
- }
-
- /**
- * Checks all vertices of a tree with the provided filterHash
- *
- * @param tree
- * @param filterHash
- * @return
- * @throws AAIException
- */
- private boolean filterOutResultTreesHelper(Tree<Vertex> tree, Map<String,Object> filterHash) throws AAIException {
-
- Set<Vertex> keys = tree.keySet();
-
- for (Vertex v : keys) {
- if (checkVertexWithFilters(v, filterHash)) {
- return true;
- } else {
- if (filterOutResultTreesHelper(tree.get(v), filterHash)) {
- return true;
- }
- }
- }
-
- return false;
- }
- /**
- * Checks whether a vertex matches the filterHash provided
- *
- * @param v
- * @param filterHash
- * @return
- * @throws AAIException
- */
- private boolean checkVertexWithFilters(Vertex v, Map<String,Object> filterHash) throws AAIException {
- Iterator <?> it = filterHash.entrySet().iterator();
-
- while( it.hasNext() ){
- Map.Entry<?,?> filtEntry = (Map.Entry<?,?>) it.next();
- String propNodeTypeDotName = (filtEntry.getKey()).toString();
- String value = (filtEntry.getValue()).toString();
-
- int periodLoc = propNodeTypeDotName.indexOf(".");
- if( periodLoc <= 0 ){
- throw new AAIException("AAI_6120", "Bad filter param key passed in: [" + propNodeTypeDotName + "]. Expected format = [nodeName.paramName]\n");
- }
- else {
- String nodeType = propNodeTypeDotName.substring(0,periodLoc);
- String propertyName = propNodeTypeDotName.substring(periodLoc + 1);
- String nt = v.<String>property("aai-node-type").orElse(null);
- if( nt.equals( nodeType ) ){
- if( propertyName.equals("vertex-id") ){
- // vertex-id can't be gotten the same way as other properties
- String thisVtxId = v.id().toString();
- if( thisVtxId.equals(value) ){
- return true;
- }
- }
- else {
- Object thisValObj = v.property(propertyName).orElse(null);
- if( thisValObj != null ){
- String thisVal = thisValObj.toString();
- if( thisVal.equals(value) ){
- return true;
- }
- }
- }
- }
- }
- }
-
- return false;
- }
-
- /**
- * Removes every other tree from the originalTree provided.
- * It is designed to specifically handle removing unwanted edges from the originalTree
- * @param originalTree
- * @return
- */
- private Tree<Vertex> removeUnwantedItems(Tree<Element> originalTree) {
-
- Tree<Vertex> newTree = new Tree<>();
- Set<Element> keys = originalTree.keySet();
- for (Element element : keys) {
- newTree.put((Vertex)element, removeUnwantedItemsHelper(originalTree.get(element).getTreesAtDepth(2)));
- }
-
- return newTree;
-
-
- }
-
- private Tree<Vertex> removeUnwantedItemsHelper(List<Tree<Element>> originalTrees) {
- Tree<Vertex> newTree = new Tree<>();
- for (Tree<Element> tree : originalTrees) {
- newTree.addTree(removeUnwantedItems(tree));
- }
-
- return newTree;
- }
-}
diff --git a/aai-core/src/test/java/org/openecomp/aai/parsers/uri/URIToDBKeyTest.java b/aai-core/src/test/java/org/openecomp/aai/parsers/uri/URIToDBKeyTest.java
new file mode 100644
index 00000000..59c5dd40
--- /dev/null
+++ b/aai-core/src/test/java/org/openecomp/aai/parsers/uri/URIToDBKeyTest.java
@@ -0,0 +1,182 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.openecomp.aai
+ * ================================================================================
+ * 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.aai.parsers.uri;
+
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+
+import javax.ws.rs.core.UriBuilder;
+import javax.xml.bind.JAXBException;
+
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+
+import org.openecomp.aai.exceptions.AAIException;
+import org.openecomp.aai.introspection.Loader;
+import org.openecomp.aai.introspection.LoaderFactory;
+import org.openecomp.aai.introspection.ModelInjestor;
+import org.openecomp.aai.introspection.ModelType;
+import org.openecomp.aai.introspection.Version;
+
+
+@Ignore
+@PrepareForTest(ModelInjestor.class)
+public class URIToDBKeyTest {
+
+ private Loader loader = LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v8);
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ /**
+ * Configure.
+ */
+ @BeforeClass
+ public static void configure() {
+ System.setProperty("AJSC_HOME", ".");
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources/bundleconfig-local");
+ }
+
+ /**
+ * Uri.
+ *
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ @Test
+ public void uri() throws JAXBException, AAIException, IllegalArgumentException, UnsupportedEncodingException {
+ URI uri = UriBuilder.fromPath("/aai/" + loader.getVersion() + "/cloud-infrastructure/tenants/tenant/key1/vservers/vserver/key2/l-interfaces/l-interface/key3").build();
+ URIToDBKey parse = new URIToDBKey(loader, uri);
+ Object result = parse.getResult();
+
+ String expected = "cloud-region/att-aic/AAIAIC25/tenant/key1/vserver/key2/l-interface/key3";
+
+ assertEquals("blah", expected, result);
+
+ }
+
+ /**
+ * Uri no version.
+ *
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ @Test
+ public void uriNoVersion() throws JAXBException, AAIException, IllegalArgumentException, UnsupportedEncodingException {
+ URI uri = UriBuilder.fromPath("/cloud-infrastructure/tenants/tenant/key1/vservers/vserver/key2/l-interfaces/l-interface/key3").build();
+ URIToDBKey parse = new URIToDBKey(loader, uri);
+ Object result = parse.getResult();
+
+ String expected = "cloud-region/att-aic/AAIAIC25/tenant/key1/vserver/key2/l-interface/key3";
+
+ assertEquals("blah", expected, result);
+
+ }
+
+
+ /**
+ * Bad URI.
+ *
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ @Test
+ public void badURI() throws JAXBException, AAIException, IllegalArgumentException, UnsupportedEncodingException {
+ URI uri = UriBuilder.fromPath("/aai/" + loader.getVersion() + "/cloud-infrastructure/tenants/tenant/key1/vservers/vserver/key2/l-interadsfaces/l-interface/key3").build();
+
+ thrown.expect(AAIException.class);
+ thrown.expect(hasProperty("code", is("AAI_3001")));
+
+ new URIToDBKey(loader, uri);
+ }
+
+ /**
+ * No valid tokens.
+ *
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ @Test
+ public void noValidTokens() throws JAXBException, AAIException, IllegalArgumentException, UnsupportedEncodingException {
+ URI uri = UriBuilder.fromPath("/aai/" + loader.getVersion() + "/cloud/blah/blah").build();
+
+ thrown.expect(AAIException.class);
+ thrown.expect(hasProperty("code", is("AAI_3001")));
+
+ new URIToDBKey(loader, uri);
+ }
+
+ /**
+ * Starts with valid namespace.
+ *
+ * @throws JAXBException the JAXB exception
+ * @throws AAIException the AAI exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ @Test
+ public void startsWithValidNamespace() throws JAXBException, AAIException, IllegalArgumentException, UnsupportedEncodingException {
+ URI uri = UriBuilder.fromPath("/aai/" + loader.getVersion() + "/cloud-infrastructure/tenants/tenant/key1/vservers/vserver/key2/l-interfaces/l-interface/key3").build();
+
+ URIToDBKey parse = new URIToDBKey(loader, uri);
+ Object result = parse.getResult();
+
+ String expected = "cloud-region/att-aic/AAIAIC25/tenant/key1/vserver/key2/l-interface/key3";
+
+ assertEquals("blah", expected, result);
+ }
+
+ /**
+ * Naming exceptions.
+ *
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws AAIException the AAI exception
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ @Test
+ public void namingExceptions() throws IllegalArgumentException, AAIException, UnsupportedEncodingException {
+ URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags/cvlan-tag/655").build();
+ URIToDBKey parse = new URIToDBKey(loader, uri);
+ Object result = parse.getResult();
+
+ String expected = "vce/key1/port-group/key2/cvlan-tag/655";
+
+ assertEquals("blah", expected, result);
+
+ }
+
+}
diff --git a/aai-core/src/test/java/org/openecomp/aai/util/CNNameTest.java b/aai-core/src/test/java/org/openecomp/aai/util/CNNameTest.java
index dc7a5280..6b2536c9 100644
--- a/aai-core/src/test/java/org/openecomp/aai/util/CNNameTest.java
+++ b/aai-core/src/test/java/org/openecomp/aai/util/CNNameTest.java
@@ -56,6 +56,8 @@ public class CNNameTest {
*/
@Before
public void initialize(){
+ System.setProperty("AJSC_HOME", ".");
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources/bundleconfig-local");
mockAccEvent = Mockito.mock(IAccessEvent.class);
mockHttpServletRequest = Mockito.mock(HttpServletRequest.class);
cert = Mockito.mock(X509Certificate.class);