aboutsummaryrefslogtreecommitdiffstats
path: root/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java
diff options
context:
space:
mode:
Diffstat (limited to 'aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java')
-rw-r--r--aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java1946
1 files changed, 1946 insertions, 0 deletions
diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java
new file mode 100644
index 0000000..b21ad57
--- /dev/null
+++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java
@@ -0,0 +1,1946 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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.sdnc.sli.aai;
+
+import java.io.UnsupportedEncodingException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.aai.AAIService.AAIRequestExecutor;
+import org.openecomp.sdnc.sli.aai.data.AAIDatum;
+import org.openecomp.sdnc.sli.aai.query.InstanceFilter;
+import org.openecomp.sdnc.sli.aai.query.InstanceFilters;
+import org.openecomp.sdnc.sli.aai.query.NamedQuery;
+import org.openecomp.sdnc.sli.aai.query.NamedQueryData;
+import org.openecomp.sdnc.sli.aai.query.QueryParameters;
+import org.openecomp.sdnc.sli.aai.update.Action;
+import org.openecomp.sdnc.sli.aai.update.ActionDatum;
+import org.openecomp.sdnc.sli.aai.update.Update;
+import org.openecomp.sdnc.sli.aai.update.UpdateNodeKey;
+import org.slf4j.Logger;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.openecomp.aai.inventory.v8.GenericVnf;
+import org.openecomp.aai.inventory.v8.InventoryResponseItem;
+import org.openecomp.aai.inventory.v8.InventoryResponseItems;
+import org.openecomp.aai.inventory.v8.LogicalLink;
+import org.openecomp.aai.inventory.v8.Metadata;
+import org.openecomp.aai.inventory.v8.Metadatum;
+import org.openecomp.aai.inventory.v8.Pnf;
+import org.openecomp.aai.inventory.v8.Relationship;
+import org.openecomp.aai.inventory.v8.RelationshipData;
+import org.openecomp.aai.inventory.v8.RelationshipList;
+import org.openecomp.aai.inventory.v8.ResultData;
+import org.openecomp.aai.inventory.v8.SearchResults;
+import org.openecomp.aai.inventory.v8.Vlan;
+import org.openecomp.aai.inventory.v8.Vlans;
+import org.openecomp.aai.inventory.v8.Vserver;
+
+
+public abstract class AAIDeclarations implements AAIClient {
+
+ public static final String TRUSTSTORE_PATH = "org.openecomp.sdnc.sli.aai.ssl.trust";
+ public static final String TRUSTSTORE_PSSWD = "org.openecomp.sdnc.sli.aai.ssl.trust.psswd";
+ public static final String KEYSTORE_PATH = "org.openecomp.sdnc.sli.aai.ssl.key";
+ public static final String KEYSTORE_PSSWD = "org.openecomp.sdnc.sli.aai.ssl.key.psswd";
+
+ public static final String CLIENT_NAME = "org.openecomp.sdnc.sli.aai.client.name";
+ public static final String CLIENT_PWWD = "org.openecomp.sdnc.sli.aai.client.psswd";
+
+ public static final String APPLICATION_ID = "org.openecomp.sdnc.sli.aai.application";
+
+ public static final String CONNECTION_TIMEOUT = "connection.timeout";
+ public static final String READ_TIMEOUT = "read.timeout";
+
+ public static final String TARGET_URI = "org.openecomp.sdnc.sli.aai.uri";
+
+ // Availability zones query
+ public static final String QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.query";
+
+ // Update
+ public static final String UPDATE_PATH = "org.openecomp.sdnc.sli.aai.update";
+
+ // VCE
+ public static final String NETWORK_VCE_PATH = "org.openecomp.sdnc.sli.aai.path.vce";
+
+ // VPE
+ public static final String NETWORK_VPE_PATH = "org.openecomp.sdnc.sli.aai.path.vpe";
+
+ // VPLS-PE
+ public static final String NETWORK_VPLS_PE_PATH = "org.openecomp.sdnc.sli.aai.path.vpls.pe";
+
+ // Service instance
+ public static final String SVC_INSTANCE_PATH = "org.openecomp.sdnc.sli.aai.path.svcinst";
+ public static final String SVC_INST_QRY_PATH = "org.openecomp.sdnc.sli.aai.path.svcinst.query";
+
+ // customer
+ public static final String CUSTOMER_PATH = "org.openecomp.sdnc.sli.aai.path.customer";
+
+ // Complexes
+ public static final String NETWORK_COMPLEX_PATH = "org.openecomp.sdnc.sli.aai.path.complex";
+
+ // PServer
+ public static final String NETWORK_PSERVER_PATH = "org.openecomp.sdnc.sli.aai.path.pserver";
+
+ // VServer
+ public static final String NETWORK_VSERVER_PATH = "org.openecomp.sdnc.sli.aai.path.vserver";
+
+ // DVS Seitch
+ public static final String NETWORK_DVSSWITCH_PATH = "org.openecomp.sdnc.sli.aai.path.dvsswitch";
+
+ // GENERIC VNF
+ public static final String GENERIC_VNF_PATH = "org.openecomp.sdnc.sli.aai.path.generic.vnf";
+
+ // CTAG Pool
+ public static final String CTAG_POOLS_PATH = "org.openecomp.sdnc.sli.aai.path.ctag.pools";
+ public static final String CTAG_POOL_PATH = "org.openecomp.sdnc.sli.aai.path.ctag.pool";
+
+ // L3 Network
+ public static final String L3_NETWORK_PATH = "org.openecomp.sdnc.sli.aai.path.l3network";
+ public static final String L3_NETWORK_PATH_QUERY_NAME = "org.openecomp.sdnc.sli.aai.path.l3network.query.name";
+
+ // VPN Bindings
+ public static final String VPN_BINDING_PATH = "org.openecomp.sdnc.sli.aai.path.vpn.binding";
+
+ public static final String VNF_IMAGE_PATH = "org.openecomp.sdnc.sli.aai.path.vnf.image";
+ public static final String VNF_IMAGE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.vnf.image.query";
+
+ public static final String QUERY_FORMAT = "org.openecomp.sdnc.sli.aai.param.format";
+ public static final String PARAM_VNF_TYPE = "org.openecomp.sdnc.sli.aai.param.vnf_type";
+ public static final String PARAM_PHYS_LOC_ID = "org.openecomp.sdnc.sli.aai.param.physical.location.id";
+ public static final String PARAM_SERVICE_TYPE = "org.openecomp.sdnc.sli.aai.param.service.type";
+ public static final String CERTIFICATE_HOST_ERROR = "org.openecomp.sdnc.sli.aai.host.certificate.ignore";
+
+ // UBB Notify
+ public static final String UBB_NOTIFY_PATH = "org.openecomp.sdnc.sli.aai.path.notify";
+ public static final String SELFLINK_AVPN = "org.openecomp.sdnc.sli.aai.notify.selflink.avpn";
+ public static final String SELFLINK_FQDN = "org.openecomp.sdnc.sli.aai.notify.selflink.fqdn";
+
+ //Service
+ public static final String SERVICE_PATH = "org.openecomp.sdnc.sli.aai.path.service";
+
+ // P-Interfaces
+ public static final String P_INTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface";
+
+ // Physical Link
+ public static final String PHYSICAL_LINK_PATH = "org.openecomp.sdnc.sli.aai.path.physical.link";
+
+ // site-pair-sets
+ public static final String SITE_PAIR_SET_PATH = "org.openecomp.sdnc.sli.aai.path.site.pair.set";
+
+ // node query (1602)
+ public static final String QUERY_NODES_PATH = "org.openecomp.sdnc.sli.aai.query.nodes";
+
+
+ protected abstract Logger getLogger();
+ public abstract AAIRequestExecutor getExecutor();
+
+
+ @Override
+ public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, String orderBy, SvcLogicContext ctx)
+ throws SvcLogicException {
+
+ getLogger().debug("AAIService.query \tresource = "+resource);
+
+ String vnfId = null;
+ String vnfName = null;
+ HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+ getLogger().debug("key = "+ nameValues.toString());
+
+ // process data using new model
+ boolean useNewModelProcessing = true;
+ // process server query by name the old way
+ if(("vserver".equals(resource) || "vserver2".equals(resource))){
+ if(nameValues.containsKey("vserver_name") || nameValues.containsKey("vserver-name"))
+ useNewModelProcessing = false;
+ }
+ if("generic-vnf".equals(resource)){
+ if(nameValues.containsKey("vnf_name") || nameValues.containsKey("vnf-name"))
+ useNewModelProcessing = false;
+ }
+
+ // process data using new model
+ if(useNewModelProcessing && AAIRequest.createRequest(resource, nameValues) != null) {
+
+ try {
+ return newModelQuery(resource, localOnly, select, key, prefix, orderBy, ctx);
+ } catch (Exception exc) {
+ getLogger().warn("Failed query - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ }
+
+ ObjectMapper mapper = getObjectMapper();
+ Map<String,Object> attributes = new HashMap<String,Object>();
+
+ String modifier = null;
+
+ if(resource.contains(":")) {
+ String[] tokens = resource.split(":");
+ resource = tokens[0];
+ if(tokens.length > 1) {
+ modifier = tokens[1];
+ }
+ }
+
+ resource = resource.toLowerCase().replace("-", "_");
+
+ try {
+
+ switch(resource) {
+ case "generic_vnf":
+ vnfId = nameValues.get("vnf_id");
+ vnfName = nameValues.get("vnf_name");
+ if(vnfId != null && !vnfId.isEmpty()) {
+ // at this point of the project this part should not be executed
+ vnfId = vnfId.trim().replace("'", "").replace("$", "").replace("'", "");
+ GenericVnf vnf = this.requestGenericVnfData(vnfId);
+ if(vnf == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ attributes = mapper.convertValue(vnf, attributes.getClass());
+ } else if(vnfName != null && !vnfName.isEmpty()) {
+ try {
+ vnfName = vnfName.trim().replace("'", "").replace("$", "").replace("'", "");
+ GenericVnf vnf = this.requestGenericVnfeNodeQuery(vnfName);
+ if(vnf == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+ vnfId=vnf.getVnfId();
+ nameValues.put("vnf_id", vnfId);
+ attributes = mapper.convertValue(vnf, attributes.getClass());
+ } catch (AAIServiceException exc) {
+ int errorCode = exc.getReturnCode();
+ switch(errorCode) {
+ case 400:
+ case 404:
+ case 412:
+ break;
+ default:
+ getLogger().warn("Caught exception trying to refresh generic VNF", exc);
+ }
+ ctx.setAttribute(prefix + ".error.message", exc.getMessage());
+ if(errorCode >= 300) {
+ ctx.setAttribute(prefix + ".error.http.response-code", "" + exc.getReturnCode());
+ }
+ return QueryStatus.FAILURE;
+ }
+ } else {
+ getLogger().warn("No arguments are available to process generic VNF");
+ return QueryStatus.FAILURE;
+ }
+ break;
+ case "vserver":
+ case "vserver2":
+ String vserverName = nameValues.get("vserver_name");
+ String vserverId = nameValues.get("vserver_id");
+ String tenantId = nameValues.get("teannt_id");
+
+ if(vserverName != null) vserverName = vserverName.trim().replace("'", "").replace("$", "").replace("'", "");
+ if(vserverId != null) vserverId = vserverId.trim().replace("'", "").replace("$", "").replace("'", "");
+ if(tenantId != null) tenantId = tenantId.trim().replace("'", "").replace("$", "").replace("'", "");
+
+ if(vserverName != null) {
+ try {
+// add cloud region to return data
+ URL vserverUrl = this.requestVserverURLNodeQuery(vserverName);
+ if(vserverUrl == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ tenantId = getTenantIdFromVserverUrl(vserverUrl);
+ String cloudOwner = getCloudOwnerFromVserverUrl(vserverUrl);
+ String cloudRegionId = getCloudRegionFromVserverUrl(vserverUrl);
+
+ Vserver vserver = this.requestVServerDataByURL(vserverUrl);
+ if(vserver == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+ attributes = mapper.convertValue(vserver, attributes.getClass());
+ if(!attributes.containsKey("tenant-id") && tenantId != null){
+ attributes.put("tenant-id", tenantId);
+ }
+ if(!attributes.containsKey("cloud-owner") && cloudOwner != null){
+ attributes.put("cloud-owner", cloudOwner);
+ }
+ if(!attributes.containsKey("cloud-region-id") && cloudRegionId != null){
+ attributes.put("cloud-region-id", cloudRegionId);
+ }
+ } catch (AAIServiceException e) {
+ getLogger().warn("Caught exception trying to refresh generic VNF", e);
+ }
+ } else if(vserverId != null && tenantId != null) {
+ Vserver vserver = this.requestVServerData(tenantId, vserverId, "att-aic", "AAIAIC25");
+ if(vserver == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+ attributes = mapper.convertValue(vserver, attributes.getClass());
+ if(!attributes.containsKey("tenant-id") && tenantId != null){
+ attributes.put("tenant-id", tenantId);
+ }
+ } else {
+ return QueryStatus.FAILURE;
+ }
+ break;
+
+ default:
+ return QueryStatus.FAILURE;
+ }
+
+ QueryStatus retval = QueryStatus.SUCCESS;
+
+ if (attributes == null || attributes.isEmpty()) {
+ retval = QueryStatus.NOT_FOUND;
+ getLogger().debug("No data found");
+ } else {
+ if (ctx != null) {
+ if (prefix != null) {
+ ArrayList<String> keys = new ArrayList<String>(attributes.keySet());
+
+ int numCols = keys.size();
+
+ for (int i = 0; i < numCols; i++) {
+ String colValue = null;
+ String colName = keys.get(i);
+ Object object = attributes.get(colName);
+
+ if(object != null && object instanceof String) {
+ colValue = (String)object;
+
+ if (prefix != null) {
+ getLogger().debug("Setting "+prefix + "." + colName.replaceAll("_", "-")+" = "+ colValue);
+ ctx.setAttribute(prefix + "." + colName.replaceAll("_", "-"), colValue);
+ } else {
+ getLogger().debug("Setting " + colValue.replaceAll("_", "-")+" = "+colValue);
+ ctx.setAttribute(colValue.replaceAll("_", "-"), colValue);
+ }
+ } else if(object != null && object instanceof Map) {
+ if(colName.equals(modifier) || colName.equals("relationship-list")){
+ String localNodifier = modifier;
+ if(localNodifier == null)
+ localNodifier = "relationship-list";
+ Map<String, Object> properties = (Map<String, Object>)object;
+ writeMap(properties, prefix+"."+localNodifier, ctx);
+ }
+ }
+ }
+ }
+ }
+ }
+ getLogger().debug("Query - returning " + retval);
+ return (retval);
+
+ } catch (Exception exc) {
+ getLogger().warn("Failed query - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+
+// return QueryStatus.SUCCESS;
+ }
+
+ public void writeMap(Map<String, Object> properties, String prefix, SvcLogicContext ctx) {
+ Set<String> mapKeys = properties.keySet();
+
+ for(String mapKey : mapKeys) {
+ Object entity = properties.get(mapKey);
+ if(entity instanceof ArrayList) {
+ writeList((ArrayList<?>)entity, prefix + "." + mapKey, ctx);
+ } else
+ if(entity instanceof String) {
+ ctx.setAttribute(prefix + "." + mapKey, entity.toString());
+ getLogger().debug(prefix + "." + mapKey + " : " + entity.toString());
+ } else
+ if(entity instanceof Map) {
+ String localPrefix = prefix;
+ if(mapKey != null) {
+ localPrefix = String.format("%s.%s", prefix, mapKey);
+ }
+ writeMap( (Map<String, Object>)entity, localPrefix, ctx);
+ }
+ }
+ }
+
+ private void writeList(ArrayList<?> list, String prefix, SvcLogicContext ctx) {
+ for(int i = 0; i < list.size(); i++ ) {
+ Object entity = list.get(i);
+ if(entity instanceof Map) {
+ writeMap( (Map<String, Object>)entity, prefix + "[" + i + "]", ctx);
+ } else
+ if(entity instanceof String) {
+ ctx.setAttribute(prefix, entity.toString());
+ getLogger().debug(prefix + " : " + entity.toString());
+ }
+ }
+
+ if(list.size() > 0) {
+ ctx.setAttribute(prefix + "_length", Integer.toString(list.size()));
+ getLogger().debug(prefix + "_length" + " : " + Integer.toString(list.size()));
+ }
+ }
+
+ @Override
+ public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map<String, String> params, String prefix, SvcLogicContext ctx)
+ throws SvcLogicException {
+
+ getLogger().debug("AAIService.save\tresource="+resource);
+
+ if(resource == null || resource.isEmpty()) {
+ getLogger().warn("AAIService.save has unspecified resource");
+ return QueryStatus.FAILURE;
+ }
+ // keys passed
+ HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+ getLogger().debug("key = "+ Arrays.toString(nameValues.entrySet().toArray()));
+
+ // process params
+ if(params.containsKey("prefix")) {
+ Map<String, String> tmpParams = ctxGetBeginsWith(ctx, params.get("prefix"));
+ if(!tmpParams.isEmpty()) {
+ params.putAll(tmpParams);
+// params.remove("prefix");
+ }
+ }
+ // params passed
+ getLogger().debug("parms = "+ Arrays.toString(params.entrySet().toArray()));
+
+
+ boolean useNewModelProcessing = true;
+ // process server query by name the old way
+ if(("vserver".equals(resource) || "vserver2".equals(resource))){
+ if(nameValues.containsKey("vserver-name")) {
+ useNewModelProcessing = false;
+ }
+
+ if(!params.containsKey("vserver-selflink")) {
+
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ URL path = null;
+ try {
+ request.processRequestPathValues(nameValues);
+ path = request.getRequestUrl("GET", null);
+ params.put("vserver-selflink", path.toString());
+ } catch (UnsupportedEncodingException | MalformedURLException e) {
+ params.put("vserver-selflink", "/vserver");
+ }
+ }
+ }
+
+ // process data using new model
+ if(useNewModelProcessing && AAIRequest.createRequest(resource, nameValues) != null) {
+
+ try {
+ if(!resource.contains(":")){
+ return newModelSave(resource, force, key, params, prefix, ctx);
+ } else {
+ String[] tokens = resource.split(":");
+ String localResource = tokens[0];
+ String dependency = tokens[1];
+ // get the object
+ AAIDatum instance = newModelObjectRequest( localResource, nameValues, prefix, ctx);
+ if(instance == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ switch(dependency){
+ case "relationship-list":
+ newModelProcessRelationshipList(instance, params, prefix, ctx);
+ break;
+ }
+ // create a method to update relationship-list
+ AAIRequest request = AAIRequest.createRequest(localResource, nameValues);
+ request.setRequestObject(instance);
+ request.processRequestPathValues(nameValues);
+
+ if(getExecutor().post(request) == true) {
+ getLogger().debug("Save relationship list - returning SUCCESS");
+ return QueryStatus.SUCCESS;
+ } else {
+ getLogger().debug("Save relationship list - returning FAILURE");
+ return QueryStatus.FAILURE;
+ }
+ }
+ } catch (Exception exc) {
+ ctx.setAttribute(prefix + ".error.message", exc.getMessage());
+ if(exc instanceof AAIServiceException) {
+ AAIServiceException aaiexc = (AAIServiceException)exc;
+ if(aaiexc.getReturnCode() >= 300) {
+ ctx.setAttribute(prefix + ".error.http.response-code", "" + aaiexc.getReturnCode());
+ }
+
+ if(aaiexc.getReturnCode() == 404) {
+ return QueryStatus.NOT_FOUND;
+ }
+ }
+ getLogger().warn("Failed save() - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ } else {
+ String reSource = resource.toLowerCase().replace("-", "_");
+ String vnfId = null;
+
+ try {
+ switch(reSource) {
+ case "generic_vnf":
+ case "generic-vnf":
+ vnfId = nameValues.get("vnf_id");
+ if(vnfId == null) {
+ getLogger().debug("Save(generic-vnf) with no vnf-id specified. Returning FAILURE");
+ return QueryStatus.FAILURE;
+ }
+ vnfId = vnfId.trim().replace("'", "").replace("$", "").replace("'", "");
+ GenericVnf vnf = this.requestGenericVnfData(vnfId);
+ String status = params.get("prov-status");
+ boolean updated = false;
+ if(status != null && !status.isEmpty()) {
+ vnf.setProvStatus(status);
+ }
+ if(updated) {
+ this.postGenericVnfData(vnfId, vnf);
+ }
+ break;
+ case "vpe":
+ return update( resource, key, params, prefix, ctx) ;
+
+ default:
+ getLogger().debug("Save() executing default path - returning FAILURE");
+ return QueryStatus.FAILURE;
+ }
+ } catch (Exception exc) {
+ getLogger().warn("Failed save - returning FAILURE", exc);
+ ctx.setAttribute(prefix + ".error.message", exc.getMessage());
+ return QueryStatus.FAILURE;
+ }
+ }
+
+ getLogger().debug("Save - returning SUCCESS");
+ return QueryStatus.SUCCESS;
+ }
+
+ @Override
+ public QueryStatus update(String resource, String key, Map<String, String> parms, String prefix, SvcLogicContext ctx) throws SvcLogicException {
+
+ resource = resource.toLowerCase();
+ HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+ getLogger().debug("key = "+ Arrays.toString(nameValues.entrySet().toArray()));
+ getLogger().debug("parms = "+ Arrays.toString(parms.entrySet().toArray()));
+
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ if(request == null) {
+ if("generic-vnf".equals(resource)) {
+ request = new GenericVnfRequest();
+ }
+ }
+
+ String resourceType = resource;
+ if(request != null) {
+ resourceType = request.getPrimaryResourceName(resource);
+ }
+
+ try {
+ Update update = new Update();
+ update.setUpdateNodeType(resourceType);
+
+ List<UpdateNodeKey> updateNodeKeyList = update.getUpdateNodeKey();
+ if(updateNodeKeyList == null) {
+ updateNodeKeyList = new ArrayList<UpdateNodeKey>();
+ }
+
+ Set<String>keys = nameValues.keySet();
+
+ for(String argument: keys) {
+ if(nameValues.containsKey(argument)){
+ String value = nameValues.get(argument);
+ if(value != null && !value.isEmpty()) {
+ argument = argument.replaceAll("_", "-");
+ value = value.trim().replaceAll("'", "").replace("$", "").replace("'", "");
+ // set node key
+ UpdateNodeKey updateNodeKey = new UpdateNodeKey();
+ if(request != null)
+ updateNodeKey.setKeyName( request.formatKey(argument));
+ else
+ updateNodeKey.setKeyName(argument);
+ updateNodeKey.setKeyValue(value);
+
+ updateNodeKeyList.add(updateNodeKey);
+ }
+ }
+ }
+
+
+ // set actions
+ List<Action> actionList = update.getAction();
+ if(actionList == null) {
+ actionList = new ArrayList<Action>();
+ }
+ Action action = new Action();
+ action.setActionType("replace");
+
+ List<ActionDatum> actionData = action.getActionData();
+ if(actionData == null) {
+ actionData = new ArrayList<ActionDatum>();
+ }
+
+ keys = parms.keySet();
+
+ for(String name : keys) {
+ ActionDatum actionDatum = new ActionDatum();
+ actionDatum.setPropertyName(name);
+ String value = parms.get(name);
+ actionDatum.setPropertyValue(value);
+
+ actionData.add(actionDatum);
+ }
+
+ actionList.add(action);
+
+ this.updateAnAIEntry(update);
+ } catch(AAIServiceException aaiexc) {
+ if(aaiexc.getReturnCode() == 404)
+ return QueryStatus.NOT_FOUND;
+ else
+ return QueryStatus.FAILURE;
+ } catch (Exception exc) {
+ getLogger().warn("Failed update - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+
+ getLogger().debug("Update - returning SUCCESS");
+ return QueryStatus.SUCCESS;
+ }
+
+ @Override
+ public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException {
+ HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+ getLogger().debug("key = "+ Arrays.toString(nameValues.entrySet().toArray()));
+
+ if(AAIRequest.createRequest(resource, nameValues) != null) {
+ if(resource.contains(":")) {
+ return processDeleteRelationshipList(resource, key, ctx, nameValues);
+ }
+
+
+ try {
+ QueryStatus retval = QueryStatus.SUCCESS;
+
+ retval = newModelQuery(resource, false, null, key, "tmpDelete", null, ctx);
+
+ if(retval == null || retval != QueryStatus.SUCCESS) {
+ return retval;
+ }
+
+ String resourceVersion = ctx.getAttribute("tmpDelete.resource-version");
+ if(resourceVersion == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ try {
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ if(request == null) {
+ return QueryStatus.FAILURE;
+ }
+
+ request.processRequestPathValues(nameValues);
+
+ if(getExecutor().delete(request, resourceVersion)) {
+ return QueryStatus.SUCCESS;
+ }
+ } catch(AAIServiceException aaiexc) {
+ if(aaiexc.getReturnCode() == 404)
+ return QueryStatus.NOT_FOUND;
+ else
+ return QueryStatus.FAILURE;
+
+ } catch (Exception exc) {
+ getLogger().warn("requestGenericVnfData", exc);
+ return QueryStatus.FAILURE;
+ }
+
+ } catch (Exception exc) {
+ getLogger().warn("Failed delete - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ } else {
+ String resoourceName = resource;
+ String identifier = null;
+
+ if(resoourceName == null)
+ return QueryStatus.FAILURE;
+
+ if(resoourceName.contains(":")) {
+ String[] tokens = resoourceName.split(":");
+ if(tokens != null && tokens.length > 0) {
+ resoourceName = tokens[0];
+ identifier = tokens[1];
+ }
+ }
+ if("relationship-list".equals(identifier) || "relationshipList".equals(identifier)) {
+// RelationshipRequest relationshipRequest = new RelationshipRequest();
+ if("generic-vnf".equals(resoourceName)){
+ String vnfId = nameValues.get("vnf_id");
+ String relatedTo = nameValues.get("related_to");
+ vnfId = vnfId.trim().replace("'", "").replace("$", "").replace("'", "");
+ relatedTo = relatedTo.trim().replace("'", "").replace("$", "").replace("'", "");
+
+ GenericVnf vnf;
+ try {
+ vnf = this.requestGenericVnfData(vnfId);
+ if(vnf == null)
+ return QueryStatus.NOT_FOUND;
+ } catch (AAIServiceException exc) {
+ getLogger().warn("Failed delete - returning NOT_FOUND", exc);
+ return QueryStatus.NOT_FOUND;
+ }
+ boolean itemRemoved = false;
+ RelationshipList relationshipList = vnf.getRelationshipList();
+ List<Relationship> relationships = relationshipList.getRelationship();
+ List<Relationship> iterableList = new LinkedList<Relationship>(relationships);
+ for(Relationship relationship : iterableList) {
+ if(relationship.getRelatedTo().equals(relatedTo)) {
+ relationships.remove(relationship);
+ itemRemoved = true;
+ }
+ }
+
+ if(!itemRemoved)
+ return QueryStatus.NOT_FOUND;
+
+ try {
+ this.postGenericVnfData(vnf.getVnfId(), vnf);
+ } catch (AAIServiceException exc) {
+ if(exc.getReturnCode() == 404){
+ return QueryStatus.NOT_FOUND;
+ } else {
+ getLogger().warn("Failed delete - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ }
+ return QueryStatus.SUCCESS;
+ }
+ }
+ }
+ return QueryStatus.FAILURE;
+ }
+
+ @Override
+ public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException {
+ return query(resource, false, null, key, prefix, null, ctx);
+ }
+
+ @Override
+ public QueryStatus isAvailable(String arg0, String arg1, String arg2, SvcLogicContext arg3)
+ throws SvcLogicException {
+ // TODO Auto-generated method stub
+ throw new SvcLogicException("Method AAIService.isAvailable() has not been implemented yet");
+ }
+
+ @Override
+ public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx) throws SvcLogicException {
+ // TODO Auto-generated method stub
+ throw new SvcLogicException("Method AAIService.notify() has not been implemented yet");
+ }
+
+// @Override
+ public QueryStatus newModelQuery(String resource, boolean localOnly, String select, String key, String prefix, String orderBy, SvcLogicContext ctx) {
+
+ Object response = null;
+ QueryStatus retval = QueryStatus.SUCCESS;
+ String modifier = null;
+
+ HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+ if(resource.contains(":")) {
+ modifier = resource.split(":")[1];
+ }
+
+ try {
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ if(request == null) {
+ return QueryStatus.FAILURE;
+ }
+
+ Map<String, String> params = new HashMap<String, String>();
+ request.processRequestPathValues(nameValues);
+ if(nameValues.containsKey("prefix")){
+ Map<String, String> tmpParams = ctxGetBeginsWith(ctx, nameValues.get("prefix"));
+ if(!tmpParams.isEmpty()) {
+ params.putAll(tmpParams);
+ }
+ if("named-query".equals(resource))
+ request.setRequestObject(extractNamedQueryDataFromQueryPrefix(nameValues, params));
+ }
+ String rv = getExecutor().get(request);
+ if(rv == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ response = request.jsonStringToObject(rv);
+ if(response == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ if("generic-query".equals(resource)) {
+ SearchResults rd = SearchResults.class.cast(response);
+ List<ResultData> rdList = rd.getResultData();
+ if(rdList == null || rdList.isEmpty()) {
+ return QueryStatus.NOT_FOUND;
+ }
+ ResultData rDatum = rdList.get(0);
+ nameValues.put("selflink", rDatum.getResourceLink());
+ AAIRequest req2 = AAIRequest.createRequest(rDatum.getResourceType(), nameValues);
+ req2.processRequestPathValues(nameValues);
+ rv = getExecutor().get(req2);
+ if(rv == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ response = req2.jsonStringToObject(rv);
+ if(response == null) {
+ return QueryStatus.NOT_FOUND;
+ }
+ }
+
+ if("named-query".equals(resource)) {
+ InventoryResponseItems rd = InventoryResponseItems.class.cast(response);
+ List<InventoryResponseItem> iRIlist = rd.getInventoryResponseItem();
+ if(iRIlist == null || iRIlist.isEmpty()) {
+ return QueryStatus.NOT_FOUND;
+ }
+
+ ObjectMapper mapper = getObjectMapper();
+ Map<String, Object> subnetsList = mapper.convertValue(rd, Map.class);
+ writeMap(subnetsList, prefix, ctx);
+ return QueryStatus.SUCCESS;
+// writeList((ArrayList)iRIlist, String.format("%s.%s", prefix, "inventory-response-items"), ctx);
+ }
+
+ if("nodes-query".equals(resource)) {
+ SearchResults rd = SearchResults.class.cast(response);
+ List<ResultData> rdList = rd.getResultData();
+ if(rdList == null || rdList.isEmpty()) {
+ return QueryStatus.NOT_FOUND;
+ }
+ ResultData rDatum = rdList.get(0);
+ response = rDatum;
+// writeList((ArrayList)rdList, prefix, ctx);
+ }
+
+ String preFix = null;
+ if(prefix == null || prefix.isEmpty()) {
+ preFix = "";
+ } else {
+ preFix = prefix + ".";
+ }
+
+ Map<String,Object> props = objectToProperties(response);
+ Set<String> keys = props.keySet();
+ for(String theKey: keys) {
+ if(getLogger().isTraceEnabled())
+ getLogger().trace(theKey);
+
+ Object value = props.get(theKey);
+ if(value == null)
+ continue;
+ Object type = value.getClass();
+ if(value instanceof String) {
+ ctx.setAttribute(preFix + theKey, value.toString());
+ continue;
+ }
+ if(value instanceof Boolean) {
+ ctx.setAttribute(preFix + theKey, value.toString());
+ continue;
+ }
+ if(value instanceof Integer) {
+ ctx.setAttribute(preFix + theKey, value.toString());
+ continue;
+ }
+ if(value instanceof Long) {
+ ctx.setAttribute(preFix + theKey, value.toString());
+ continue;
+ }
+
+ if(value instanceof ArrayList) {
+ ArrayList array = ArrayList.class.cast(value);
+ for(int i = 0; i < array.size(); i++) {
+ ctx.setAttribute(String.format("%s%s[%d]", preFix, theKey, i), array.get(i).toString());
+ }
+ continue;
+ }
+
+ if("relationship-list".equals(theKey)){
+ Map<String, Object> relationshipList = (Map<String, Object>)value;
+ // we are interested in seeing just the selected relationship
+ if(theKey.equals(modifier)) {
+ List<?> relationships = (List<?>)relationshipList.get("relationship");
+ if(relationships != null && !relationships.isEmpty()) {
+
+ List newRelationships = new LinkedList();
+ newRelationships.addAll(relationships);
+
+ for(Object obj : newRelationships){
+ if(obj instanceof Map<?, ?>) {
+ Map<?, ?> relProperties = (Map<?, ?>)obj;
+ if(relProperties.containsKey("related-to")) {
+ Object relPropsRelatedTo = relProperties.get("related-to");
+
+ String relatedTo = nameValues.get("related_to");
+ if(relatedTo != null) {
+ relatedTo = relatedTo.trim().replace("'", "").replace("$", "").replace("'", "");
+ if(!relatedTo.equals(relPropsRelatedTo)) {
+ relationships.remove(relProperties);
+ }
+ continue;
+ } else {
+ continue;
+ }
+ }
+ }
+ }
+ }
+ }
+ writeMap(relationshipList, String.format("%s.%s", prefix, theKey), ctx);
+ continue;
+ }
+
+// if("subnets".equals(theKey)){
+// Map<String, Object> subnetsList = (Map<String, Object>)value;
+// writeMap(subnetsList, String.format("%s.%s", prefix, theKey), ctx);
+// }
+
+ if(value instanceof Map) {
+ Map<String, Object> subnetsList = (Map<String, Object>)value;
+ writeMap(subnetsList, String.format("%s.%s", prefix, theKey), ctx);
+ continue;
+ }
+
+ }
+ } catch(AAIServiceException aaiexc) {
+ int errorCode = aaiexc.getReturnCode();
+ ctx.setAttribute(prefix + ".error.message", aaiexc.getMessage());
+ if(errorCode >= 300) {
+ ctx.setAttribute(prefix + ".error.http.response-code", "" + aaiexc.getReturnCode());
+ }
+
+ if(aaiexc.getReturnCode() == 404)
+ return QueryStatus.NOT_FOUND;
+
+ return QueryStatus.FAILURE;
+ } catch (Exception exc) {
+ getLogger().warn("requestGenericVnfData", exc);
+ ctx.setAttribute(prefix + ".error.message", exc.getMessage());
+ return QueryStatus.FAILURE;
+ }
+
+ return retval;
+ }
+
+
+ public QueryStatus newModelBackupRequest(String resource, Map<String, String> params, String prefix, SvcLogicContext ctx) {
+
+ QueryStatus retval = QueryStatus.SUCCESS;
+ HashMap<String, String> nameValues = new HashMap<String, String>();
+
+ try {
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ if(request == null) {
+ return QueryStatus.FAILURE;
+ }
+
+ boolean argsFound = false;
+ String[] arguments = request.getArgsList();
+ for(String name : arguments) {
+ String tmpName = name.replaceAll("-", "_");
+ String value = params.get(tmpName);
+ if(value != null && !value.isEmpty()) {
+ value = value.trim().replace("'", "").replace("$", "").replace("'", "");
+ request.addRequestProperty(name, value);
+ argsFound = true;
+ }
+ }
+ if(!argsFound) {
+ getLogger().warn("No arguments were found. Terminating backup request.");
+ return QueryStatus.FAILURE;
+ }
+
+ String rv = getExecutor().get(request);
+ ctx.setAttribute(prefix, rv);
+ } catch(AAIServiceException aaiexc) {
+ if(aaiexc.getReturnCode() == 404)
+ return QueryStatus.NOT_FOUND;
+
+ return QueryStatus.FAILURE;
+ } catch (Exception exc) {
+ getLogger().warn("newModelBackupRequest", exc);
+ return QueryStatus.FAILURE;
+ }
+
+ return retval;
+ }
+
+ public AAIDatum newModelObjectRequest(String resource, Map<String, String> params, String prefix, SvcLogicContext ctx)
+ throws AAIServiceException {
+
+ AAIDatum response = null;
+
+ try {
+ AAIRequest request = AAIRequest.createRequest(resource, params);
+ if(request == null) {
+ return null;
+ }
+ String[] arguments = request.getArgsList();
+ for(String name : arguments) {
+ String tmpName = name.replaceAll("-", "_");
+ String value = params.get(tmpName);
+ if(value != null && !value.isEmpty()) {
+ value = value.trim().replace("'", "").replace("$", "").replace("'", "");
+ request.addRequestProperty(name, value);
+ }
+ }
+ String rv = getExecutor().get(request);
+ response = request.jsonStringToObject(rv);
+ } catch(AAIServiceException aaiexc) {
+ throw aaiexc;
+ } catch (Exception exc) {
+ getLogger().warn("newModelBackupRequest", exc);
+ throw new AAIServiceException(exc);
+ }
+
+ return response;
+ }
+
+
+ @Override
+ public QueryStatus release(String arg0, String arg1, SvcLogicContext arg2) throws SvcLogicException {
+ // TODO Auto-generated method stub
+ throw new SvcLogicException("Method AAIService.release() has not been implemented yet");
+ }
+
+ @Override
+ public QueryStatus reserve(String arg0, String arg1, String arg2, String arg3, SvcLogicContext arg4)
+ throws SvcLogicException {
+ // TODO Auto-generated method stub
+ throw new SvcLogicException("Method AAIService.reserve() has not been implemented yet");
+ }
+
+ private QueryStatus newModelSave(String resource, boolean force, String key, Map<String, String> parms, String prefix, SvcLogicContext ctx) {
+ getLogger().debug("Executing newModelSave for resource : " + resource);
+ HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+
+ try {
+ ArrayList<String> subResources = new ArrayList<String>();
+ Set<String> set = parms.keySet();
+ Map<String, Method> setters = new HashMap<String, Method>();
+ Map<String, Method> getters = new HashMap<String, Method>();
+
+ // 1. find class
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ Class<? extends AAIDatum> resourceClass = request.getModelClass();
+ getLogger().debug(resourceClass.getName());
+ AAIDatum instance = resourceClass.newInstance();
+
+ {
+ Annotation[] annotations = resourceClass.getAnnotations();
+ for(Annotation annotation : annotations) {
+ Class<? extends Annotation> anotationType = annotation.annotationType();
+ String annotationName = anotationType.getName();
+// if("com.fasterxml.jackson.annotation.JsonPropertyOrder".equals(annotationName)){
+
+ // 2. find string property setters and getters for the lists
+ if("javax.xml.bind.annotation.XmlType".equals(annotationName)){
+ XmlType order = (XmlType)annotation;
+ String[] values = order.propOrder();
+ for(String value : values) {
+ String id = camelCaseToDashedString(value);
+ Field field = resourceClass.getDeclaredField(value);
+ Class<?> type = field.getType();
+ Method setter = null;
+ try {
+ setter = resourceClass.getMethod("set"+StringUtils.capitalize(value), type);
+ if(type.getName().startsWith("java.lang")) {
+ try {
+ setter.setAccessible(true);
+ Object arglist[] = new Object[1];
+ arglist[0] = parms.get(id);
+
+ if(arglist[0] != null) {
+ if(!type.getName().equals("java.lang.String")) {
+// getLogger().debug(String.format("Processing %s with parameter %s", types[0].getName(), value));
+ arglist[0] = valueOf(type, parms.get(id));
+ }
+ Object o = setter.invoke(instance, arglist);
+ }
+ set.remove(id);
+
+ } catch (Exception x) {
+ Throwable cause = x.getCause();
+ getLogger().warn("Failed process for " + resourceClass.getName(), x);
+ }
+ } else {
+ setters.put(id, setter);
+ }
+ } catch(Exception exc) {
+
+ }
+
+ Method getter = null;
+ try {
+ getter = resourceClass.getMethod("get"+StringUtils.capitalize(value));
+ if(!type.getName().equals("java.lang.String")) {
+ getters.put(id, getter);
+ }
+ } catch(Exception exc) {
+
+ }
+
+ }
+ subResources.addAll(Arrays.asList(values));
+ }
+ }
+ }
+
+ // remove getters that have matching setter
+ for(String setKey : setters.keySet()) {
+ if(getters.containsKey(setKey)) {
+ getters.remove(setKey);
+ }
+ }
+
+ Set<String> relationshipKeys = new TreeSet<String>();
+ Set<String> vlansKeys = new TreeSet<String>();
+ Set<String> metadataKeys = new TreeSet<String>();
+
+ for(String attribute : set) {
+ String value = parms.get(attribute);
+ if(attribute.startsWith("relationship-list")) {
+ relationshipKeys.add(attribute);
+ } else if(attribute.startsWith("vlans")) {
+ vlansKeys.add(attribute);
+ } else if(attribute.startsWith("metadata")) {
+ metadataKeys.add(attribute);
+ }
+ }
+ // 3. find list property getters
+ for(String attribute : set) {
+ String value = parms.get(attribute);
+ Method method = getters.get(attribute);
+ if(method != null) {
+ try {
+ method.setAccessible(true);
+ Object arglist[] = new Object[0];
+// arglist[0] = value;
+ Class<?>[] types = method.getParameterTypes();
+ if(types.length == 0){
+ Object o = method.invoke(instance, arglist);
+ if(o instanceof ArrayList) {
+ ArrayList<String> values = (ArrayList<String>)o;
+// getLogger().debug(String.format("Processing %s with parameter %s", types[0].getName(), value));
+ value = value.replace("[", "").replace("]", "");
+ List<String> items = Arrays.asList(value.split("\\s*,\\s*"));
+ for(String s : items) {
+ values.add(s.trim());
+ }
+ }
+ }
+ } catch (Exception x) {
+ Throwable cause = x.getCause();
+ getLogger().warn("Failed process for " + resourceClass.getName(), x);
+ }
+ }
+ }
+ // 4. Process Relationships
+ // add relationship list
+ if( (subResources.contains("relationship-list") || subResources.contains("relationshipList")) && !relationshipKeys.isEmpty()) {
+ RelationshipList relationshipList = null;
+ Object obj = null;
+ Method getRelationshipListMethod = resourceClass.getMethod("getRelationshipList");
+ if(getRelationshipListMethod != null){
+ try {
+ getRelationshipListMethod.setAccessible(true);
+ obj = getRelationshipListMethod.invoke(instance);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ if(obj != null && obj instanceof RelationshipList){
+ relationshipList = (RelationshipList)obj;
+ } else {
+ relationshipList = new RelationshipList();
+ Method setRelationshipListMethod = resourceClass.getMethod("setRelationshipList", RelationshipList.class);
+ if(setRelationshipListMethod != null){
+ try {
+ setRelationshipListMethod.setAccessible(true);
+ Object arglist[] = new Object[1];
+ arglist[0] = relationshipList;
+
+ obj = setRelationshipListMethod.invoke(instance, arglist);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ }
+
+ List<Relationship> relationships = relationshipList.getRelationship();
+
+ int i = 0;
+ while(true){
+ int j = 0;
+ String searchKey = "relationship-list.relationship[" + i + "].related-to";
+ if(!parms.containsKey(searchKey))
+ break;
+ Relationship relationship = new Relationship();
+ relationships.add(relationship);
+
+ String relatedTo = parms.get(searchKey);
+ relationship.setRelatedTo(relatedTo);
+
+ List<RelationshipData> relData = relationship.getRelationshipData();
+// if(relData == null) {
+// relData = new LinkedList<RelationshipData>();
+// relationship.setRelationshipData(relData);
+// }
+
+ while(true) {
+ String searchRelationshipKey = "relationship-list.relationship[" + i + "].relationship-data[" + j + "].relationship-key";
+ String searchRelationshipValue = "relationship-list.relationship[" + i + "].relationship-data[" + j + "].relationship-value";
+ if(!parms.containsKey(searchRelationshipKey))
+ break;
+
+ RelationshipData relDatum = new RelationshipData();
+ relDatum.setRelationshipKey(parms.get(searchRelationshipKey));
+ relDatum.setRelationshipValue(parms.get(searchRelationshipValue));
+ relData.add(relDatum);
+ j++;
+ }
+
+ i++;
+ }
+ }
+
+ // 4. vlans
+ if(subResources.contains("vlans") && !vlansKeys.isEmpty()) {
+ Object obj = null;
+ Vlans vlanList = null;
+ Method getVLansMethod = resourceClass.getMethod("getVlans");
+ if(getVLansMethod != null){
+ try {
+ getVLansMethod.setAccessible(true);
+ obj = getVLansMethod.invoke(instance);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ if(obj != null && obj instanceof Vlans){
+ vlanList = (Vlans)obj;
+ } else {
+ vlanList = new Vlans();
+ Method setVlansMethod = resourceClass.getMethod("setVlans", Vlans.class);
+ if(setVlansMethod != null){
+ try {
+ setVlansMethod.setAccessible(true);
+ Object arglist[] = new Object[1];
+ arglist[0] = vlanList;
+
+ obj = setVlansMethod.invoke(instance, arglist);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ }
+
+ int i = 0;
+ while(true){
+ String searchKey = "vlans.vlan[" + i + "].vlan-interface";
+ if(!parms.containsKey(searchKey))
+ break;
+
+ String vlanInterface = parms.get("vlans.vlan[" + i + "].vlan-interface");
+ String vlanIdInner = parms.get("vlans.vlan[" + i + "].vlan-id-inner");
+ String vlanIdOute = parms.get("vlans.vlan[" + i + "].vlan-id-outer");
+ String speedValue = parms.get("vlans.vlan[" + i + "].speed-value");
+ String speedUnits = parms.get("vlans.vlan[" + i + "].speed-units");
+
+ Vlan vlan = new Vlan();
+ vlan.setVlanInterface(vlanInterface);
+
+ if(vlanIdInner != null) {
+ Long iVlanIdInner = Long.parseLong(vlanIdInner);
+ vlan.setVlanIdInner(iVlanIdInner);
+ }
+
+ if(vlanIdOute != null) {
+ Long iVlanIdOuter = Long.parseLong(vlanIdOute);
+ vlan.setVlanIdOuter(iVlanIdOuter);
+ }
+
+ if(speedValue != null) {
+ vlan.setSpeedValue(speedValue);
+ vlan.setSpeedUnits(speedUnits);
+ }
+
+ vlanList.getVlan().add(vlan);
+ i++;
+ }
+ }
+
+ // 5. metadata
+ if(subResources.contains("metadata") && !metadataKeys.isEmpty()) {
+ Object obj = null;
+ Metadata metadataList = null;
+ Method getMetadataMethod = resourceClass.getMethod("getMetadata");
+ if(getMetadataMethod != null){
+ try {
+ getMetadataMethod.setAccessible(true);
+ obj = getMetadataMethod.invoke(instance);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ if(obj != null && obj instanceof Metadata){
+ metadataList = (Metadata)obj;
+ } else {
+ metadataList = new Metadata();
+ Method setMetadataMethod = resourceClass.getMethod("setMetadata", Metadata.class);
+ if(setMetadataMethod != null){
+ try {
+ setMetadataMethod.setAccessible(true);
+ Object arglist[] = new Object[1];
+ arglist[0] = metadataList;
+
+ obj = setMetadataMethod.invoke(instance, arglist);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ }
+
+ if(metadataList.getMetadatum() == null) {
+// metadataList.setMetadatum(new ArrayList<Metadatum>());
+ }
+
+ // process data
+ int i = 0;
+ while(true){
+ String metaKey = "metadata.metadatum[" + i + "].meta-key";
+ if(!parms.containsKey(metaKey))
+ break;
+
+ String metaValue = parms.get("metadata.metadatum[" + i + "].meta-value");
+
+ Metadatum vlan = new Metadatum();
+ vlan.setMetaname(metaKey);
+ vlan.setMetaval(metaValue);
+
+ metadataList.getMetadatum().add(vlan);
+ i++;
+ }
+
+ }
+
+
+ // 6. Prepare AAI request
+// HashMap<String, String> nameValues = keyToHashMap(key, ctx);
+ Set<String> keys = nameValues.keySet();
+ for(String haslo : keys) { getLogger().debug("Key = " + haslo + "\tValue = ->" + nameValues.get(haslo) + "<-"); }
+ String[] args = request.getArgsList();
+ for(String arg : args) {
+ String modifiedKey = arg.replaceAll("-", "_");
+ if(nameValues.containsKey(modifiedKey)) {
+ String argValue = nameValues.get(modifiedKey);
+ if(argValue != null) argValue = argValue.trim().replace("'", "").replace("$", "").replace("'", "");
+ request.addRequestProperty(arg, argValue);
+ }
+ }
+ request.setRequestObject(instance);
+ getExecutor().post(request);
+
+ } catch(AAIServiceException exc){
+ ctx.setAttribute(prefix + ".error.message", exc.getMessage());
+ int returnCode = exc.getReturnCode();
+ if(returnCode >= 300) {
+ ctx.setAttribute(prefix + ".error.http.response-code", "" + exc.getReturnCode());
+ }
+
+ if(returnCode == 400 || returnCode == 412)
+ return QueryStatus.FAILURE;
+ else if(returnCode == 404)
+ return QueryStatus.NOT_FOUND;
+ else {
+ getLogger().warn("Failed newModelSave - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ } catch(Exception exc){
+ getLogger().warn("Failed newModelSave - returning FAILURE", exc);
+ ctx.setAttribute(prefix + ".error.message", exc.getMessage());
+ return QueryStatus.FAILURE;
+ }
+
+ getLogger().debug("newModelSave - returning SUCCESS");
+ return QueryStatus.SUCCESS;
+ }
+
+ private static final String regex = "([A-Z][a-z,0-9]+)";
+ private static final String replacement = "-$1";
+
+ private String camelCaseToDashedString(String propOrder) {
+ return propOrder.replaceAll(regex, replacement).toLowerCase();
+ }
+
+ private QueryStatus newModelProcessRelationshipList(Object instance, Map<String, String> params, String prefix, SvcLogicContext ctx) throws Exception {
+
+ Class resourceClass = instance.getClass();
+
+ Set<String> relationshipKeys = new TreeSet<String>();
+
+ Set<String> set = params.keySet();
+
+ for(String attribute : set) {
+ String value = params.get(attribute);
+
+ if(attribute.startsWith("relationship-list")) {
+ relationshipKeys.add(attribute);
+ }
+ }
+
+ // 3. Process Relationships
+ // add relationship list
+ if(!relationshipKeys.isEmpty()) {
+ RelationshipList relationshipList = null;
+ Object obj = null;
+ Method getRelationshipListMethod = resourceClass.getMethod("getRelationshipList");
+ if(getRelationshipListMethod != null){
+ try {
+ getRelationshipListMethod.setAccessible(true);
+ obj = getRelationshipListMethod.invoke(instance);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ if(obj != null && obj instanceof RelationshipList){
+ relationshipList = (RelationshipList)obj;
+ } else {
+ relationshipList = new RelationshipList();
+ Method setRelationshipListMethod = resourceClass.getMethod("setRelationshipList", RelationshipList.class);
+ if(setRelationshipListMethod != null){
+ try {
+ setRelationshipListMethod.setAccessible(true);
+ Object arglist[] = new Object[1];
+ arglist[0] = relationshipList;
+
+ obj = setRelationshipListMethod.invoke(instance, arglist);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ }
+
+ boolean createdNewRelationships = false;
+ List<Relationship> relationships = relationshipList.getRelationship();
+ if(relationships == null) {
+ relationships = new ArrayList<Relationship>();
+ createdNewRelationships = true;
+ }
+
+ int i = 0;
+ int j = 0;
+ while(true){
+ String searchKey = "relationship-list.relationship[" + i + "].related-to";
+ if(!params.containsKey(searchKey))
+ break;
+
+ j = 0;
+ String relatedTo = params.get(searchKey);
+
+ Relationship relationship = null; //findRelationship(relationships, relatedTo);
+ if(relationship == null) {
+ relationship = new Relationship();
+ relationships.add(relationship);
+ relationship.setRelatedTo(relatedTo);
+ }
+
+
+ List<RelationshipData> relData = relationship.getRelationshipData();
+// if(relData == null) {
+// relData = new LinkedList<RelationshipDatum>();
+// relationship.setRelationshipData(relData);
+// }
+
+ while(true) {
+ String searchRelationshipKey = "relationship-list.relationship[" + i + "].relationship-data[" + j + "].relationship-key";
+ String searchRelationshipValue = "relationship-list.relationship[" + i + "].relationship-data[" + j + "].relationship-value";
+ if(!params.containsKey(searchRelationshipKey))
+ break;
+
+ RelationshipData relDatum = new RelationshipData();
+ relDatum.setRelationshipKey(params.get(searchRelationshipKey));
+ relDatum.setRelationshipValue(params.get(searchRelationshipValue));
+ relData.add(relDatum);
+ j++;
+ }
+
+ i++;
+ }
+ }
+
+ return QueryStatus.SUCCESS;
+ }
+
+ private Relationship findRelationship(List<Relationship> relationships, String relatedTo) {
+ if(relatedTo == null)
+ return null;
+
+ for(Relationship relationship : relationships) {
+ if(relationship.getRelatedTo().equals(relatedTo)){
+ return relationship;
+ }
+ }
+ return null;
+ }
+
+ protected HashMap<String,String> keyToHashMap(String key, SvcLogicContext ctx) {
+ if (key == null) {
+ return (null);
+ }
+
+ getLogger().debug("Converting key [" + key + "] to where clause");
+
+ if (key.startsWith("'") && key.endsWith("'")) {
+ key = key.substring(1, key.length() - 1);
+
+ getLogger().debug("Stripped outer single quotes - key is now [" + key + "]");
+ }
+
+ String[] keyTerms = key.split("\\s+");
+
+ StringBuffer whereBuff = new StringBuffer();
+ 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);
+ }
+
+ getLogger().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
+ getLogger().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()));
+ }
+
+
+ public QueryStatus backup(Map<String, String> params, SvcLogicContext ctx) throws SvcLogicException {
+ String resource = params.get("resource").toLowerCase();
+ String prefix = params.get("data-key");
+
+ HashMap<String, String> nameValues = new HashMap<String, String>();
+ if(AAIRequest.createRequest(resource, nameValues) != null) {
+
+ try {
+ return newModelBackupRequest(resource, params, prefix, ctx);
+ } catch (Exception exc) {
+ getLogger().warn("Failed backup - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ }
+
+ return QueryStatus.NOT_FOUND;
+ }
+
+ @Override
+ public QueryStatus restore(Map<String, String> params, SvcLogicContext ctx) throws SvcLogicException {
+
+ QueryStatus retval = QueryStatus.SUCCESS;
+ String resource = params.get("resource").toLowerCase();
+ String prefix = params.get("data-key");
+
+ HashMap<String, String> nameValues = new HashMap<String, String>();
+ if(AAIRequest.createRequest(resource, nameValues) != null) {
+
+ try {
+ retval = newModelBackupRequest(resource, params, "tmpRestore", ctx);
+ if(retval == QueryStatus.SUCCESS) {
+ String current_json = ctx.getAttribute("tmpRestore");
+ ctx. setAttribute("tmpRestore", null);
+
+ String snapshot_json = ctx.getAttribute(prefix);
+ }
+ } catch (Exception exc) {
+ getLogger().warn("Failed restore - returning FAILURE", exc);
+ return QueryStatus.FAILURE;
+ }
+ }
+
+ return QueryStatus.NOT_FOUND;
+ }
+
+ private Map<String, Object> objectToProperties(Object object) {
+ ObjectMapper mapper = getObjectMapper();
+ return mapper.convertValue(object, Map.class);
+ }
+
+ static <T> T valueOf(Class<T> klazz, String arg) {
+ Exception cause = null;
+ T ret = null;
+ try {
+ ret = klazz.cast(
+ klazz.getDeclaredMethod("valueOf", String.class)
+ .invoke(null, arg)
+ );
+ } catch (NoSuchMethodException e) {
+ cause = e;
+ } catch (IllegalAccessException e) {
+ cause = e;
+ } catch (InvocationTargetException e) {
+ cause = e;
+ }
+ if (cause == null) {
+ return ret;
+ } else {
+ throw new IllegalArgumentException(cause);
+ }
+ }
+
+ private QueryStatus processDeleteRelationshipList(String resource, String key, SvcLogicContext ctx, HashMap<String, String> nameValues) {
+ try {
+ AAIRequest request = AAIRequest.createRequest(resource, nameValues);
+ if(request == null) {
+ return QueryStatus.FAILURE;
+ }
+
+ request.processRequestPathValues(nameValues);
+ URL url = request.getRequestUrl("GET", null);
+
+ Class resourceClass = request.getModelClass();
+ Object instance = getResource(url.toString(), resourceClass);
+
+ // get resource version
+ String resourceVersion = null;
+ Method getResourceVersionMethod = resourceClass.getMethod("getResourceVersion");
+ if(getResourceVersionMethod != null){
+ try {
+ getResourceVersionMethod.setAccessible(true);
+ Object object = getResourceVersionMethod.invoke(instance);
+ if(object != null)
+ resourceVersion = object.toString();
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+
+ RelationshipList relationshipList = null;
+ Object obj = null;
+ Method getRelationshipListMethod = resourceClass.getMethod("getRelationshipList");
+ if(getRelationshipListMethod != null){
+ try {
+ getRelationshipListMethod.setAccessible(true);
+ obj = getRelationshipListMethod.invoke(instance);
+ } catch (InvocationTargetException x) {
+ Throwable cause = x.getCause();
+ }
+ }
+ if(obj != null && obj instanceof RelationshipList){
+ relationshipList = (RelationshipList)obj;
+ } else {
+ getLogger().debug("No relationships found to process.");
+ return QueryStatus.NOT_FOUND;
+ }
+
+ if(relationshipList.getRelationship() == null || relationshipList.getRelationship().isEmpty()) {
+ return QueryStatus.NOT_FOUND;
+ }
+ String relatedTo = nameValues.get("related_to");
+ if(relatedTo == null) {
+ return QueryStatus.FAILURE;
+ }
+
+ relatedTo = relatedTo.replaceAll("_", "-");
+
+ List<Relationship> relationships = relationshipList.getRelationship();
+ List<Relationship> relationshipsToDelete = new LinkedList<Relationship>();
+
+ for(Relationship relationship : relationships) {
+ getLogger().debug(String.format("Comparing existing relationship of '%s' to keyword '%s'", relationship.getRelatedTo(), relatedTo));
+ if(relatedTo.equals(relationship.getRelatedTo())) {
+ getLogger().debug("Found relationship");
+// targetRelationship = relationship;
+ relationshipsToDelete.add(relationship);
+ }
+ }
+ if(relationshipsToDelete == null || relationshipsToDelete.isEmpty()) {
+ getLogger().info(String.format("Relationship has not been found for %s", key));
+ return QueryStatus.NOT_FOUND;
+ }
+
+ String path = url.toString();
+ path = path + "/relationship-list/relationship";
+ URL deleteUrl = new URL(path);
+
+ ObjectMapper mapper = getObjectMapper();
+
+ boolean cumulativeResponse = true;
+
+ for(Relationship targetRelationship : relationshipsToDelete) {
+ String json_text = mapper.writeValueAsString(targetRelationship);
+ boolean response = deleteRelationshipList(deleteUrl, json_text);
+ if(!response)
+ cumulativeResponse = response;
+
+ }
+
+ if(!cumulativeResponse)
+ return QueryStatus.FAILURE;
+
+ return QueryStatus.SUCCESS;
+
+ } catch(Exception exc) {
+ getLogger().warn("processDelete", exc);
+ return QueryStatus.FAILURE;
+ }
+ }
+
+ public static final Map<String, String> ctxGetBeginsWith( SvcLogicContext ctx, String prefix ) {
+ Map<String, String> tmpPrefixMap = new HashMap<String, String>();
+
+ if(prefix == null || prefix.isEmpty()){
+ return tmpPrefixMap;
+ }
+
+ for( String key : ctx.getAttributeKeySet() ) {
+ if( key.startsWith(prefix) ) {
+ String tmpKey = key.substring(prefix.length() + 1);
+ tmpPrefixMap.put( tmpKey, ctx.getAttribute(key));
+ }
+ }
+
+ Map<String, String> prefixMap = new HashMap<String, String>();
+ Pattern p = Pattern.compile(".*\\[\\d\\]");
+
+ SortedSet<String> keys = new TreeSet(tmpPrefixMap.keySet () );
+ for(String key : keys) {
+ Matcher m = p.matcher(key);
+ if(m.matches()) {
+ continue;
+ } else if(key.endsWith("_length")) {
+ String listKey = key.substring(0, key.indexOf("_length"));
+ int max = Integer.parseInt(tmpPrefixMap.get(key));
+
+ ArrayList<String> data = new ArrayList<String>();
+ for(int x = 0; x < max; x++){
+ String tmpKey = String.format("%s[%d]", listKey, x);
+ String tmpValue = tmpPrefixMap.get(tmpKey);
+ if(tmpValue != null && !tmpValue.isEmpty()) {
+ data.add(tmpValue);
+ }
+ }
+ if(!data.isEmpty()) {
+ prefixMap.put(listKey, data.toString());
+ } else {
+ prefixMap.put(key, tmpPrefixMap.get(key));
+ }
+ } else {
+ prefixMap.put(key, tmpPrefixMap.get(key));
+ }
+ }
+
+ return prefixMap;
+ }
+
+ /**
+ */
+ private NamedQueryData extractNamedQueryDataFromQueryPrefix(HashMap<String, String> nameValues, Map<String, String> parms) {
+ if(parms.isEmpty()) {
+ return null;
+ }
+
+ NamedQueryData data = new NamedQueryData();
+
+ // query parameters
+ if(data.getQueryParameters() == null) {
+ data.setQueryParameters(new QueryParameters());
+ }
+ String namedQueryUuid = nameValues.get("named-query-uuid".replaceAll("-", "_"));
+ if(namedQueryUuid == null) {
+ namedQueryUuid = parms.get("query-parameters.named-query.named-query-uuid");
+ }
+ NamedQuery namedQuery = new NamedQuery();
+ namedQuery.setNamedQueryUuid(namedQueryUuid);
+ data.getQueryParameters().setNamedQuery(namedQuery);
+
+ // instance filters
+ if(data.getInstanceFilters() == null) {
+ data.setInstanceFilters(new InstanceFilters());
+ }
+
+
+ String quantity = parms.get("instance-filters.instance-filter_length");
+ if(quantity != null && StringUtils.isNumeric(quantity)) {
+ int max = Integer.parseInt(quantity);
+ for(int i = 0; i < max; i++) {
+ String keyPattern = String.format("instance-filters.instance-filter[%d].", i);
+ Set<String> keys = parms.keySet();
+ for(String key: keys) {
+ if(key.startsWith(keyPattern)){
+ String value = parms.get(key);
+ String remainder = key.substring(keyPattern.length());
+ String[] split = remainder.split("\\.");
+ getLogger().debug(String.format("%s", remainder));
+ if("logical-link".equals(split[0])) {
+ InstanceFilter insf = null;
+ if(data.getInstanceFilters().getInstanceFilter().isEmpty()) {
+ insf = new InstanceFilter();
+ data.getInstanceFilters().getInstanceFilter().add(insf);
+ } else {
+ insf = data.getInstanceFilters().getInstanceFilter().get(0);
+ }
+ LogicalLink logicalLink = insf.getLogicalLink();
+ if(logicalLink == null) {
+ logicalLink = new LogicalLink();
+ insf.setLogicalLink(logicalLink);
+ }
+
+ switch(split[1]) {
+ case "link-name":
+ logicalLink.setLinkName(value);
+ break;
+ case "link-type":
+ logicalLink.setLinkType(value);
+ break;
+ case "operational-state":
+ logicalLink.setOperationalStatus(value);
+ break;
+ }
+
+ } else if("pnf".equals(split[0])) {
+ Pnf pnf = new Pnf();
+ pnf.setPnfName(value);
+
+ InstanceFilter insf = new InstanceFilter();
+ insf.setPnf(pnf);
+ data.getInstanceFilters().getInstanceFilter().add(insf);
+ }
+ }
+ }
+ }
+ }
+
+ return data;
+ }
+
+ public abstract <T> T getResource(String key, Class<T> type) throws AAIServiceException ;
+ protected abstract boolean deleteRelationshipList(URL url, String caller) throws AAIServiceException;
+}