diff options
9 files changed, 1045 insertions, 933 deletions
diff --git a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClient.java b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClient.java index 3684cf21..6f466c3b 100755 --- a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClient.java +++ b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClient.java @@ -24,7 +24,6 @@ package org.onap.ccsdk.sli.adaptors.aai; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.util.HashMap; import java.util.Map; import org.openecomp.aai.inventory.v11.*; @@ -76,9 +75,9 @@ public interface AAIClient extends SvcLogicResource, SvcLogicJavaPlugin { public void logKeyError(String keys); - public QueryStatus processResponseData(String rv, String resource, AAIRequest request, String prefix, SvcLogicContext ctx, HashMap<String, String> nameValues, String modifier) throws JsonParseException, JsonMappingException, IOException, AAIServiceException ; + public QueryStatus processResponseData(String rv, String resource, AAIRequest request, String prefix, SvcLogicContext ctx, Map<String, String> nameValues, String modifier) throws JsonParseException, JsonMappingException, IOException, AAIServiceException ; public String getPathTemplateForResource(String resoourceName, String join, SvcLogicContext ctx) throws MalformedURLException; - public boolean isDeprecatedFormat(String resource, HashMap<String, String> nameValues); + public boolean isDeprecatedFormat(String resource, Map<String, String> nameValues); String query(AAIRequest request) throws AAIServiceException; String save(AAIRequest request) throws AAIServiceException; diff --git a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClientRESTExecutor.java b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClientRESTExecutor.java index 252f3197..906cd838 100755 --- a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClientRESTExecutor.java +++ b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIClientRESTExecutor.java @@ -103,7 +103,6 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { truststorePassword = props.getProperty(AAIService.TRUSTSTORE_PSSWD); keystorePath = props.getProperty(AAIService.KEYSTORE_PATH); keystorePassword = props.getProperty(AAIService.KEYSTORE_PSSWD); -// this.read_timeout = read_timeout; String tmpApplicationId =props.getProperty(AAIService.APPLICATION_ID); if(tmpApplicationId == null || tmpApplicationId.isEmpty()) { @@ -310,14 +309,12 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { errorresponse.setRequestError(requestError); throw new AAIServiceException(responseCode, errorresponse); } else { -// StringBuilder errorStringBuilder = new StringBuilder(); String line = null; while( ( line = reader.readLine() ) != null ) { errorStringBuilder.append("\n").append( line ); } ErrorResponse errorresponse = mapper.readValue(errorStringBuilder.toString(), ErrorResponse.class); -// ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); LOGwriteEndingTrace(responseCode, responseMessage, mapper.writeValueAsString(errorresponse)); throw new AAIServiceException(responseCode, errorresponse); } @@ -373,16 +370,16 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { LOG.error("", exc); } - URL requestUrl = null; - HttpURLConnection con = getConfiguredConnection(requestUrl = request.getRequestUrl(HttpMethod.PUT, resourceVersion), HttpMethod.PUT); + URL requestUrl = request.getRequestUrl(HttpMethod.PUT, resourceVersion); + HttpURLConnection con = getConfiguredConnection(requestUrl, HttpMethod.PUT); ObjectMapper mapper = AAIService.getObjectMapper(); - String json_text = request.toJSONString(); + String jsonText = request.toJSONString(); - LOGwriteDateTrace("data", json_text); - logMetricRequest("PUT "+requestUrl.getPath(), json_text, requestUrl.getPath()); + LOGwriteDateTrace("data", jsonText); + logMetricRequest("PUT "+requestUrl.getPath(), jsonText, requestUrl.getPath()); OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); - osw.write(json_text); + osw.write(jsonText); osw.flush(); // Check for errors @@ -454,8 +451,8 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { } try { - URL requestUrl = null; - HttpURLConnection conn = getConfiguredConnection(requestUrl = request.getRequestUrl(HttpMethod.DELETE, resourceVersion), HttpMethod.DELETE); + URL requestUrl = request.getRequestUrl(HttpMethod.DELETE, resourceVersion); + HttpURLConnection conn = getConfiguredConnection(requestUrl, HttpMethod.DELETE); logMetricRequest("DELETE "+requestUrl.getPath(), "", requestUrl.getPath()); conn.setDoOutput(true); @@ -527,11 +524,10 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { public Object query(AAIRequest request, Class clas) throws AAIServiceException { Object response = null; InputStream inputStream = null; - HttpURLConnection con = null; - URL requestUrl = null; try { - con = getConfiguredConnection(requestUrl = request.getRequestQueryUrl(HttpMethod.GET), HttpMethod.GET); + URL requestUrl = request.getRequestQueryUrl(HttpMethod.GET); + HttpURLConnection con = getConfiguredConnection(requestUrl, HttpMethod.GET); logMetricRequest("GET "+requestUrl.getPath(), "", requestUrl.getPath()); // Check for errors @@ -574,7 +570,6 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { LOG.warn("GET", exc); } } - con = null; } return response; } @@ -592,13 +587,13 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { URL requestUrl = null; HttpURLConnection con = getConfiguredConnection(requestUrl = request.getRequestUrl("PATCH", resourceVersion), "PATCH"); ObjectMapper mapper = AAIService.getObjectMapper(); - String json_text = request.toJSONString(); + String jsonText = request.toJSONString(); - LOGwriteDateTrace("data", json_text); - logMetricRequest("PATCH "+requestUrl.getPath(), json_text, requestUrl.getPath()); + LOGwriteDateTrace("data", jsonText); + logMetricRequest("PATCH "+requestUrl.getPath(), jsonText, requestUrl.getPath()); OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); - osw.write(json_text); + osw.write(jsonText); osw.flush(); // Check for errors @@ -723,8 +718,6 @@ public class AAIClientRESTExecutor implements AAIExecutorInterface { String targetEntity = "A&AI"; String targetVirtualEntity = null; - targetServiceName = ""; - ml.logRequest(svcInstanceId, svcName, partnerName, targetEntity, targetServiceName, targetVirtualEntity, msg); } diff --git a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIDeclarations.java b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIDeclarations.java index 7966fa97..d1b148d5 100755 --- a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIDeclarations.java +++ b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIDeclarations.java @@ -818,7 +818,7 @@ public abstract class AAIDeclarations implements AAIClient { return retval; } - public QueryStatus processResponseData(String rv, String resource, AAIRequest request, String prefix, SvcLogicContext ctx, HashMap<String, String> nameValues, String modifier) throws JsonParseException, JsonMappingException, IOException, AAIServiceException + public QueryStatus processResponseData(String rv, String resource, AAIRequest request, String prefix, SvcLogicContext ctx, Map<String, String> nameValues, String modifier) throws JsonParseException, JsonMappingException, IOException, AAIServiceException { Object response; diff --git a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIService.java b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIService.java index 73454694..9e6e60f9 100755 --- a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIService.java +++ b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIService.java @@ -1520,7 +1520,7 @@ public class AAIService extends AAIDeclarations implements AAIClient, SvcLogicRe } @Override - public boolean isDeprecatedFormat(String resource, HashMap<String, String> nameValues) { + public boolean isDeprecatedFormat(String resource, Map<String, String> nameValues) { return !AAIServiceUtils.isValidFormat(resource, nameValues); } diff --git a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceException.java b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceException.java index ff182f2d..9fac977d 100644 --- a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceException.java +++ b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceException.java @@ -3,14 +3,14 @@ * openECOMP : SDN-C * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. + * 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. @@ -25,53 +25,62 @@ import org.onap.ccsdk.sli.adaptors.aai.data.ErrorResponse; public class AAIServiceException extends Exception { - /** - * - */ - private static final long serialVersionUID = -9039257722542999522L; - - protected ErrorResponse errorResponse = null; - protected int returnCode = -1; + /** + * + */ + private static final long serialVersionUID = -9039257722542999522L; - public AAIServiceException() { + protected final ErrorResponse errorResponse; + protected final int returnCode; - } + public AAIServiceException() { + returnCode = -1; + errorResponse = null; + } - public AAIServiceException(String message) { - super(message); - } + public AAIServiceException(String message) { + super(message); + returnCode = -1; + errorResponse = null; + } - public AAIServiceException(Throwable cause) { - super(cause); - } + public AAIServiceException(Throwable cause) { + super(cause); + returnCode = -1; + errorResponse = null; + } - public AAIServiceException(String message, Throwable cause) { - super(message, cause); - } + public AAIServiceException(String message, Throwable cause) { + super(message, cause); + returnCode = -1; + errorResponse = null; + } - public AAIServiceException(String message, Throwable cause, - boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } + public AAIServiceException(String message, Throwable cause, + boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + returnCode = -1; + errorResponse = null; + } - public AAIServiceException(int returnCode, ErrorResponse errorresponse) { - this.errorResponse = errorresponse; - this.returnCode = returnCode; - } - - public ErrorResponse getErrorResponse() { - return errorResponse; - } + public AAIServiceException(int returnCode, ErrorResponse errorresponse) { + this.errorResponse = errorresponse; + this.returnCode = returnCode; + } - public int getReturnCode() { - return returnCode; - } - - public String getMessage() { - if(errorResponse != null) { - return errorResponse.getRequestError().getServiceException().getText(); - } else { - return super.getMessage(); - } - } + public ErrorResponse getErrorResponse() { + return errorResponse; + } + + public int getReturnCode() { + return returnCode; + } + + public String getMessage() { + if(errorResponse != null) { + return errorResponse.getRequestError().getServiceException().getText(); + } else { + return super.getMessage(); + } + } } diff --git a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceUtils.java b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceUtils.java index 102835d9..ca2af1df 100755 --- a/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceUtils.java +++ b/aai-service/provider/src/main/java/org/onap/ccsdk/sli/adaptors/aai/AAIServiceUtils.java @@ -28,6 +28,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import java.util.HashMap; +import java.util.Map; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; @@ -49,14 +50,14 @@ public class AAIServiceUtils { private static final Logger LOG = LoggerFactory.getLogger(AAIService.class); + private AAIServiceUtils() { + } + public static String getPrimaryIdFromClass(Class<? extends AAIDatum> resourceClass){ // 1. find class getLogger().debug(resourceClass.getName()); - AAIDatum instance = null; try { - instance = resourceClass.newInstance(); - Annotation[] annotations = resourceClass.getAnnotations(); for(Annotation annotation : annotations) { Class<? extends Annotation> anotationType = annotation.annotationType(); @@ -73,19 +74,15 @@ public class AAIServiceUtils { } } } catch(Exception exc) { - + getLogger().warn("getPrimaryIdFromClass failed", exc); } return null; } public static String getSecondaryIdFromClass(Class<? extends AAIDatum> resourceClass){ - // 1. find class getLogger().debug(resourceClass.getName()); - AAIDatum instance = null; try { - instance = resourceClass.newInstance(); - Annotation[] annotations = resourceClass.getAnnotations(); for(Annotation annotation : annotations) { Class<? extends Annotation> anotationType = annotation.annotationType(); @@ -112,16 +109,16 @@ public class AAIServiceUtils { return null; } - public static Method getRelationshipListGetterMethodFromClassDefinition(Class resourceClass) { - Method getRelationshipListMethod = null; - - try { - getRelationshipListMethod = resourceClass.getMethod("getRelationshipList"); - } catch(Exception exc) { - getLogger().debug("Retrofiting relationship data: " + exc.getMessage()); - } - return getRelationshipListMethod; - } + public static Method getRelationshipListGetterMethodFromClassDefinition(Class resourceClass) { + Method getRelationshipListMethod = null; + + try { + getRelationshipListMethod = resourceClass.getMethod("getRelationshipList"); + } catch(Exception exc) { + getLogger().debug("Retrofiting relationship data: " + exc.getMessage()); + } + return getRelationshipListMethod; + } private static Logger getLogger() { return LOG; @@ -314,10 +311,10 @@ public class AAIServiceUtils { return request.getRequestPath(); } - public static boolean isValidFormat(String resource, HashMap<String, String> nameValues) { + public static boolean isValidFormat(String resource, Map<String, String> nameValues) { switch(resource){ - case "custom-query": + case "custom-query": case "formatted-query": case "generic-query": case "named-query": @@ -336,10 +333,10 @@ public class AAIServiceUtils { Set<String> keys = nameValues.keySet(); for(String key : keys) { if(!key.contains(".")) { - if("depth".equals(key) || "related-to".equals(key) || "related_to".equals(key) || "related-link".equals(key) || "related_link".equals(key) || "selflink".equals(key) || "resource_path".equals(key)) + if("depth".equals(key) || "related-to".equals(key) || "related_to".equals(key) || "related-link".equals(key) || "related_link".equals(key) || "selflink".equals(key) || "resource_path".equals(key)) continue; else { - getLogger().warn(String.format("key '%s' is incompatible with resource type '%s'", key, resource)); + getLogger().warn(String.format("key '%s' is incompatible with resource type '%s'", key, resource)); } } } diff --git a/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/ActionUpdateTest.java b/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/ActionUpdateTest.java new file mode 100755 index 00000000..607182ea --- /dev/null +++ b/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/ActionUpdateTest.java @@ -0,0 +1,43 @@ +package org.onap.ccsdk.sli.adaptors.aai; + +import static org.junit.Assert.*; + +import java.util.ArrayList; + +import org.onap.ccsdk.sli.adaptors.aai.update.Action; +import org.onap.ccsdk.sli.adaptors.aai.update.ActionDatum; +import org.junit.Test; + +public class ActionUpdateTest { + @Test + public void getActionData() throws Exception { + final Action resolver = new Action(); + assertNotNull(resolver.getActionData()); + } + + @Test + public void setActionData() throws Exception { + final Action resolver = new Action(); + resolver.setActionData( new ArrayList<ActionDatum>()); + } + + @Test + public void setActionType() throws Exception { + final Action resolver = new Action(); + resolver.setActionType("create"); + assertEquals("create", resolver.getActionType()); + } + + @Test + public void getAdditionalProperties() throws Exception { + final Action resolver = new Action(); + assertNotNull(resolver.getAdditionalProperties()); + } + + @Test + public void setAdditionalProperty() throws Exception { + final Action resolver = new Action(); + resolver.setAdditionalProperty("outcome", "success"); + assertEquals("success", resolver.getAdditionalProperties().get("outcome")); + } +}
\ No newline at end of file diff --git a/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/AutoGeneratedRegressionTest.java b/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/AutoGeneratedRegressionTest.java index 345ff57b..9bc93609 100755 --- a/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/AutoGeneratedRegressionTest.java +++ b/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/AutoGeneratedRegressionTest.java @@ -3,7 +3,7 @@ * openECOMP : SDN-C * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights - * reserved. + * reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ package org.onap.ccsdk.sli.adaptors.aai; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -65,7 +64,6 @@ import org.onap.ccsdk.sli.adaptors.aai.query.NamedQueryData; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; import org.openecomp.aai.inventory.v11.GenericVnf; -import org.openecomp.aai.inventory.v11.InventoryResponseItems; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotationUtils; @@ -81,697 +79,694 @@ import com.fasterxml.jackson.databind.ObjectMapper; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class AutoGeneratedRegressionTest { - static { - System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "INFO"); - System.setProperty(org.slf4j.impl.SimpleLogger.LOG_FILE_KEY, String.format("AutoGeneratedRegressionTest-%d.txt", System.currentTimeMillis())); - } - private static final Logger LOG = LoggerFactory.getLogger(AutoGeneratedRegressionTest.class); - - - protected static AAIClient client; - - protected Map<String, String> cache = new HashMap<String, String>(); - - @BeforeClass - public static void setUp() throws Exception { - URL url = AAIService.class.getResource(AAIService.AAICLIENT_PROPERTIES); - client = new AAIService(url); - LOG.info("----------------------- aicAAIResourceTest.setUp -----------------------"); - } - - @AfterClass - public static void tearDown() throws Exception { - client = null; - LOG.info("----------------------- AAIResourceTest.tearDown -----------------------"); - } - - - @Test - public void mainLoadTest () - { - try - { - String currentDir = System.getProperty("user.dir"); - File dir = new File(currentDir); - if(!dir.exists()) { - System.exit(1); - } - dir = new File(dir, "src/main/resources"); - if(!dir.exists()) { - System.exit(1); - } - // parse the document - File file = new File(dir, "aai_schema_v11.xsd"); - if(!file.exists()) { - assert(false); - return; - } - - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); - Document doc = dBuilder.parse(file); - - Stack<String> stack = new Stack<String>(); - List<String> commands = new ArrayList<String>(); - listSubNodes("network", doc, stack, commands); - listSubNodes("cloud-infrastructure", doc, stack, commands); - listSubNodes("service-design-and-creation", doc, stack, commands); - listSubNodes("license-management", doc, stack, commands); - listSubNodes("business", doc, stack, commands); - - String[] requestDefinition = commands.toArray(new String[0]); - LOG.info("\n----------------------------"); - - executeTests(requestDefinition); - } - catch (Throwable e) - { - LOG.error("", e); - } - } - - @Test - public void testFromFile() { - String filename = "testCommands.txt"; - List<String> lines = new ArrayList<String>(); - Scanner scanner = null; - - try { - File testFile = new File(filename); - if(!testFile.exists()) - return; - scanner = new Scanner(testFile); - while (scanner.hasNextLine()) { - lines.add(scanner.nextLine()); - } - } catch (Exception exc) { - - } finally { - if(scanner != null) - scanner.close(); - } - - String[] requestDefinition = lines.toArray(new String[0]); - executeTests(requestDefinition); - } - - - @Test - public void test01AutoGeneratedRequest() { - - String[] requestDefinition = { - "save|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458", - "update|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458", - "query|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458", - "delete|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458" - }; - - executeTests(requestDefinition); - } - - public void executeTests(String[] requestDefinition) { - - for(String line : requestDefinition){ - LOG.info("Executing: " + line); - - // parse request line resource | key structure - String[] segments = line.split("\\|"); - String action = segments[0]; - String resource = segments[1]; - String[] tmpKeys = segments[2].split("&"); -// String[] keyStructure = tmpKey.; - // options :assign:uuid:cache - // :cached - // :query:random - - - String localId = null; - - List<String> keys = new ArrayList<String>(); - String keyLine = null; - - for(String instruction : tmpKeys) { - String[] parts = instruction.split(":"); - String identifier = parts[0]; - String method = parts[2]; - - if(identifier.startsWith(resource)) { - localId = identifier; - } else if(identifier.startsWith("l-interface") && "l2-bridge-bgf".equals(resource)) { - localId = identifier; - } else if(identifier.startsWith("l-interface") && "l2-bridge-sbg".equals(resource)) { - localId = identifier; - } else if("nodes-query".equals(resource)) { - localId = identifier; - } - - switch(parts[1]) { - case "assign": - String postProcesss = parts[3]; - keyLine = processAssign(identifier, method, postProcesss); - if(keyLine != null && !keyLine.trim().isEmpty()) { - keys.add(keyLine); - } - break; - case "cached": - keyLine = processCached(identifier, method); - if(keyLine != null && !keyLine.trim().isEmpty()) { - keys.add(keyLine); - } - break; - } - - } - - List<String> x = Arrays.asList(localId.split("\\.")); - switch(action){ - case "save": - testAutoGeneratedSaveRequest(resource, keys, x.get(x.size() - 1), cache.get(localId)); - break; - case "update": - testAutoGeneratedUpdateRequest(resource, keys, x.get(x.size() - 1), cache.get(localId)); - break; - - case "query": - test03AutoGeneratedQueryRequest(resource, keys); - break; - case "delete": - test03AutoGeneratedDeleteRequest(resource, keys); - break; - } - } - - LOG.info("done"); - } - - - public void testAutoGeneratedSaveRequest(String resource, List<String> requestKeys, String identifier, String idValue) { - LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); - - try - { - Map<String, String> nameValues = keyToHashMap(StringUtils.join(requestKeys, " AND "), new SvcLogicContext()); - AAIRequest request = AAIRequest.createRequest(resource, nameValues); - Class<AAIDatum> resourceClass = (Class<AAIDatum>) (request==null ? GenericVnf.class : request.getModelClass()); - - Map<String, String> data = new HashMap<String, String>(); - - for(Field field : resourceClass.getDeclaredFields()) { - String type = field.getType().getName(); - switch(type){ - case "bool": - case "boolean": - type = Boolean.class.getName(); - break; - case "int": - type = Integer.class.getName(); - break; - case "long": - type = Long.class.getName(); - break; - - } - if(type.startsWith("java.lang.")){ - Annotation[] fieldAnnotations = field.getAnnotations(); - for(int i = 0; i < fieldAnnotations.length; i++) { - Annotation a = fieldAnnotations[i]; - if(a instanceof JsonProperty){ - JsonProperty pa = (JsonProperty)a; - String name = pa.value(); - String value; - switch(type) { - case "java.lang.Integer": - case "java.lang.Long": - value = RandomStringUtils.random(6, false, true); - break; - case "java.lang.Boolean": - value = "false"; - break; - default: - if(name.equals(identifier)) { - value = idValue; - } else { - value = RandomStringUtils.random(10, true, false); - } - } - data.put(name, value); - } else - if(a instanceof javax.xml.bind.annotation.XmlElement) { - XmlElement xe = (XmlElement)a; - String name = xe.name(); - if("model-version-id".equals(name)) { - continue; - } - if("model-invariant-id".equals(name)) { - continue; - } - if("link-type".equals(name)){ - data.put(name, "roadmTail"); - continue; - } - if("operational-status".equals(name)){ - data.put(name, "available"); - continue; - } - if(name.equals(identifier)) { - data.put(name, idValue); - continue; - } - - String value; - switch(type) { - case "java.lang.Integer": - case "java.lang.Long": - value = RandomStringUtils.random(6, false, true); - break; - case "java.lang.Boolean": - value = "false"; - break; - default: - if(name.equals(identifier)) { - value = idValue; - } else { - value = RandomStringUtils.random(10, true, false); - } - } - data.put(name, value); - } - } - } - } - - SvcLogicContext ctx = new SvcLogicContext(); - - data.remove("resource-version"); - - QueryStatus resp = null; - - //(String resource, boolean force, boolean localOnly, String key, Map<String, String> parms, String prefix, SvcLogicContext ctx) - resp = client.save(resource, false, false, StringUtils.join(requestKeys, " AND "), data, "aaidata", ctx); - if(resp == QueryStatus.SUCCESS) { - LOG.info(String.format("Save %s successfull", resource)); - } else { - LOG.info(String.format("Save %s failed due to : %s", resource, ctx.getAttribute("aaidata.error.message"))); - } - } - catch (Throwable e) - { - LOG.error("Caught exception", e); - fail("Caught exception"); - } - } - - public void test03AutoGeneratedQueryRequest(String resource, List<String> requestKeys) { - LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); - - SvcLogicContext ctx = new SvcLogicContext(); - try - { - - QueryStatus response = null; - - response = client.query(resource, false, null, StringUtils.join(requestKeys, " AND "), "aaiTest", null, ctx); - if(response == QueryStatus.SUCCESS) { - LOG.info(String.format("Query %s successfull", resource)); - Set<String> tokens = ctx.getAttributeKeySet(); - Map<String, String> reponseData = new HashMap<String, String>(); - - String responsePrefix = String.format("%s", "aaiTest"); - - for(String token : tokens) { - if(token.startsWith(responsePrefix)){ - reponseData.put(token, ctx.getAttribute(token)); - } else { - LOG.info(String.format("%s = ", token, ctx.getAttribute(token))); - } - } - - LOG.info("AAIResponse: " + response.toString()); - assertTrue("AAIRequest:"+resource, reponseData.size() > 0); - } else { - LOG.info(String.format("Query %s failed due to : %s", resource, ctx.getAttribute("aaidata.error.message"))); - assert(false); - } - } - catch (Throwable e) - { - LOG.error("Caught exception", e); - } - } - - - public void test03AutoGeneratedDeleteRequest(String resource, List<String> requestKeys) { - LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); - - try - { - SvcLogicContext ctx = new SvcLogicContext(); - - QueryStatus response = null; - - response = client.delete(resource, StringUtils.join(requestKeys, " AND "), ctx); - if(response == QueryStatus.SUCCESS) { - LOG.info(String.format("Delete %s successfull", resource)); - } else { - LOG.info(String.format("Delete %s failed due to : %s", resource, ctx.getAttribute("aaiDelete.error.message"))); - } - } - catch (Throwable e) - { - LOG.error("Caught exception", e); - fail("Caught exception"); - } - } - - public void testAutoGeneratedUpdateRequest(String resource, List<String> requestKeys, String identifier, String idValue) { - LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); - - try - { - Map<String, String> nameValues = keyToHashMap(StringUtils.join(requestKeys, " AND "), new SvcLogicContext()); - AAIRequest request = AAIRequest.createRequest(resource, nameValues); - Class<AAIDatum> resourceClass = (Class<AAIDatum>) (request==null ? GenericVnf.class : request.getModelClass()); - - Map<String, String> data = new HashMap<String, String>(); - - boolean skipFirst = true; - boolean breakLoop = false; - for(Field field : resourceClass.getDeclaredFields()) { - if(skipFirst){ - skipFirst = false; - continue; - } - if(breakLoop){ - break; - } - String type = field.getType().getName(); - if(type.startsWith("java.lang.")){ - Annotation[] fieldAnnotations = field.getAnnotations(); - for(int i = 0; i < fieldAnnotations.length; i++) { - Annotation a = fieldAnnotations[i]; - if(a instanceof JsonProperty){ - JsonProperty pa = (JsonProperty)a; - String name = pa.value(); - String value; - switch(type) { - case "java.lang.Integer": - case "java.lang.Long": - value = RandomStringUtils.random(6, false, true); - break; - case "java.lang.Boolean": - value = "false"; - break; - default: - if(name.equals(identifier)) { - value = idValue; - } else { - value = RandomStringUtils.random(10, true, false); - } - } - data.put(name, value); - breakLoop = true; - } else - if(a instanceof javax.xml.bind.annotation.XmlElement) { - XmlElement xe = (XmlElement)a; - String name = xe.name(); - if("link-type".equals(name)){ - data.put(name, "roadmTail"); - continue; - } - if("operational-status".equals(name)){ - data.put(name, "available"); - continue; - } - String value; - switch(type) { - case "java.lang.Integer": - case "java.lang.Long": - value = RandomStringUtils.random(6, false, true); - break; - case "java.lang.Boolean": - value = "false"; - break; - default: - if(name.equals(identifier)) { - value = idValue; - } else { - value = RandomStringUtils.random(10, true, false); - } - } - data.put(name, value); - breakLoop = true; - } - } - } - } - - SvcLogicContext ctx = new SvcLogicContext(); - - data.remove("resource-version"); - - QueryStatus resp = null; - - //client.update("ipsec-configuration", "ipsec-configuration.ipsec-configuration-id = 'testConfigurationId01'", data, "aaiTest", ctx); - resp = client.update(resource, StringUtils.join(requestKeys, " AND "), data, "aaidata", ctx); - if(resp == QueryStatus.SUCCESS) { - LOG.info(String.format("Update %s successfull", resource)); - } else { - LOG.info(String.format("Update %s failed due to : %s", resource, ctx.getAttribute("aaidata.error.message"))); - } - - } - catch (Throwable e) - { - LOG.error("Caught exception", e); - fail("Caught exception"); - } - } - - static ArrayList<Method> findSetters(Class<?> c) { - ArrayList<Method> list = new ArrayList<Method>(); - Method[] methods = c.getDeclaredMethods(); - for (Method method : methods) - if (isGetter(method)) - list.add(method); - return list; - } - - - public static boolean isGetter(Method method) { - if (Modifier.isPublic(method.getModifiers()) && - method.getParameterTypes().length == 0) { - if (method.getName().matches("^get[A-Z].*") && - !method.getReturnType().equals(void.class)) - return true; - if (method.getName().matches("^is[A-Z].*") && - method.getReturnType().equals(boolean.class)) - return true; - } - return false; - } - - public static boolean isSetter(Method method) { - return Modifier.isPublic(method.getModifiers()) && - method.getReturnType().equals(void.class) && - method.getParameterTypes().length == 1 && - method.getName().matches("^set[A-Z].*"); - } - - private String processAssign(String identifier, String method, String postProcess) { - String value = null; - if("uuid".equals(method)) { - value = UUID.randomUUID().toString(); - } - - if("cache".equals(postProcess)) { - cache.put(identifier, value); - } - - if("value".equals(method)) { - cache.put(identifier, postProcess); - value = postProcess; - } - - String key = String.format("%s = '%s'", identifier, value); - return key; - } - - private String processCached(String identifier, String method) { - String value = cache.get(identifier); - - String key = String.format("%s = '%s'", identifier, value); - return key; - } - - protected HashMap<String,String> keyToHashMap(String key, SvcLogicContext ctx) { - if (key == null) { - return (null); - } - - LOG.debug("Converting key [" + key + "] to where clause"); - - if (key.startsWith("'") && key.endsWith("'")) { - key = key.substring(1, key.length() - 1); - - LOG.debug("Stripped outer single quotes - key is now [" + key + "]"); - } - - String[] keyTerms = key.split("\\s+"); - - String term1 = null; - String op = null; - String term2 = null; - HashMap<String, String> results = new HashMap<String, String>(); - - for (int i = 0; i < keyTerms.length; i++) { - if (term1 == null) { - if ("and".equalsIgnoreCase(keyTerms[i]) - || "or".equalsIgnoreCase(keyTerms[i])) { - // Skip over ADD/OR - } else { - term1 = resolveTerm(keyTerms[i], ctx); - } - } else if (op == null) { - if ("==".equals(keyTerms[i])) { - op = "="; - } else { - op = keyTerms[i]; - } - } else { - term2 = resolveTerm(keyTerms[i], ctx); - term2 = term2.trim().replace("'", "").replace("$", "").replace("'", ""); - results.put(term1, term2); - - term1 = null; - op = null; - term2 = null; - } - } - - return (results); - } - - private String resolveTerm(String term, SvcLogicContext ctx) { - if (term == null) { - return (null); - } - - LOG.debug("resolveTerm: term is " + term); - - if (term.startsWith("$") && (ctx != null)) { - // Resolve any index variables. - - return ("'" + resolveCtxVariable(term.substring(1), ctx) + "'"); - } else if (term.startsWith("'") || term.startsWith("\"")) { - return (term); - } else { - return (term.replaceAll("-", "_")); - - } - - } - - private String resolveCtxVariable(String ctxVarName, SvcLogicContext ctx) { - - if (ctxVarName.indexOf('[') == -1) { - // Ctx variable contains no arrays - return (ctx.getAttribute(ctxVarName)); - } - - // Resolve any array references - StringBuffer sbuff = new StringBuffer(); - String[] ctxVarParts = ctxVarName.split("\\["); - sbuff.append(ctxVarParts[0]); - for (int i = 1; i < ctxVarParts.length; i++) { - if (ctxVarParts[i].startsWith("$")) { - int endBracketLoc = ctxVarParts[i].indexOf("]"); - if (endBracketLoc == -1) { - // Missing end bracket ... give up parsing - LOG.warn("Variable reference " + ctxVarName - + " seems to be missing a ']'"); - return (ctx.getAttribute(ctxVarName)); - } - - String idxVarName = ctxVarParts[i].substring(1, endBracketLoc); - String remainder = ctxVarParts[i].substring(endBracketLoc); - - sbuff.append("["); - sbuff.append(ctx.getAttribute(idxVarName)); - sbuff.append(remainder); - - } else { - // Index is not a variable reference - sbuff.append("["); - sbuff.append(ctxVarParts[i]); - } - } - - return (ctx.getAttribute(sbuff.toString())); - } - -// @Test - public void test90QueryTenantRequest() - { - LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); - - URL url; - - try { - url = client.requestVserverURLNodeQuery("bpsx0001vm001bps001"); - url = new URL("https://mtanjv9aaas03.aic.cip.att.com:8443/aai/v4/cloud-infrastructure/tenants/tenant/6b012c07bdf1427190ae58f794a86344/vservers/vserver/5acfe828-82e9-swgk092815-13-4d2c-85bb-9c2c1fafcce6"); - client.getTenantIdFromVserverUrl(url); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Test - public void R1702NamedQueryRequest() - { - LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); - try - { - SvcLogicContext ctx = new SvcLogicContext(); - URL resource = this.getClass().getResource("/json/nquery2.json"); - - LOG.info("Resource is " + resource.getFile()); - File requestFile = new File(resource.getFile()); - if(!requestFile.exists()) { - fail("Test file does not exist"); - } - ObjectMapper mapper = AAIService.getObjectMapper(); - NamedQueryData request = mapper.readValue(requestFile, NamedQueryData.class); - Map<String, Object> map = mapper.convertValue(request, Map.class); -// AAIDeclartations.class.cast(client).writeMap(map, String.format("%s.%s", "aaiTmp", "inventory-response-items"), ctx); - - - Map<String, String> data = new HashMap<String, String>(); - ctx.setAttribute("namedQueryData.instance-filters.instance-filter[0].l3-network.network-role", "example-network-role-val-432223"); - ctx.setAttribute("namedQueryData.instance-filters.instance-filter_length", "1"); - QueryStatus resp = client.query("named-query", false, null, "named-query-uuid = '4f448e43-339f-4c1c-85f6-896c444e25ca' AND prefix = 'namedQueryData' ", "zdzich", null, ctx); - - LOG.info("AAIResponse: " + resp.toString()); - } - catch (Throwable e) - { - assert(true); - } - } - - - static class MySchemaOutputResolver extends SchemaOutputResolver { - - public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException { - File file = new File(suggestedFileName); - StreamResult result = new StreamResult(file); - result.setSystemId(file.getAbsolutePath()); - return result; - } - - } - - private static void listSubNodes(String parent, Document doc, Stack<String> stack, List<String> commands) throws Exception { + static { + System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "INFO"); + System.setProperty(org.slf4j.impl.SimpleLogger.LOG_FILE_KEY, String.format("AutoGeneratedRegressionTest-%d.txt", System.currentTimeMillis())); + } + private static final Logger LOG = LoggerFactory.getLogger(AutoGeneratedRegressionTest.class); + + + protected static AAIClient client; + + protected Map<String, String> cache = new HashMap<String, String>(); + + @BeforeClass + public static void setUp() throws Exception { + URL url = AAIService.class.getResource(AAIService.AAICLIENT_PROPERTIES); + client = new AAIService(url); + LOG.info("----------------------- aicAAIResourceTest.setUp -----------------------"); + } + + @AfterClass + public static void tearDown() throws Exception { + client = null; + LOG.info("----------------------- AAIResourceTest.tearDown -----------------------"); + } + + + @Test + public void mainLoadTest () + { + try + { + String currentDir = System.getProperty("user.dir"); + File dir = new File(currentDir); + if(!dir.exists()) { + System.exit(1); + } + dir = new File(dir, "src/main/resources"); + if(!dir.exists()) { + System.exit(1); + } + // parse the document + File file = new File(dir, "aai_schema_v11.xsd"); + if(!file.exists()) { + assert(false); + return; + } + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(file); + + Stack<String> stack = new Stack<String>(); + List<String> commands = new ArrayList<String>(); + listSubNodes("network", doc, stack, commands); + listSubNodes("cloud-infrastructure", doc, stack, commands); + listSubNodes("service-design-and-creation", doc, stack, commands); + listSubNodes("license-management", doc, stack, commands); + listSubNodes("business", doc, stack, commands); + + String[] requestDefinition = commands.toArray(new String[0]); + LOG.info("\n----------------------------"); + + executeTests(requestDefinition); + } + catch (Throwable e) + { + LOG.error("", e); + } + } + + @Test + public void testFromFile() { + String filename = "testCommands.txt"; + List<String> lines = new ArrayList<String>(); + Scanner scanner = null; + + try { + File testFile = new File(filename); + if(!testFile.exists()) + return; + scanner = new Scanner(testFile); + while (scanner.hasNextLine()) { + lines.add(scanner.nextLine()); + } + } catch (Exception exc) { + + } finally { + if(scanner != null) + scanner.close(); + } + + String[] requestDefinition = lines.toArray(new String[0]); + executeTests(requestDefinition); + } + + + @Test + public void test01AutoGeneratedRequest() { + + String[] requestDefinition = { + "save|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458", + "update|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458", + "query|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458", + "delete|generic-vnf|generic-vnf.vnf-id:assign:value:adb28ac0-a260-4b7d-9ce5-adf15733c458" + }; + + executeTests(requestDefinition); + } + + public void executeTests(String[] requestDefinition) { + + for(String line : requestDefinition){ + LOG.info("Executing: " + line); + + // parse request line resource | key structure + String[] segments = line.split("\\|"); + String action = segments[0]; + String resource = segments[1]; + String[] tmpKeys = segments[2].split("&"); + // String array keyStructure can be tmpKey. + // options :assign:uuid:cache + // :cached + // :query:random + + + String localId = null; + + List<String> keys = new ArrayList<String>(); + String keyLine = null; + + for(String instruction : tmpKeys) { + String[] parts = instruction.split(":"); + String identifier = parts[0]; + String method = parts[2]; + + if(identifier.startsWith(resource)) { + localId = identifier; + } else if(identifier.startsWith("l-interface") && "l2-bridge-bgf".equals(resource)) { + localId = identifier; + } else if(identifier.startsWith("l-interface") && "l2-bridge-sbg".equals(resource)) { + localId = identifier; + } else if("nodes-query".equals(resource)) { + localId = identifier; + } + + switch(parts[1]) { + case "assign": + String postProcesss = parts[3]; + keyLine = processAssign(identifier, method, postProcesss); + if(keyLine != null && !keyLine.trim().isEmpty()) { + keys.add(keyLine); + } + break; + case "cached": + keyLine = processCached(identifier, method); + if(keyLine != null && !keyLine.trim().isEmpty()) { + keys.add(keyLine); + } + break; + } + + } + + List<String> x = Arrays.asList(localId.split("\\.")); + switch(action){ + case "save": + testAutoGeneratedSaveRequest(resource, keys, x.get(x.size() - 1), cache.get(localId)); + break; + case "update": + testAutoGeneratedUpdateRequest(resource, keys, x.get(x.size() - 1), cache.get(localId)); + break; + + case "query": + test03AutoGeneratedQueryRequest(resource, keys); + break; + case "delete": + test03AutoGeneratedDeleteRequest(resource, keys); + break; + } + } + + LOG.info("done"); + } + + + public void testAutoGeneratedSaveRequest(String resource, List<String> requestKeys, String identifier, String idValue) { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + try + { + Map<String, String> nameValues = keyToHashMap(StringUtils.join(requestKeys, " AND "), new SvcLogicContext()); + AAIRequest request = AAIRequest.createRequest(resource, nameValues); + Class<AAIDatum> resourceClass = (Class<AAIDatum>) (request==null ? GenericVnf.class : request.getModelClass()); + + Map<String, String> data = new HashMap<String, String>(); + + for(Field field : resourceClass.getDeclaredFields()) { + String type = field.getType().getName(); + switch(type){ + case "bool": + case "boolean": + type = Boolean.class.getName(); + break; + case "int": + type = Integer.class.getName(); + break; + case "long": + type = Long.class.getName(); + break; + + } + if(type.startsWith("java.lang.")){ + Annotation[] fieldAnnotations = field.getAnnotations(); + for(int i = 0; i < fieldAnnotations.length; i++) { + Annotation a = fieldAnnotations[i]; + if(a instanceof JsonProperty){ + JsonProperty pa = (JsonProperty)a; + String name = pa.value(); + String value; + switch(type) { + case "java.lang.Integer": + case "java.lang.Long": + value = RandomStringUtils.random(6, false, true); + break; + case "java.lang.Boolean": + value = "false"; + break; + default: + if(name.equals(identifier)) { + value = idValue; + } else { + value = RandomStringUtils.random(10, true, false); + } + } + data.put(name, value); + } else + if(a instanceof javax.xml.bind.annotation.XmlElement) { + XmlElement xe = (XmlElement)a; + String name = xe.name(); + if("model-version-id".equals(name)) { + continue; + } + if("model-invariant-id".equals(name)) { + continue; + } + if("link-type".equals(name)){ + data.put(name, "roadmTail"); + continue; + } + if("operational-status".equals(name)){ + data.put(name, "available"); + continue; + } + if(name.equals(identifier)) { + data.put(name, idValue); + continue; + } + + String value; + switch(type) { + case "java.lang.Integer": + case "java.lang.Long": + value = RandomStringUtils.random(6, false, true); + break; + case "java.lang.Boolean": + value = "false"; + break; + default: + if(name.equals(identifier)) { + value = idValue; + } else { + value = RandomStringUtils.random(10, true, false); + } + } + data.put(name, value); + } + } + } + } + + SvcLogicContext ctx = new SvcLogicContext(); + + data.remove("resource-version"); + + QueryStatus resp = null; + + //(String resource, boolean force, boolean localOnly, String key, Map<String, String> parms, String prefix, SvcLogicContext ctx) + resp = client.save(resource, false, false, StringUtils.join(requestKeys, " AND "), data, "aaidata", ctx); + if(resp == QueryStatus.SUCCESS) { + LOG.info(String.format("Save %s successfull", resource)); + } else { + LOG.info(String.format("Save %s failed due to : %s", resource, ctx.getAttribute("aaidata.error.message"))); + } + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + + public void test03AutoGeneratedQueryRequest(String resource, List<String> requestKeys) { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + SvcLogicContext ctx = new SvcLogicContext(); + try + { + + QueryStatus response = null; + + response = client.query(resource, false, null, StringUtils.join(requestKeys, " AND "), "aaiTest", null, ctx); + if(response == QueryStatus.SUCCESS) { + LOG.info(String.format("Query %s successfull", resource)); + Set<String> tokens = ctx.getAttributeKeySet(); + Map<String, String> reponseData = new HashMap<String, String>(); + + String responsePrefix = String.format("%s", "aaiTest"); + + for(String token : tokens) { + if(token.startsWith(responsePrefix)){ + reponseData.put(token, ctx.getAttribute(token)); + } else { + LOG.info(String.format("%s = ", token, ctx.getAttribute(token))); + } + } + + LOG.info("AAIResponse: " + response.toString()); + assertTrue("AAIRequest:"+resource, reponseData.size() > 0); + } else { + LOG.info(String.format("Query %s failed due to : %s", resource, ctx.getAttribute("aaidata.error.message"))); + assert(false); + } + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + } + } + + + public void test03AutoGeneratedDeleteRequest(String resource, List<String> requestKeys) { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + try + { + SvcLogicContext ctx = new SvcLogicContext(); + + QueryStatus response = null; + + response = client.delete(resource, StringUtils.join(requestKeys, " AND "), ctx); + if(response == QueryStatus.SUCCESS) { + LOG.info(String.format("Delete %s successfull", resource)); + } else { + LOG.info(String.format("Delete %s failed due to : %s", resource, ctx.getAttribute("aaiDelete.error.message"))); + } + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + + public void testAutoGeneratedUpdateRequest(String resource, List<String> requestKeys, String identifier, String idValue) { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + try + { + Map<String, String> nameValues = keyToHashMap(StringUtils.join(requestKeys, " AND "), new SvcLogicContext()); + AAIRequest request = AAIRequest.createRequest(resource, nameValues); + Class<AAIDatum> resourceClass = (Class<AAIDatum>) (request==null ? GenericVnf.class : request.getModelClass()); + + Map<String, String> data = new HashMap<String, String>(); + + boolean skipFirst = true; + boolean breakLoop = false; + for(Field field : resourceClass.getDeclaredFields()) { + if(skipFirst){ + skipFirst = false; + continue; + } + if(breakLoop){ + break; + } + String type = field.getType().getName(); + if(type.startsWith("java.lang.")){ + Annotation[] fieldAnnotations = field.getAnnotations(); + for(int i = 0; i < fieldAnnotations.length; i++) { + Annotation a = fieldAnnotations[i]; + if(a instanceof JsonProperty){ + JsonProperty pa = (JsonProperty)a; + String name = pa.value(); + String value; + switch(type) { + case "java.lang.Integer": + case "java.lang.Long": + value = RandomStringUtils.random(6, false, true); + break; + case "java.lang.Boolean": + value = "false"; + break; + default: + if(name.equals(identifier)) { + value = idValue; + } else { + value = RandomStringUtils.random(10, true, false); + } + } + data.put(name, value); + breakLoop = true; + } else + if(a instanceof javax.xml.bind.annotation.XmlElement) { + XmlElement xe = (XmlElement)a; + String name = xe.name(); + if("link-type".equals(name)){ + data.put(name, "roadmTail"); + continue; + } + if("operational-status".equals(name)){ + data.put(name, "available"); + continue; + } + String value; + switch(type) { + case "java.lang.Integer": + case "java.lang.Long": + value = RandomStringUtils.random(6, false, true); + break; + case "java.lang.Boolean": + value = "false"; + break; + default: + if(name.equals(identifier)) { + value = idValue; + } else { + value = RandomStringUtils.random(10, true, false); + } + } + data.put(name, value); + breakLoop = true; + } + } + } + } + + SvcLogicContext ctx = new SvcLogicContext(); + + data.remove("resource-version"); + + QueryStatus resp = null; + + //client.update("ipsec-configuration", "ipsec-configuration.ipsec-configuration-id = 'testConfigurationId01'", data, "aaiTest", ctx); + resp = client.update(resource, StringUtils.join(requestKeys, " AND "), data, "aaidata", ctx); + if(resp == QueryStatus.SUCCESS) { + LOG.info(String.format("Update %s successfull", resource)); + } else { + LOG.info(String.format("Update %s failed due to : %s", resource, ctx.getAttribute("aaidata.error.message"))); + } + + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + + static ArrayList<Method> findSetters(Class<?> c) { + ArrayList<Method> list = new ArrayList<Method>(); + Method[] methods = c.getDeclaredMethods(); + for (Method method : methods) + if (isGetter(method)) + list.add(method); + return list; + } + + + public static boolean isGetter(Method method) { + if (Modifier.isPublic(method.getModifiers()) && + method.getParameterTypes().length == 0) { + if (method.getName().matches("^get[A-Z].*") && + !method.getReturnType().equals(void.class)) + return true; + if (method.getName().matches("^is[A-Z].*") && + method.getReturnType().equals(boolean.class)) + return true; + } + return false; + } + + public static boolean isSetter(Method method) { + return Modifier.isPublic(method.getModifiers()) && + method.getReturnType().equals(void.class) && + method.getParameterTypes().length == 1 && + method.getName().matches("^set[A-Z].*"); + } + + private String processAssign(String identifier, String method, String postProcess) { + String value = null; + if("uuid".equals(method)) { + value = UUID.randomUUID().toString(); + } + + if("cache".equals(postProcess)) { + cache.put(identifier, value); + } + + if("value".equals(method)) { + cache.put(identifier, postProcess); + value = postProcess; + } + + String key = String.format("%s = '%s'", identifier, value); + return key; + } + + private String processCached(String identifier, String method) { + String value = cache.get(identifier); + + String key = String.format("%s = '%s'", identifier, value); + return key; + } + + protected HashMap<String,String> keyToHashMap(String key, SvcLogicContext ctx) { + if (key == null) { + return (null); + } + + LOG.debug("Converting key [" + key + "] to where clause"); + + if (key.startsWith("'") && key.endsWith("'")) { + key = key.substring(1, key.length() - 1); + + LOG.debug("Stripped outer single quotes - key is now [" + key + "]"); + } + + String[] keyTerms = key.split("\\s+"); + + String term1 = null; + String op = null; + String term2 = null; + HashMap<String, String> results = new HashMap<String, String>(); + + for (int i = 0; i < keyTerms.length; i++) { + if (term1 == null) { + if ("and".equalsIgnoreCase(keyTerms[i]) + || "or".equalsIgnoreCase(keyTerms[i])) { + // Skip over ADD/OR + } else { + term1 = resolveTerm(keyTerms[i], ctx); + } + } else if (op == null) { + if ("==".equals(keyTerms[i])) { + op = "="; + } else { + op = keyTerms[i]; + } + } else { + term2 = resolveTerm(keyTerms[i], ctx); + term2 = term2.trim().replace("'", "").replace("$", "").replace("'", ""); + results.put(term1, term2); + + term1 = null; + op = null; + term2 = null; + } + } + + return (results); + } + + private String resolveTerm(String term, SvcLogicContext ctx) { + if (term == null) { + return (null); + } + + LOG.debug("resolveTerm: term is " + term); + + if (term.startsWith("$") && (ctx != null)) { + // Resolve any index variables. + + return ("'" + resolveCtxVariable(term.substring(1), ctx) + "'"); + } else if (term.startsWith("'") || term.startsWith("\"")) { + return (term); + } else { + return (term.replaceAll("-", "_")); + + } + + } + + private String resolveCtxVariable(String ctxVarName, SvcLogicContext ctx) { + + if (ctxVarName.indexOf('[') == -1) { + // Ctx variable contains no arrays + return (ctx.getAttribute(ctxVarName)); + } + + // Resolve any array references + StringBuffer sbuff = new StringBuffer(); + String[] ctxVarParts = ctxVarName.split("\\["); + sbuff.append(ctxVarParts[0]); + for (int i = 1; i < ctxVarParts.length; i++) { + if (ctxVarParts[i].startsWith("$")) { + int endBracketLoc = ctxVarParts[i].indexOf("]"); + if (endBracketLoc == -1) { + // Missing end bracket ... give up parsing + LOG.warn("Variable reference " + ctxVarName + + " seems to be missing a ']'"); + return (ctx.getAttribute(ctxVarName)); + } + + String idxVarName = ctxVarParts[i].substring(1, endBracketLoc); + String remainder = ctxVarParts[i].substring(endBracketLoc); + + sbuff.append("["); + sbuff.append(ctx.getAttribute(idxVarName)); + sbuff.append(remainder); + + } else { + // Index is not a variable reference + sbuff.append("["); + sbuff.append(ctxVarParts[i]); + } + } + + return (ctx.getAttribute(sbuff.toString())); + } + +// @Test + public void test90QueryTenantRequest() + { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + URL url; + + try { + url = client.requestVserverURLNodeQuery("bpsx0001vm001bps001"); + url = new URL("https://mtanjv9aaas03.aic.cip.att.com:8443/aai/v4/cloud-infrastructure/tenants/tenant/6b012c07bdf1427190ae58f794a86344/vservers/vserver/5acfe828-82e9-swgk092815-13-4d2c-85bb-9c2c1fafcce6"); + client.getTenantIdFromVserverUrl(url); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Test + public void R1702NamedQueryRequest() + { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + try + { + SvcLogicContext ctx = new SvcLogicContext(); + URL resource = this.getClass().getResource("/json/nquery2.json"); + + LOG.info("Resource is " + resource.getFile()); + File requestFile = new File(resource.getFile()); + if(!requestFile.exists()) { + fail("Test file does not exist"); + } + ObjectMapper mapper = AAIService.getObjectMapper(); + NamedQueryData request = mapper.readValue(requestFile, NamedQueryData.class); + Map<String, Object> map = mapper.convertValue(request, Map.class); + + ctx.setAttribute("namedQueryData.instance-filters.instance-filter[0].l3-network.network-role", "example-network-role-val-432223"); + ctx.setAttribute("namedQueryData.instance-filters.instance-filter_length", "1"); + QueryStatus resp = client.query("named-query", false, null, "named-query-uuid = '4f448e43-339f-4c1c-85f6-896c444e25ca' AND prefix = 'namedQueryData' ", "zdzich", null, ctx); + + LOG.info("AAIResponse: " + resp.toString()); + } + catch (Throwable e) + { + assert(true); + } + } + + + static class MySchemaOutputResolver extends SchemaOutputResolver { + + public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException { + File file = new File(suggestedFileName); + StreamResult result = new StreamResult(file); + result.setSystemId(file.getAbsolutePath()); + return result; + } + + } + + private static void listSubNodes(String parent, Document doc, Stack<String> stack, List<String> commands) throws Exception { XPathFactory xFactory = XPathFactory.newInstance(); XPath xPath = xFactory.newXPath(); String format = "/schema/element[@name='%s']/complexType/sequence/element[@ref]"; @@ -787,157 +782,157 @@ public class AutoGeneratedRegressionTest { Node node = nl.item(index); - if(!(node instanceof Element)) - continue; - - String classAlias = null; - - if(node.hasAttributes()) - { - String nm = ((Element)node).getAttribute("ref"); - if(nm != null && !nm.isEmpty()) { - String[] split = nm.split(":"); - classAlias = split[split.length - 1]; - if("relationship-list".equals(classAlias)) - continue; - if("metadata".equals(classAlias)) - continue; - if("classes-of-service".equals(classAlias)) { - classAlias = "class-of-service"; - } else if("l3-interface-ipv4-address-list".equals(classAlias)) { - ; - } else if("l3-interface-ipv6-address-list".equals(classAlias)) { - ; - } else if("cvlan-tags".equals(classAlias)) { - classAlias = "cvlan-tag-entry"; - } else if("network-policies".equals(classAlias)) { - classAlias = "network-policy"; - } else if("complexes".equals(classAlias)) { - classAlias = "complex"; - } else if("dvs-switches".equals(classAlias)) { - classAlias = "dvs-switch"; - } else if("service-capabilities".equals(classAlias)) { - classAlias = "service-capability"; - } else { - classAlias = classAlias.substring(0, classAlias.length() -1); - } - AAIRequest request = AAIRequest.createRequest(classAlias, new HashMap<String, String>()); - if(request != null) { - Class<?> clazz = request.getModelClass(); - Field[] fieldz = clazz.getDeclaredFields(); - Field field = fieldz[0]; - String fieldName = field.getName(); - XmlElement annotation = field.getAnnotation(XmlElement.class); - - Map<String, Object> map = AnnotationUtils.getAnnotationAttributes(annotation); - String id = (String)map.get("name"); - if("##default".equals(id)) { - id = fieldName; - } - - if("cloud-region".equals(classAlias)) { - String keystring = "cloud-region.cloud-owner:assign:value:att-aic&cloud-region.cloud-region-id:assign:value:AAIAIC25"; - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - listSubNodes(classAlias, doc, stack, commands); - stack.pop(); - } else if("entitlement".equals(classAlias)) { - String keystring = "entitlement.group-uuid:assign:value:"+UUID.randomUUID()+"&entitlement.resource-uuid:assign:value:"+UUID.randomUUID(); - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - listSubNodes(classAlias, doc, stack, commands); - stack.pop(); - } else if("license".equals(classAlias)) { - String keystring = "license.group-uuid:assign:value:"+UUID.randomUUID()+"&license.resource-uuid:assign:value:"+UUID.randomUUID(); - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - listSubNodes(classAlias, doc, stack, commands); - stack.pop(); - } else if("route-target".equals(classAlias)) { - String keystring = "route-target.global-route-target:assign:value:"+UUID.randomUUID()+"&route-target.route-target-role:assign:value:"+UUID.randomUUID(); - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - listSubNodes(classAlias, doc, stack, commands); - stack.pop(); - } else if("service-capability".equals(classAlias)) { - String keystring = "service-capability.service-type:assign:value:"+UUID.randomUUID()+"&service-capability.vnf-type:assign:value:"+UUID.randomUUID(); - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - listSubNodes(classAlias, doc, stack, commands); - stack.pop(); - } else if("ctag-pool".equals(classAlias)) { - String keystring = "ctag-pool.target-pe:assign:value:"+UUID.randomUUID()+"&ctag-pool.availability-zone-name:assign:value:"+UUID.randomUUID(); - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - listSubNodes(classAlias, doc, stack, commands); - stack.pop(); - } else { - String keystring = String.format("%s.%s:assign:value:%s", classAlias, id, UUID.randomUUID()); - stack.push(keystring); - String[] array = stack.toArray(new String[0]); - String key = StringUtils.join(array, "&"); - - String save = String.format("save|%s|%s", classAlias, key); - commands.add(save); - - String query = String.format("query|%s|%s", classAlias, key); - commands.add(query); - - String update = String.format("update|%s|%s", classAlias, key); - commands.add(update); - - if(!parent.equals(classAlias) && !containsCircular(classAlias, id, stack)) { - listSubNodes(classAlias, doc, stack, commands); - } - String delete = String.format("delete|%s|%s", classAlias, key); - commands.add(delete); - stack.pop(); - } - } - } - } + if(!(node instanceof Element)) + continue; + + String classAlias = null; + + if(node.hasAttributes()) + { + String nm = ((Element)node).getAttribute("ref"); + if(nm != null && !nm.isEmpty()) { + String[] split = nm.split(":"); + classAlias = split[split.length - 1]; + if("relationship-list".equals(classAlias)) + continue; + if("metadata".equals(classAlias)) + continue; + if("classes-of-service".equals(classAlias)) { + classAlias = "class-of-service"; + } else if("l3-interface-ipv4-address-list".equals(classAlias)) { + ; + } else if("l3-interface-ipv6-address-list".equals(classAlias)) { + ; + } else if("cvlan-tags".equals(classAlias)) { + classAlias = "cvlan-tag-entry"; + } else if("network-policies".equals(classAlias)) { + classAlias = "network-policy"; + } else if("complexes".equals(classAlias)) { + classAlias = "complex"; + } else if("dvs-switches".equals(classAlias)) { + classAlias = "dvs-switch"; + } else if("service-capabilities".equals(classAlias)) { + classAlias = "service-capability"; + } else { + classAlias = classAlias.substring(0, classAlias.length() -1); + } + AAIRequest request = AAIRequest.createRequest(classAlias, new HashMap<String, String>()); + if(request != null) { + Class<?> clazz = request.getModelClass(); + Field[] fieldz = clazz.getDeclaredFields(); + Field field = fieldz[0]; + String fieldName = field.getName(); + XmlElement annotation = field.getAnnotation(XmlElement.class); + + Map<String, Object> map = AnnotationUtils.getAnnotationAttributes(annotation); + String id = (String)map.get("name"); + if("##default".equals(id)) { + id = fieldName; + } + + if("cloud-region".equals(classAlias)) { + String keystring = "cloud-region.cloud-owner:assign:value:att-aic&cloud-region.cloud-region-id:assign:value:AAIAIC25"; + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + listSubNodes(classAlias, doc, stack, commands); + stack.pop(); + } else if("entitlement".equals(classAlias)) { + String keystring = "entitlement.group-uuid:assign:value:"+UUID.randomUUID()+"&entitlement.resource-uuid:assign:value:"+UUID.randomUUID(); + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + listSubNodes(classAlias, doc, stack, commands); + stack.pop(); + } else if("license".equals(classAlias)) { + String keystring = "license.group-uuid:assign:value:"+UUID.randomUUID()+"&license.resource-uuid:assign:value:"+UUID.randomUUID(); + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + listSubNodes(classAlias, doc, stack, commands); + stack.pop(); + } else if("route-target".equals(classAlias)) { + String keystring = "route-target.global-route-target:assign:value:"+UUID.randomUUID()+"&route-target.route-target-role:assign:value:"+UUID.randomUUID(); + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + listSubNodes(classAlias, doc, stack, commands); + stack.pop(); + } else if("service-capability".equals(classAlias)) { + String keystring = "service-capability.service-type:assign:value:"+UUID.randomUUID()+"&service-capability.vnf-type:assign:value:"+UUID.randomUUID(); + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + listSubNodes(classAlias, doc, stack, commands); + stack.pop(); + } else if("ctag-pool".equals(classAlias)) { + String keystring = "ctag-pool.target-pe:assign:value:"+UUID.randomUUID()+"&ctag-pool.availability-zone-name:assign:value:"+UUID.randomUUID(); + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + listSubNodes(classAlias, doc, stack, commands); + stack.pop(); + } else { + String keystring = String.format("%s.%s:assign:value:%s", classAlias, id, UUID.randomUUID()); + stack.push(keystring); + String[] array = stack.toArray(new String[0]); + String key = StringUtils.join(array, "&"); + + String save = String.format("save|%s|%s", classAlias, key); + commands.add(save); + + String query = String.format("query|%s|%s", classAlias, key); + commands.add(query); + + String update = String.format("update|%s|%s", classAlias, key); + commands.add(update); + + if(!parent.equals(classAlias) && !containsCircular(classAlias, id, stack)) { + listSubNodes(classAlias, doc, stack, commands); + } + String delete = String.format("delete|%s|%s", classAlias, key); + commands.add(delete); + stack.pop(); + } + } + } + } } - } + } - public static boolean containsCircular(String classAlias, String id, Stack<String> stack) { - String keystring = String.format("%s.%s", classAlias, id); + public static boolean containsCircular(String classAlias, String id, Stack<String> stack) { + String keystring = String.format("%s.%s", classAlias, id); - Stack<String> localStack = new Stack<String>(); - localStack.addAll(stack); + Stack<String> localStack = new Stack<String>(); + localStack.addAll(stack); - localStack.pop(); + localStack.pop(); - while(!localStack.isEmpty()) { - String instruction = localStack.pop(); - if(instruction.contains(keystring)) { - return true; - } - } + while(!localStack.isEmpty()) { + String instruction = localStack.pop(); + if(instruction.contains(keystring)) { + return true; + } + } - return false; - } + return false; + } } diff --git a/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/RequestPathTest.java b/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/RequestPathTest.java new file mode 100755 index 00000000..5ee35c64 --- /dev/null +++ b/aai-service/provider/src/test/java/org/onap/ccsdk/sli/adaptors/aai/RequestPathTest.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.ccsdk.sli.adaptors.aai; + +import static org.junit.Assert.assertNotNull; + +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class RequestPathTest { + + private static final Logger LOG = LoggerFactory.getLogger(RequestPathTest.class); + + protected static AAIClient client; + + @BeforeClass + public static void setUp() throws Exception { + URL url = AAIService.class.getResource(AAIService.AAICLIENT_PROPERTIES); + client = new AAIService(url); + LOG.info("\nTaicAAIResourceTest.setUp\n"); + } + + @AfterClass + public static void tearDown() throws Exception { + client = null; + LOG.info("----------------------- AAIResourceTest.tearDown -----------------------"); + } + + @Test + public void getRequestUrl() { + try { + Map<String, String> nameValues = new HashMap<String, String> (); + nameValues.put("generic-vnf.vnf-id","AABBCCDDEEFFGG0123"); + + AAIRequest request = AAIRequest.createRequest("service-instances", nameValues); + request.addRequestProperty("generic-vnf.vnf-id","AABBCCDDEEFFGG0123"); + + URL url = request.getRequestUrl("GET", null); + assertNotNull(url); + url.getPath(); + LOG.info("Received response"); + } catch(Exception exc) { + LOG.info("Caught exception", exc); + } + } +} |