diff options
author | 2017-06-27 17:07:50 -0400 | |
---|---|---|
committer | 2017-06-27 17:14:37 -0400 | |
commit | c5009ade9e35d9d03131f55dafc9f0fd79c2246a (patch) | |
tree | 96e560b2fca04337951456e167253518947bf4ba /aai-resources/src | |
parent | 3c9490abf80793988b32b3a75fc6f386a56c832e (diff) |
[AAI-14] Force delete tool now uses Tinkerpop
vertex vs titan vertex
Updates now always add aai-node-type to vertex
Stop using hbase.table.timestamp.format=YYYYMMdd-HH:mm:ss:SSS for date
format
Define new endpoint in ajsc to process the v8 models from Model Loader
Change-Id: I7f6986e12d0f4c74256fe24629e1f1851541d7e4
Signed-off-by: Maharajh, Robby (rx2202) <rx2202@att.com>
Diffstat (limited to 'aai-resources/src')
9 files changed, 775 insertions, 735 deletions
diff --git a/aai-resources/src/main/ajsc/ajsc-aai_v1/ajsc-aai/v1/conf/jaxrsBeans.groovy b/aai-resources/src/main/ajsc/ajsc-aai_v1/ajsc-aai/v1/conf/jaxrsBeans.groovy index a54da81..e371cd7 100644 --- a/aai-resources/src/main/ajsc/ajsc-aai_v1/ajsc-aai/v1/conf/jaxrsBeans.groovy +++ b/aai-resources/src/main/ajsc/ajsc-aai_v1/ajsc-aai/v1/conf/jaxrsBeans.groovy @@ -11,7 +11,7 @@ beans{ ExampleConsumer(org.openecomp.aai.rest.ExampleConsumer) V3ThroughV7Consumer(org.openecomp.aai.rest.retired.V3ThroughV7Consumer) EchoResponse(org.openecomp.aai.rest.util.EchoResponse) - + ModelVersionTransformer(org.openecomp.aai.rest.tools.ModelVersionTransformer) util.list(id: 'jaxrsServices') { @@ -22,6 +22,7 @@ beans{ ref(bean:'BulkAddConsumer') ref(bean:'BulkProcessConsumer') ref(bean:'V3ThroughV7Consumer') + ref(bean:'ModelVersionTransformer') ref(bean:'EchoResponse') } diff --git a/aai-resources/src/main/java/org/openecomp/aai/dbgen/ForceDeleteTool.java b/aai-resources/src/main/java/org/openecomp/aai/dbgen/ForceDeleteTool.java index 20d5c9f..bced2bc 100644 --- a/aai-resources/src/main/java/org/openecomp/aai/dbgen/ForceDeleteTool.java +++ b/aai-resources/src/main/java/org/openecomp/aai/dbgen/ForceDeleteTool.java @@ -23,15 +23,19 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.Properties; import java.util.Scanner; + +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; -import org.slf4j.MDC; - import org.openecomp.aai.exceptions.AAIException; +import org.openecomp.aai.serialization.db.EdgeProperties; +import org.openecomp.aai.serialization.db.EdgeProperty; import org.openecomp.aai.util.AAIConfig; import org.openecomp.aai.util.AAIConstants; +import org.slf4j.MDC; + import com.att.eelf.configuration.Configuration; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; @@ -39,16 +43,11 @@ import com.thinkaurelius.titan.core.TitanEdge; import com.thinkaurelius.titan.core.TitanFactory; import com.thinkaurelius.titan.core.TitanGraph; import com.thinkaurelius.titan.core.TitanGraphQuery; -import com.thinkaurelius.titan.core.TitanVertex; public class ForceDeleteTool { - - - private static final int MAXDESCENDENTDEPTH = 15; - - /** + /* * The main method. * * @param args the arguments @@ -206,7 +205,7 @@ public class ForceDeleteTool { System.out.println(msg); logger.info(msg); - + ForceDelete fd = new ForceDelete(graph); if( actionVal.equals("COLLECT_DATA") ){ // When doing COLLECT_DATA, we expect the dataString string to be comma separated // name value pairs like this: @@ -241,13 +240,13 @@ public class ForceDeleteTool { } } if( (tgQ != null) && (tgQ instanceof TitanGraphQuery) ){ - Iterable <TitanVertex> verts = (Iterable<TitanVertex>) tgQ.vertices(); - Iterator <TitanVertex> vertItor = verts.iterator(); + Iterable <Vertex> verts = (Iterable<Vertex>) tgQ.vertices(); + Iterator <Vertex> vertItor = verts.iterator(); while( vertItor.hasNext() ){ resCount++; - TitanVertex v = (TitanVertex)vertItor.next(); - showNodeInfo( logger, v, displayAllVidsFlag ); - int descendantCount = countDescendants( logger, v, 0 ); + Vertex v = vertItor.next(); + fd.showNodeInfo( logger, v, displayAllVidsFlag ); + int descendantCount = fd.countDescendants( logger, v, 0 ); String infMsg = " Found " + descendantCount + " descendant nodes \n"; System.out.println( infMsg ); logger.info( infMsg ); @@ -268,20 +267,20 @@ public class ForceDeleteTool { Iterator <Vertex> vtxItr = graph.vertices( vertexIdLong ); if( vtxItr != null && vtxItr.hasNext() ) { Vertex vtx = vtxItr.next(); - showNodeInfo( logger, vtx, displayAllVidsFlag ); - int descendantCount = countDescendants( logger, (TitanVertex)vtx, 0 ); + fd.showNodeInfo( logger, vtx, displayAllVidsFlag ); + int descendantCount = fd.countDescendants( logger, vtx, 0 ); String infMsg = " Found " + descendantCount + " descendant nodes. Note - forceDelete does not cascade to " + " child nodes, but they may become unreachable after the delete. \n"; System.out.println( infMsg ); logger.info( infMsg ); - int edgeCount = countEdges( logger, vtx ); + int edgeCount = fd.countEdges( logger, vtx ); infMsg = " Found total of " + edgeCount + " edges incident on this node. \n"; System.out.println( infMsg ); logger.info( infMsg ); - if( getNodeDelConfirmation(logger, userIdVal, vtx, descendantCount, edgeCount, overRideProtection) ){ + if( fd.getNodeDelConfirmation(logger, userIdVal, vtx, descendantCount, edgeCount, overRideProtection) ){ vtx.remove(); graph.tx().commit(); infMsg = ">>>>>>>>>> Removed node with vertexId = " + vertexIdLong; @@ -314,7 +313,7 @@ public class ForceDeleteTool { System.exit(0); } - if( getEdgeDelConfirmation(logger, userIdVal, thisEdge, overRideProtection) ){ + if( fd.getEdgeDelConfirmation(logger, userIdVal, thisEdge, overRideProtection) ){ thisEdge.remove(); graph.tx().commit(); String infMsg = ">>>>>>>>>> Removed edge with edgeId = " + edgeIdStr; @@ -339,383 +338,389 @@ public class ForceDeleteTool { }// end of main() - - public static void showNodeInfo(EELFLogger logger, Vertex tVert, Boolean displayAllVidsFlag ){ + public static class ForceDelete { - try { - Iterator<VertexProperty<Object>> pI = tVert.properties(); - String infStr = ">>> Found Vertex with VertexId = " + tVert.id() + ", properties: "; - System.out.println( infStr ); - logger.info(infStr); - while( pI.hasNext() ){ - VertexProperty<Object> tp = pI.next(); - infStr = " [" + tp.key() + "|" + tp.value() + "] "; - System.out.println( infStr ); + private final int MAXDESCENDENTDEPTH = 15; + private final TitanGraph graph; + public ForceDelete(TitanGraph graph) { + this.graph = graph; + } + public void showNodeInfo(EELFLogger logger, Vertex tVert, Boolean displayAllVidsFlag ){ + + try { + Iterator<VertexProperty<Object>> pI = tVert.properties(); + String infStr = ">>> Found Vertex with VertexId = " + tVert.id() + ", properties: "; + System.out.println( infStr ); logger.info(infStr); + while( pI.hasNext() ){ + VertexProperty<Object> tp = pI.next(); + infStr = " [" + tp.key() + "|" + tp.value() + "] "; + System.out.println( infStr ); + logger.info(infStr); + } + + ArrayList <String> retArr = collectEdgeInfoForNode( logger, tVert, displayAllVidsFlag ); + for( String infoStr : retArr ){ + System.out.println( infoStr ); + logger.info(infoStr); + } } - - ArrayList <String> retArr = collectEdgeInfoForNode( logger, tVert, displayAllVidsFlag ); - for( String infoStr : retArr ){ - System.out.println( infoStr ); - logger.info(infoStr); + catch (Exception e){ + String warnMsg = " -- Error -- trying to display edge info. [" + e.getMessage() + "]"; + System.out.println( warnMsg ); + logger.warn(warnMsg); } - } - catch (Exception e){ - String warnMsg = " -- Error -- trying to display edge info. [" + e.getMessage() + "]"; - System.out.println( warnMsg ); - logger.warn(warnMsg); - } - - }// End of showNodeInfo() + + }// End of showNodeInfo() - - public static void showPropertiesForEdge( EELFLogger logger, TitanEdge tEd ){ - String infMsg = ""; - if( tEd == null ){ - infMsg = "null Edge object passed to showPropertiesForEdge()"; - System.out.print(infMsg); - logger.info(infMsg); - return; - } - // Try to show the edge properties - try { - infMsg =" Label for this Edge = [" + tEd.label() + "] "; - System.out.print(infMsg); - logger.info(infMsg); + public void showPropertiesForEdge( EELFLogger logger, TitanEdge tEd ){ + String infMsg = ""; + if( tEd == null ){ + infMsg = "null Edge object passed to showPropertiesForEdge()"; + System.out.print(infMsg); + logger.info(infMsg); + return; + } - infMsg =" EDGE Properties for edgeId = " + tEd.id() + ": "; - System.out.print(infMsg); - logger.info(infMsg); - Iterator <String> pI = tEd.keys().iterator(); - while( pI.hasNext() ){ - String propKey = pI.next(); - infMsg = "Prop: [" + propKey + "], val = [" - + tEd.property(propKey) + "] "; + // Try to show the edge properties + try { + infMsg =" Label for this Edge = [" + tEd.label() + "] "; System.out.print(infMsg); logger.info(infMsg); + + infMsg =" EDGE Properties for edgeId = " + tEd.id() + ": "; + System.out.print(infMsg); + logger.info(infMsg); + Iterator <String> pI = tEd.keys().iterator(); + while( pI.hasNext() ){ + String propKey = pI.next(); + infMsg = "Prop: [" + propKey + "], val = [" + + tEd.property(propKey) + "] "; + System.out.print(infMsg); + logger.info(infMsg); + } } - } - catch( Exception ex ){ - infMsg = " Could not retrieve properties for this edge. exMsg = [" - + ex.getMessage() + "] "; - System.out.println( infMsg ); - logger.info(infMsg); - } - - // Try to show what's connected to the IN side of this Edge - try { - infMsg = " Looking for the Vertex on the IN side of the edge: "; - System.out.print(infMsg); - logger.info(infMsg); - TitanVertex inVtx = tEd.inVertex(); - Iterator<VertexProperty<Object>> pI = inVtx.properties(); - String infStr = ">>> Found Vertex with VertexId = " + inVtx.id() - + ", properties: "; - System.out.println( infStr ); - logger.info(infStr); - while( pI.hasNext() ){ - VertexProperty<Object> tp = pI.next(); - infStr = " [" + tp.key() + "|" + tp.value() + "] "; - System.out.println( infStr ); + catch( Exception ex ){ + infMsg = " Could not retrieve properties for this edge. exMsg = [" + + ex.getMessage() + "] "; + System.out.println( infMsg ); + logger.info(infMsg); + } + + // Try to show what's connected to the IN side of this Edge + try { + infMsg = " Looking for the Vertex on the IN side of the edge: "; + System.out.print(infMsg); + logger.info(infMsg); + Vertex inVtx = tEd.inVertex(); + Iterator<VertexProperty<Object>> pI = inVtx.properties(); + String infStr = ">>> Found Vertex with VertexId = " + inVtx.id() + + ", properties: "; + System.out.println( infStr ); logger.info(infStr); + while( pI.hasNext() ){ + VertexProperty<Object> tp = pI.next(); + infStr = " [" + tp.key() + "|" + tp.value() + "] "; + System.out.println( infStr ); + logger.info(infStr); + } } - } - catch( Exception ex ){ - infMsg = " Could not retrieve vertex data for the IN side of " - + "the edge. exMsg = [" + ex.getMessage() + "] "; - System.out.println( infMsg ); - logger.info(infMsg); - } - - // Try to show what's connected to the OUT side of this Edge - try { - infMsg = " Looking for the Vertex on the OUT side of the edge: "; - System.out.print(infMsg); - logger.info(infMsg); - TitanVertex outVtx = tEd.outVertex(); - Iterator<VertexProperty<Object>> pI = outVtx.properties(); - String infStr = ">>> Found Vertex with VertexId = " + outVtx.id() - + ", properties: "; - System.out.println( infStr ); - logger.info(infStr); - while( pI.hasNext() ){ - VertexProperty<Object> tp = pI.next(); - infStr = " [" + tp.key() + "|" + tp.value() + "] "; - System.out.println( infStr ); + catch( Exception ex ){ + infMsg = " Could not retrieve vertex data for the IN side of " + + "the edge. exMsg = [" + ex.getMessage() + "] "; + System.out.println( infMsg ); + logger.info(infMsg); + } + + // Try to show what's connected to the OUT side of this Edge + try { + infMsg = " Looking for the Vertex on the OUT side of the edge: "; + System.out.print(infMsg); + logger.info(infMsg); + Vertex outVtx = tEd.outVertex(); + Iterator<VertexProperty<Object>> pI = outVtx.properties(); + String infStr = ">>> Found Vertex with VertexId = " + outVtx.id() + + ", properties: "; + System.out.println( infStr ); logger.info(infStr); + while( pI.hasNext() ){ + VertexProperty<Object> tp = pI.next(); + infStr = " [" + tp.key() + "|" + tp.value() + "] "; + System.out.println( infStr ); + logger.info(infStr); + } } - } - catch( Exception ex ){ - infMsg = " Could not retrieve vertex data for the OUT side of " - + "the edge. exMsg = [" + ex.getMessage() + "] "; - System.out.println( infMsg ); - logger.info(infMsg); - } - - }// end showPropertiesForEdge() + catch( Exception ex ){ + infMsg = " Could not retrieve vertex data for the OUT side of " + + "the edge. exMsg = [" + ex.getMessage() + "] "; + System.out.println( infMsg ); + logger.info(infMsg); + } + + }// end showPropertiesForEdge() - - - public static ArrayList <String> collectEdgeInfoForNode( EELFLogger logger, Vertex tVert, boolean displayAllVidsFlag ){ - ArrayList <String> retArr = new ArrayList <String> (); - Direction dir = Direction.OUT; - for ( int i = 0; i <= 1; i++ ){ - if( i == 1 ){ - // Second time through we'll look at the IN edges. - dir = Direction.IN; - } - Iterator <Edge> eI = tVert.edges(dir); - if( ! eI.hasNext() ){ - retArr.add("No " + dir + " edges were found for this vertex. "); - } - while( eI.hasNext() ){ - Edge ed = eI.next(); - String lab = ed.label(); - Vertex vtx = null; - if( dir == Direction.OUT ){ - // get the vtx on the "other" side - vtx = ed.inVertex(); - } - else { - // get the vtx on the "other" side - vtx = ed.outVertex(); + + + public ArrayList <String> collectEdgeInfoForNode( EELFLogger logger, Vertex tVert, boolean displayAllVidsFlag ){ + ArrayList <String> retArr = new ArrayList <String> (); + Direction dir = Direction.OUT; + for ( int i = 0; i <= 1; i++ ){ + if( i == 1 ){ + // Second time through we'll look at the IN edges. + dir = Direction.IN; } - if( vtx == null ){ - retArr.add(" >>> COULD NOT FIND VERTEX on the other side of this edge edgeId = " + ed.id() + " <<< "); + Iterator <Edge> eI = tVert.edges(dir); + if( ! eI.hasNext() ){ + retArr.add("No " + dir + " edges were found for this vertex. "); } - else { - String nType = vtx.<String>property("aai-node-type").orElse(null); - if( displayAllVidsFlag ){ - // This should rarely be needed - String vid = vtx.id().toString(); - retArr.add("Found an " + dir + " edge (" + lab + ") between this vertex and a [" + nType + "] node with VtxId = " + vid ); + while( eI.hasNext() ){ + Edge ed = eI.next(); + String lab = ed.label(); + Vertex vtx = null; + if( dir == Direction.OUT ){ + // get the vtx on the "other" side + vtx = ed.inVertex(); } else { - // This is the normal case - retArr.add("Found an " + dir + " edge (" + lab + ") between this vertex and a [" + nType + "] node. "); + // get the vtx on the "other" side + vtx = ed.outVertex(); + } + if( vtx == null ){ + retArr.add(" >>> COULD NOT FIND VERTEX on the other side of this edge edgeId = " + ed.id() + " <<< "); + } + else { + String nType = vtx.<String>property("aai-node-type").orElse(null); + if( displayAllVidsFlag ){ + // This should rarely be needed + String vid = vtx.id().toString(); + retArr.add("Found an " + dir + " edge (" + lab + ") between this vertex and a [" + nType + "] node with VtxId = " + vid ); + } + else { + // This is the normal case + retArr.add("Found an " + dir + " edge (" + lab + ") between this vertex and a [" + nType + "] node. "); + } } } } - } - return retArr; - - }// end of collectEdgeInfoForNode() + return retArr; + + }// end of collectEdgeInfoForNode() - - public static int countEdges( EELFLogger logger, Vertex vtx ){ - int edgeCount = 0; - try { - Iterator<Edge> edgesItr = vtx.edges(Direction.BOTH); - while( edgesItr.hasNext() ){ - edgesItr.next(); - edgeCount++; + + public int countEdges( EELFLogger logger, Vertex vtx ){ + int edgeCount = 0; + try { + Iterator<Edge> edgesItr = vtx.edges(Direction.BOTH); + while( edgesItr.hasNext() ){ + edgesItr.next(); + edgeCount++; + } } - } - catch (Exception e) { - String wMsg = "-- ERROR -- Stopping the counting of edges because of Exception [" + e.getMessage() + "]"; - System.out.println( wMsg ); - logger.warn( wMsg ); - } - return edgeCount; + catch (Exception e) { + String wMsg = "-- ERROR -- Stopping the counting of edges because of Exception [" + e.getMessage() + "]"; + System.out.println( wMsg ); + logger.warn( wMsg ); + } + return edgeCount; + + }// end of countEdges() - }// end of countEdges() - - public static int countDescendants(EELFLogger logger, TitanVertex vtx, int levelVal ){ - int totalCount = 0; - int thisLevel = levelVal + 1; - - if( thisLevel > MAXDESCENDENTDEPTH ){ - String wMsg = "Warning -- Stopping the counting of descendents because we reached the max depth of " + MAXDESCENDENTDEPTH; - System.out.println( wMsg ); - logger.warn( wMsg ); - return totalCount; - } - - try { - Iterable <?> verts = vtx.query().direction(Direction.OUT).has("isParent",true).vertices(); - Iterator <?> vertI = verts.iterator(); - while( vertI != null && vertI.hasNext() ){ - totalCount++; - TitanVertex childVtx = (TitanVertex) vertI.next(); - totalCount = totalCount + countDescendants( logger, childVtx, thisLevel ); + public int countDescendants(EELFLogger logger, Vertex vtx, int levelVal ){ + int totalCount = 0; + int thisLevel = levelVal + 1; + + if( thisLevel > MAXDESCENDENTDEPTH ){ + String wMsg = "Warning -- Stopping the counting of descendents because we reached the max depth of " + MAXDESCENDENTDEPTH; + System.out.println( wMsg ); + logger.warn( wMsg ); + return totalCount; } - } - catch (Exception e) { - String wMsg = "Error -- Stopping the counting of descendents because of Exception [" + e.getMessage() + "]"; - System.out.println( wMsg ); - logger.warn( wMsg ); - } - - return totalCount; - }// end of countDescendants() + + try { + Iterator <Vertex> vertI = graph.traversal().V(vtx).union(__.outE().has(EdgeProperties.out(EdgeProperty.IS_PARENT), true).inV(), __.inE().has(EdgeProperties.in(EdgeProperty.IS_PARENT), true).outV()); + while( vertI != null && vertI.hasNext() ){ + totalCount++; + Vertex childVtx = vertI.next(); + totalCount = totalCount + countDescendants( logger, childVtx, thisLevel ); + } + } + catch (Exception e) { + String wMsg = "Error -- Stopping the counting of descendents because of Exception [" + e.getMessage() + "]"; + System.out.println( wMsg ); + logger.warn( wMsg ); + } + + return totalCount; + }// end of countDescendants() - - public static boolean getEdgeDelConfirmation( EELFLogger logger, String uid, TitanEdge ed, - Boolean overRideProtection ) { - - showPropertiesForEdge( logger, ed ); - System.out.print("\n Are you sure you want to delete this EDGE? (y/n): "); - Scanner s = new Scanner(System.in); - s.useDelimiter(""); - String confirm = s.next(); - s.close(); - if (!confirm.equalsIgnoreCase("y")) { - String infMsg = " User [" + uid + "] has chosen to abandon this delete request. "; - System.out.println("\n" + infMsg); - logger.info(infMsg); - return false; - } - else { - String infMsg = " User [" + uid + "] has confirmed this delete request. "; - System.out.println("\n" + infMsg); - logger.info(infMsg); - return true; - } - - } // End of getEdgeDelConfirmation() + public boolean getEdgeDelConfirmation( EELFLogger logger, String uid, TitanEdge ed, + Boolean overRideProtection ) { + + showPropertiesForEdge( logger, ed ); + System.out.print("\n Are you sure you want to delete this EDGE? (y/n): "); + Scanner s = new Scanner(System.in); + s.useDelimiter(""); + String confirm = s.next(); + s.close(); + + if (!confirm.equalsIgnoreCase("y")) { + String infMsg = " User [" + uid + "] has chosen to abandon this delete request. "; + System.out.println("\n" + infMsg); + logger.info(infMsg); + return false; + } + else { + String infMsg = " User [" + uid + "] has confirmed this delete request. "; + System.out.println("\n" + infMsg); + logger.info(infMsg); + return true; + } + } // End of getEdgeDelConfirmation() + - public static boolean getNodeDelConfirmation( EELFLogger logger, String uid, Vertex vtx, int edgeCount, - int descendantCount, Boolean overRideProtection ) { - String thisNodeType = ""; - try { - thisNodeType = vtx.<String>property("aai-node-type").orElse(null); - } - catch ( Exception nfe ){ - // Let the user know something is going on - but they can confirm the delete if they want to. - String infMsg = " -- WARNING -- could not get an aai-node-type for this vertex. -- WARNING -- "; - System.out.println( infMsg ); - logger.warn( infMsg ); - } - - String ntListString = ""; - String maxDescString = ""; - String maxEdgeString = ""; - - int maxDescCount = 10; // default value - int maxEdgeCount = 10; // default value - ArrayList <String> protectedNTypes = new ArrayList <String> (); - protectedNTypes.add("cloud-region"); // default value - - try { - ntListString = AAIConfig.get("aai.forceDel.protected.nt.list"); - maxDescString = AAIConfig.get("aai.forceDel.protected.descendant.count"); - maxEdgeString = AAIConfig.get("aai.forceDel.protected.edge.count"); - } - catch ( Exception nfe ){ - // Don't worry, we will use default values - String infMsg = "-- WARNING -- could not get aai.forceDel.protected values from aaiconfig.properties -- will use default values. "; - System.out.println( infMsg ); - logger.warn( infMsg ); - } - - if( maxDescString != null && !maxDescString.equals("") ){ + public boolean getNodeDelConfirmation( EELFLogger logger, String uid, Vertex vtx, int edgeCount, + int descendantCount, Boolean overRideProtection ) { + String thisNodeType = ""; try { - maxDescCount = Integer.parseInt(maxDescString); + thisNodeType = vtx.<String>property("aai-node-type").orElse(null); } catch ( Exception nfe ){ - // Don't worry, we will leave "maxDescCount" set to the default value + // Let the user know something is going on - but they can confirm the delete if they want to. + String infMsg = " -- WARNING -- could not get an aai-node-type for this vertex. -- WARNING -- "; + System.out.println( infMsg ); + logger.warn( infMsg ); } - } - - if( maxEdgeString != null && !maxEdgeString.equals("") ){ + + String ntListString = ""; + String maxDescString = ""; + String maxEdgeString = ""; + + int maxDescCount = 10; // default value + int maxEdgeCount = 10; // default value + ArrayList <String> protectedNTypes = new ArrayList <String> (); + protectedNTypes.add("cloud-region"); // default value + try { - maxEdgeCount = Integer.parseInt(maxEdgeString); + ntListString = AAIConfig.get("aai.forceDel.protected.nt.list"); + maxDescString = AAIConfig.get("aai.forceDel.protected.descendant.count"); + maxEdgeString = AAIConfig.get("aai.forceDel.protected.edge.count"); } catch ( Exception nfe ){ - // Don't worry, we will leave "maxEdgeCount" set to the default value + // Don't worry, we will use default values + String infMsg = "-- WARNING -- could not get aai.forceDel.protected values from aaiconfig.properties -- will use default values. "; + System.out.println( infMsg ); + logger.warn( infMsg ); } - } - - if( ntListString != null && !ntListString.trim().equals("") ){ - String [] nodeTypes = ntListString.split("\\|"); - for( int i = 0; i < nodeTypes.length; i++ ){ - protectedNTypes.add(nodeTypes[i]); + + if( maxDescString != null && !maxDescString.equals("") ){ + try { + maxDescCount = Integer.parseInt(maxDescString); + } + catch ( Exception nfe ){ + // Don't worry, we will leave "maxDescCount" set to the default value + } } - } - - boolean giveProtOverRideMsg = false; - boolean giveProtErrorMsg = false; - if( descendantCount > maxDescCount ){ - // They are trying to delete a node with a lots of descendants - String infMsg = " >> WARNING >> This node has more descendant edges than the max ProtectedDescendantCount: " + edgeCount + ". Max = " + - maxEdgeCount + ". It can be DANGEROUS to delete one of these. << WARNING << "; - System.out.println(infMsg); - logger.info(infMsg); - if( ! overRideProtection ){ - // They cannot delete this kind of node without using the override option - giveProtErrorMsg = true; + + if( maxEdgeString != null && !maxEdgeString.equals("") ){ + try { + maxEdgeCount = Integer.parseInt(maxEdgeString); + } + catch ( Exception nfe ){ + // Don't worry, we will leave "maxEdgeCount" set to the default value + } } - else { - giveProtOverRideMsg = true; + + if( ntListString != null && !ntListString.trim().equals("") ){ + String [] nodeTypes = ntListString.split("\\|"); + for( int i = 0; i < nodeTypes.length; i++ ){ + protectedNTypes.add(nodeTypes[i]); + } } - } - - if( edgeCount > maxEdgeCount ){ - // They are trying to delete a node with a lot of edges - String infMsg = " >> WARNING >> This node has more edges than the max ProtectedEdgeCount: " + edgeCount + ". Max = " + - maxEdgeCount + ". It can be DANGEROUS to delete one of these. << WARNING << "; - System.out.println(infMsg); - logger.info(infMsg); - if( ! overRideProtection ){ - // They cannot delete this kind of node without using the override option - giveProtErrorMsg = true; + + boolean giveProtOverRideMsg = false; + boolean giveProtErrorMsg = false; + if( descendantCount > maxDescCount ){ + // They are trying to delete a node with a lots of descendants + String infMsg = " >> WARNING >> This node has more descendant edges than the max ProtectedDescendantCount: " + edgeCount + ". Max = " + + maxEdgeCount + ". It can be DANGEROUS to delete one of these. << WARNING << "; + System.out.println(infMsg); + logger.info(infMsg); + if( ! overRideProtection ){ + // They cannot delete this kind of node without using the override option + giveProtErrorMsg = true; + } + else { + giveProtOverRideMsg = true; + } } - else { - giveProtOverRideMsg = true; + + if( edgeCount > maxEdgeCount ){ + // They are trying to delete a node with a lot of edges + String infMsg = " >> WARNING >> This node has more edges than the max ProtectedEdgeCount: " + edgeCount + ". Max = " + + maxEdgeCount + ". It can be DANGEROUS to delete one of these. << WARNING << "; + System.out.println(infMsg); + logger.info(infMsg); + if( ! overRideProtection ){ + // They cannot delete this kind of node without using the override option + giveProtErrorMsg = true; + } + else { + giveProtOverRideMsg = true; + } } - } - - if( thisNodeType != null && !thisNodeType.equals("") && protectedNTypes.contains(thisNodeType) ){ - // They are trying to delete a protected Node Type - String infMsg = " >> WARNING >> This node is a PROTECTED NODE-TYPE (" + thisNodeType + "). " + - " It can be DANGEROUS to delete one of these. << WARNING << "; - System.out.println(infMsg); - logger.info(infMsg); - if( ! overRideProtection ){ - // They cannot delete this kind of node without using the override option - giveProtErrorMsg = true; + + if( thisNodeType != null && !thisNodeType.equals("") && protectedNTypes.contains(thisNodeType) ){ + // They are trying to delete a protected Node Type + String infMsg = " >> WARNING >> This node is a PROTECTED NODE-TYPE (" + thisNodeType + "). " + + " It can be DANGEROUS to delete one of these. << WARNING << "; + System.out.println(infMsg); + logger.info(infMsg); + if( ! overRideProtection ){ + // They cannot delete this kind of node without using the override option + giveProtErrorMsg = true; + } + else { + giveProtOverRideMsg = true; + } + } + + if( giveProtOverRideMsg ){ + String infMsg = " !!>> WARNING >>!! you are using the overRideProtection parameter which will let you do this potentially dangerous delete."; + System.out.println("\n" + infMsg); + logger.info(infMsg); + } + else if( giveProtErrorMsg ) { + String errMsg = " ERROR >> this kind of node can only be deleted if you pass the overRideProtection parameter."; + System.out.println("\n" + errMsg); + logger.error(errMsg); + return false; + } + + System.out.print("\n Are you sure you want to do this delete? (y/n): "); + Scanner s = new Scanner(System.in); + s.useDelimiter(""); + String confirm = s.next(); + s.close(); + + if (!confirm.equalsIgnoreCase("y")) { + String infMsg = " User [" + uid + "] has chosen to abandon this delete request. "; + System.out.println("\n" + infMsg); + logger.info(infMsg); + return false; } else { - giveProtOverRideMsg = true; + String infMsg = " User [" + uid + "] has confirmed this delete request. "; + System.out.println("\n" + infMsg); + logger.info(infMsg); + return true; } - } - - if( giveProtOverRideMsg ){ - String infMsg = " !!>> WARNING >>!! you are using the overRideProtection parameter which will let you do this potentially dangerous delete."; - System.out.println("\n" + infMsg); - logger.info(infMsg); - } - else if( giveProtErrorMsg ) { - String errMsg = " ERROR >> this kind of node can only be deleted if you pass the overRideProtection parameter."; - System.out.println("\n" + errMsg); - logger.error(errMsg); - return false; - } - - System.out.print("\n Are you sure you want to do this delete? (y/n): "); - Scanner s = new Scanner(System.in); - s.useDelimiter(""); - String confirm = s.next(); - s.close(); - if (!confirm.equalsIgnoreCase("y")) { - String infMsg = " User [" + uid + "] has chosen to abandon this delete request. "; - System.out.println("\n" + infMsg); - logger.info(infMsg); - return false; - } - else { - String infMsg = " User [" + uid + "] has confirmed this delete request. "; - System.out.println("\n" + infMsg); - logger.info(infMsg); - return true; - } - - } // End of getNodeDelConfirmation() + } // End of getNodeDelConfirmation() + } } diff --git a/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSInInterceptor.java b/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSInInterceptor.java index 7480c05..050283d 100644 --- a/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSInInterceptor.java +++ b/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSInInterceptor.java @@ -263,7 +263,7 @@ public class AAILogJAXRSInInterceptor extends JAXRSInInterceptor { * @return the string */ protected String genDate() { - FormatDate fd = new FormatDate(AAIConfig.get(AAIConstants.HBASE_TABLE_TIMESTAMP_FORMAT, "YYMMdd-HH:mm:ss:SSS")); + FormatDate fd = new FormatDate( "YYMMdd-HH:mm:ss:SSS"); return fd.getDateTime(); } diff --git a/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSOutInterceptor.java b/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSOutInterceptor.java index 563500e..b1d7ac9 100644 --- a/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSOutInterceptor.java +++ b/aai-resources/src/main/java/org/openecomp/aai/interceptors/AAILogJAXRSOutInterceptor.java @@ -267,7 +267,7 @@ public class AAILogJAXRSOutInterceptor extends JAXRSOutInterceptor { } protected String genDate() { - FormatDate fd = new FormatDate(AAIConfig.get(AAIConstants.HBASE_TABLE_TIMESTAMP_FORMAT, "YYMMdd-HH:mm:ss:SSS")); + FormatDate fd = new FormatDate( "YYMMdd-HH:mm:ss:SSS"); return fd.getDateTime(); } diff --git a/aai-resources/src/main/java/org/openecomp/aai/rest/db/HttpEntry.java b/aai-resources/src/main/java/org/openecomp/aai/rest/db/HttpEntry.java index ef305b0..945a6f3 100644 --- a/aai-resources/src/main/java/org/openecomp/aai/rest/db/HttpEntry.java +++ b/aai-resources/src/main/java/org/openecomp/aai/rest/db/HttpEntry.java @@ -271,8 +271,6 @@ public class HttpEntry { case PUT: if (isNewVertex) { v = serializer.createNewVertex(obj); - } else { - serializer.touchStandardVertexProperties(v, false); } serializer.serializeToDb(obj, v, query, uri.getRawPath(), requestContext); status = Status.OK; diff --git a/aai-resources/src/main/java/org/openecomp/aai/rest/tools/ModelVersionTransformer.java b/aai-resources/src/main/java/org/openecomp/aai/rest/tools/ModelVersionTransformer.java new file mode 100644 index 0000000..956fb41 --- /dev/null +++ b/aai-resources/src/main/java/org/openecomp/aai/rest/tools/ModelVersionTransformer.java @@ -0,0 +1,412 @@ +/*- + * ============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.rest.tools; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.Encoded; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; + +import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.openecomp.aai.db.props.AAIProperties; +import org.openecomp.aai.dbmap.DBConnectionType; +import org.openecomp.aai.exceptions.AAIException; +import org.openecomp.aai.introspection.Introspector; +import org.openecomp.aai.introspection.Loader; +import org.openecomp.aai.introspection.MarshallerProperties; +import org.openecomp.aai.introspection.ModelType; +import org.openecomp.aai.introspection.Version; +import org.openecomp.aai.introspection.exceptions.AAIUnknownObjectException; +import org.openecomp.aai.logging.ErrorLogHelper; +import org.openecomp.aai.rest.db.HttpEntry; +import org.openecomp.aai.rest.exceptions.AAIInvalidXMLNamespace; +import org.openecomp.aai.rest.util.ValidateEncoding; +import org.openecomp.aai.restcore.RESTAPI; +import org.openecomp.aai.serialization.db.EdgeType; +import org.openecomp.aai.serialization.db.exceptions.NoEdgeRuleFoundException; +import org.openecomp.aai.serialization.engines.QueryStyle; +import org.openecomp.aai.serialization.engines.TransactionalGraphEngine; +import org.radeox.util.logging.Logger; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.google.common.base.Joiner; +import com.thinkaurelius.titan.core.TitanTransaction; + + +/** + * The Class ModelVersionTransformer. + */ +@Path("tools") +public class ModelVersionTransformer extends RESTAPI { + + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(ModelVersionTransformer.class.getName()); + protected static String authPolicyFunctionName = "REST"; + private ModelType introspectorFactoryType = ModelType.MOXY; + private QueryStyle queryStyle = QueryStyle.TRAVERSAL; + + + /** + * POST for model transformation. + * + * @param content the content + * @param uri the uri + * @param headers the headers + * @param info the info + * @param req the req + * @return the transformed model + * @Path("/{uri: modeltransform}") + * @throws UnsupportedEncodingException + */ + @POST + @Path("/{uri: modeltransform}") + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + public Response modelTransform (String content, @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) throws UnsupportedEncodingException { + Response response = null; + TransactionalGraphEngine dbEngine = null; + Loader loader = null; + MediaType mediaType = headers.getMediaType(); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + String realTime = headers.getRequestHeaders().getFirst("Real-Time"); + TitanTransaction g = null; + Boolean success = true; + AAIException ex; + + try { + validateRequest(info); + + DBConnectionType type = this.determineConnectionType(sourceOfTruth, realTime); + HttpEntry httpEntry = new HttpEntry(Version.v8, introspectorFactoryType, queryStyle, type); + loader = httpEntry.getLoader(); + dbEngine = httpEntry.getDbEngine(); + if (content.length() == 0) { + if (mediaType.toString().contains(MediaType.APPLICATION_JSON)) { + content = "{}"; + } else { + content = "<empty/>"; + } + } + + //Unmarshall the received model and store properties and values in a map. + Introspector obj = loader.unmarshal("Model", content, org.openecomp.aai.restcore.MediaType.getEnum(this.getInputMediaType(mediaType))); + if (obj == null) { + throw new AAIException("AAI_3000", "object could not be unmarshalled:" + content); + } + + if (mediaType.toString().contains(MediaType.APPLICATION_XML) && !content.equals("<empty/>") && isEmptyObject(obj)) { + throw new AAIInvalidXMLNamespace(content); + } + + Set<String> properties = obj.getProperties(); + java.util.Iterator<String> propItr = properties.iterator(); + + Map<String, Object> v8PropMap = new HashMap<String, Object>(); + while (propItr.hasNext()){ + String property = propItr.next(); + Object propertyValue = obj.getValue(property); + if (propertyValue != null) { + v8PropMap.put(propItr.next(), propertyValue); + } + } + // Get the current models and create a map of model-ver to model keys, this allows us + // to easily figure out and construct the relationships on the supplied v8 model + Map<String,String> modelVersionIdToModelInvariantIdMap = getCurrentModelsFromGraph(headers, transId, info); + + // Build the v10 - TODO + HttpEntry newHttpEntry = new HttpEntry(Version.v10, introspectorFactoryType, queryStyle, type); + Loader newLoader = newHttpEntry.getLoader(); + Introspector newModelObj = newLoader.introspectorFromName("Model"); + + // pull the attributes we need to apply to the model + model-ver objects + // model specific attrs + String oldModelInvariantId = obj.getValue("model-id"); + String oldModelType = obj.getValue("model-type"); + // model-ver specific + String oldModelName = obj.getValue("model-name"); + String oldModelVersionId = obj.getValue("model-name-version-id"); + String oldModelVersion = obj.getValue("model-version"); + + // copy attributes from the v8 model object to the v10 model object + newModelObj.setValue("model-invariant-id", oldModelInvariantId); + newModelObj.setValue("model-type", oldModelType); + + Introspector modelVersObj = newModelObj.newIntrospectorInstanceOfProperty("model-vers"); + + newModelObj.setValue("model-vers", modelVersObj.getUnderlyingObject()); + + List<Object> modelVerList = (List<Object>)modelVersObj.getValue("model-ver"); + + //create a model-ver object + Introspector modelVerObj = newLoader.introspectorFromName("ModelVer"); + // load attributes from the v8 model object into the v10 model-ver object + modelVerObj.setValue("model-version-id", oldModelVersionId); + modelVerObj.setValue("model-name", oldModelName); + modelVerObj.setValue("model-version", oldModelVersion); + + + if (obj.hasProperty("model-elements")) { + Introspector oldModelElements = obj.getWrappedValue("model-elements"); + if (oldModelElements != null) { + Introspector newModelElements = modelVerObj.newIntrospectorInstanceOfProperty("model-elements"); + modelVerObj.setValue("model-elements", newModelElements.getUnderlyingObject()); + repackModelElements(oldModelElements, newModelElements, modelVersionIdToModelInvariantIdMap); + } + } + + modelVerList.add(modelVerObj.getUnderlyingObject()); + + String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); + MarshallerProperties marshallerProperties = + new MarshallerProperties.Builder(org.openecomp.aai.restcore.MediaType.getEnum(outputMediaType)).build(); + + String result = newModelObj.marshal(marshallerProperties); + response = Response.ok(result).build(); + + } catch (AAIException e) { + + ArrayList<String> templateVars = new ArrayList<String>(2); + templateVars.add("POST modeltransform"); + templateVars.add("model-ver.model-version-id"); + response = Response + .status(e.getErrorObject().getHTTPResponseCode()) + .entity(ErrorLogHelper.getRESTAPIErrorResponse( + headers.getAcceptableMediaTypes(), e, + templateVars)).build(); + success = false; + } catch (Exception e) { + ArrayList<String> templateVars = new ArrayList<String>(2); + templateVars.add("POST modeltransform"); + templateVars.add("model-ver.model-version-id"); + ex = new AAIException("AAI_4000", e); + response = Response + .status(Status.INTERNAL_SERVER_ERROR) + .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) + .build(); + e.printStackTrace(); + success = false; + } finally { + if (dbEngine != null) { + if (success) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + } + return response; + } + + + private void repackModelElements(Introspector oldModelElements, Introspector newModelElements, Map<String, String> modelVersionIdToModelInvariantIdMap) + throws AAIUnknownObjectException, AAIException { + + List<Introspector> oldModelElementList = oldModelElements.getWrappedListValue("model-element"); + List<Object> newModelElementList = (List<Object>)newModelElements.getValue("model-element"); + + for (Introspector oldModelElement : oldModelElementList) { + Introspector newModelElement = newModelElements.getLoader().introspectorFromName("model-element"); + + ArrayList<String> attrs = new ArrayList<String>(); + + attrs.add("model-element-uuid"); + attrs.add("new-data-del-flag"); + attrs.add("cardinality"); + attrs.add("linkage-points"); + + for (String attr : attrs) { + if (oldModelElement.hasProperty(attr)) { + newModelElement.setValue(attr, oldModelElement.getValue(attr)); + } + } + + if (oldModelElement.hasProperty("relationship-list")) { + + Introspector oldRelationshipList = oldModelElement.getWrappedValue("relationship-list"); + Introspector newRelationshipList = newModelElements.getLoader().introspectorFromName("relationship-list"); + newModelElement.setValue("relationship-list", newRelationshipList.getUnderlyingObject()); + + List<Introspector> oldRelationshipListList = oldRelationshipList.getWrappedListValue("relationship"); + List<Object> newRelationshipListList = (List<Object>)newRelationshipList.getValue("relationship"); + + for (Introspector oldRelationship : oldRelationshipListList) { + + Introspector newRelationship = newModelElements.getLoader().introspectorFromName("relationship"); + newRelationshipListList.add(newRelationship.getUnderlyingObject()); + + List<Introspector> oldRelationshipData = oldRelationship.getWrappedListValue("relationship-data"); + List<Object> newRelationshipData = (List<Object>)newRelationship.getValue("relationship-data"); + + newRelationship.setValue("related-to", "model-ver"); + + for (Introspector oldRelationshipDatum : oldRelationshipData) { + + String oldProp = null; + String oldVal = null; + + if (oldRelationshipDatum.hasProperty("relationship-key")) { + oldProp = oldRelationshipDatum.getValue("relationship-key"); + } + if (oldRelationshipDatum.hasProperty("relationship-value")) { + oldVal = oldRelationshipDatum.getValue("relationship-value"); + } + + if (oldProp.equals("model.model-name-version-id")) { + // make two new relationshipDatum for use w/ the new style model + + // you should have the model in the list of models we collected earlier + if (modelVersionIdToModelInvariantIdMap.containsKey(oldVal)) { + Introspector newRelationshipDatum1 = newModelElements.getLoader().introspectorFromName("relationship-data"); + Introspector newRelationshipDatum2 = newModelElements.getLoader().introspectorFromName("relationship-data"); + + String modelId = modelVersionIdToModelInvariantIdMap.get(oldVal); + + // the first one points at the model-invariant-id of found model + newRelationshipDatum1.setValue("relationship-key", "model.model-invariant-id"); + newRelationshipDatum1.setValue("relationship-value", modelId); + + // the second one points at the model-version-id which corresponds to the old model-name-version-id + newRelationshipDatum2.setValue("relationship-key", "model-ver.model-version-id"); + newRelationshipDatum2.setValue("relationship-value", oldVal); + + newRelationshipData.add(newRelationshipDatum1.getUnderlyingObject()); + newRelationshipData.add(newRelationshipDatum2.getUnderlyingObject()); + } else { + throw new AAIException("AAI_6114", "No model-ver found using model-ver.model-version-id=" + oldVal); + } + } + } + + } + } + + if (oldModelElement.hasProperty("model-elements")) { + Introspector nextOldModelElements = oldModelElement.getWrappedValue("model-elements"); + if (nextOldModelElements != null) { + Introspector nextNewModelElements = newModelElement.newIntrospectorInstanceOfProperty("model-elements"); + newModelElement.setValue("model-elements", nextNewModelElements.getUnderlyingObject()); + repackModelElements(nextOldModelElements, nextNewModelElements, modelVersionIdToModelInvariantIdMap); + } + } + newModelElementList.add(newModelElement.getUnderlyingObject()); + } + return; + + } + + private Map<String, String> getCurrentModelsFromGraph(HttpHeaders headers, String transactionId, UriInfo info) throws NoEdgeRuleFoundException, AAIException { + + TransactionalGraphEngine dbEngine = null; + Map<String, String> modelVerModelMap = new HashMap<String,String>() ; + try { + + Version version = AAIProperties.LATEST; + DBConnectionType type = DBConnectionType.REALTIME; + + final HttpEntry httpEntry = new HttpEntry(version, introspectorFactoryType, queryStyle, type); + dbEngine = httpEntry.getDbEngine(); + + List<Vertex> modelVertices = dbEngine.asAdmin().getTraversalSource().V().has(AAIProperties.NODE_TYPE,"model").toList(); + for (Vertex modelVtx : modelVertices) { + + List<Vertex> modelVerVerts = dbEngine.getQueryBuilder(modelVtx).createEdgeTraversal(EdgeType.TREE, "model", "model-ver").toList(); + for (Vertex v : modelVerVerts) { + modelVerModelMap.put(v.value("model-version-id"), modelVtx.value("model-invariant-id")); + } + } + } catch (NoSuchElementException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (Exception e1) { + e1.printStackTrace(); + } + return modelVerModelMap; + + } + + /** + * Validate request. + * + * @param uri the uri + * @param headers the headers + * @param req the req + * @param action the action + * @param info the info + * @throws AAIException the AAI exception + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + private void validateRequest(UriInfo info) throws AAIException, UnsupportedEncodingException { + + if (!ValidateEncoding.getInstance().validate(info)) { + throw new AAIException("AAI_3008", "uri=" + getPath(info)); + } + } + + /** + * Gets the path. + * + * @param info the info + * @return the path + */ + private String getPath(UriInfo info) { + String path = info.getPath(false); + MultivaluedMap<String, String> map = info.getQueryParameters(false); + String params = "?"; + List<String> parmList = new ArrayList<>(); + for (String key : map.keySet()) { + for (String value : map.get(key)) { + parmList.add(key + "=" + value); + } + } + String queryParams = Joiner.on("&").join(parmList); + if (map.keySet().size() > 0) { + path += params + queryParams; + } + + return path; + + } + + protected boolean isEmptyObject(Introspector obj) { + return "{}".equals(obj.marshal(false)); + } + + +} diff --git a/aai-resources/src/main/java/org/openecomp/aai/util/AAIAppServletContextListener.java b/aai-resources/src/main/java/org/openecomp/aai/util/AAIAppServletContextListener.java index 773b4a6..3184da8 100644 --- a/aai-resources/src/main/java/org/openecomp/aai/util/AAIAppServletContextListener.java +++ b/aai-resources/src/main/java/org/openecomp/aai/util/AAIAppServletContextListener.java @@ -25,12 +25,11 @@ import java.io.IOException; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; -//import org.apache.activemq.broker.BrokerService; - import org.openecomp.aai.dbmap.AAIGraph; import org.openecomp.aai.exceptions.AAIException; import org.openecomp.aai.introspection.ModelInjestor; import org.openecomp.aai.logging.ErrorLogHelper; +import org.openecomp.aai.migration.MigrationControllerInternal; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; @@ -38,8 +37,6 @@ public class AAIAppServletContextListener implements ServletContextListener { private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIAppServletContextListener.class.getName()); - //private BrokerService broker = new BrokerService(); - /** * Destroys Context * @@ -49,13 +46,6 @@ public class AAIAppServletContextListener implements ServletContextListener { LOGGER.info("AAIGraph shutting down"); AAIGraph.getInstance().graphShutdown(); LOGGER.info("AAIGraph shutdown"); - - try { -// broker.stop(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } } /** @@ -79,17 +69,12 @@ public class AAIAppServletContextListener implements ServletContextListener { AAIGraph.getInstance(); ModelInjestor.getInstance(); - // Jsm internal broker for aai events - //broker = new BrokerService(); - //broker.addConnector("tcp://localhost:61447"); - //broker.setPersistent(false); - //broker.setUseJmx(false); - //broker.setSchedulerSupport(false); - //broker.start(); - LOGGER.info("A&AI Server initialization succcessful."); System.setProperty("org.openecomp.aai.serverStarted", "true"); - + if ("true".equals(AAIConfig.get("aai.run.migrations", "false"))) { + MigrationControllerInternal migrations = new MigrationControllerInternal(); + migrations.run(new String[]{"--commit"}); + } } catch (AAIException e) { ErrorLogHelper.logException(e); throw new RuntimeException("AAIException caught while initializing A&AI server", e); diff --git a/aai-resources/src/main/xjb/bindings.xjb b/aai-resources/src/main/xjb/bindings.xjb index 12fbb6d..4ced5e0 100644 --- a/aai-resources/src/main/xjb/bindings.xjb +++ b/aai-resources/src/main/xjb/bindings.xjb @@ -43,4 +43,4 @@ <jaxb:package name="org.openecomp.aai.domain.yang"/> </jaxb:schemaBindings> </jaxb:bindings> -</jaxb:bindings> +</jaxb:bindings>
\ No newline at end of file diff --git a/aai-resources/src/test/java/org/openecomp/aai/util/AAITxnLogTest.java b/aai-resources/src/test/java/org/openecomp/aai/util/AAITxnLogTest.java deleted file mode 100644 index 57ba3eb..0000000 --- a/aai-resources/src/test/java/org/openecomp/aai/util/AAITxnLogTest.java +++ /dev/null @@ -1,361 +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.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.List; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.HBaseConfiguration; -import org.apache.hadoop.hbase.client.Get; -import org.apache.hadoop.hbase.client.HTable; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.ResultScanner; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.agent.PowerMockAgent; -import org.powermock.modules.junit4.rule.PowerMockRule; - -import org.openecomp.aai.domain.notificationEvent.NotificationEvent; -import org.openecomp.aai.domain.translog.TransactionLogEntries; -import org.openecomp.aai.domain.translog.TransactionLogEntry; -import org.openecomp.aai.exceptions.AAIException; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.databind.JsonMappingException; - - -@Ignore -@PrepareForTest({HBaseConfiguration.class, Configuration.class, - HTable.class, Result.class, ResultScanner.class, Scan.class, - Get.class, NotificationEvent.class, - NotificationEvent.EventHeader.class, PojoUtils.class, AAITxnLog.class}) - -public class AAITxnLogTest { - - @Rule - public PowerMockRule rule = new PowerMockRule(); - - static { - PowerMockAgent.initializeIfNeeded(); - } - - AAITxnLog aaiTnxLog; - Configuration config; - HTable htable; - Result result; - ResultScanner resScanner; - Scan scan; - Get g; - NotificationEvent notif; - NotificationEvent.EventHeader ehNotif; - PojoUtils pu; - - boolean hasNotifEvent = true; - final String notifPayload = "A random payload"; - final String notifID = "1"; - final String notifEntityLink = "nLink"; - final String notifAction = "nAction"; - final String notifStatus = "nStatus"; - final String notifTopic = "nTopic"; - - final String tid = "tidVal"; - final String status = "statusVal"; - final String rqstTm = "rqstTmVal"; - final String respTm = "respTmVal"; - final String srcId = "srcIdVal"; - final String rsrcId = "rsrcIdVal"; - final String rsrcType = "rsrcTypeVal"; - final String rqstBuf = "rqstBufVal"; - final String respBuf = "respBufVal"; - - - /** - * Initialize. - */ - @Before - public void initialize(){ - partialSetupForAAIConfig(); - PowerMockito.mockStatic(HBaseConfiguration.class); - config = PowerMockito.mock(Configuration.class); - htable = PowerMockito.mock(HTable.class); - result = PowerMockito.mock(Result.class); - resScanner = PowerMockito.mock(ResultScanner.class); - scan = PowerMockito.mock(Scan.class); - g = PowerMockito.mock(Get.class); - notif = PowerMockito.mock(NotificationEvent.class); - ehNotif = PowerMockito.mock(NotificationEvent.EventHeader.class); - pu = PowerMockito.mock(PojoUtils.class); - - - mockNotificationEvent(); - - Mockito.when(HBaseConfiguration.create()).thenReturn(config); - aaiTnxLog = new AAITxnLog(tid, srcId); - - try { - PowerMockito.whenNew(HTable.class).withAnyArguments().thenReturn(htable); - PowerMockito.whenNew(Get.class).withAnyArguments().thenReturn(g); - PowerMockito.whenNew(PojoUtils.class).withAnyArguments().thenReturn(pu); - PowerMockito.whenNew(Scan.class).withAnyArguments().thenReturn(scan); - } catch (Exception e) { - e.printStackTrace(); - } - - mockResult(); - - try { - PowerMockito.when(htable.get(g)).thenReturn(result); - PowerMockito.when(htable.getScanner(scan)).thenReturn(resScanner); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Method to test 'put' operation without a notification event. - */ - @Test - public void testPut_withoutNotifEvent(){ - String htid = aaiTnxLog.put(tid, status, rqstTm, respTm, srcId, rsrcId, rsrcType, rqstBuf, respBuf); - try { - TransactionLogEntry tle = aaiTnxLog.get(htid); - hasNotifEvent = false; - validateTransactionLogEntry(tle); - } catch (AAIException e) { - fail("Cant read back data from htable"); - e.printStackTrace(); - } - } - - /** - * Method to test 'put' operation with a notification event. - */ - @Test - public void testPut_withNotifEvent(){ - hasNotifEvent = true; - String htid = aaiTnxLog.put(tid, status, rqstTm, respTm, srcId, rsrcId, rsrcType, rqstBuf, respBuf, hasNotifEvent, notif); - try { - TransactionLogEntry tle = aaiTnxLog.get(htid); - validateTransactionLogEntry(tle); - } catch (AAIException e) { - fail("Cant read back data from htable"); - e.printStackTrace(); - } - } - - /** - * Method to test 'scan' over an empty htable. - */ - @Test - public void testScan_withEmptyHTable(){ - String key = tid; - List<String> res = aaiTnxLog.scan(key); - assertTrue("Scan output should be empty", res.size() == 0 ); - } - - /** - * Method to test 'scan' operation. - */ - @Test - public void testScan(){ - try { - PowerMockito.when(resScanner.next()).thenReturn(result).thenReturn(null); - } catch (IOException e) { - e.printStackTrace(); - } - List<String> res = aaiTnxLog.scan(tid); - assertTrue("Scan output should not be empty", res.size()==1); - assertTrue("Did not find entry in 'scan'", res.get(0).equals(result.toString())); - } - - /** - * Method to test 'scanFiltered' with an empty htable. - */ - @Test - public void testScanFiltered_withEmptyHTable(){ - aaiTnxLog.put(tid, status, rqstTm, respTm, srcId, rsrcId, rsrcType, rqstBuf, respBuf, true, new NotificationEvent()); - TransactionLogEntries tles = aaiTnxLog.scanFiltered(0, 100, null, null, null, null, null); - assertTrue ("scanFilstered output should be empty", tles.getTransactionLogEntries().size() == 0); - } - - /** - * Method to test 'scanFiltered' operation. - */ - @Test - public void testScanFiltered(){ - try { - PowerMockito.when(resScanner.next()).thenReturn(result).thenReturn(null); - } catch (IOException e) { - e.printStackTrace(); - } - aaiTnxLog.put(tid, status, rqstTm, respTm, srcId, rsrcId, rsrcType, rqstBuf, respBuf, true, new NotificationEvent()); - TransactionLogEntries tles = aaiTnxLog.scanFiltered(0, 100, null, null, null, null, null); - assertFalse ("scanFilstered output should not be empty", tles.getTransactionLogEntries().size() == 0); - validateTransactionLogEntry(tles.getTransactionLogEntries().get(0)); - } - - /** - * Helper method to validate the contents of a TransactionalLogEntry. - * - * @param tle TransactionalLogEntry to compare against - */ - public void validateTransactionLogEntry(TransactionLogEntry tle){ - String pre = "validateTransactionLogEntry: "; - String post = " didn't match"; - assertEquals(pre + "tid" + post, tle.getTransactionLogEntryId(), tid); - assertEquals(pre + "status" + post, tle.getStatus(), status); - assertEquals(pre + "rqstDate" + post, tle.getRqstDate(), rqstTm); - assertEquals(pre + "respDate" + post, tle.getRespDate(), respTm); - assertEquals(pre + "srcId" + post, tle.getSourceId(), srcId); - assertEquals(pre + "rsrcId" + post, tle.getResourceId(), rsrcId); - assertEquals(pre + "rqstBuf" + post, tle.getRqstBuf(), rqstBuf); - assertEquals(pre + "respBuf" + post, tle.getrespBuf(), respBuf); - if ( hasNotifEvent){ - assertEquals(pre + "notifPayload" + post, tle.getNotificationPayload(), notifPayload); - assertEquals(pre + "notifStatus" + post, tle.getNotificationStatus(), notifStatus); - assertEquals(pre + "notifID" + post, tle.getNotificationId(), notifID); - assertEquals(pre + "notifTopic" + post, tle.getNotificationTopic(), notifTopic); - assertEquals(pre + "notifEntityLink" + post, tle.getNotificationEntityLink(), notifEntityLink); - assertEquals(pre + "notifAction" + post, tle.getNotificationAction(), notifAction); - } - } - - - - /** - * Helper method to mock PojoUtils. - */ - public void mockPojoUtils(){ - - try { - PowerMockito.when(pu.getJsonFromObject(notif)).thenReturn(notifPayload); - } catch (JsonGenerationException e) {e.printStackTrace();} - catch (JsonMappingException e) {e.printStackTrace();} - catch (IOException e) {e.printStackTrace(); } - } - - - - /** - * Helper method to mock a notification event handler. - */ - public void mockNotifEventHandler(){ - PowerMockito.when(ehNotif.getId()).thenReturn(notifID); - PowerMockito.when(ehNotif.getEntityLink()).thenReturn(notifEntityLink); - PowerMockito.when(ehNotif.getAction()).thenReturn(notifAction); - PowerMockito.when(ehNotif.getStatus()).thenReturn(notifStatus); - } - - /** - * Helper method to mock a notification event. - */ - public void mockNotificationEvent(){ - mockPojoUtils(); - mockNotifEventHandler(); - PowerMockito.when(notif.getEventHeader()).thenReturn(ehNotif); - PowerMockito.when(notif.getEventHeader().getEventType()).thenReturn(null); - PowerMockito.when(notif.getEventHeader().getStatus()).thenReturn(null); - } - - - /** - * Helper method to build a mock-Result. - */ - public void mockResult(){ - PowerMockito.when(result.getValue(Bytes.toBytes("transaction"),Bytes.toBytes("tid"))).thenReturn(Bytes.toBytes(tid)); - PowerMockito.when(result.getValue(Bytes.toBytes("transaction"),Bytes.toBytes("status"))).thenReturn(Bytes.toBytes(status)); - PowerMockito.when(result.getValue(Bytes.toBytes("transaction"),Bytes.toBytes("rqstDate"))).thenReturn(Bytes.toBytes(rqstTm)); - PowerMockito.when(result.getValue(Bytes.toBytes("transaction"),Bytes.toBytes("respDate"))).thenReturn(Bytes.toBytes(respTm)); - PowerMockito.when(result.getValue(Bytes.toBytes("transaction"),Bytes.toBytes("sourceId"))).thenReturn(Bytes.toBytes(srcId)); - - PowerMockito.when(result.getValue(Bytes.toBytes("resource"),Bytes.toBytes("resourceId"))).thenReturn(Bytes.toBytes(rsrcId)); - PowerMockito.when(result.getValue(Bytes.toBytes("resource"),Bytes.toBytes("resourceType"))).thenReturn(Bytes.toBytes(rsrcType)); - - PowerMockito.when(result.getValue(Bytes.toBytes("payload"),Bytes.toBytes("rqstBuf"))).thenReturn(Bytes.toBytes(rqstBuf)); - PowerMockito.when(result.getValue(Bytes.toBytes("payload"),Bytes.toBytes("respBuf"))).thenReturn(Bytes.toBytes(respBuf)); - - PowerMockito.when(result.getValue(Bytes.toBytes("notification"),Bytes.toBytes("notificationPayload"))).thenReturn(Bytes.toBytes(notifPayload)); - PowerMockito.when(result.getValue(Bytes.toBytes("notification"),Bytes.toBytes("notificationStatus"))).thenReturn(Bytes.toBytes(notifStatus)); - PowerMockito.when(result.getValue(Bytes.toBytes("notification"),Bytes.toBytes("notificationId"))).thenReturn(Bytes.toBytes(notifID)); - PowerMockito.when(result.getValue(Bytes.toBytes("notification"),Bytes.toBytes("notificationTopic"))).thenReturn(Bytes.toBytes(notifTopic)); - PowerMockito.when(result.getValue(Bytes.toBytes("notification"),Bytes.toBytes("notificationEntityLink"))).thenReturn(Bytes.toBytes(notifEntityLink)); - PowerMockito.when(result.getValue(Bytes.toBytes("notification"),Bytes.toBytes("notificationAction"))).thenReturn(Bytes.toBytes(notifAction)); - } - - - /** - * Helper method to load aai config from test configuration file - * This requires that the 'test_aaiconfig.properties' file is available - */ - - static void setFinalStatic(Field field, Object newValue) throws Exception { - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, newValue); - } - - /** - * Partial setup for AAI config. - */ - public void partialSetupForAAIConfig(){ - - try { - setFinalStatic(AAIConfig.class.getDeclaredField("GlobalPropFileName"), "src/test/resources/test_aaiconfig.properties"); - } - catch (SecurityException e) {fail();} - catch (NoSuchFieldException e) {fail();} - catch (Exception e) {fail();} - - AAIConfig.reloadConfig(); - } - - /** - * Helper method to set the file name of aaiconfig.properties file - * - * @param field Private static filed for update - * @param newValue New value to be used - * @throws Exception the exception - */ - public void modifyFinalStatic(Field field, Object newValue) throws Exception { - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, newValue); - } - -} |